首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >solidity无法验证ethers.js签名数据

solidity无法验证ethers.js签名数据
EN

Ethereum用户
提问于 2022-01-28 14:41:27
回答 1查看 689关注 0票数 3

我有一份简单的合同可以收回签名人

签署:

代码语言:javascript
复制
const signer = new Wallet(process.env.PRIVATE_KEY)
console.log(signer.address)
const encoded = abiCoder.encode([ "uint" ], [ 1234 ]);
console.log(encoded)
const signature = await signer.signMessage(arrayify(encoded));
const { r, s, v } = splitSignature(signature)


console.log(v)
console.log(r)
console.log(s)

收回签字人:

代码语言:javascript
复制
function recover(uint256 amount, uint8 v, bytes32 r, bytes32 s) view external returns(address signer){

        bytes32 hash =  keccak256(abi.encodePacked(amount));
        bytes32 signedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",hash));
        signer = ecrecover(signedHash, v, r, s);

}

但不知怎么我找不到真正的签字人。

EN

回答 1

Ethereum用户

发布于 2022-03-24 15:47:58

您没有在双方签署/验证相同的数据。

在您要签名的JavaScript上(前缀隐藏在signMessage中):

  • keccak256("\x19Ethereum Signed Message:\n32" || abi.encode(uint(1234)))

但在坚实的一面,你是非常支持的

  • keccak256("\x19Ethereum Signed Message:\n32" || keccak256(abi.encode(uint(1234)))

假设您希望使用solidity代码作为引用,因为您硬编码了32字节长度,那么您希望在amount端对哈希编码进行签名。

要做到这一点,请更改这一行:

代码语言:javascript
复制
const encoded = abiCoder.encode([ "uint" ], [ 1234 ]);

适用于:

代码语言:javascript
复制
const encoded = ethers.utils.keccak256(abiCoder.encode(["uint"], [1234]));

恢复的地址与签名人的地址相匹配。

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

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

复制
相关文章

相似问题

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