中移链元交易功能对接说明

前言

12月5日,由中国移动信息技术中心研发的中移链“元交易”功能,已在BSN-DDC基础网络正式上线。中移链“元交易”是将多个连续的中移链链操作打包整合,保障操作事务统一、一致的快捷交易开发工具包。在中移链原有链上应用开发SDK的基础上,中移链“元交易”降低了区块链业务应用的开发复杂度,对构建高效便捷的区块链应用开发经济模型提供了重要支撑。

一、元交易功能

(一)功能简介

“元交易”是由平台方代终端用户(DDC的拥有者)发起DDC铸造、转移或者销毁的相关交易,且本功能由平台方代付资源费和手续费。在传统的交易模式中,如发起铸造、转移、销毁等操作时,需要终端用户拥有足额的链资源和DDC合约中的手续费,并且流程较长且复杂。本次中国移动信息技术中心研发的中移链“元交易”功能,通过将交易的发起方从终端用户变更为平台方,控制发起方的数量,使发起方充值链资源变得容易,同时从根本上解决了终端用户操作复杂的弊端。

(二)应用场景

1、终端用户根据交易请求参数和权限私钥,离线生成元交易的签名,并将签名值发送给平台方,由平台方代为发起元交易执行;

2、终端用户将私钥托管给平台方,平台方根据交易请求参数和权限私钥,生成元交易的签名并发起元交易执行。

二、元交易签名

(一)基于ddc-sdk-java进行元交易签名

1、平台方添加终端用户的公钥,参考ddc-sdk中的addMetaUser方法

1)测试用例

@Test
public void addMetaUser() {
    //设置平台方账户私钥
    ChainConfig.setPk("5Jj3bPpWtbJex5DGXCLjE8c5Gr9SudFRogkwXvd1KHGGa7ZWYS1");
    DDCPermissionService ddcPermissionService = new DDCPermissionServiceImpl();
    //平台方账户、终端用户账户、终端用户账户公钥
    PushedTransaction pt1 = ddcPermissionService.addMetaUser("ddcplatform1", "ddcconsumer1", "EOS6R3jYqb3uZsVgzJz4HVLcYV94CLkr3u9unEzm5rpuAqUos7fqK");
    System.out.println(JSONUtil.toJsonStr(pt1));
}

2)输出结果

{
    "transactionId":"3ea5f2b4e21642f6862a0120a11ff9ef0fd54bc34f4d5c79884bc66b5f5bd86e",
    "processed":{
        "id":"3ea5f2b4e21642f6862a0120a11ff9ef0fd54bc34f4d5c79884bc66b5f5bd86e",
        "blockNum":169181,
        "blockTime":"2023-02-01T06:23:56.000",
        "receipt":{
            "cpuUsageUs":278,
            "netUsageWords":21,
            "status":"executed"
        },
        "elapsed":278,
        "netUsage":168,
        "scheduled":false,
        "actionTraces":[
            {
                "actionOrdinal":1,
                "creatorActionOrdinal":0,
                "closestUnnotifiedAncestorActionOrdinal":0,
                "receipt":{
                    "abiSequence":1,
                    "actDigest":"d3950f01d30eeee961fb2e2335b00cfdf098b19a6671d18189bf59454f8410df",
                    "authSequence":[
                        [
                            "ddcplatform1",
                            "11"
                        ]
                    ],
                    "codeSequence":1,
                    "globalSequence":169952,
                    "receiver":"ddccontract1",
                    "recvSequence":69
                },
                "receiver":"ddccontract1",
                "act":{
                    "account":"ddccontract1",
                    "authorization":[
                        {
                            "actor":"ddcplatform1",
                            "permission":"active"
                        }
                    ],
                    "data":{
                        "sender":"ddcplatform1",
                        "account":"ddcconsumer1",
                        "pubKey":"EOS6R3jYqb3uZsVgzJz4HVLcYV94CLkr3u9unEzm5rpuAqUos7fqK"
                    },
                    "hexData":"10e4a52b9b58514a10ae921a4f8a504a35454f533652336a59716233755a7356677a4a7a3448564c6359563934434c6b72337539756e457a6d357270754171556f733766714b",
                    "name":"addmetauser"
                },
                "contextFree":false,
                "elapsed":125,
                "console":"",
                "trxId":"3ea5f2b4e21642f6862a0120a11ff9ef0fd54bc34f4d5c79884bc66b5f5bd86e",
                "blockNum":169181,
                "blockTime":"2023-02-01T06:23:56.000",
                "accountRamDeltas":[

                ],
                "accountDiskDeltas":[

                ],
                "returnValueHexData":"",
                "inlineTraces":[

                ]
            }
        ]
    }
}

