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 | |
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代币餘額查詢
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代币事件查詢
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 account4.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()
-
:接入shasta測試鍊TestNetTronApi()
例如,下面的代碼是等效的:
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/