eth的签名ecrecover签名可以吧三个参数v,s,r写成一个吗

v,s,r这三个参数是链下私钥签名签出来的,传给合约,但是一般合约对参数数量有限制,参数太多就出现

Stack too deep, try removing local variables

有没有办法可以不传三个,只传一个也能实现这个功能?

请先 登录 后评论

1 个回答

tengdw

这三个参数可以合成一个传给合约然后在合约里面做分割

function test(address owner, address sender, uint256 amount, bytes calldata sign) public {
    bytes32 digest = keccak256(abi.encodePacked(keccak256(abi.encode(sender, amount))));
    require(ecrecovery(digest, sign) == owner, "Sign Validation Failed");
}

function ecrecovery(bytes32 hash, bytes memory sig) private pure returns (address) {
    bytes32 r;
    bytes32 s;
    uint8 v;

    if (sig.length != 65) {
    return address(0);
    }

    assembly {
    r := mload(add(sig, 32))
    s := mload(add(sig, 64))
    v := and(mload(add(sig, 65)), 255)
    }

    // https://github.com/ethereum/go-ethereum/issues/2053
    if (v < 27) {
    v += 27;
    }

    if (v != 27 && v != 28) {
    return address(0);
    }

    /* prefix might be needed for geth only
    * https://github.com/ethereum/go-ethereum/issues/3731
    */
    // bytes memory prefix = "\x19Ethereum Signed Message:\n32";
    // hash = sha3(prefix, hash);

    return ecrecover(hash, v, r, s);
}
请先 登录 后评论
  • 1 关注
  • 0 收藏,2369 浏览
  • 钱二毛 提出于 2022-09-15 16:17