2、终端用户根据DDC拥有者查询Nonce值,参考ddc-sdk中的getNonce方法

1)测试用例

@Test
public void getMetaNonce() {
    DDC1155Service ddc1155Service = new DDC1155ServiceImpl();
    //终端用户账户
    BigInteger nonce = ddc1155Service.getNonce("ddcconsumer1");
    System.out.println("nonce:" + nonce);
}

2)输出结果

nonce:2

3、终端用户根据交易请求参数,生成签名所需的摘要数据(以元交易生成为例)

1)测试用例

@Test
public void getMetaMintDigest() {
    BigInteger amount = BigInteger.valueOf(10);
    String ddcURI = "https://bitnodes.io/0001";
    String memo = "memo0001";
    //上一步获取的nonce值
    BigInteger nonce = BigInteger.valueOf(2);
    //过期时间(时间戳:秒)
    BigInteger deadline = BigInteger.valueOf(1671096761);

    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String digest = metaTransaction.getSafeMintDigest("ddcplatform1", "ddcconsumer1", "ddcconsumer1", amount, ddcURI, memo, nonce, deadline);
    System.out.println("digest:" + digest);
}

2)输出结果

digest:baa58785f08da6bfe06e3675423478f8039a55f5aaf57eea195b47b9ebb6732c

4、终端用户根据权限私钥和摘要数据,生成元交易签名

1)测试用例

@Test
public void getMetaMintSignature() {
    //终端用户账户私钥
    String privateKey = "5JAT6ZYDhvvWVP2UMat84BhCyu5U3PYMYtkzqXEgoPoyhdJJfV1";
    //上一步获取的摘要值
    String digest = "baa58785f08da6bfe06e3675423478f8039a55f5aaf57eea195b47b9ebb6732c";

    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String signature = metaTransaction.generateSignature(privateKey, digest.getBytes(StandardCharsets.UTF_8));
    System.out.println("signature:" + signature);
}

2)输出结果

signature:SIG_K1_K8W87kgEkB3EwUUTSzqU5WjnuQJ5Q11mcUx7PGJhCG5ZgALHzmxep8s9AVWXyXAEfhc9xb1Bz53biadmnRBkyRzWnYGU8W

(二)基于ddc-sdk-js进行元交易签名

1、平台方添加终端用户的公钥,参考ddc-sdk中的addMetaUser方法
1)测试用例

import EOSDDC from 'eos-ts-sdk';
const addMetaUserTest = (sender='ddcplatform1',account='ddcconsumer1') => {
    const privateKey = "5JAT6ZYDhvvWVP2UMat84BhCyu5U3PYMYtkzqXEgoPoyhdJJfV1";
    const pubKey= "EOS6R3jYqb3uZsVgzJz4HVLcYV94CLkr3u9unEzm5rpuAqUos7fqK";
    let ddcPermissionService = new EOSDDC('http://101.42.251.173:3921', 'ddccontract1');
    const result1 = ddcPermissionService.addMetaUser(sender, account, pubKey,privateKey);
    console.log(result1);
}

2)输出结果

