小怪獸愛吃肉
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)

滄海一幻覺
TA貢獻1824條經驗 獲得超5個贊
web3.eth.sign
并?web3.eth.accounts.sign
在 web3.js v1.3.4 中生成相同的簽名。
如果我錯了,請糾正我,似乎在幕后web3.eth.sign
調用,web3.eth.accounts.sign
添加回答
舉報
0/150
提交
取消