我用一个聪明的合同来验证签名:
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:这个签名是由莱杰钱包制作的。
发布于 2021-07-19 15:02:06
问题是,ECRecover期望v参数是27或28,在签名中它是0。
来自伊瑟姆黄纸附录F-签署事务。V的可接受值为27或28。
一个解决方案是在签名的末尾替换字节:00由1B (27)替换,01由1C (28)替换。
发布于 2022-07-21 18:00:50
如果您使用golang验证分类账签名,此存储库可能会帮助您:https://github.com/storyicon/sigverify。
https://ethereum.stackexchange.com/questions/103307
复制相似问题