实现链下的元交易签名
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();
}
网友评论