Solidity

ecrecover() 總是返回 0x0000000000000000000000000000000000000000

  • July 17, 2019

我知道這些文章

你如何在 javascript 中籤署驗證消息以證明你擁有乙太坊地址?

如何正確使用 ecrecover 來驗證乙太坊簽名?


我想簽署一條消息,然後驗證它。我在 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

另外,你hashcall_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從一段數據中獲取簽名者的詳細資訊,通常是雜湊和簽名者簽署數據時獲得的簽名。

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