【发布时间】:2021-12-03 03:35:13
【问题描述】:
我需要能够从合同中检索文档,让用户钱包对其进行签名,然后将其发送回合同并验证签名。
下面是我让 address0 在客户端签名的方法:
let message : string = "check this message signed by account0";
let messageHash = keccak256(utils.toUtf8Bytes(message));
let signature = await address0.signMessage(messageHash);
await hm.connect(address0).verifyMessage(message, signature);
这是我合约中的验证器:
function verifyMessage(string memory message,
bytes memory signature)
public view returns(bool) {
//hash the plain text message
bytes32 messagehash = keccak256(bytes(message));
//hash the prefix and messagehash together
bytes32 messagehash2 = keccak256(abi.encodePacked("\x19Ethereum Signed Messsage:\n32", messagehash));
//extract the signing contract address
address signeraddress = ECDSA.recover( messagehash2, signature);
if (msg.sender==signeraddress) {
//The message is authentic
return true;
} else {
//msg.sender didnt sign this message.
return false;
}
}
很遗憾,ECDSA.recover 为 signeraddress 返回的值不是 account0 的地址,尽管有很多 经过实验,我无法从签名中推导出消息发件人的正确地址。
不胜感激。
【问题讨论】:
标签: solidity ecdsa ethers.js hardhat