Web3js

如何從使用 web3.personal.sign 生成的消息和簽名中恢復地址?

  • August 12, 2021

有沒有辦法做到這一點?在使用 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"

引用自:https://ethereum.stackexchange.com/questions/69790