{
    "transaction_id": "4b2b33a6e380ba4726ce6360a91435fe93ec304b0e06ee2170de5a537f254769", 
    "processed": {
        "id": "4b2b33a6e380ba4726ce6360a91435fe93ec304b0e06ee2170de5a537f254769", 
        "block_num": 2363, 
        "block_time": "2023-01-31T07:13:47.000", 
        "producer_block_id": null, 
        "receipt": {
            "status": "executed", 
            "cpu_usage_us": 270, 
            "net_usage_words": 21
        }, 
        "elapsed": 270, 
        "net_usage": 168, 
        "scheduled": false, 
        "action_traces": [
            {
                "action_ordinal": 1, 
                "creator_action_ordinal": 0, 
                "closest_unnotified_ancestor_action_ordinal": 0, 
                "receipt": {
                    "receiver": "ddccontract1", 
                    "act_digest": "d3950f01d30eeee961fb2e2335b00cfdf098b19a6671d18189bf59454f8410df", 
                    "global_sequence": 3129, 
                    "recv_sequence": 64, 
                    "auth_sequence": [
                        [
                            "ddcplatform1", 
                            6
                        ]
                    ], 
                    "code_sequence": 1, 
                    "abi_sequence": 1
                }, 
                "receiver": "ddccontract1", 
                "act": {
                    "account": "ddccontract1", 
                    "name": "addmetauser", 
                    "authorization": [
                        {
                            "actor": "ddcplatform1", 
                            "permission": "active"
                        }
                    ], 
                    "data": {
                        "sender": "ddcplatform1", 
                        "account": "ddcconsumer1", 
                        "pubKey": "EOS6R3jYqb3uZsVgzJz4HVLcYV94CLkr3u9unEzm5rpuAqUos7fqK"
                    }, 
                    "hex_data": "10e4a52b9b58514a10ae921a4f8a504a35454f533652336a59716233755a7356677a4a7a3448564c6359563934434c6b72337539756e457a6d357270754171556f733766714b"
                }, 
                "context_free": false, 
                "elapsed": 135, 
                "console": "", 
                "trx_id": "4b2b33a6e380ba4726ce6360a91435fe93ec304b0e06ee2170de5a537f254769", 
                "block_num": 2363, 
                "block_time": "2023-01-31T07:13:47.000", 
                "producer_block_id": null, 
                "account_ram_deltas": [ ], 
                "account_disk_deltas": [ ], 
                "except": null, 
                "error_code": null, 
                "return_value_hex_data": "", 
                "inline_traces": [ ]
            }
        ], 
        "account_ram_delta": null, 
        "except": null, 
        "error_code": null
    }
}

2、终端用户根据DDC拥有者查询Nonce值,参考ddc-sdk中的getNonce方法

1)测试用例

const getNonce1155 = async () => {
    const Meta1155 = new EOSDDC(
        'http://101.42.251.173:3921',
        'ddccontract1',
    );
    const nonce = await Meta1155.getNonce('ddcconsumer1');
    console.log(`nonce:${nonce}`);
    return nonce;
};

2)输出结果

nonce:2

3、终端用户根据交易请求参数,生成签名所需的摘要数据(以元交易生成为例)

1)测试用例

const getMetaMintDigest1155 = async () => {
        const amount = 10;
        const ddcURI = 'https://bitnodes.io/0001';
        const memo = 'memo0001';
        const deadline = 1671096761;
        const nonce = await getNonce1155();
        const ddc1155 = new DDC1155MetaTransaction('ddccontract1');
        const digest = await ddc1155.getSafeMintDigest(
            'ddcplatform1',
            'ddcconsumer1',
            'ddcconsumer1',
            amount,
            ddcURI,
            memo,
            nonce,
            deadline,
        );
        console.log(`digest:${digest}`);
        return digest;
    };

2)输出结果

digest:baa58785f08da6bfe06e3675423478f8039a55f5aaf57eea195b47b9ebb6732c

4、终端用户根据权限私钥和摘要数据,生成元交易签名
1)测试用例

const getMetaMintSignature1155 = async () => {
        const key = '5JAT6ZYDhvvWVP2UMat84BhCyu5U3PYMYtkzqXEgoPoyhdJJfV1';
        const digest = await getMetaMintDigest1155(); // baa58785f08da6bfe06e3675423478f8039a55f5aaf57eea195b47b9ebb6732c
        const ddc1155 = new DDC1155MetaTransaction('ddccontract1');
        const signature = await ddc1155.generateSignature(key, digest);
        console.log(`signature:${signature}`);
        return signature;
    };

2)输出结果

signature:SIG_K1_K8W87kgEkB3EwUUTSzqU5WjnuQJ5Q11mcUx7PGJhCG5ZgALHzmxep8s9AVWXyXAEfhc9xb1Bz53biadmnRBkyRzWnYGU8W

三、元交易方法调用

(一)元交易生成

1、功能介绍

终端用户可以通过授权平台方调用该方法对 DDC 进行元交易生成,注:调用此接口所消耗的能量值和业务费对应的是平台方账户。

