java读取pem格式私钥_Java对接USDT-TRC20开发包
【Tron】
1、TronTool.Java开发包概述
TronTool.Java开发包主要包含以下特性:
⽀持Tron区块链原⽣Trx交易
⽀持Tron智能合约以及TRC20,例如USDT-TRC20等 ⽀持交易的离线签名,避免泄露私钥
完善的Tron节点API封装,⽀持全节点、Solidity节点和事件节点提供的API ⽀持使⽤⾃有节点或第三⽅节点,例如Tron官⽅提供的公共节点
Java 8环境下,当前版本1.0.0,主要类/接⼝及关系如下图所⽰:
TronTool.Java开发包运⾏在Java 8
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.TronApi;
//import trontool.Credential;
TronKit kit = new TronKit(
TronApi.mainNet(), //接⼊主链
Credential.fromPrivateKey("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: %sn", Id); //显⽰交易ID
System.out.printf("tx state: %bn", ret.state); //显⽰交易结果
注意:需要将⾦额单位转换为SUN,1 TRX = 1000000 SUN。
使⽤getTrxBalance()⽅法查询指定地址的Trx余额,例如:
String addr = "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx"; //要查询的Tron地址
long balance = TrxBlanace(addr); //查询Trx余额,单位:SUN
System.out.printf("balance: %dn",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 = 20(contractAddress); //创建Trc20合约实例
TransactionResult ret = ansfer(to,value); //转账Trc20
System.out.printf("tx id: %sn",Id); //显⽰转账交易ID
System.out.printf("tx state: %bn",ret.state); //显⽰转账交易结果
2.4 TRC20余额查询
使⽤TronKit对象的trc20()⽅法获取指定TRC20合约实例,然后调⽤合约的balanceOf()⽅法查询指定地址的TRC20余额。例如,下⾯的代码查询指定地址的USDT余额:
//impot java.math.BigInteger;
Trc20 usdt = 20("TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"); //创建USDT-TRC20合约实例
BigInteger balance = usdt.balanceOf("TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx"); //查询Trc20余额
System.out.printf("balance: %sn",balance); //显⽰余额
2.5 TRC20事件查询
使⽤TronKit对象的trc20()⽅法获取指定TRC20合约实例,然后调⽤合约的events()⽅法查询指定合约触发事件。
例如查询USDT合约最近10秒的事件:
//import trontool.Trc20;
//import trontool.api.ContractEvent;
Trc20 usdt = 20("TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"); //创建Trc20合约实例
long since = System.currentTimeMillis() - 10000; //计算检查时间点
ContractEvent[] events = usdt.events(since); //提取合约事件
for(ContractEvent e: events){
System.out.println("event name: %sn",e.eventName); //显⽰事件名称
System.out.println("block height: %dn",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 = ate(); //创建新账号
System.out.printf("private key: %sn",c.getPrivateKey()); //显⽰私钥
System.out.printf("public key: %sn",c.getPublicKey()); //显⽰公钥
System.out.printf("address: %sn",c.getAddress()); //显⽰地址
可以使⽤静态⽅法fromPrivateKey()导⼊已有的私钥来实例化Credential。例如下⾯的代码导⼊已有私钥并显⽰地址:
//import trontool.Credential;
Credential c = Credential.fromPrivateKey("023a"); //导⼊已有私钥
System.out.printf("address: %sn",c.getAddress()); //显⽰相应地址
在Tron区块链中,地址有两种表⽰:16进制和base58表⽰,例如下⾯是同⼀个地址的两种表⽰:
base58:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
16进制: 412539EF4F3EB733C105A957EEBB20FD60AD8C9A43
Address类包含了相应的编解码逻辑,可以⽅⾯的利⽤不同形式的地址实例化Address。例如: