資安

USDT-TRC20對接Go語言開發包【TronTool.Go】

TronTool.Go開發包適用於為Go應用快速增加對Tron/USDT-TRC20數字資產的支持能力,即支持使用自有Tron區塊鏈節點的應用場景,也支持基於Tron官方公共API服務的輕量級部署場景。官方下載地址:TronTool for Golang

1、開發包概述

TronTool.Go開發包主要包含以下特性:

  • 支持Tron區塊鏈原生Trx交易
  • 支持Tron智能合約以及TRC20代幣,例如USDT-TRC20等
  • 支持交易的離線簽名,避免洩露私鑰
  • 完善的Tron節點API封裝,支持全節點、Solidity節點和事件節點提供的API
  • 支持使用自有節點或第三方節點,例如Tron官方提供的公共節點

TronTool.Go開發包採用 Go 1.13 開發,當前版本1.0.0,主要數據類型及關係如下圖所示:

在這裡插入圖片描述

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

代碼文件 說明
trontool/tron/address.go Tron地址編解碼方法
trontool/tron/contract.go Tron合約封裝類
trontool/tron/credential.go Tron身份類
trontool/tron/nodeclient.go Tron節點客戶端類
trontool/tron/trc20.go TRC20合約封裝類
trontool/tron/tronapi.go Tron多節點客戶端
trontool/tron/tronkit.go TronKit入口類
trontool/tron/types.go 雜項類型
trontool/api/account.go 賬戶相關API數據結構
trontool/api/apiresult.go 一般性API結構
trontool/api/contract.go 合約相關API數據結構
trontool/api/contractevent.go 合約事件相關API數據結構
trontool/api/contracttransaction.go 合約交易相關API數據結構
trontool/api/transaction.go TRX交易相關API數據結構
trontool/demo/addressdemo.go Tron地址演示
trontool/demo/trc20demo.go TRC20查詢與交易演示
trontool/demo/trc20eventdemo.go TRC20事件查詢演示
trontool/demo/trxdemo.go Trx餘額查詢與轉賬交易演示
trontool/go.mod Go模塊管理文件
trontool/go.sum Go模塊管理文件
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目錄運行示例代碼。

2.1 創建新地址

示例代碼 addressdemo.go 演示如何創建一個新地址,或者導入已有的私鑰。

執行如下命令運行示例代碼:

go run demo/addressdemo.go

執行結果如下:

在這裡插入圖片描述

2.2 TRX轉賬及餘額查詢

示例代碼 trxdemo.go 演示如何進行TRX轉賬並查詢指定Tron賬號的TRX餘額。

執行如下命令運行示例代碼:

go run demo/trxdemo.go

執行結果如下:

在這裡插入圖片描述

2.3 Trc20代幣轉賬及餘額查詢

示例代碼 trc20demo.go 演示如何查詢指定的TRC20代幣的相關信息並進行轉賬。

執行如下命令運行示例代碼:

go run demo/trc20demo.go

執行結果如下:

在這裡插入圖片描述

2.4 TRC20代幣事件查詢

示例代碼 trc20eventdemo.go 演示如何查詢指定TRC20代幣的事件。

執行如下命令運行示例代碼:

go run demo/trc20eventdemo.go

執行結果如下:

在這裡插入圖片描述

3、使用TronKit

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

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

3.1 實例化TronKit

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

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

//import "trontool/tron"

credential, _ := tron.HexKeyToCredential("8D914…71EB5F")     //導入私鑰
TronKit kit = tron.NewTronKit(
  Tron.MainNetTronApi(),                                     //接入主鏈
  credential,                                                //使用指定身份
)

3.2 TRX轉賬及餘額查詢

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

//import "fmt"
//import "trontool/tron"

to := "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx"            //轉賬目標地址
var amount  int64 = 1000000000                        //轉賬金額,單位:SUN
ret,_  := kit.SendTrx(to,amount)                      //提交Trx轉賬交易
fmt.Printf("tx id: %s\n", ret.TxId)                   //顯示交易ID    
fmt.Printf("tx state: %b\n", ret.State)               //顯示交易提交結果              

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

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

addr := "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx"        //要查詢的Tron地址
balance := kit.GetTrxBlanace(addr)                   //查詢Trx餘額,單位:SUN
fmt.Printf("balance: %d\n",balance)                  //顯示餘額        

3.3 TRC20代幣轉賬

使用TronKit對象的Trc20()方法獲取指定TRC20代幣合約實例,然後調用合約的transfer()方法進行TRC20代幣轉賬。

例如,下面的代碼在指定地址間轉賬1315300個最小單位的TRC20-USDT代幣,即1.3153 USDT:

//import "trontool/tron"
//import "math/big"

to := "TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx"                  //轉賬目標地址
value := big.NewInt(1315300)                                //轉賬Trc20代幣數量
contractAddress := "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"     //USDT代幣地址
usdt, _ := kit.Trc20(contractAddress)                       //創建Trc20代幣合約實例
ret,_ := usdt.Transfer(to, value)                           //轉賬Trc20代幣
fmt.Printf("tx id: %s\n",ret.txId)                          //顯示轉賬交易ID
fmt.Printf("tx state: %b\n",ret.state)                      //顯示轉賬交易結果