2、方法定义

1)SDK 方法定义:

DDC721Service PushedTransaction metaSafeMint(String sender, String from, String to, String ddcURI, String memo, BigInteger nonce, BigInteger deadline, String signature);

DDC1155Service PushedTransaction metaSafeMint(String sender, String from, String to, BigInteger amount, String ddcURI, String memo, BigInteger nonce, BigInteger deadline, String signature);

2)EOS 合约方法:

metamint(name sender,name from, name to, uint64_t amount, std::string ddc_uri, uint64_t business_type, std::string memo, uint64_t nonce, uint64_t deadline, signature signature);

3、输入参数

字段 字段名 类型 是否必传 备注
sender 调用者 String 调用者地址
from 发送方账户 String
to 接收者账户 String
amount DDC数量 BigInteger DDC721不传
ddcURI DDC资源标识符 String
memo 附加数据 String
nonce Nonce值 BigInteger
deadline 过期时间 BigInteger
signature 签名值 String

4、输出参数

字段 字段名 类型 备注
transactionId 交易哈希 String
processed 执行信息 Processed

5、API 调用

1)测试用例(以DDC1155为例)

@Test
public void metaSafeMint1155() {
    BigInteger amount = BigInteger.valueOf(10);
    String ddcURI = "https://bitnodes.io/0001";
    String memo = "memo0001";
    BigInteger deadline = BigInteger.valueOf(1671096761);
    DDC1155Service ddc1155Service = new DDC1155ServiceImpl();
    BigInteger nonce = ddc1155Service.getNonce(accountList.get(2));
    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String digest = metaTransaction.getSafeMintDigest(accountList.get(1), accountList.get(2), accountList.get(2), amount, ddcURI, memo, nonce, deadline);
    String signature = metaTransaction.generateSignature(privateKey, digest.getBytes(StandardCharsets.UTF_8));
    PushedTransaction pt = ddc1155Service.metaSafeMint(accountList.get(1), accountList.get(2), accountList.get(2), amount, ddcURI, memo, nonce, deadline, signature);
    Map trxMap = ChainUtil.getInstance().parseTrxResp(pt);
    System.out.println(JSONUtil.parse(trxMap));
}

2) 输出结果

{
    "actionTraces":[
        {
            "actData":{
                "ddc_id":6899,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"mint",
                "fee":"0.0001 FEE",
                "balance":"8.2350 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "to":"ddcconsumer1",
                "ddc_id":6899,
                "ddc_uri":"https://bitnodes.io/0001",
                "allowed":1,
                "amount":10,
                "business_type":2,
                "ddc_name":"",
                "ddc_symbol":""
            },
            "actAccount":"ddccontract1",
            "actName":"receiptmint"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "from":"ddcconsumer1",
                "to":"ddcconsumer1",
                "amount":10,
                "ddc_uri":"https://bitnodes.io/0001",
                "business_type":2,
                "memo":"memo0001",
                "nonce":77,
                "deadline":1671096761,
                "signature":"SIG_K1_K5wAsgrAAoAyafBVXSXQQ8qSn6N7tY6XiyJ3wYvv1Bky3fZbYQJmuVw94wYnAqfqRfNZ7Zt7umMiSroArYSbu3vVbphZmh"
            },
            "actAccount":"ddccontract1",
            "actName":"metamint"
        }
    ],
    "blockNum":8126659,
    "blockTime":"2022-12-28T07:03:12.000",
    "transactionId":"9d2e99de165568cd74ef4b779c73f4afa2085e023b1d80ccbd521237c9c1efa2"
}

(二)元交易批量生成

1、功能介绍

终端用户可以通过授权平台方调用该方法对 DDC 进行元交易批量安全生成,注:调用此接口所消耗的能量值和业务费对应的是平台方账户。

2、方法定义

1)SDK 方法定义:

DDC1155Service PushedTransaction metaSafeMintBatch(String sender, String from, String to, List amounts, List ddcURIs, String memo, BigInteger nonce, BigInteger deadline, String signature);

2)EOS 合约方法:

metamintbatc(name sender, name from,name to, std::vector amounts, std::vector ddc_uris, uint64_t business_type, std::string memo, uint64_t nonce, uint64_t deadline, signature signature);

