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