Tron区块链对接Java开发包【支持USDT-TRC20】

TronTool.Java开发包适用于为Java应用快速增加对Tron/USDT-TRC20数字资产的支持能力, 即支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的 轻量级部署场景。官方下载地址: http://sc.hubwiz.com/codebag/tron-java-lib/ 。

1、开发包概述

TronTool.Java开发包主要包含以下特性:

  • 支持Tron区块链原生Trx交易
  • 支持Tron智能合约以及TRC20代币,例如USDT-TRC20等
  • 支持交易的离线签名,避免泄露私钥
  • 完善的Tron节点API封装,支持全节点、Solidity节点和事件节点提供的API
  • 支持使用自有节点或第三方节点,例如Tron官方提供的公共节点

TronTool.Java开发包运行在 Java 8 环境下,当前版本1.0.0,主要类/接口及关系如下图所示:

Tron区块链对接Java开发包【支持USDT-TRC20】

TronTool.Java开发包的主要代码文件清单如下:

代码文件 说明
trontool/ TronTool库项目代码目录
trontool/build.gradle TronTool项目Gradle配置
trontool/src/main/java/trontool/TronKit.java Tron开发包入口类
trontool/src/main/java/trontool/Trc20.java Tron TRC20智能合约封装类
trontool/src/main/java/trontool/Contract.java Tron智能合约封装类
trontool/src/main/java/trontool/Credential.java Tron区块链身份标识类,用于交易签名
trontool/src/main/java/trontool/Address.java Tron地址表示类
trontool/src/main/java/trontool/Base58.java Base58编解码器
trontool/src/main/java/trontool/TronApi.java Tron节点API聚合封装类
trontool/src/main/java/trontool/NodeClient.java HTTP协议封装类
trontool/src/main/java/trontool/api/ Tron API数据类型定义目录
demo/ 演示项目代码目录
demo/build.gradle 演示项目Gradle配置文件
demo/src/main/java/demo/NewAddressDemo.java 演示代码,创建新的Tron区块链地址
demo/src/main/java/demo/TrxDemo.java 演示代码,Trx转账交易及余额查询
demo/src/main/java/demo/Trc20Demo.java 演示代码,Trc20代币转账、余额查询、事件监听等
build.gradle 根项目配置文件
settings.gradle 根项目配置文件

2、使用示例代码

2.1 创建新地址

在终端进入演示代码目录,执行如下命令:

~$ cd ~/trontool.java/demo
~/trontool.java/demo$ gradle NewAddressDemo

执行结果如下:

Tron区块链对接Java开发包【支持USDT-TRC20】

2.2 Trx转账及余额查询

在终端进入演示代码目录,执行如下命令:

~$ cd ~/trontool.java/demo
~/trontool.java/demo$ gradle TrxDemo

执行结果如下:

Tron区块链对接Java开发包【支持USDT-TRC20】

2.3 Trc20代币转账、余额查询及事件监听

在终端进入演示代码目录,执行如下命令:

~$ cd ~/trontool.java/demo
~/trontool.java/demo$ gradle Trc20Demo

执行结果如下:

Tron区块链对接Java开发包【支持USDT-TRC20】

2、使用TronKit

TronKit是开发包的入口,使用这个类可以快速实现如下功能:

  • Trx转账与余额查询
  • Trc20代币转账、授权、余额查询等

2.1 实例化TronKit

TronKit实例化需要传入 TronApi 对象和 Credential 对象,这两个 参数分别封装了Tron节点提供的API,以及进行交易签名的用户身份信息。

例如,下面的代码创建一个接入Tron主链的TronKit实例,并使用 指定的私钥进行交易签名:

//import trontool.TronKit;
//import trontool.TronApi;
//import trontool.Credential;

TronKit kit = new TronKit(
  TronApi.mainNet(),                                       //接入主链
  Credential.fromPrivateKey("87c12d....d435")              //使用指定私钥
);

2.2 Trx转账及余额查询

使用TronKit的 sendTrx() 方法进行Trx转账,例如发送1000 TRX:

//import trontool.api.TransactionResult;

String to = "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx";             //转账目标地址
long amount = 1000000000;                                     //转账金额,单位:SUN
TransactionResult ret = kit.sendTrx(to,amount);               //提交Trx转账交易
System.out.printf("tx id: %s/n", ret.txId);                   //显示交易ID    
System.out.printf("tx state: %b/n", ret.state);               //显示交易结果

