TronTool開發包适用于為PHP應用快速增加對Tron/USDT-TRC20數字資産的支援能力,即支援使用自有Tron區塊鍊節點的應用場景,也支援基于Tron官方公共API服務的輕量級部署場景。TronTool官方下載下傳位址: http://sc.hubwiz.com/codebag/tron-php-lib/ 。
1、開發包概述
TronTool開發包主要包含以下特性:
- 支援Tron區塊鍊原生Trx交易
- 支援Tron智能合約以及TRC20代币,例如USDT-TRC20等
- 支援交易的離線簽名,避免洩露私鑰
- 完善的Tron節點API封裝,支援全節點、Solidity節點和事件節點提供的API
- 支援使用自有節點或第三方節點,例如Tron官方提供的公共節點
TronTool軟體包運作在Php 7.1+環境下,目前版本1.0.0,主要類/接口及關系如下圖所示:
TronTool的主要代碼檔案清單如下:
代碼檔案 | 說明 |
---|---|
tron.php/src/TronKit.php | Tron開發包入口類 |
tron.php/src/Trc20.php | Tron TRC20智能合約封裝類 |
tron.php/src/Contract.php | Tron智能合約封裝類 |
tron.php/src/Credential.php | Tron區塊鍊身份辨別類,用于交易簽名 |
tron.php/src/Address.php | Tron位址表示類 |
tron.php/src/TronApi.php | Tron節點API聚合封裝類 |
tron.php/src/NodeClient.php | HTTP協定封裝類 |
demo/NewAddressDemo.php | 示範代碼,建立新的Tron區塊鍊位址 |
demo/TrxDemo.php | 示範代碼,Trx轉賬交易及餘額查詢 |
demo/Trc20Demo.php | 示範代碼,Trc20代币轉賬、餘額查詢、事件監聽等 |
demo/DeployContractDemo.php | 示範代碼,智能合約的部署 |
demo/build-contract.php | 示例Trc20代币合約的建構腳本 |
demo/contract/EzToken.sol | 示例Trc20代币合約 |
demo/contract/build/EzToken.abi | 示例Trc20代币合約的ABI檔案 |
demo/contract/build/EzToken.bin | 示例Trc20代币合約的位元組碼檔案 |
vendor | 第三方依賴包目錄 |
composer.json | composer配置檔案 |
2、使用示例代碼
2.1 建立新位址
在終端進入示範代碼目錄,執行如下指令:
~$ cd ~/trontool/demo
~/trontool/demo$ php NewAddressDemo.php
執行結果如下:

