Ошибка проверки подписи Web3 - ethers.js - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь создать подписанное сообщение вне цепочки, используя 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);
    }
} 

Из простых эфиров, вот (упрощенная версия) код, который я использую для генерацииподпись, которую я использую в качестве параметров для вызова функции _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)

, это побуждает меня к подписи в matamask, где я подписываю правильный dataHash.Затем он записывает значения r, s и v.

В ремиксе я вызываю isSigned, передавая мой адрес метамаски, dataHash (0x952 ... d60), а также значения r, s и v, ожидая результата true, но он возвращаетfalse.Я довольно уверен в коде солидности и коде javascript, но явно что-то упускаю.Помощь очень ценится!

1 Ответ

0 голосов
/ 22 сентября 2019

Разобрался!Оказывается, я подписывал string dataHash вместо bytes значения dataHash.Я смог получить подтверждение, добавив:

let bytesDataHash = ethers.utils.arrayify(dataHash)

и подписав bytesDataHash вместо dataHash :), как обычно, Ричард Мур ответил на аналогичный вопрос на github, потому что этот человек невероятен:https://github.com/ethers-io/ethers.js/issues/245#issuecomment-408706606

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...