以太坊元交易签名

2023-03-21  本文已影响0人  95加不满

实现链下的元交易签名

demo 代码如下:

/**
 * 实现元交易的签名
 */
const { ethers } = require("ethers");
const { keccak256, defaultAbiCoder, toUtf8Bytes, solidityPack } = require("ethers/lib/utils");
const { ecsign } = require('ethereumjs-util')


const sign = (digest, privateKey) => {
    return ecsign(Buffer.from(digest.slice(2), 'hex'), privateKey)
}

const MetaTransferFrom_TYPEHASH = keccak256(
    toUtf8Bytes('metaTransferFrom(address from,address to,uint256 ddcId,uint256 nonce,uint256 deadline)')
)

// Returns the EIP712 hash which should be signed by the user
// in order to make a call to `MetaTransfer`
function getMetaTransferFromDigest(
    from,
    to,
    ddcId,
    nonce,
    deadline,
    DOMAIN_SEPARATOR,
    TYPEHASH
) {
    return keccak256(
        solidityPack(
            ['bytes1', 'bytes1', 'bytes32', 'bytes32'],
            [
                '0x19',
                '0x01',
                DOMAIN_SEPARATOR,
                keccak256(
                    defaultAbiCoder.encode(
                        ['bytes32', 'address', 'address', 'uint256', 'uint256', 'uint256'],
                        [TYPEHASH, from, to, ddcId, nonce, deadline]
                    )
                ),
            ]
        )
    )
}

// Gets the EIP712 domain separator
function getDomainSeparator(name, version, chainId, contractAddress) {
    return keccak256(
        defaultAbiCoder.encode(
            ['bytes32', 'bytes32', 'bytes32', 'uint256', 'address'],
            [
                keccak256(toUtf8Bytes('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)')),
                keccak256(toUtf8Bytes(name)),
                keccak256(toUtf8Bytes(version)),
                chainId,
                contractAddress,
            ]
        )
    )
}


// 私钥信息
var privateKey = "";
var address = "0x349c666566fcD9eB2f1BCc68823b919641254d4e";
var signer = new ethers.utils.SigningKey(privateKey)


async function test1() {
    var digest = ethers.utils.hashMessage("Hello World")

    var signature = signer.signDigest(digest)

    console.log(signature);
}
// ok
async function test2() {

    const chainId = 1218;
    const _name = "ddc";
    const version = "v1.0";
    const verifyingContract = "0xc7aE70983520bC9300663E8FAbA7b9E35CCc38Cf";

    var digest = ethers.utils._TypedDataEncoder.hashDomain({
        name: _name,
        version,
        chainId,
        verifyingContract
    });

    console.log(digest);
    var expected = "0x326d4148cb163792b50319bae0158968ffaa4d44b27eecd1548fd4b7af2e7476";
    console.log(digest == expected)
}

// 1. 通过
async function testDOMAIN_SEPARATOR() {
    var name = "ddc";
    var version = "v1.0";
    var address = "0xc7aE70983520bC9300663E8FAbA7b9E35CCc38Cf";
    var chainId = 1218;
    const DOMAIN_SEPARATOR = getDomainSeparator(name, version, chainId, address)
    console.log(DOMAIN_SEPARATOR);
    var expected = "0x326d4148cb163792b50319bae0158968ffaa4d44b27eecd1548fd4b7af2e7476";
    console.log(DOMAIN_SEPARATOR == expected)
}

// 2. 通过
async function testMetaTransferFrom_TYPEHASH() {
    console.log(MetaTransferFrom_TYPEHASH);
    var expected = "0xfc899b2afbc18468d9392ec9265b9053f0b2744cb75bee3df03a7b5eabe374da";
    console.log(MetaTransferFrom_TYPEHASH == expected)
}

//3.  通过
async function testDigest() {
    var from = "0x349c666566fcD9eB2f1BCc68823b919641254d4e";
    var to = "0x349c666566fcD9eB2f1BCc68823b919641254d4e";
    var ddcId = "1";
    var nonce = "0";
    var deadline = 100000000;

    var name = "ddc";
    var version = "v1.0";
    var address = "0x349c666566fcD9eB2f1BCc68823b919641254d4e";
    var chainId = 1218;
    var DOMAIN_SEPARATOR = getDomainSeparator(name, version, chainId, address)

    console.log("DOMAIN_SEPARATOR--");
    var expected = "0xaf6bf16ac9aa99e6052384167f9ce9bf29ff07cc7c71daea02a0fb77e51f1689";
    console.log(DOMAIN_SEPARATOR == expected)


    console.log("MetaTransferFrom_TYPEHASH");
    var expected = "0xfc899b2afbc18468d9392ec9265b9053f0b2744cb75bee3df03a7b5eabe374da";
    console.log(MetaTransferFrom_TYPEHASH == expected)


    var digest = getMetaTransferFromDigest(from, to, ddcId, nonce, deadline, DOMAIN_SEPARATOR, MetaTransferFrom_TYPEHASH)
    console.log(digest);
    var expected = "0x75342bf19dd1f83653a1a373a60a22d3e0618ee0872bb69117134343cb1fa7f3";
    console.log(digest == expected)
}


// 4. 
async function testMetaTransferFrom() {
    var from = "0x349c666566fcD9eB2f1BCc68823b919641254d4e";
    var to = "0x349c666566fcD9eB2f1BCc68823b919641254d4e";
    var ddcId = "1";
    var nonce = "0";
    var deadline = 1657526317;

    var DOMAIN_SEPARATOR = "0xaf6bf16ac9aa99e6052384167f9ce9bf29ff07cc7c71daea02a0fb77e51f1689";
    var MetaTransferFrom_TYPEHASH = "0xfc899b2afbc18468d9392ec9265b9053f0b2744cb75bee3df03a7b5eabe374da";

    var digest = getMetaTransferFromDigest(from, to, ddcId, nonce, deadline, DOMAIN_SEPARATOR, MetaTransferFrom_TYPEHASH)

    var signature = signer.signDigest(digest)

    console.log(signature);

}

if (require.main === module) {
    // test1();
    // testDOMAIN_SEPARATOR();
    // testMetaTransferFrom_TYPEHASH();
    // testDigest();
    testMetaTransferFrom();
}




上一篇 下一篇

猜你喜欢

热点阅读