我想跟随这个tutorial here:
但是在教程中他没有说明如何实现合同。所以我尝试用松露和ganache-cli来做。在松露测试中,我尝试使用以下代码:
const amount = web3.toWei(5, 'ether');
const Contract = await GmsPay.new({from : Sender, value : web3.toWei(10, 'ether')});
const hash = Web3Beta.utils.soliditySha3(
{t : 'address', v : Recipient},
{t : 'uint256', v : amount},
{t : 'uint256', v : 1},
{t : 'address', v : Contract.address}
);
const sig = await Web3Beta.eth.sign(hash, Sender);
const res = await Contract.claimPayment(amount, 1, sig, {from : Recipient});
但我只是继续说,“错误:处理事务时VM异常:还原”。使用调试器我看到我的代码执行到:
require(recoverSigner(message, sig) == owner);
即使我把这条线拿出来,最后一行仍然无效。我究竟做错了什么?任何帮助将不胜感激。
在我的松露测试中使用'recoverSigner(message,sig)== owner'检查进入类似的挑战。在比较R,S,V,在solidity recoverSigner()函数中产生的值与使用ethereumjs-util的fromRpcSig()函数在测试端生成的相同值之后,我意识到recoverSigner将V返回为0,而fromRpcSig这个值为27. This line提供了工作答案。
如果您遇到类似的问题,最终的splitSignature()函数将包含在下面。
function splitSignature(bytes memory sig)
internal
pure
returns (uint8, bytes32, bytes32)
{
require(sig.length == 65);
bytes32 r;
bytes32 s;
uint8 v;
assembly {
// first 32 bytes, after the length prefix
r := mload(add(sig, 32))
// second 32 bytes
s := mload(add(sig, 64))
// final byte (first byte of the next 32 bytes)
v := byte(0, mload(add(sig, 96)))
}
// support both versions of `eth_sign` responses
if (v < 27)
v += 27;
return (v, r, s);
}