trc20地址监听php,Tron/USDT-TRC20对接PHP开发包 - 人人都是架构师
TronTool開發(fā)包適用于為PHP應(yīng)用快速增加對(duì)Tron/USDT-TRC20數(shù)字資產(chǎn)的支持能力,即支持使用自有Tron區(qū)塊鏈節(jié)點(diǎn)的應(yīng)用場(chǎng)景,也支持基于Tron官方公共API服務(wù)的輕量級(jí)部署場(chǎng)景。TronTool官方下載地址:http://sc.hubwiz.com/codebag/tron-php-lib/。
1、開發(fā)包概述
TronTool開發(fā)包主要包含以下特性:
支持Tron區(qū)塊鏈原生Trx交易
支持Tron智能合約以及TRC20代幣,例如USDT-TRC20等
支持交易的離線簽名,避免泄露私鑰
完善的Tron節(jié)點(diǎn)API封裝,支持全節(jié)點(diǎn)、Solidity節(jié)點(diǎn)和事件節(jié)點(diǎn)提供的API
支持使用自有節(jié)點(diǎn)或第三方節(jié)點(diǎn),例如Tron官方提供的公共節(jié)點(diǎn)
TronTool軟件包運(yùn)行在**Php 7.1+**環(huán)境下,當(dāng)前版本1.0.0,主要類/接口及關(guān)系如下圖所示:
TronTool的主要代碼文件清單如下:
代碼文件說明tron.php/src/TronKit.phpTron開發(fā)包入口類
tron.php/src/Trc20.phpTron TRC20智能合約封裝類
tron.php/src/Contract.phpTron智能合約封裝類
tron.php/src/Credential.phpTron區(qū)塊鏈身份標(biāo)識(shí)類,用于交易簽名
tron.php/src/Address.phpTron地址表示類
tron.php/src/TronApi.phpTron節(jié)點(diǎn)API聚合封裝類
tron.php/src/NodeClient.phpHTTP協(xié)議封裝類
demo/NewAddressDemo.php演示代碼,創(chuàng)建新的Tron區(qū)塊鏈地址
demo/TrxDemo.php演示代碼,Trx轉(zhuǎn)賬交易及余額查詢
demo/Trc20Demo.php演示代碼,Trc20代幣轉(zhuǎn)賬、余額查詢、事件監(jiān)聽等
demo/DeployContractDemo.php演示代碼,智能合約的部署
demo/build-contract.php示例Trc20代幣合約的構(gòu)建腳本
demo/contract/EzToken.sol示例Trc20代幣合約
demo/contract/build/EzToken.abi示例Trc20代幣合約的ABI文件
demo/contract/build/EzToken.bin示例Trc20代幣合約的字節(jié)碼文件
vendor第三方依賴包目錄
composer.jsoncomposer配置文件
2、使用示例代碼
2.1 創(chuàng)建新地址
在終端進(jìn)入演示代碼目錄,執(zhí)行如下命令:
~$ cd ~/trontool/demo
~/trontool/demo$ php NewAddressDemo.php
執(zhí)行結(jié)果如下:
2.2 Trx轉(zhuǎn)賬及余額查詢
在終端進(jìn)入演示代碼目錄,執(zhí)行如下命令:
~$ cd ~/trontool/demo
~/trontool/demo$ php TrxDemo.php
執(zhí)行結(jié)果如下:
2.3 Trc20代幣轉(zhuǎn)賬、余額查詢及事件監(jiān)聽
在終端進(jìn)入演示代碼目錄,執(zhí)行如下命令:
~$ cd ~/trontool/demo
~/trontool/demo$ php Trc20Demo.php
執(zhí)行結(jié)果如下:
2.4 Tron智能合約部署
在終端進(jìn)入演示代碼目錄,執(zhí)行如下命令:
~$ cd ~/trontool/demo
~/trontool/demo$ php DeployContractDemo.php
執(zhí)行結(jié)果如下:
2、使用TronKit
TronKit是開發(fā)包的入口,使用這個(gè)類可以快速實(shí)現(xiàn)如下功能:
Trx轉(zhuǎn)賬與余額查詢
Trc20代幣轉(zhuǎn)賬、授權(quán)、余額查詢等
2.1 實(shí)例化TronKit
TronKit實(shí)例化需要傳入TronApi對(duì)象和Credential對(duì)象,這兩個(gè)參數(shù)分別封裝了Tron節(jié)點(diǎn)提供的API,以及進(jìn)行交易簽名的用戶身份信息。
例如,下面的代碼創(chuàng)建一個(gè)接入Tron主鏈的TronKit實(shí)例,并使用指定的私鑰進(jìn)行交易簽名:
use TronToolTronKit;
use TronToolTronApi;
use TronToolCredential;
$kit = new TronKit(
TronApi::mainNet(), //接入主鏈
Credential::fromPrivateKey('87c12d....d435') //使用指定私鑰
);
2.2 Trx轉(zhuǎn)賬及余額查詢
使用TronKit的sendTrx()方法進(jìn)行Trx轉(zhuǎn)賬,例如發(fā)送1000 TRX:
$to = 'TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx'; //轉(zhuǎn)賬目標(biāo)地址
$amount = 1000000000; //轉(zhuǎn)賬金額,單位:SUN
$ret = $kit->sendTrx($to,$amount); //提交Trx轉(zhuǎn)賬交易
echo 'txid => ' . $ret->tx->txID . PHP_EOL; //顯示交易ID
echo 'result => ' . $ret->result . PHP_EOL; //顯示交易結(jié)果
注意:需要將金額單位轉(zhuǎn)換為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代幣轉(zhuǎn)賬
使用Trc20()方法獲取指定TRC20代幣合約實(shí)例,然后調(diào)用合約的transfer()方法進(jìn)行TRC20代幣轉(zhuǎn)賬。例如,下面的代碼指定地址間轉(zhuǎn)賬1315300個(gè)最小單位的USDT-TRC20代幣,即1.3153 USDT:
$to = 'TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx'; //轉(zhuǎn)賬目標(biāo)地址
$amount = 1315300; //轉(zhuǎn)賬Trc20代幣數(shù)量
$contractAddress = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t' //USDT-TRC20代幣合約的部署地址
$usdt = $kit->Trc20($contractAddress); //創(chuàng)建Trc20代幣合約實(shí)例
$ret = $usdt->transfer($to,$amount); //轉(zhuǎn)賬Trc20代幣
echo 'txid => ' . $ret->tx->txID . PHP_EOL; //顯示轉(zhuǎn)賬交易ID
echo 'result => ' . $ret->result . PHP_EOL; //顯示轉(zhuǎn)賬交易結(jié)果
2.4 TRC20代幣余額查詢
使用Trc20()方法獲取指定TRC20代幣合約實(shí)例,然后調(diào)用合約的balanceOf()方法查詢指定地址的TRC20代幣余額。例如,下面的代碼查詢指定地址的USDT代幣余額:
$usdt = $kit->Trc20('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'); //創(chuàng)建USDT-TRC20代幣合約實(shí)例
$balance = $usdt->balanceOf('TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx'); //查詢Trc20代幣余額
echo 'usdt balance => ' . $balance . PHP_EOL; //顯示代幣余額
2.5 TRC20代幣事件查詢
使用Trc20()方法獲取指定TRC20代幣合約實(shí)例,然后調(diào)用合約的events()方法查詢指定合約觸發(fā)事件。
例如查詢USDT代幣合約最近10秒的事件:
$usdt = $kit->Trc20('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'); //創(chuàng)建Trc20代幣合約實(shí)例
$since = time() - 10000; //計(jì)算檢查時(shí)間點(diǎn)
$events = $usdt->events($since); //提取合約事件
foreach($events as $event){
echo 'block height => ' . $event->block_number . PHP_EOL; //顯示事件觸發(fā)的區(qū)塊高度
echo 'event name => ' . $event->event_name . PHP_EOL; //顯示事件名稱
}
events()返回的結(jié)果是一個(gè)事件對(duì)象數(shù)組,每個(gè)成員對(duì)象的主要字段說明如下:
caller_contract_address:調(diào)用合約地址,base58格式
transaction_id:觸發(fā)合約事件的交易ID,16進(jìn)制字符串
result:合約事件參數(shù)列表,數(shù)組
result_type:合約事件參數(shù)類型列表,數(shù)組
block_timestamp:事件所在區(qū)塊時(shí)間戳,整數(shù)
block_number:事件所在區(qū)塊號(hào),整數(shù)
event_name:事件名稱,字符串
contract_address:合約地址,base58格式
event_index:事件索引序號(hào),整數(shù)
例如,下面是一個(gè)TRC20代幣合約的Transfer事件對(duì)象的JSON表示,在event_name字段給出了事件名稱,在result字段則給出了兩種索引形式的事件參數(shù):
{
"caller_contract_address": "TS2Hzo6KpAc8Ym2nGb3idpMtUpM2GiK2gL",
"transaction_id": "265cf378f4943b7c77b7a294f533d4b8c718c297dd28a664848d77cd3f3a0af0",
"result": {
"0": "0x2539ef4f3eb733c105a957eebb20fd60ad8c9a43", //事件參數(shù)0
"1": "0x6f6794f3904ff51f9fa81e928afdec91f6744a50", //事件參數(shù)1
"2": "8", //事件參數(shù)2
"_from": "0x2539ef4f3eb733c105a957eebb20fd60ad8c9a43", //事件參數(shù)_from
"_value": "8", //事件參數(shù)_value
"_to": "0x6f6794f3904ff51f9fa81e928afdec91f6744a50" //事件參數(shù)_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區(qū)塊鏈身份與地址表示
在TronTool中,使用Credential表征Tron區(qū)塊鏈中的一個(gè)用戶身份,使用Address表征Tron區(qū)塊鏈中的一個(gè)地址。兩者的區(qū)別在于Credential包含了用戶的私鑰信息,可以用來簽名交易,因此需要保護(hù),而Address則是可以公開的信息。
使用Credential類的靜態(tài)方法create()創(chuàng)建新賬戶。例如,下面的代碼創(chuàng)建一個(gè)新的賬戶并顯示其私鑰、公鑰和地址:
use TronToolCredential;
$credential = Credential::create(); //創(chuàng)建新賬號(hào)
echo 'private key => ' . $credential->privateKey() . PHP_EOL; //顯示私鑰
echo 'public key => ' . $credential->publicKey() . PHP_EOL; //顯示公鑰
echo 'address => ' . $credential->address() . PHP_EOL; //顯示地址
可以使用靜態(tài)方法fromPrivateKey()導(dǎo)入已有的私鑰來實(shí)例化Credential。例如下面的代碼導(dǎo)入已有私鑰并顯示地址:
use TronToolCredential;
$credential = Credential::fromPrivateKey('7889...023a'); //導(dǎo)入已有私鑰
echo 'address => ' . $credential->address() . PHP_EOL; //顯示相應(yīng)地址
在Tron區(qū)塊鏈中,地址有兩種表示:16進(jìn)制和base58表示,例如下面是同一個(gè)地址的兩種表示:
base58:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
16進(jìn)制: 412539EF4F3EB733C105A957EEBB20FD60AD8C9A43
Address類包含了相應(yīng)的編解碼邏輯,可以方面的利用不同形式的地址實(shí)例化Address。例如:
$a1 = Address::fromBase58('TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx');
echo $a1->hex() . PHP_EOL; //輸出:412539EF4F3EB733C105A957EEBB20FD60AD8C9A43
$a2 = Address::fromHex('412539EF4F3EB733C105A957EEBB20FD60AD8C9A43');
echo $a2->base58() . PHP_EOL; //輸出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
有時(shí)我們只需要簡(jiǎn)單的在base58和16進(jìn)制之間轉(zhuǎn)換地址,這時(shí)并不需要中間的Address對(duì)象,可以直接使用靜態(tài)方法encode()和decode()。例如:
$a1 = Address::decode('TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx');
echo $a1 . PHP_EOL; //輸出:412539EF4F3EB733C105A957EEBB20FD60AD8C9A43
$a2 = Address::encode('412539EF4F3EB733C105A957EEBB20FD60AD8C9A43');
echo $a2 . PHP_EOL; //輸出:TDN3QY85Jft3RwgyatjRNmrwRmwkn8qwqx
4、使用TronApi訪問Tron節(jié)點(diǎn)API
使用TronApi訪問Tron的各種節(jié)點(diǎn)API。TronApi聚合了多種Tron節(jié)點(diǎn)提供的API,例如tron全節(jié)點(diǎn)、solidity節(jié)點(diǎn)和事件服務(wù)節(jié)點(diǎn)的API。
實(shí)例化TronApi時(shí),可以分別為不同類型的Tron節(jié)點(diǎn)指定不同的連接URL,例如:
use TronToolTronApi;
$tc = new TronApi(
'https://api.trongrid.io', //全節(jié)點(diǎn)URL
'https://api.trongrid.io', //合約節(jié)點(diǎn)URL
'https://api.trongrid.io' //事件節(jié)點(diǎn)URL
);
當(dāng)上述三個(gè)節(jié)點(diǎn)的URL相同時(shí),可以簡(jiǎn)寫為:
$tc = new TronApi('https://api.trongrid.io');
如果用的是Tron官方提供的TronGrid節(jié)點(diǎn),那么可以直接使用TronApi提供的兩個(gè)靜態(tài)函數(shù)mainNet()和testNet(),分別接入主鏈和shasta測(cè)試鏈。
例如,下面的代碼是等效的:
$tc = new TronApi('https://api.trongrid.io');
$tc = TronApi::mainNet(); //與上面等效
$tc = new TronApi('https://api.shasta.trongrid.io');
$tc = TronApi::testNet(); //與上面等效
TronApi封裝了Tron官方多種節(jié)點(diǎn)提供的API,并基本保持了對(duì)應(yīng)關(guān)系以便于查找利用。例如查詢賬戶的TRX余額:
$info = $tc->getAccount('TEgM5CPeqowkKUXoKrFrpvB7vcBgVkD4tP'); //查詢賬戶信息
echo 'balance -> ' . $info->balance . PHP_EOL; //顯示賬戶余額
Tron區(qū)塊鏈對(duì)接PHP開發(fā)包:http://sc.hubwiz.com/codebag/tron-php-lib/
總結(jié)
以上是生活随笔為你收集整理的trc20地址监听php,Tron/USDT-TRC20对接PHP开发包 - 人人都是架构师的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yii2中的rules验证规则
- 下一篇: nginx php-fpm 输出php错