注意:需要将金额单位转换为SUN,1 TRX = 1000000 SUN。

使用 getTrxBalance() 方法查询指定地址的Trx余额,例如:

String addr = "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx";            //要查询的Tron地址
long balance = kit.getTrxBlanace(addr);                        //查询Trx余额,单位:SUN
System.out.printf("balance: %d/n",balance);                    //显示余额

2.3 TRC20代币转账

使用TronKit对象的 trc20() 方法获取指定TRC20代币合约实例,然后调用合约 的 transfer() 方法进行TRC20代币转账。例如,下面的代码 指定地址间转账1315300个最小单位的USDT-TRC20代币,即 1.3153 USDT:

//import trontool.Trc20;
//import trontool.api.TransactionResult;
//import java.math.BigInteger;

String to = "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx";                 //转账目标地址
BigInteger value = new BigInteger("1315300");                     //转账Trc20代币数量
String contractAddress = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";    //USDT-TRC20代币合约的部署地址
Trc20 usdt = kit.trc20(contractAddress);                          //创建Trc20代币合约实例
TransactionResult ret = usdt.transfer(to,value);                  //转账Trc20代币
System.out.printf("tx id: %s/n",ret.txId);                        //显示转账交易ID
System.out.printf("tx state: %b/n",ret.state);                    //显示转账交易结果

2.4 TRC20代币余额查询

使用TronKit对象的 trc20() 方法获取指定TRC20代币合约实例,然后调用合约 的 balanceOf() 方法查询指定地址的TRC20代币余额。例如, 下面的代码查询指定地址的USDT代币余额:

//import trontool.Trc20;
//impot java.math.BigInteger;

Trc20 usdt = kit.trc20("TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t");        //创建USDT-TRC20代币合约实例
BigInteger balance = usdt.balanceOf("TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx");  //查询Trc20代币余额
System.out.printf("balance: %s/n",balance);                         //显示代币余额

2.5 TRC20代币事件查询

使用TronKit对象的 trc20() 方法获取指定TRC20代币合约实例,然后调用 合约的 events() 方法查询指定合约触发事件。

例如查询USDT代币合约最近10秒的事件:

//import trontool.Trc20;
//import trontool.api.ContractEvent;

Trc20 usdt = kit.trc20("TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t");       //创建Trc20代币合约实例
long since = System.currentTimeMillis() - 10000;                    //计算检查时间点
ContractEvent[] events = usdt.events(since);                        //提取合约事件
for(ContractEvent e: events){
  System.out.println("event name: %s/n",e.eventName);               //显示事件名称
  System.out.println("block height: %d/n",e.blockNumber);           //显示事件触发的区块高度
}

events() 返回的结果是一个事件对象数组,每个成员对象的主要字段 说明如下:

  • callerContractAddress:调用合约地址,base58格式
  • transactionId:触发合约事件的交易ID,16进制字符串
  • result:合约事件参数列表,数组
  • resultType:合约事件参数类型列表,数组
  • blockTimestamp:事件所在区块时间戳,整数
  • blockNumber:事件所在区块号,整数
  • eventName:事件名称,字符串
  • contractAddress:合约地址,base58格式
  • eventIndex:事件索引序号,整数

例如,下面是一个TRC20代币合约的Transfer事件对象的JSON表示, 在event_name字段给出了事件名称,在result字段则给出了两种索引 形式的事件参数:

{
  "caller_contract_address": "TS2Hzo6KpAc8Ym2nGb3idpMtUpM2GiK2gL",
  "transaction_id": "265cf378f4943b7c77b7a294f533d4b8c718c297dd28a664848d77cd3f3a0af0",
  "result": {
    "0": "0x2539ef4f3eb733c105a957eebb20fd60ad8c9a43",      //事件参数0
    "1": "0x6f6794f3904ff51f9fa81e928afdec91f6744a50",      //事件参数1
    "2": "8",                                               //事件参数2        
    "_from": "0x2539ef4f3eb733c105a957eebb20fd60ad8c9a43",  //事件参数_from
    "_value": "8",                                          //事件参数_value
    "_to": "0x6f6794f3904ff51f9fa81e928afdec91f6744a50"     //事件参数_to
  },
  "result_type": {
    "_from": "address",                                     
    "_value": "uint256",
    "_to": "address"
  },
  "block_timestamp": 1586263455000,
  "block_number": 3539438,
  "event_name": "Transfer",                                 //事件名称   
  "contract_address": "TS2Hzo6KpAc8Ym2nGb3idpMtUpM2GiK2gL",
  "event_index": 0
}

