当我使用 web3.eth.sign() 方法和 web3.eth.accounts.sign() 方法签署字符串时。两个签名的结果值不同。我不知道为什么这两个结果不同。我正在使用最新的 web3.js。私钥来自metamask。这是我的代码await ethereum.enable();web3 = new Web3(web3.currentProvider);let accounts = await web3.eth.getAccounts();let msg = "sign this message"let prefix = "\x19Ethereum Signed Message:\n" + msg.lengthlet msgHash1 = web3.utils.sha3(prefix+msg)let sig1 = await web3.eth.sign(msgHash1, accounts[0]);let privateKey = "0xcfb51f3737044cb4bfb49cbb10ae67d79ee81523d7065e95972cc23ed914e95e"let sigObj = await web3.eth.accounts.sign(msgHash1, privateKey)let sig2 = sigObj.signature;console.log(sig1)console.log(sig2)这就是结果。
3 回答
慕的地8271018
TA贡献1796条经验 获得超4个赞
源代码 显示,区别在于web3.eth.accounts.sign
在签名之前对消息进行前缀和哈希处理。
在您的示例中传递msg而不是msgHashto eth.accounts.sign:
所以这个签名:
const msg = 'hello world'
const { signature } = await web3.eth.accounts.sign(msg, privateKey)
将产生与散列消息相同的签名eth.sign:
const msg = 'hello world'
const msgHash = web3.eth.accounts.hashMessage(msg)
const signature = await web3.eth.sign(accounts[0], msgHash)
沧海一幻觉
TA贡献1824条经验 获得超5个赞
web3.eth.sign
并 web3.eth.accounts.sign
在 web3.js v1.3.4 中生成相同的签名。
如果我错了,请纠正我,似乎在幕后web3.eth.sign
调用,web3.eth.accounts.sign
添加回答
举报
0/150
提交
取消