Solidity
OpenZeppelin ECRecovery 不起作用
我正在嘗試將OpenZeppelin ECRecovery 庫用於我正在處理的項目。
不幸的是,我不完全理解它是如何工作的,也沒有它的文件。
假設我想在消息“你好”上簽名。首先,我對其進行雜湊處理:
msg = web3.sha3('hello');
然後我使用 web3.eth.sign 和 metamask 對其進行簽名。
web3.eth.sign(web3.eth.accounts[0], msg, (err, res) => { sig = res; })
返回的簽名是:
0xebb853cf9818c590e428bfa2b793b23e975d978bfefbb8aff164a282786c3eda0054113161b1a72f29f371a35b9a378413d689e49addcea34a8a617270c2bc951c
在庫程式碼中它說:
// Check the signature length if (sig.length != 65) { return (address(0)); }
因此,如果我使用雜湊和上述簽名呼叫該函式,它將失敗,因為此簽名的長度為 132。
我還考慮過僅通過在 JavaScript 中拆分來使用簽名的 r 或 s 值:(即使我什至不知道這些值代表什麼,因為在solidity 文件中絕對沒有資訊)
var r = sig.substr(0,66); var s = "0x" + sig.substr(66,64);
但是兩者的長度都是 66 並且也失敗了。
有沒有人使用過他們的圖書館並且可以幫助我?
它的長度是 132,但前綴 ‘0x’ 有 2 個,然後你有 130 個十六進製字元,代表 130/2 = 65 個字節,正如預期的那樣。您必須確保將它們作為字節數組發送。