我有一份简单的合同可以收回签名人
签署:
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)收回签字人:
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);
}但不知怎么我找不到真正的签字人。
发布于 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端对哈希编码进行签名。
要做到这一点,请更改这一行:
const encoded = abiCoder.encode([ "uint" ], [ 1234 ]);适用于:
const encoded = ethers.utils.keccak256(abiCoder.encode(["uint"], [1234]));恢复的地址与签名人的地址相匹配。
https://ethereum.stackexchange.com/questions/120187
复制相似问题