区块链技术-签名与验签

  1. 区块链技术-签名与验签
  2. 签名
    1. 1.对消息进行hash
    2. 2.对hash的消息进行私钥签名
  3. 验签
    1. 1.对hash的消息进行二次hash
    2. 2.获取r,s,v
    3. 3.验签

区块链技术-签名与验签

先对消息进行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