3、输入参数

字段 字段名 类型 是否必传 备注
sender 调用者 String 调用者地址
from 发送方账户 String
to 接收者账户 String
amounts DDC数量列表 List
ddcURIs DDC资源标识符列表 List
memo 附加数据 String
nonce Nonce值 BigInteger
deadline 过期时间 BigInteger
signature 签名值 String

4、输出参数

字段 字段名 类型 备注
transactionId 交易哈希 String
processed 执行信息 Processed

5、API 调用

1)测试用例

@Test
public void metaSafeMintBatch1155() {
    List amounts = Arrays.asList(BigInteger.valueOf(20), BigInteger.valueOf(30));
    List ddcURIs = Arrays.asList("http://ddcUrl1", "http://ddcUrl2");
    String memo = "memo0001";
    BigInteger deadline = BigInteger.valueOf(1671096761);
    DDC1155Service ddc1155Service = new DDC1155ServiceImpl();
    BigInteger nonce = ddc1155Service.getNonce(accountList.get(2));
    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String digest = metaTransaction.getSafeMintBatchDigest(accountList.get(1), accountList.get(2), accountList.get(2), amounts, ddcURIs, memo, nonce, deadline);
    String signature = metaTransaction.generateSignature(privateKey, digest.getBytes(StandardCharsets.UTF_8));
    PushedTransaction pt = ddc1155Service.metaSafeMintBatch(accountList.get(1), accountList.get(2), accountList.get(2), amounts, ddcURIs, memo, nonce, deadline, signature);
    Map trxMap = ChainUtil.getInstance().parseTrxResp(pt);
    System.out.println(JSONUtil.parse(trxMap));
}

2) 输出结果

{
    "actionTraces":[
        {
            "actData":{
                "ddc_id":6900,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"mintbatch",
                "fee":"0.0001 FEE",
                "balance":"8.2349 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "to":"ddcconsumer1",
                "ddc_id":6900,
                "ddc_uri":"http://ddcUrl1",
                "allowed":1,
                "amount":20,
                "business_type":2,
                "ddc_name":"",
                "ddc_symbol":""
            },
            "actAccount":"ddccontract1",
            "actName":"receiptmint"
        },
        {
            "actData":{
                "ddc_id":6901,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"mintbatch",
                "fee":"0.0001 FEE",
                "balance":"8.2348 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "to":"ddcconsumer1",
                "ddc_id":6901,
                "ddc_uri":"http://ddcUrl2",
                "allowed":1,
                "amount":30,
                "business_type":2,
                "ddc_name":"",
                "ddc_symbol":""
            },
            "actAccount":"ddccontract1",
            "actName":"receiptmint"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "from":"ddcconsumer1",
                "to":"ddcconsumer1",
                "amounts":[
                    20,
                    30
                ],
                "ddc_uris":[
                    "http://ddcUrl1",
                    "http://ddcUrl2"
                ],
                "business_type":2,
                "memo":"memo0001",
                "nonce":78,
                "deadline":1671096761,
                "signature":"SIG_K1_KfJAvnwbWXxzijNhZKsnLs4M1xHYYb3uABPho9VJcoHpQBbpGUphFXRpEAQJuhar8jzdxs4TTt1JY7giSRVuFKYD5XYBBN"
            },
            "actAccount":"ddccontract1",
            "actName":"metamintbatc"
        }
    ],
    "blockNum":8127577,
    "blockTime":"2022-12-28T07:10:51.000",
    "transactionId":"75f44ef74a241e2e341d16056e6ee379b25cf1b73a51a942a244839a974da21c"
}

(三)元交易转移

1、功能介绍

DDC 拥有者或 DDC 授权者通过授权平台方调用该方法对 DDC 进行元交易转移,注:调用此接口所消耗的能量值和业务费对应的是平台方账户。

2、方法定义

1)SDK 方法定义:

DDC721Service PushedTransaction metaSafeTransferFrom(String sender, String from, String to, BigInteger ddcId, String memo, BigInteger nonce, BigInteger deadline, String signature);

DDC1155Service PushedTransaction metaSafeTransferFrom(String sender, String from, String to, BigInteger ddcId, BigInteger amount, String memo, BigInteger nonce, BigInteger deadline, String signature);

2)EOS 合约方法:

