为了账号安全,请及时绑定邮箱和手机立即绑定

eth.sign 与 eth.accounts.sign 创建不同的符号

eth.sign 与 eth.accounts.sign 创建不同的符号

小怪兽爱吃肉 2023-08-18 16:43:58
当我使用 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)


查看完整回答
反对 回复 2023-08-18
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

web3.eth.sign并 web3.eth.accounts.sign在 web3.js v1.3.4 中生成相同的签名。

如果我错了,请纠正我,似乎在幕后web3.eth.sign调用,web3.eth.accounts.sign


查看完整回答
反对 回复 2023-08-18
?
函数式编程

TA贡献1807条经验 获得超9个赞

简而言之,这是设计使然(据我所知),以防止将签名的以太坊交易解释为其他数据(例如元交易,由智能合约逻辑验证)。


查看完整回答
反对 回复 2023-08-18
  • 3 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信