Tron區塊鏈對接Java開發包【支持USDT-TRC20】

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,主要類/接口及關係如下圖所示:

Tron區塊鏈對接Java開發包【支持USDT-TRC20】

TronTool.Java開發包的主要代碼文件清單如下:

代碼文件說明trontool/TronTool庫項目代碼目錄trontool/build.gradleTronTool項目Gradle配置trontool/src/main/java/trontool/TronKit.javaTron開發包入口類trontool/src/main/java/trontool/Trc20.javaTron TRC20智能合約封裝類trontool/src/main/java/trontool/Contract.javaTron智能合約封裝類trontool/src/main/java/trontool/Credential.javaTron區塊鏈身份標識類,用於交易簽名trontool/src/main/java/trontool/Address.javaTron地址表示類trontool/src/main/java/trontool/Base58.javaBase58編解碼器trontool/src/main/java/trontool/TronApi.javaTron節點API聚合封裝類trontool/src/main/java/trontool/NodeClient.javaHTTP協議封裝類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賬號

在終端進入演示代碼目錄,執行如下命令:

<code>~$ cd ~/trontool.java/demo
~/trontool.java/demo$ gradle NewAddressDemo/<code>

執行結果如下:

Tron區塊鏈對接Java開發包【支持USDT-TRC20】

2.2 Trx轉賬及餘額查詢

在終端進入演示代碼目錄,執行如下命令:

<code>~$ cd ~/trontool.java/demo
~/trontool.java/demo$ gradle TrxDemo/<code>

執行結果如下:

Tron區塊鏈對接Java開發包【支持USDT-TRC20】

2.3 Trc20代幣轉賬、餘額查詢及事件監聽

在終端進入演示代碼目錄,執行如下命令:

<code>~$ cd ~/trontool.java/demo
~/trontool.java/demo$ gradle Trc20Demo/<code>

執行結果如下:

Tron區塊鏈對接Java開發包【支持USDT-TRC20】

2、使用TronKit

TronKit是開發包的入口,使用這個類可以快速實現如下功能:

  • Trx轉賬與餘額查詢
  • Trc20代幣轉賬、授權、餘額查詢等

2.1 實例化TronKit

TronKit實例化需要傳入TronApi對象和Credential對象,這兩個參數分別封裝了Tron節點提供的API,以及進行交易簽名的用戶身份信息。

例如,下面的代碼創建一個接入Tron主鏈的TronKit實例,並使用指定的私鑰進行交易簽名:

<code>//import trontool.TronKit;
//import trontool.TronApi;
//import trontool.Credential;

TronKit kit = new TronKit(
TronApi.mainNet(), //接入主鏈
Credential.fromPrivateKey("87c12d....d435") //使用指定私鑰
);/<code>

2.2 Trx轉賬及餘額查詢

使用TronKit的sendTrx()方法進行Trx轉賬,例如發送1000 TRX:

<code>//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); //顯示交易結果 /<code>

注意:需要將金額單位轉換為SUN,1 TRX = 1000000 SUN。

使用getTrxBalance()方法查詢指定地址的Trx餘額,例如:

<code>String addr = "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx";            //要查詢的Tron地址 

long balance = kit.getTrxBlanace(addr); //查詢Trx餘額,單位:SUN
System.out.printf("balance: %d\\n",balance); //顯示餘額 /<code>

2.3 TRC20代幣轉賬

使用TronKit對象的trc20()方法獲取指定TRC20代幣合約實例,然後調用合約的transfer()方法進行TRC20代幣轉賬。例如,下面的代碼指定地址間轉賬1315300個最小單位的USDT-TRC20代幣,即1.3153 USDT:

<code>//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); //顯示轉賬交易結果/<code>

2.4 TRC20代幣餘額查詢

使用TronKit對象的trc20()方法獲取指定TRC20代幣合約實例,然後調用合約的balanceOf()方法查詢指定地址的TRC20代幣餘額。例如,下面的代碼查詢指定地址的USDT代幣餘額:

<code>//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); //顯示代幣餘額/<code>