metatransfer(name sender, name from, name to, uint64_t ddc_id, uint64_t amount, std::string memo, uint64_t business_type, uint64_t nonce, uint64_t deadline, signature signature);

3、输入参数

字段 字段名 类型 是否必传 备注
sender 调用者 String 调用者地址
from 发送方账户 String
to 接收者账户 String
ddcId DDC唯一标识 BigInteger
amount DDC数量 BigInteger DDC721不传
memo 附加数据 String
nonce Nonce值 BigInteger
deadline 过期时间 BigInteger
signature 签名值 String

4、输出参数

字段 字段名 类型 备注
transactionId 交易哈希 String
processed 执行信息 Processed

5、API 调用

1)测试用例(以DDC1155为例)

@Test
public void metaSafeTransferFrom1155() {
    BigInteger ddcId = BigInteger.valueOf(136);
    BigInteger amount = BigInteger.valueOf(2);
    String memo = "memo0001";
    BigInteger deadline = BigInteger.valueOf(1671096761);
    DDC1155Service ddc1155Service = new DDC1155ServiceImpl();
    BigInteger nonce = ddc1155Service.getNonce(accountList.get(2));
    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String digest = metaTransaction.getSafeTransferFromDigest(accountList.get(1), accountList.get(2), accountList.get(2), ddcId, amount, memo, nonce, deadline);
    String signature = metaTransaction.generateSignature(privateKey, digest.getBytes(StandardCharsets.UTF_8));
    PushedTransaction pt = ddc1155Service.metaSafeTransferFrom(accountList.get(1), accountList.get(2), accountList.get(2), ddcId, amount, memo, nonce, deadline, signature);
    Map trxMap = ChainUtil.getInstance().parseTrxResp(pt);
    System.out.println(JSONUtil.parse(trxMap));
}

2) 输出结果

{
    "actionTraces":[
        {
            "actData":{
                "ddc_id":136,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"transfer",
                "fee":"0.0001 FEE",
                "balance":"8.2347 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "from":"ddcconsumer1",
                "to":"ddcconsumer1",
                "ddc_id":136,
                "amount":2,
                "memo":"memo0001",
                "business_type":2,
                "nonce":79,
                "deadline":1671096761,
                "signature":"SIG_K1_KkQvq6AnrCxS2hzdqYhsqJB3AtZeQW5RJfviSMGaBYgaHXdVAFdEzW8Q5nkQMd4k7LdWprSCKLmUM49JBFGtY9TrTv9hL4"
            },
            "actAccount":"ddccontract1",
            "actName":"metatransfer"
        }
    ],
    "blockNum":8128554,
    "blockTime":"2022-12-28T07:18:59.500",
    "transactionId":"d26f43175c9b07ae3ace53122edc82ee704484168479672cccadf6ed6ea33818"
}

(四)元交易批量转移

1、功能介绍

DDC 拥有者或 DDC 授权者可以通过授权平台方调用该方法对 DDC进行元交易批量转移,注:调用此接口所消耗的能量值和业务费对应的是平台方账户。

2、方法定义

1)SDK 方法定义:

DDC1155Service PushedTransaction metaSafeBatchTransferFrom(String sender, String from, String to, List ddcIds, List amounts, String memo, BigInteger nonce, BigInteger deadline, String signature);

2)EOS 合约方法:

metatransbat (name sender, name from, name to, std::vector ddc_ids, std::vector amounts, std::string memo, uint64_t business_type, uint64_t nonce, uint64_t deadline, signature signature);

3、输入参数

字段 字段名 类型 是否必传 备注
sender 调用者 String 调用者地址
from 发送方账户 String
to 接收者账户 String
ddcIds DDC唯一标识列表 List
amounts DDC数量列表 List
memo 附加数据 String
nonce Nonce值 BigInteger
deadline 过期时间 BigInteger
signature 签名值 String

4、输出参数

字段 字段名 类型 备注
transactionId 交易哈希 String
processed 执行信息 Processed

5、API 调用

1)测试用例

