Web3 签名验证失败 - ethers.js

a94*_*a94 8 javascript solidity web3js ethers.js

我正在尝试使用 ethers.js 创建一条链下签名消息,并使用 验证该消息在链上ecrecover。我正在从我的元掩码钱包签署正确的消息,并将该签名中的 r、s 和 v 传递到 ecrecover,但没有与我的元掩码钱包匹配。

我的可靠性代码应该适用于带前缀或不带前缀的签名。

这是我用来验证签名的合同:

pragma solidity ^0.5.0;
contract SignatureVerifier {
    /// @dev Signature verifier
    function isSigned(address _address, bytes32 messageHash, uint8 v, bytes32 r, bytes32 s) public pure returns (bool) {
        return _isSigned(_address, messageHash, v, r, s) || _isSignedPrefixed(_address, messageHash, v, r, s);
    }

    /// @dev Checks unprefixed signatures.
    function _isSigned(address _address, bytes32 messageHash, uint8 v, bytes32 r, bytes32 s)
        internal pure returns (bool)
    {
        return ecrecover(messageHash, v, r, s) == _address;
    }

    /// @dev Checks prefixed signatures.
    function _isSignedPrefixed(address _address, bytes32 messageHash, uint8 v, bytes32 r, bytes32 s)
        internal pure returns (bool)
    {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        return _isSigned(_address, keccak256(abi.encodePacked(prefix, messageHash)), v, r, s);
    }
} 
Run Code Online (Sandbox Code Playgroud)

以下是我用来生成签名的代码(简化版本),我将其用作函数调用的参数_isSigned

let provider = new ethers.providers.Web3Provider(window.ethereum)
let signer = provider.getSigner()
let dataHash = '0x952d17582514a6a434234b10b8e6b681b6006c8ed225d479fa3db70828b9cd60'
let signature = await signer.signMessage(dataHash)
let sigBreakdown = ethers.utils.splitSignature(signature)
console.log(sigBreakdown)
Run Code Online (Sandbox Code Playgroud)

这提示我在 matamask 中进行签名,我在其中签署了正确的 dataHash。然后它记录 r、s 和 v 值。

在 remix 中,我调用isSigned,传递我的元掩码地址、dataHash (0x952...d60) 以及 r、s 和 v 值,期望结果为 ,true但它返回false。我对这里的 Solidity 代码和 javascript 代码相当有信心,但显然我遗漏了一些东西。非常感谢帮助!

a94*_*a94 6

我正在签署stringdataHash 而不是bytesdataHash 的值。我能够通过添加以下内容来获得验证:

let bytesDataHash = ethers.utils.arrayify(dataHash)
Run Code Online (Sandbox Code Playgroud)

并签名bytesDataHash而不是像dataHash往常一样:)理查德摩尔在github上回答了类似的问题,因为那个人太不可思议了: https: //github.com/ethers-io/ethers.js/issues/245#issuecomment-408706606