美文网首页
以太坊元交易签名

以太坊元交易签名

作者: 95加不满 | 来源:发表于2023-03-21 15:00 被阅读0次

实现链下的元交易签名

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();
}




相关文章

  • 以太坊交易签名解析源码解读

    上篇文章《以太坊交易签名过程源码解析》从源码角度分析了一个合约调用的的签名过程,签名后的交易发送到以太坊节点后,节...

  • 《精通以太坊》-交易

    原文:Transactions 交易是由外部拥有的账户发起的签名消息,由以太坊网络传输,并记录(挖掘)在以太坊区块...

  • 一个数字引发的探索——ECDSA解析

    FISCO BCOS交易签名算法基于ECDSA原理进行设计,ECDSA也是比特币和以太坊采用的交易签名算法。本文介...

  • 以太坊交易签名

    以太坊的Transcation结构如下: 对交易签名步骤如下: 对交易本身进行rlp编码,再对rlp编码进行kec...

  • 以太坊交易及流转

    以太坊的交易 以太坊的交易最直观解释:从外部账户发送到区块链上的另一个账户的消息和签名的数据包。 包含如下内容: ...

  • 理解以太坊的椭圆曲线签名

    原理 以太坊数字签名和比特币的关系 以太坊数字签名,几乎完全沿用了比特币的数字签名算法ECDSA-secp256k...

  • ETH交易源码

    006 以太坊源码解析 - 交易源码分析 以太坊交易基本流程: 完整流程分为以下几个步骤: 发起交易:指定目标地址...

  • 吐槽君烤仔 | Layer 2恐将割裂以太坊生态,Layer 1

    近来,随着以太坊上 DeFi 生态的活跃,以太坊的交易处理能力捉襟见肘。当前,以太坊的交易费用越来越高,以致于一次...

  • 以太坊交易签名过程源码解析

    向以太坊网络发起一笔交易时,需要使用私钥对交易进行签名,那么从原始的请求数据到最终的签名后的数据,这中间的数据流转...

  • 以太坊交易签名过程源码解析

    向以太坊网络发起一笔交易时,需要使用私钥对交易进行签名。那么从原始的请求数据到最终的签名后的数据,这中间的数据流转...

网友评论

      本文标题:以太坊元交易签名

      本文链接:https://www.haomeiwen.com/subject/knemrdtx.html