@Test
public void metaSafeBatchTransferFrom1155() {
    List ddcIds = Arrays.asList(BigInteger.valueOf(137), BigInteger.valueOf(138));
    List amounts = Arrays.asList(BigInteger.valueOf(2), BigInteger.valueOf(3));
    String memo = "memo0001";
    BigInteger deadline = BigInteger.valueOf(1671096761);
    DDC1155Service ddc1155Service = new DDC1155ServiceImpl();
    BigInteger nonce = ddc1155Service.getNonce(accountList.get(2));
    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String digest = metaTransaction.getSafeBatchTransferFromDigest(accountList.get(1), accountList.get(2), accountList.get(2), ddcIds, amounts, memo, nonce, deadline);
    String signature = metaTransaction.generateSignature(privateKey, digest.getBytes(StandardCharsets.UTF_8));
    PushedTransaction pt = ddc1155Service.metaSafeBatchTransferFrom(accountList.get(1), accountList.get(2), accountList.get(2), ddcIds, amounts, memo, nonce, deadline, signature);
    Map trxMap = ChainUtil.getInstance().parseTrxResp(pt);
    System.out.println(JSONUtil.parse(trxMap));
}

2) 输出结果

{
    "actionTraces":[
        {
            "actData":{
                "ddc_id":137,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"batchtrans",
                "fee":"0.0001 FEE",
                "balance":"8.2346 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "ddc_id":138,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"batchtrans",
                "fee":"0.0001 FEE",
                "balance":"8.2345 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "from":"ddcconsumer1",
                "to":"ddcconsumer1",
                "ddc_ids":[
                    137,
                    138
                ],
                "amounts":[
                    2,
                    3
                ],
                "memo":"memo0001",
                "business_type":2,
                "nonce":80,
                "deadline":1671096761,
                "signature":"SIG_K1_KWTUkvmwpYiTK9jvZcrWSJSs9p9XnX2Br6odYv7fVzQ6qZmQrhfXXf5VEMAvrwLo9Ufs3pijh4u9JioT2wKwFFx5dF4dvW"
            },
            "actAccount":"ddccontract1",
            "actName":"metatransbat"
        }
    ],
    "blockNum":8129207,
    "blockTime":"2022-12-28T07:24:26.000",
    "transactionId":"a4c2049569c305f094ffd6c568711796b8eb4df4e21b8b326077491844d6ca01"
}

(五)元交易销毁

1、功能介绍

DDC 拥有者或 DDC 授权者可以通过授权平台方调用该方法对 DDC进行元交易销毁,注:调用此接口所消耗的能量值和业务费对应的是平台方账户。

2、方法定义

1)SDK 方法定义:

DDC721Service PushedTransaction metaBurn(String sender, String owner, BigInteger ddcId, BigInteger nonce, BigInteger deadline, String signature);

DDC1155Service PushedTransaction metaBurn(String sender, String owner, BigInteger ddcId, BigInteger nonce, BigInteger deadline, String signature);

2)EOS 合约方法:

metaburn(name sender, name owner, uint64_t ddc_id, uint64_t business_type, uint64_t nonce, uint64_t deadline, signature signature);

3、输入参数

字段 字段名 类型 是否必传 备注
sender 调用者 String 调用者地址
owner 拥有者账户 String
ddcId DDC唯一标识 BigInteger
nonce Nonce值 BigInteger
deadline 过期时间 BigInteger
signature 签名值 String

4、输出参数

字段 字段名 类型 备注
transactionId 交易哈希 String
processed 执行信息 Processed

5、API 调用

1)测试用例(以DDC1155为例)

@Test
public void metaBurn1155() {
    BigInteger ddcId = BigInteger.valueOf(139);
    BigInteger deadline = BigInteger.valueOf(1671096761);
    DDC1155Service ddc1155Service = new DDC1155ServiceImpl();
    BigInteger nonce = ddc1155Service.getNonce(accountList.get(2));
    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String digest = metaTransaction.getBurnDigest(accountList.get(1), accountList.get(2), ddcId, nonce, deadline);
    String signature = metaTransaction.generateSignature(privateKey, digest.getBytes(StandardCharsets.UTF_8));
    PushedTransaction pt = ddc1155Service.metaBurn(accountList.get(1), accountList.get(2), ddcId, nonce, deadline, signature);
    Map trxMap = ChainUtil.getInstance().parseTrxResp(pt);
    System.out.println(JSONUtil.parse(trxMap));
}

2) 输出结果

