在以太坊中签名和验证消息

问题描述 投票:0回答:1

我想跟随这个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);

即使我把这条线拿出来,最后一行仍然无效。我究竟做错了什么?任何帮助将不胜感激。

ethereum solidity truffle
1个回答
1
投票

在我的松露测试中使用'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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.