Tron区块链对接Java开发包【TronTool.Java】
TronTool.Java开发包适用于为Java应用快速增加对Tron/USDT-TRC20数字资产的支持能力,即支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。官方下载地址:http://sc.hubwiz.com/codebag/tron-java-lib/。
1、TronTool.Java开发包概述
TronTool.Java开发包主要包含以下特性:
- 支持Tron区块链原生Trx交易
- 支持Tron智能合约以及TRC20代币,例如USDT-TRC20等
- 支持交易的离线签名,避免泄露私钥
- 完善的Tron节点API封装,支持全节点、Solidity节点和事件节点提供的API
- 支持使用自有节点或第三方节点,例如Tron官方提供的公共节点
TronTool.Java开发包运行在Java 8环境下,当前版本1.0.0,主要类/接口及关系如下图所示:
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、使用TronTool.Java的示例代码
2.1 创建新的Tron账号
在终端进入演示代码目录,执行如下命令:
~$ cd ~/trontool.java/demo ~/trontool.java/demo$ gradle NewAddressDemo
执行结果如下:
2.2 Trx转账及余额查询
在终端进入演示代码目录,执行如下命令:
~$ cd ~/trontool.java/demo ~/trontool.java/demo$ gradle TrxDemo
执行结果如下:
2.3 Trc20代币转账、余额查询及事件监听
在终端进入演示代码目录,执行如下命令:
~$ cd ~/trontool.java/demo ~/trontool.java/demo$ gradle Trc20Demo
执行结果如下:
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); //显示账户余额
官方下载地址:Tron对接Java开发包
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
强迫症福音:函数整理成类的5个原因
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 不同函数具有不同的地位,类本质上是以某种方式相互关联的函数族。特定范围内二者具有共性,其工作内容也可能存在相似之处。 但无论如何,有时最好将函数作为方法编写于对象中。即使乍眼一看不是如此,但事实上JavaScript本身是基于对象的概念构建的。 类是如何工作的?为何要将函数转换为对象?下面5点将给出答案。 JavaScript中类的快速入门 JavaScript中的类是一种函数,正常情况下,您会这么写: function catName(){ console.log("Tibbers"); } 也可以用箭头表示法: catName = () =>console.log("Tibbers"); 这么做当然没有问题,但如果你有一堆与猫相关的函数,并想将它们附加到某个实例上呢?如果想操作时不需找出并告知代码具体实例目标,又该怎么做呢? 这就是“类”派上用场的地方。 类通常有两部分:属性(attributes)和方法(methods)。属性定义类的特定实例值。方法对这些属性执行特定操作。属...
- 下一篇
当 Mars 遇上 RAPIDS:用 GPU 以并行的方式加速数据科学
背景 在数据科学世界,Python 是一个不可忽视的存在,且有愈演愈烈之势。而其中主要的使用工具,包括 Numpy、Pandas 和 Scikit-learn 等。 Numpy Numpy 是数值计算的基础包,内部提供了多维数组(ndarray)这样一个数据结构,用户可以很方便地在任意维度上进行数值计算。 我们举一个蒙特卡洛方法求解 Pi 的例子。这背后的原理非常简单,现在我们有个半径为1的圆和边长为2的正方形,他们的中心都在原点。现在我们生成大量的均匀分布的点,让这些点落在正方形内,通过简单的推导,我们就可以知道,Pi 的值 = 落在圆内的点的个数 / 点的总数 * 4。 这里要注意,就是随机生成的点的个数越多,结果越精确。 用 Numpy 实现如下: import numpy as np N = 10 ** 7 # 1千万个点 data = np.random.uniform(-1, 1, size=(N, 2)) # 生成1千万个x轴和y轴都介于-1和1间的点 inside = (np.sqrt((data ** 2).sum(axis=1)) < 1).sum() # 计...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8