{
    "actionTraces":[
        {
            "actData":{
                "ddc_id":139,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"burn",
                "fee":"0.0001 FEE",
                "balance":"8.2343 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "owner":"ddcconsumer1",
                "ddc_id":139,
                "business_type":2,
                "nonce":82,
                "deadline":1671096761,
                "signature":"SIG_K1_Kk7xG8Ux1Nu7jjF4zx4p98BLb4cZHVxwTbTV1L9nxU4zXiaRQoeNGq4WDv33hdFZ3pGrLyrcK5XwSkPR7sn7vdm3hdi2yG"
            },
            "actAccount":"ddccontract1",
            "actName":"metaburn"
        }
    ],
    "blockNum":8129841,
    "blockTime":"2022-12-28T07:29:43.000",
    "transactionId":"863711b5f8a4aa17ec167ecf073c62c4c2491754bed29064b1935c19bcf84929"
}

(六)元交易批量销毁

1、功能介绍

DDC 拥有者或 DDC 授权者可以通过授权平台方调用该方法对 DDC进行元交易批量销毁,注:调用此接口所消耗的能量值和业务费对应的是平台方账户。

2、方法定义

1)SDK 方法定义:

DDC1155Service PushedTransaction metaBurnBatch(String sender, String owner, List ddcIds, BigInteger nonce, BigInteger deadline, String signature);

2)EOS 合约方法:

metaburnbatc(name sender, name owner, std::vector ddc_ids, uint64_t business_type, uint64_t nonce, uint64_t deadline, signature signature);

3、输入参数

字段 字段名 类型 是否必传 备注
sender 调用者 String 调用者地址
owner 拥有者账户 String
ddcIds DDC唯一标识列表 List
nonce Nonce值 BigInteger
deadline 过期时间 BigInteger
signature 签名值 String

4、输出参数

字段 字段名 类型 备注
transactionId 交易哈希 String
processed 执行信息 Processed

5、API 调用

1)测试用例

@Test
public void metaBurnBatch1155() {
    List ddcIds = Arrays.asList(BigInteger.valueOf(137), BigInteger.valueOf(138));
    BigInteger deadline = BigInteger.valueOf(1671096761);
    DDC1155Service ddc1155Service = new DDC1155ServiceImpl();
    BigInteger nonce = ddc1155Service.getNonce(accountList.get(2));
    DDC1155MetaTransaction metaTransaction = new DDC1155MetaTransaction();
    String digest = metaTransaction.getBurnBatchDigest(accountList.get(1), accountList.get(2), ddcIds, nonce, deadline);
    String signature = metaTransaction.generateSignature(privateKey, digest.getBytes(StandardCharsets.UTF_8));
    PushedTransaction pt = ddc1155Service.metaBurnBatch(accountList.get(1), accountList.get(2), ddcIds, nonce, deadline, signature);
    Map trxMap = ChainUtil.getInstance().parseTrxResp(pt);
    System.out.println(JSONUtil.parse(trxMap));
}

2) 输出结果

{
    "actionTraces":[
        {
            "actData":{
                "ddc_id":137,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"burnbatch",
                "fee":"0.0001 FEE",
                "balance":"8.2342 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "ddc_id":138,
                "account":"ddcplatform1",
                "business_type":2,
                "func_name":"burnbatch",
                "fee":"0.0001 FEE",
                "balance":"8.2341 FEE"
            },
            "actAccount":"ddccontract1",
            "actName":"receiptpay"
        },
        {
            "actData":{
                "sender":"ddcplatform1",
                "owner":"ddcconsumer1",
                "ddc_ids":[
                    137,
                    138
                ],
                "business_type":2,
                "nonce":83,
                "deadline":1671096761,
                "signature":"SIG_K1_K4TC8gPC3iLQcrrKYRS7kgsNKX2xh6AB8CSyaRyN6fYfiAow3YMctBGg2z9pyS7RPuXmidn6GVapJ4k7scMxRFJPzAFc8X"
            },
            "actAccount":"ddccontract1",
            "actName":"metaburnbatc"
        }
    ],
    "blockNum":8130284,
    "blockTime":"2022-12-28T07:33:24.500",
    "transactionId":"9352f902710cf44133729b1730565c95a5900d7d51f95bef1f043f2de42bae71"
}

你可能感兴趣的:(区块链)