Solidity
ecrecover() 總是返回 0x0000000000000000000000000000000000000000
我知道這些文章
你如何在 javascript 中籤署驗證消息以證明你擁有乙太坊地址?
我想簽署一條消息,然後驗證它。我在 geth 終端中使用以下命令行。
var msg = web3.sha3('Schoolbus') var signature = web3.eth.sign(web3.eth.accounts[0], msg) var r = signature.slice(0, 66) var s = '0x' + signature.slice(66, 130) var v = '0x' + signature.slice(130, 132) v = web3.toDecimal(v)
然後我使用下面的智能合約,並呼叫:
call_ecover(r, s, v, msg)
但我得到的是:0x0000000000000000000000000000000000000000
pragma solidity ^0.5.0; contract Call_verify{ function call_ecover(bytes32 r, bytes32 s, uint8 v, bytes32 hash)external pure returns (address){ bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHash = keccak256(abi.encodePacked(prefix,hash)); return ecrecover(prefixedHash, v, r, s); } }
請注意,我在 remix 上使用的是編譯器版本 0.5.3。
問題:為什麼我不能在我的合約中獲得 ecrecover() 函式的返回值?我錯過了什麼嗎?
根據文件,它是
web3.eth.sign(data, address)
. 我認為你顛倒了參數。請參閱https://web3js.readthedocs.io/en/1.0/web3-eth.html#sign。另外,你
hash
在call_ecover
功能中發送好東西嗎?我認為您需要發送msg
(在您的情況下是雜湊的雜湊:)的雜湊web3.sha3(msg)
。
以下程式碼片段有效:
//pragma solidity ^0.5.0 function checkSignature(bytes32 h, uint8 v, bytes32 r, bytes32 s) public pure returns (address signer) { bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHash = keccak256(abi.encodePacked(prefix,h)); signer = ecrecover(prefixedHash, v, r, s); }
//web3 1.0 //multisig is my constract instance and second is an account address. const message = "SchoolBus"; const h = web3.utils.soliditySha3(message); let signature = await web3.eth.sign(h, second); var r = signature.slice(0, 66); var s = "0x" + signature.slice(66, 130); var v = "0x" + signature.slice(130, 132); v = web3.utils.toDecimal(v); v = v + 27; const result = await multisig.checkSignature(h, v, r, s); //result === second
注意:
web3.sha3
是來自 v0.2x 的方法。在 v1.0 中,使用的功能如上所述。ecrecover
從一段數據中獲取簽名者的詳細資訊,通常是雜湊和簽名者簽署數據時獲得的簽名。