猿问

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

当我使用 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.length

let 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)

这就是结果。

小怪兽爱吃肉
浏览 114回答 3
3回答

慕的地8271018

源代码 显示,区别在于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)

沧海一幻觉

web3.eth.sign并 web3.eth.accounts.sign在 web3.js v1.3.4 中生成相同的签名。如果我错了,请纠正我,似乎在幕后web3.eth.sign调用,web3.eth.accounts.sign

函数式编程

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

相关分类

JavaScript
我要回答