天天看點

java讀取pem格式私鑰_Java對接USDT-TRC20開發包【Tron】

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

java讀取pem格式私鑰_Java對接USDT-TRC20開發包【Tron】

TronTool.Java開發包的主要代碼檔案清單參見官網說明:http://sc.hubwiz.com/codebag/tron-java-lib/。

2、使用TronTool.Java的示例代碼

2.1 建立新的Tron賬号

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

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

執行結果如下:

java讀取pem格式私鑰_Java對接USDT-TRC20開發包【Tron】

2.2 Trx轉賬及餘額查詢

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

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

執行結果如下:

java讀取pem格式私鑰_Java對接USDT-TRC20開發包【Tron】

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

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

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

執行結果如下:

java讀取pem格式私鑰_Java對接USDT-TRC20開發包【Tron】

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: %sn", ret.txId);                   //顯示交易ID    
System.out.printf("tx state: %bn", ret.state);               //顯示交易結果              
           

注意:需要将金額機關轉換為SUN,1 TRX = 1000000 SUN。

使用

getTrxBalance()

方法查詢指定位址的Trx餘額,例如:

String addr = "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx";            //要查詢的Tron位址
long balance = kit.getTrxBlanace(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 = kit.trc20(contractAddress);                          //建立Trc20代币合約執行個體
TransactionResult ret = usdt.transfer(to,value);                  //轉賬Trc20代币
System.out.printf("tx id: %sn",ret.txId);                        //顯示轉賬交易ID
System.out.printf("tx state: %bn",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: %sn",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: %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 = Credential.create();                           //建立新賬号
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("7889...023a");      //導入已有私鑰
System.out.printf("address: %sn",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: %dn",account.balance);             //顯示賬戶餘額      
           

Tron/USDT-TRC20系列開發包:TronTool.Java|TronTool.Net|TronTool.Go|TronTool.Php