Solidity

無法在solidity中使用ecrecover來恢復用於簽名消息的地址,只需返回0x0地址

  • February 4, 2018

我在 geth 中執行以下操作:

var msgHash = web3.sha3("hello")
var signature = eth.sign(eth.accounts[0], msgHash)
var r = signature.slice(0,64)
var s = "0x" +signature.slice(64,128)
var v = signature.slice(128,130)

R = signature.slice(0,64)“0x6d49c891d29b33c292232f690c9972e17e0dbead7d4fc446bb4ce5892f0e55”S = signature.slice(64128)“a22c9f3c20a7f0bc90666d1d1c6f269658a0ccd56b1db1812671e23331d8ad2c”V = signature.slice(128130)“52”

然後我呼叫以下可靠性程式碼

function verify(bytes32 msgHash, uint8 v, bytes32 r, bytes32 s) public {
   bytes memory prefix = "\x19Ethereum Signed Message:\n32";
   bytes32 prefixedHash = keccak256(prefix, msgHash);
   a = ecrecover(prefixedHash, v, r, s);
}

它返回以下內容: 0x0000000000000000000000000000000000000000

對此絕對感到困惑,我查看了以下執行緒但沒有成功:

來自 Geth 和 web3.eth.sign 的 ecrecover

您必須在執行切片之前取出 0x - 這只是為了表明該字元串是十六進制的,而不是 r 值的一部分。

在切片之前,您需要去掉0x前綴。

ethereumjs-util有一個非常方便的功能fromRpcSig,你可以像使用它一樣使用它

const eutil = require('ethereumjs-util')

const hash = web3.sha3('hello world')
const rpcSig = web3.eth.sign(web3.eth.coinbase, eutil.bufferToHex(hash))
const rsv = eutil.fromRpcSig(rpcSig)
// then call your ecrecover with 
// hash, eutil.bufferToHex(rsv.r), eutil.bufferToHex(rsv.s), rsv.v

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