首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用ecrecover验证Ledger在实体中生成的签名

无法使用ecrecover验证Ledger在实体中生成的签名
EN

Ethereum用户
提问于 2021-07-11 10:20:02
回答 2查看 1.3K关注 0票数 5

我用一个聪明的合同来验证签名:

代码语言:javascript
复制
function verify(string memory _msg, bytes memory _sig) public pure returns (address) {
    bytes memory _msgHex = bytes(_msg);
    bytes32 prefixedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", uint2str(_msgHex.length), _msgHex));
    (bytes32 _r, bytes32 _s, uint8 _v) = splitSignature(_sig);
    address signer = ecrecover(prefixedHash, _v, _r, _s);
    return signer;
}

function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) {
    require(sig.length == 65, "invalid signature length");
    assembly {
        r := mload(add(sig, 32))
        s := mload(add(sig, 64))
        v := byte(0, mload(add(sig, 96)))
    }
}

uint2str体的功能并不重要。例如,它将438转换为"438"

主函数verify根据消息和签名值返回签名者地址。

这对所有签名都有好处,但是对于一个特定的签名,它会对提供给它的任何消息返回0x0000000000000000000000000000000000000000

这一特别签名是:

0x8ecd9d9f1ece5bd0ea1638d9a05bc194bb7536aed42fd6a09fbeb1a9479c316760ce3ff2dfbf73ad7a488e6d46988a443430a13153b26b99a83d1101d00e36bb00

但是水电部没有任何问题地验证了这个签名。

有人能建议一种方法来验证这个签名吗?

P.S:这个签名是由莱杰钱包制作的。

EN

回答 2

Ethereum用户

回答已采纳

发布于 2021-07-19 15:02:06

问题是,ECRecover期望v参数是27或28,在签名中它是0。

  • r: 8ecd9d9f1ece5bd0ea1638d9a05bc194bb7536aed42fd6a09fbeb1a9479c3167
  • s: 60ce3ff2dfbf73ad7a488e6d46988a443430a13153b26b99a83d1101d00e36bb
  • v: 00

来自伊瑟姆黄纸附录F-签署事务。V的可接受值为27或28。

一个解决方案是在签名的末尾替换字节:001B (27)替换,011C (28)替换。

票数 4
EN

Ethereum用户

发布于 2022-07-21 18:00:50

如果您使用golang验证分类账签名,此存储库可能会帮助您:https://github.com/storyicon/sigverify

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/103307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档