主页 > imtoken钱包 > 以太坊签名和验证

以太坊签名和验证

imtoken钱包 2023-04-06 06:12:39

前言

以太坊的签名和验证可以用于metamask钱包登录、多重签名钱包等应用。但是目前还没有完整的文档进行相关解释以太坊钱包多久到账以太坊钱包多久到账。 这里笔者整理一下相关的方法

已签名元掩码的以太坊签名

const msg = '0x553d52098a30d90afbae2f14f7872b8ede6c2eb7020661813b9f75df14cb8da7'
const account = await signer.getAddress()
const signedMessage = await ethereum.request({ method: "personal_sign", params: [account, msg] })

以太签名

const msg = '0x553d52098a30d90afbae2f14f7872b8ede6c2eb7020661813b9f75df14cb8da7'
//  亦可以用私钥来构建signer
const provider = new ethers.providers.Web3Provider(window.ethereum)
const signer = provider.getSigner()
//  这里一定要把msg通过arrayify方法,功能类似于下文中solidity中的getEthSignedMessageHash方法
const signedMessage = await signer.signMessage(ethers.utils.arrayify(msg))

以太坊轻钱包_以太坊钱包多久到账_以太坊钱包是什么

签名验证solidity签名验证

function getEthSignedMessageHash(bytes32 _messageHash)
        public
        pure
        returns (bytes32)
    {
        /*
        Signature is produced by signing a keccak256 hash with the following format:
        "\x19Ethereum Signed Message\n" + len(msg) + msg
        */
        return
            keccak256(

以太坊钱包多久到账_以太坊轻钱包_以太坊钱包是什么

abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) ); } function splitSignature(bytes memory sig) public pure returns ( bytes32 r, bytes32 s, uint8 v ) {

以太坊钱包是什么_以太坊轻钱包_以太坊钱包多久到账

require(sig.length == 65, "invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix

以太坊轻钱包_以太坊钱包是什么_以太坊钱包多久到账

r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } // implicitly return (r, s, v) } // !!!_ethSignedMessageHash需要把msg传入getEthSignedMessageHash再次hash function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) public

以太坊钱包是什么_以太坊钱包多久到账_以太坊轻钱包

pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); }

以太签名验证

//  理论上可以签名和验签都不加ethers.utils.arrayify(),但是为了和solidity验签签名保持一致,最好如此
const signerAddr = await ethers.utils.verifyMessage(ethers.utils.arrayify(msg), signedMessage)

参考

举例说明可靠性

使用 Ethers.js 签署消息并使用 Solidity 合约进行验证