Tron区块链Go语言开发包【TronTool.Go】
TronTool.Go开发包适用于为Go应用快速增加对Tron/USDT-TRC20数字资产的支持能力,即支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。官方下载地址:[TronTool for Golang](http://sc.hubwiz.com/codebag/tron-go-lib/)。
## 1、开发包概述
TronTool.Go开发包主要包含以下特性:
- 支持Tron区块链原生Trx交易
- 支持Tron智能合约以及TRC20代币,例如USDT-TRC20等
- 支持交易的离线签名,避免泄露私钥
- 完善的Tron节点API封装,支持全节点、Solidity节点和事件节点提供的API
- 支持使用自有节点或第三方节点,例如Tron官方提供的公共节点
TronTool.Go开发包采用 **Go 1.13** 开发,当前版本1.0.0,主要数据类型及关系如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806212928469.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoZWJhbzMzMzM=,size_16,color_FFFFFF,t_70)
TronTool.Go开发包的主要代码文件清单如下:
<table class="table table-striped">
<thead>
<tr><th>代码文件</th><th>说明</th></tr>
</thead>
<tbody>
<tr><td>trontool/tron/address.go</td><td>Tron地址编解码方法</td></tr>
<tr><td>trontool/tron/contract.go</td><td>Tron合约封装类</td></tr>
<tr><td>trontool/tron/credential.go</td><td>Tron身份类</td></tr>
<tr><td>trontool/tron/nodeclient.go</td><td>Tron节点客户端类</td></tr>
<tr><td>trontool/tron/trc20.go</td><td>TRC20合约封装类</td></tr>
<tr><td>trontool/tron/tronapi.go</td><td>Tron多节点客户端</td></tr>
<tr><td>trontool/tron/tronkit.go</td><td>TronKit入口类</td></tr>
<tr><td>trontool/tron/types.go</td><td>杂项类型</td></tr>
<tr><td>trontool/api/account.go</td><td>账户相关API数据结构</td></tr>
<tr><td>trontool/api/apiresult.go</td><td>一般性API结构</td></tr>
<tr><td>trontool/api/contract.go</td><td>合约相关API数据结构</td></tr>
<tr><td>trontool/api/contractevent.go</td><td>合约事件相关API数据结构</td></tr>
<tr><td>trontool/api/contracttransaction.go</td><td>合约交易相关API数据结构</td></tr>
<tr><td>trontool/api/transaction.go</td><td>TRX交易相关API数据结构</td></tr>
<tr><td>trontool/demo/addressdemo.go</td><td>Tron地址演示</td></tr>
<tr><td>trontool/demo/trc20demo.go</td><td>TRC20查询与交易演示</td></tr>
<tr><td>trontool/demo/trc20eventdemo.go</td><td>TRC20事件查询演示</td></tr>
<tr><td>trontool/demo/trxdemo.go</td><td>Trx余额查询与转账交易演示</td></tr>
<tr><td>trontool/go.mod</td><td>Go模块管理文件</td></tr>
<tr><td>trontool/go.sum</td><td>Go模块管理文件</td></tr>
<tr><td>demo/</td><td>演示项目代码目录</td></tr>
<tr><td>demo/build.gradle</td><td>演示项目Gradle配置文件</td></tr>
<tr><td>demo/src/main/java/demo/NewAddressDemo.java</td><td>演示代码,创建新的Tron区块链地址</td></tr>
<tr><td>demo/src/main/java/demo/TrxDemo.java</td><td>演示代码,Trx转账交易及余额查询</td></tr>
<tr><td>demo/src/main/java/demo/Trc20Demo.java</td><td>演示代码,Trc20代币转账、余额查询、事件监听等</td></tr>
<tr><td>build.gradle</td><td>根项目配置文件</td></tr>
<tr><td>settings.gradle</td><td>根项目配置文件</td></tr>
</tbody>
</table>
## 2、使用示例代码
进入`trontool`目录运行示例代码。
### 2.1 创建新地址
示例代码 `addressdemo.go` 演示如何创建一个新地址,或者导入已有的私钥。
执行如下命令运行示例代码:
```
go run demo/addressdemo.go
```
执行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806212946585.png)
### 2.2 TRX转账及余额查询
示例代码 `trxdemo.go` 演示如何进行TRX转账并查询指定Tron账号的TRX余额。
执行如下命令运行示例代码:
```
go run demo/trxdemo.go
```
执行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806213001719.png)
### 2.3 Trc20代币转账及余额查询
示例代码 `trc20demo.go` 演示如何查询指定的TRC20代币的相关信息并进行转账。
执行如下命令运行示例代码:
```
go run demo/trc20demo.go
```
执行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806213015345.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoZWJhbzMzMzM=,size_16,color_FFFFFF,t_70)
### 2.4 TRC20代币事件查询
示例代码 `trc20eventdemo.go` 演示如何查询指定TRC20代币的事件。
执行如下命令运行示例代码:
```
go run demo/trc20eventdemo.go
```
执行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806213024797.png)
## 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](https://developers.tron.network/docs/account#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的[技术资料](https://developers.tron.network/reference)进行实现。
---
Tron区块链Go开发包官方下载:http://sc.hubwiz.com/codebag/tron-go-lib/