Web3js
如何從使用 web3.personal.sign 生成的消息和簽名中恢復地址?
有沒有辦法做到這一點?在使用 web3.personal.sign 客戶端簽名後從簽名和消息中恢復 nodejs 伺服器端的地址?我試過這個:https : //ethereum.stackexchange.com/a/12580/42452 with ethereumjs-util; 我嘗試了 eth-sig-util 中的 recoverTypedSignature() ,但在這兩種情況下,恢復的地址都與簽名地址不匹配。
這是客戶端程式碼:
function authorize() { web3.eth.getAccounts(function (err, account) { let nonce = "123ABC"; web3.personal.sign(nonce, account[0], function (err, signature) { //send to nodejs server $.post("http://localhost:8087", {signature: signature, nonce: nonce, address: account[0]}, function (data) { console.log(data); }); }) }) }
和伺服器端:
app.post('/', cors(corsOptions), function(req, res){ const msg = web3.sha3(nonce); const sig = signature; const {v, r, s} = util.fromRpcSig(sig); const pubKey = util.ecrecover(util.toBuffer(msg), v, r, s); const addrBuf = util.pubToAddress(pubKey); const addr = util.bufferToHex(addrBuf); console.log(addr); }); app.listen(8087);
所以,幾個小時後,我找到了一個可行的解決方案。為了使它起作用,我使用了 ethereumjs-util - ecrecover 中的方法。我必須在簽名的 nonce 中添加一些前綴消息。程式碼如下所示:
function checkSignature(nonce, signature, res) { nonce = "\x19Ethereum Signed Message:\n" + nonce.length + nonce; nonce = util.keccak(nonce); const sig = signature; const {v, r, s} = util.fromRpcSig(sig); const pubKey = util.ecrecover(util.toBuffer(nonce), v, r, s); const addrBuf = util.pubToAddress(pubKey); const addr = util.bufferToHex(addrBuf); console.log(addr); }
你試過web3的
web3.eth.personal.ecRecover
嗎?例如,如果您通過
web3.eth.personal.sign("Hello world", "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", "test password!") .then(console.log); > "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400"
你“恢復”通過…
web3.eth.personal.ecRecover("Hello world", "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400").then(console.log); > "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe"