我需要能够从合同中检索文档,让用户钱包对其进行签名,然后将其发送回合同并验证签名。
这是我让 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 的地址,尽管经过大量实验,我仍无法从签名中得出消息发送者的正确地址。
将不胜感激任何指针。