如何通过web3.eth.personal.sign向Metamask发送多行待签名消息
关于web3.eth.personal.sign传递多行消息至MetaMask的问题解答
核心结论
可以直接将包含换行的多行字符串作为web3.eth.personal.sign方法的第一个参数传入,MetaMask签名弹窗会自动识别换行,实现你需要的分段展示效果,和OpenSea的签名弹窗表现完全一致。
具体实现方式
你只需要在构造签名消息时,在需要换行的位置插入转义字符\n即可,如果需要段落之间的空行分隔,插入两个连续的\n(即\n\n)即可。
代码示例
// 构造带分段换行的签名消息 const multiLineMsg = `Welcome to OpenSea! Click "Sign" to sign in. This action will not trigger any on-chain transaction and will not generate gas fees. Wallet address: ${userWalletAddress} Nonce: ${randomNonce}`; // 发起签名请求 web3.eth.personal.sign( multiLineMsg, userWalletAddress, (error, signatureResult) => { if (error) { console.error("签名请求失败:", error); return; } // 后续处理签名结果逻辑 } );
注意事项
- 不要对签名消息做额外的HTML转义、URL编码等处理,直接传入原始带
\n的字符串即可,否则换行符会被识别为普通字符,无法触发换行 - 该方案兼容所有主流版本的MetaMask,符合EIP-191规范的
personal_sign方法本身就支持任意UTF-8字符串作为签名内容,包括带换行的多段文本 - 如果你使用的是ethers.js库,对应
signMessage方法的实现逻辑完全一致,同样支持传入带\n的多行字符串
内容的提问来源于stack exchange,提问作者Alexandru-Marian Constantin
相关产品推荐
相关产品推荐

