Solidity

OpenZeppelin ECRecovery 不起作用

  • May 19, 2018

我正在嘗試將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 個字節,正如預期的那樣。您必須確保將它們作為字節數組發送。

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