区块链技术-签名与验签
先对消息进行hash,再通过私钥将此hash进行签名,
签名
1.对消息进行hash
2.对hash的消息进行私钥签名
验签
1.对hash的消息进行二次hash
2.获取r,s,v
3.验签
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract VerifySignature {
// 签名
/*
对内容进行hash
对hash进行签名(用私钥)
*/
// 验证签名
/*
重新对内容进行hash
重建签名,对比解密后的地址
*/
function getMessageHash(string memory _to, uint _amount, string memory _message, uint _nonce) public pure returns (bytes32) {
return keccak256(abi.encodePacked(_to, _amount, _message, _nonce));
}
function getEthSignedMessageHash(bytes32 _messageHash) private pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash));
}
function verify(string memory _to, uint _amount, string memory _message, uint _nonce, bytes32 r, bytes32 s, uint8 v) external view returns (bool) {
bytes32 messageHash = getMessageHash(_to, _amount, _message, _nonce);
bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
return ecrecover(ethSignedMessageHash, v, r, s) == msg.sender;
}
}
// const provider = new _ethers.providers.Web3Provider(window.ethereum)
// const signer = provider.getSigner()
// const messageHashBytes = _ethers.utils.arrayify("")
// const flatSig = await signer.signMessage(messageHashBytes)
// _ethers.utils.splitSignature(flatSig)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com