3.4 TRC20代幣餘額查詢

使用TronKit對象的Trc20()方法獲取指定TRC20代幣合約實例,然後調用合約的BalanceOf()方法查詢指定地址的TRC20代幣餘額。

例如,下面的代碼查詢指定地址的USDT代幣餘額:

//import "trontool/tron"
//impot "math/big"

usdt,_ := kit.Trc20("TR7NhqjeK…zgjLj6t")                  //創建USDT-TRC20代幣實例
balance,_ := usdt.BalanceOf("TDN3Q…8qwqx")                //查詢Trc20代幣餘額
fmt.Printf("balance: %s\n",balance)                       //顯示代幣餘額

3.5 TRC20代幣事件查詢

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

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

//import "trontool/tron"
//import "time"
//import "fmt"

usdt,_ := kit.Trc20("TR7Nhqje…zgjLj6t")                    //創建Trc20代幣合約實例
since := time.Now().Unix()*1000 - 10000                    //計算檢查時間點
events,_ := usdt.GetEvents(since)                          //提取合約事件
for _,event := range events {
  fmt.Printf("event name: %s\n",e.EventName)              //顯示事件名稱
  fmt.Printf("block height: %d\n",e.BlockNumber)          //顯示事件觸發區塊高度
}

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

在開發包中,使用Credential表徵Tron區塊鏈中的一個用戶身份,它與地址的區別在於, Credential包含了用戶的私鑰信息,可以用來簽名交易,而地址則是可以公開的信息。

4.1 創建新賬號身份

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

//import "fmt"
//import "trontool/tron"

c,_ := tron.NewCredential()                                      //創建新身份
fmt.Printf("private key: %s\n",c. PrivateKeyHex());              //顯示私鑰
fmt.Printf("public key: %s\n",c. PublicKeyHex());                //顯示公鑰
fmt.Printf("address: %s\n",c.AddressBase58());                   //顯示地址      

需要指出的是,對於任何新創建的賬號,Tron要求向其注入0.1 TRX進行激活後才可以使用。具體說明請參考How to create an account

4.2 使用已有的私鑰創建身份

可以使用包方法HexKeyToCredential()導入已有的私鑰來實例化Credential。

例如下面的代碼導入已有私鑰並顯示地址:

//Import "fmt"
//import "trontool/tron"

c,_ := tron.HexKeyToCredential("7889...023a")                   //導入已有私鑰
fmt.Printf("address: %s\n",c. AddressBase58())                  //顯示相應地址

4.3 Tron地址的兩種表示

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

  • base58:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
  • 16進制: 412539EF4F3EB733C105A957EEBB20FD60AD8C9A43

tron包中提供了相應的編解碼方法,可以在兩種格式之間進行轉化。例如:

//import "fmt"
//import "trontool/tron"

a1,_  := tron.DecodeBase58Address("TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx");
fmt.Println(a1)                  //輸出:412539EF4F3EB733C105A957EEBB20FD60AD8C9A43

a2,_ := := tron.EncodeHexAddress("412539EF4F3EB733C105A957EEBB20FD60AD8C9A43")
fmt.Println(a2)                  //輸出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx

5、使用TronApi

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

5.1 TronApi的實例化

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

//import "trontool/tron"

tronApi := tron.NewTronApi(
  "https://api.trongrid.io",       //全節點URL
  "https://api.trongrid.io",       //合約節點URL
  "https://api.trongrid.io",       //事件節點URL
)

如果用的是Tron官方提供的TronGrid節點,那麼可以直接使用tron包提供的兩個方法分別接入主鏈和shasta測試鏈:

  • MainNetTronApi():接入主鏈
  • TestNetTronApi():接入shasta測試鏈

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

urlM := "https://api.trongrid.io"
tronApiM1 := tron.NewTronApi( urlM, urlM, urlM)
tronApiM2 := Tron.MainNetTronApi()                 //與上面等效

urlT := "https://api.shasta.trongrid.io"
tronApiT1 = tron.NewTronApi(urlT, urlT, urlT)
tronApiT2 =tron.TestNetTronApi()                   //與上面等效

5.2 訪問多節點API

TronApi封裝了Tron官方多種節點提供的API的一個子集,提供了常用的訪問Tron區塊鏈的API的封裝。

例如查詢指定賬戶的TRX餘額,可以利用Tron節點的getaccount接口,這對應於TronApi中的getAccount()方法:

//import "fmt"
//import "trontool/tron"

account,_ := tronApi.getAccount("TEgM5CPeqow...7vcBgVkD4tP")  //查詢賬戶信息
fmt.Printf("balance: %d\n", account.Balance)                     //顯示賬戶餘額      

5.3 擴展TronAPi

TronApi依賴於NodeCllient訪問Tron的節點API。因此如果需要擴展TronApi使其支持更多的Tron節點API,可參考TronApi的現有代碼並結合TRON提供的節點API的技術資料進行實現。


Tron區塊鏈Go開發包官方下載:http://sc.hubwiz.com/codebag/tron-go-lib/

Leave a Reply

Your email address will not be published. Required fields are marked *