3、Tron区块链身份与地址表示

在TronTool.Java开发包中,使用 Credential 表征Tron区块链中的一个用户身份,使用 Address 表征Tron区块链中的一个地址。两者的区别在于Credential包含了用户 的私钥信息,可以用来签名交易,因此需要保护,而Address则是可以 公开的信息。

使用Credential类的静态方法 create() 创建新账户。例如,下面的代码创建一个 新的账户并显示其私钥、公钥和地址:

//import trontool.Credential;

Credential c = Credential.create();                           //创建新账号
System.out.printf("private key: %s/n",c.getPrivateKey());     //显示私钥
System.out.printf("public key: %s/n",c.getPublicKey());       //显示公钥
System.out.printf("address: %s/n",c.getAddress());            //显示地址

可以使用静态方法 fromPrivateKey() 导入已有的私钥来实例化Credential。 例如下面的代码导入已有私钥并显示地址:

//import trontool.Credential;

Credential c = Credential.fromPrivateKey("7889...023a");      //导入已有私钥
System.out.printf("address: %s/n",c.getAddress());            //显示相应地址

在Tron区块链中,地址有两种表示:16进制和base58表示,例如 下面是同一个地址的两种表示:

  • base58:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
  • 16进制: 412539EF4F3EB733C105A957EEBB20FD60AD8C9A43

Address类包含了相应的编解码逻辑,可以方面的利用不同形式 的地址实例化Address。例如:

//import trontool.Address;

Address a1 = Address.fromBase58("TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx");
System.out.println(a1.hex);       //输出:412539EF4F3EB733C105A957EEBB20FD60AD8C9A43

Address a2 = Address.fromHex("412539EF4F3EB733C105A957EEBB20FD60AD8C9A43");
System.out.println(a2.base58);    //输出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx

有时我们只需要简单的在base58和16进制之间转换地址,这时并 不需要中间的Address对象,可以直接使用静态方法encode()和decode()。 例如:

//import trontool.Address;

String a1 = Address.decode("TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx");
System.out.println(a1);         //输出:412539EF4F3EB733C105A957EEBB20FD60AD8C9A43

String a2 = Address.encode("412539EF4F3EB733C105A957EEBB20FD60AD8C9A43");
System.out.println(a2);         //输出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx

4、使用TronApi访问Tron节点API

使用TronApi访问Tron的各种节点API。TronApi聚合了多种Tron节点 提供的API,例如tron全节点、solidity节点和事件服务节点的API。

实例化TronApi时,可以分别为不同类型的Tron节点指定不同的连接URL, 例如:

//import trontool.TronApi;

TronApi api = new TronApi(
  "https://api.trongrid.io",       //全节点URL
  "https://api.trongrid.io",       //合约节点URL
  "https://api.trongrid.io"        //事件节点URL
);

当上述三个节点的URL相同时,可以简写为:

TronAPi api = new TronApi("https://api.trongrid.io");

如果用的是Tron官方提供的TronGrid节点,那么可以直接使用TronApi 提供的两个静态函数mainNet()和testNet(),分别接入主链和shasta测试链。

例如,下面的代码是等效的:

TronApi api = new TronApi("https://api.trongrid.io");
TronApi api = TronApi.mainNet();                 //与上面等效

TronApi api = new TronApi("https://api.shasta.trongrid.io");
TronApi api = TronApi.testNet();                 //与上面等效

TronApi封装了Tron官方多种节点提供的API的一个子集,可以用于应用 与Tron区块链的交互。例如查询指定账户的TRX余额,可以利用Tron节点 的getaccount接口,这对应于TronApi中的 getAccount() 方法:

//import trontool.api.Account

Account account = api.getAccount("TEgM5CPeqow...7vcBgVkD4tP");  //查询账户信息
System.out.printf("balance: %d/n",account.balance);             //显示账户余额

TronTool.Java官方下载地址:http://sc.hubwiz.com/codebag/tron-java-lib/

原文 

http://blog.hubwiz.com/2020/04/13/tron-java-lib/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Tron区块链对接Java开发包【支持USDT-TRC20】

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址