Ethereumjs
無法驗證簽名 - 恢復的密鑰與實際密鑰不匹配?
我正在嘗試使用 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"
可能是您的程式碼無法正常工作的原因。