2.5 TRC20代幣事件查詢

使用TronKit對象的trc20()方法獲取指定TRC20代幣合約實例,然後調用合約的events()方法查詢指定合約觸發事件。

例如查詢USDT代幣合約最近10秒的事件:

<code>//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); //顯示事件觸發的區塊高度
}/<code>

events()返回的結果是一個事件對象數組,每個成員對象的主要字段說明如下:

  • callerContractAddress:調用合約地址,base58格式
  • transactionId:觸發合約事件的交易ID,16進制字符串
  • result:合約事件參數列表,數組
  • resultType:合約事件參數類型列表,數組
  • blockTimestamp:事件所在區塊時間戳,整數
  • blockNumber:事件所在區塊號,整數
  • eventName:事件名稱,字符串
  • contractAddress:合約地址,base58格式
  • eventIndex:事件索引序號,整數

例如,下面是一個TRC20代幣合約的Transfer事件對象的JSON表示,在event_name字段給出了事件名稱,在result字段則給出了兩種索引形式的事件參數:

<code>{
"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
}/<code>

3、Tron區塊鏈身份與地址表示

在TronTool.Java開發包中,使用Credential表徵Tron區塊鏈中的一個用戶身份,使用Address表徵Tron區塊鏈中的一個地址。兩者的區別在於Credential包含了用戶的私鑰信息,可以用來簽名交易,因此需要保護,而Address則是可以公開的信息。

使用Credential類的靜態方法create()創建新賬戶。例如,下面的代碼創建一個新的賬戶並顯示其私鑰、公鑰和地址:

<code>//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()); //顯示地址 /<code>

可以使用靜態方法fromPrivateKey()導入已有的私鑰來實例化Credential。例如下面的代碼導入已有私鑰並顯示地址:

<code>//import trontool.Credential;

Credential c = Credential.fromPrivateKey("7889...023a"); //導入已有私鑰
System.out.printf("address: %s\\n",c.getAddress()); //顯示相應地址/<code>

在Tron區塊鏈中,地址有兩種表示:16進制和base58表示,例如下面是同一個地址的兩種表示:

  • base58:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
  • 16進制: 412539EF4F3EB733C105A957EEBB20FD60AD8C9A43

Address類包含了相應的編解碼邏輯,可以方面的利用不同形式的地址實例化Address。例如:

<code>//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/<code>

有時我們只需要簡單的在base58和16進制之間轉換地址,這時並不需要中間的Address對象,可以直接使用靜態方法encode()和decode()。例如:

<code>//import trontool.Address;

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

String a2 = Address.encode("412539EF4F3EB733C105A957EEBB20FD60AD8C9A43");
System.out.println(a2); //輸出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx/<code>

4、使用TronApi訪問Tron節點API

使用TronApi訪問Tron的各種節點API。TronApi聚合了多種Tron節點提供的API,例如tron全節點、solidity節點和事件服務節點的API。

實例化TronApi時,可以分別為不同類型的Tron節點指定不同的連接URL,例如:

<code>//import trontool.TronApi;

TronApi api = new TronApi(
"https://api.trongrid.io", //全節點URL
"https://api.trongrid.io", //合約節點URL
"https://api.trongrid.io" //事件節點URL
);/<code>

當上述三個節點的URL相同時,可以簡寫為:

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

如果用的是Tron官方提供的TronGrid節點,那麼可以直接使用TronApi提供的兩個靜態函數mainNet()和testNet(),分別接入主鏈和shasta測試鏈。

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

<code>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(); //與上面等效/<code>

TronApi封裝了Tron官方多種節點提供的API的一個子集,可以用於應用與Tron區塊鏈的交互。例如查詢指定賬戶的TRX餘額,可以利用Tron節點的getaccount接口,這對應於TronApi中的getAccount()方法:

<code>//import trontool.api.Account

Account account = api.getAccount("TEgM5CPeqow...7vcBgVkD4tP"); //查詢賬戶信息
System.out.printf("balance: %d\\n",account.balance); //顯示賬戶餘額 /<code>

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


分享到:


相關文章: