Ethereumjs

無法驗證簽名 - 恢復的密鑰與實際密鑰不匹配?

  • February 8, 2022

我正在嘗試使用 ethereumjs 來驗證簽名。使用以下參數通過https://etherscan.io/verifySig成功驗證簽名:

  • $$ Step 1 $$地址:0x817A8d457bF4bFcDB833a0C72eb2f879C857e1E5
  • $$ Step 2 $$消息簽名雜湊:0xa3ea6f0c3302f82103a62bb31bdbd9ea5a25436d2a3414d0cb1f60e7fc8cf0fb337c1205ad5e6180015e1fbb9fecffe956e519b6f4af79a08df7a1275fb8abc71c
  • $$ Step 3 $$輸入簽名的原始消息:lol:18006416246562465

不幸的是,它沒有使用 ethereumjs 進行驗證。這是我的程式碼:

import assert from 'assert'
import { ecrecover, pubToAddress, keccak } from 'ethereumjs-util'

var signature = "a3ea6f0c3302f82103a62bb31bdbd9ea5a25436d2a3414d0cb1f60e7fc8cf0fb337c1205ad5e6180015e1fbb9fecffe956e519b6f4af79a08df7a1275fb8abc71c";
var message = 'lol:18006416246562465';
message = keccak(new Buffer(message));

var messageBuffer = new Buffer(message);

var r = new Buffer(signature.substring(0, 64), 'hex')
var s = new Buffer(signature.substring(64, 128), 'hex')
var v = parseInt(signature.substring(128, 130), 16);

var pub = ecrecover(messageBuffer, v, r, s);
var recoveredAddress = '0x' + pubToAddress(pub).toString('hex')

console.log(recoveredAddress);

如果我理解正確,恢復的地址應該等於原始地址,但事實並非如此。

我的理解是完全不正確還是我做錯了什麼?

這是我需要做的:

#
#-----[ FIND ]------------------------------------------
#
message = keccak(new Buffer(message));
#
#-----[ REPLACE WITH ]----------------------------------
#
message = "\x19Ethereum Signed Message:\n" + message.length + message;
message = keccak(new Buffer(message));

我能夠使用 web3 庫完成簽名。該庫中有一些幫助程序,因此您無需自己建構 rsv 和其他部分。這是一個範例函式:

function generateSignature(message) {
 const signature = web3.eth.accounts.sign(
   web3.utils.soliditySha3(message),
   private_key
 );
 return signature.signature;
}

如果這可以正確生成您的簽名,您應該能夠從那裡向後工作。

要記住的另一件事是,消息開頭的特定規範"\x19Ethereum Signed Message:\n32"可能是您的程式碼無法正常工作的原因。

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