2.2 Trx轉賬及餘額查詢
~$ cd ~/trontool/demo
~/trontool/demo$ php TrxDemo.php
2.3 Trc20代币轉賬、餘額查詢及事件監聽
~$ cd ~/trontool/demo
~/trontool/demo$ php Trc20Demo.php
2.4 Tron智能合約部署
~$ cd ~/trontool/demo
~/trontool/demo$ php DeployContractDemo.php
2、使用TronKit
TronKit是開發包的入口,使用這個類可以快速實作如下功能:
- Trx轉賬與餘額查詢
- Trc20代币轉賬、授權、餘額查詢等
2.1 執行個體化TronKit
TronKit執行個體化需要傳入
TronApi
對象和
Credential
對象,這兩個參數分别封裝了Tron節點提供的API,以及進行交易簽名的使用者身份資訊。
例如,下面的代碼建立一個接入Tron主鍊的TronKit執行個體,并使用指定的私鑰進行交易簽名:
use TronTool\TronKit;
use TronTool\TronApi;
use TronTool\Credential;
$kit = new TronKit(
TronApi::mainNet(), //接入主鍊
Credential::fromPrivateKey('87c12d....d435') //使用指定私鑰
);
使用TronKit的
sendTrx()
方法進行Trx轉賬,例如發送1000 TRX:
$to = 'TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx'; //轉賬目标位址
$amount = 1000000000; //轉賬金額,機關:SUN
$ret = $kit->sendTrx($to,$amount); //送出Trx轉賬交易
echo 'txid => ' . $ret->tx->txID . PHP_EOL; //顯示交易ID
echo 'result => ' . $ret->result . PHP_EOL; //顯示交易結果
注意:需要将金額機關轉換為SUN,1 TRX = 1000000 SUN。
使用
getTrxBalance()
方法查詢指定位址的Trx餘額,例如:
$addr = 'TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx'; //要查詢的Tron位址
$balance = $kit->getTrxBlanace($addr); //查詢Trx餘額,機關:SUN
echo 'trx balance => ' . $balance . PHP_EOL; //顯示餘額
2.3 TRC20代币轉賬
Trc20()
方法擷取指定TRC20代币合約執行個體,然後調用合約的
transfer()
方法進行TRC20代币轉賬。例如,下面的代碼指定位址間轉賬1315300個最小機關的USDT-TRC20代币,即1.3153 USDT:
$to = 'TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx'; //轉賬目标位址
$amount = 1315300; //轉賬Trc20代币數量
$contractAddress = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t' //USDT-TRC20代币合約的部署位址
$usdt = $kit->Trc20($contractAddress); //建立Trc20代币合約執行個體
$ret = $usdt->transfer($to,$amount); //轉賬Trc20代币
echo 'txid => ' . $ret->tx->txID . PHP_EOL; //顯示轉賬交易ID
echo 'result => ' . $ret->result . PHP_EOL; //顯示轉賬交易結果
2.4 TRC20代币餘額查詢
Trc20()
balanceOf()
方法查詢指定位址的TRC20代币餘額。例如,下面的代碼查詢指定位址的USDT代币餘額:
$usdt = $kit->Trc20('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'); //建立USDT-TRC20代币合約執行個體
$balance = $usdt->balanceOf('TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx'); //查詢Trc20代币餘額
echo 'usdt balance => ' . $balance . PHP_EOL; //顯示代币餘額
2.5 TRC20代币事件查詢
Trc20()
events()
方法查詢指定合約觸發事件。
例如查詢USDT代币合約最近10秒的事件:
$usdt = $kit->Trc20('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'); //建立Trc20代币合約執行個體
$since = time() - 10000; //計算檢查時間點
$events = $usdt->events($since); //提取合約事件
foreach($events as $event){
echo 'block height => ' . $event->block_number . PHP_EOL; //顯示事件觸發的區塊高度
echo 'event name => ' . $event->event_name . PHP_EOL; //顯示事件名稱
}
events()
傳回的結果是一個事件對象數組,每個成員對象的主要字段說明如下:
- caller_contract_address:調用合約位址,base58格式
- transaction_id:觸發合約事件的交易ID,16進制字元串
- result:合約事件參數清單,數組
- result_type:合約事件參數類型清單,數組
- block_timestamp:事件所在區塊時間戳,整數
- block_number:事件所在區塊号,整數
- event_name:事件名稱,字元串
- contract_address:合約位址,base58格式
- event_index:事件索引序号,整數
例如,下面是一個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中,使用
Credential
表征Tron區塊鍊中的一個使用者身份,使用
Address
表征Tron區塊鍊中的一個位址。兩者的差別在于Credential包含了使用者的私鑰資訊,可以用來簽名交易,是以需要保護,而Address則是可以公開的資訊。
使用Credential類的靜态方法
create()
建立新賬戶。例如,下面的代碼建立一個新的賬戶并顯示其私鑰、公鑰和位址:
use TronTool\Credential;
$credential = Credential::create(); //建立新賬号
echo 'private key => ' . $credential->privateKey() . PHP_EOL; //顯示私鑰
echo 'public key => ' . $credential->publicKey() . PHP_EOL; //顯示公鑰
echo 'address => ' . $credential->address() . PHP_EOL; //顯示位址
可以使用靜态方法
fromPrivateKey()
導入已有的私鑰來執行個體化Credential。例如下面的代碼導入已有私鑰并顯示位址:
use TronTool\Credential;
$credential = Credential::fromPrivateKey('7889...023a'); //導入已有私鑰
echo 'address => ' . $credential->address() . PHP_EOL; //顯示相應位址
在Tron區塊鍊中,位址有兩種表示:16進制和base58表示,例如下面是同一個位址的兩種表示:
- base58:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
- 16進制: 412539EF4F3EB733C105A957EEBB20FD60AD8C9A43
Address類包含了相應的編解碼邏輯,可以方面的利用不同形式的位址執行個體化Address。例如:
$a1 = Address::fromBase58('TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx');
echo $a1->hex() . PHP_EOL; //輸出:412539EF4F3EB733C105A957EEBB20FD60AD8C9A43
$a2 = Address::fromHex('412539EF4F3EB733C105A957EEBB20FD60AD8C9A43');
echo $a2->base58() . PHP_EOL; //輸出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
有時我們隻需要簡單的在base58和16進制之間轉換位址,這時并不需要中間的Address對象,可以直接使用靜态方法encode()和decode()。例如:
$a1 = Address::decode('TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx');
echo $a1 . PHP_EOL; //輸出:412539EF4F3EB733C105A957EEBB20FD60AD8C9A43
$a2 = Address::encode('412539EF4F3EB733C105A957EEBB20FD60AD8C9A43');
echo $a2 . PHP_EOL; //輸出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
4、使用TronApi通路Tron節點API
使用TronApi通路Tron的各種節點API。TronApi聚合了多種Tron節點提供的API,例如tron全節點、solidity節點和事件服務節點的API。
執行個體化TronApi時,可以分别為不同類型的Tron節點指定不同的連接配接URL,例如:
use TronTool\TronApi;
$tc = new TronApi(
'https://api.trongrid.io', //全節點URL
'https://api.trongrid.io', //合約節點URL
'https://api.trongrid.io' //事件節點URL
);
當上述三個節點的URL相同時,可以簡寫為:
$tc = new TronApi('https://api.trongrid.io');
如果用的是Tron官方提供的TronGrid節點,那麼可以直接使用TronApi提供的兩個靜态函數mainNet()和testNet(),分别接入主鍊和shasta測試鍊。
例如,下面的代碼是等效的:
$tc = new TronApi('https://api.trongrid.io');
$tc = TronApi::mainNet(); //與上面等效
$tc = new TronApi('https://api.shasta.trongrid.io');
$tc = TronApi::testNet(); //與上面等效
TronApi封裝了Tron官方多種節點提供的API,并基本保持了對應關系以便于查找利用。例如查詢賬戶的TRX餘額:
$info = $tc->getAccount('TEgM5CPeqowkKUXoKrFrpvB7vcBgVkD4tP'); //查詢賬戶資訊
echo 'balance -> ' . $info->balance . PHP_EOL; //顯示賬戶餘額
Tron區塊鍊對接PHP開發包: