总结下 波场TRC20 Token与PHP交互及DApp开发相关。
PHP交互
使用composer
安装iexbase/tron-api
,该库依赖gmp
扩展,不然会报BigInteger
的错。
存在的问题
-
只支持TRC10 Token,不支持
TRC20
,需要自己去实现。 -
这个库本地验证地址的方法
isAddress
有BUG,总是返回false
,composer仓库并未更新,需手动修改/vendor/iexbase/tron-api/src/Tron.php
/**
* Validate Tron Address (Locale)
*
* @param string|null $address
* @return bool
*/
public function isAddress(string $address = null)
{
if(strlen($address) !== self::ADDRESS_SIZE)
return false;
$address = Base58Check::decode($address, 0, 0, false);
$utf8 = hex2bin($address);
if(strlen($utf8) !== 25) return false;
if(strpos($utf8 , chr(self::ADDRESS_PREFIX_BYTE)) !== 0) return false;
$checkSum = substr($utf8, 21);
$address = substr($utf8, 0, 21);
$hash0 = Hash::SHA256($address);
$hash1 = Hash::SHA256($hash0);
$checkSum1 = substr($hash1, 0, 4);
if ($checkSum === $checkSum1)
return true;
return false;
}
Token余额
使用TronGrid提供的公共API可以查询,另外也可以通过调用合约方法的方式来实现,即balanceOf。
发送Token
-
参考iexbase/tron-api-python的issue42,并不完全适用于PHP版本,需要修改相关参数
Token发行
工具
- Chrome扩展:Tronlink
- NPM:tronbox,使用方法同
truffle
合约代码同Etherum,除了solidity版本号,其它无需修改。
-
主网发行Token及合约验证参考 官方教程, tronbox在测试网络上可以,主网上老报错,
ERROR: No contract or not a valid smart contract
。 -
官方在线工具,推荐这个
合约部署链接 https://tronscan.io/#/contracts/contract-compiler
合约验证链接 https://tronscan.io/#/contracts/verify
合约收录 https://tronscan.io/#/tokens/create/Type
DApp
合约交互可使用 JS工具 tronweb
查询合约内交易
单条记录示例,发送地址,接收地址,数量需要自己解析。
array(13) {
["ret"]=>
array(1) {
[0]=>
array(1) {
["contractRet"]=>
string(7) "SUCCESS"
}
}
["signature"]=>
array(1) {
[0]=>
string(130) "9358d1f0399b60bbac5d2fef402bba712586370021e93242935db0757989dbfb6dbffc0fdb3eb651eeae97b01e3a99da70ef9decb376ce79635c7e27d88b926d00"
}
["txID"]=>
string(64) "e54f1f87c5212ca649f228cab80475bf122b853b672ab676cebdeb4b0a5a2894"
["net_usage"]=>
int(345)
["raw_data_hex"]=>
string(422) "0a025e32220888c29e3164584f8e40889194b6fd2e5aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a154128a2e1886a856f2a80ab25c04a522d5bb928c2b8121541a614f803b6fd780986a42c78ec9c7f77e6ded13c2244a9059cbb000000000000000000000000391ab53d7dcd641d45492a56a53e4c8fc8d5d470000000000000000000000000000000000000000000000000000000002fcf7ffa70b0e090b6fd2e900180ade204"
["net_fee"]=>
int(0)
["energy_usage"]=>
int(0)
["block_timestamp"]=>
string(13) "1614215919000"
["blockNumber"]=>
string(8) "27942470"
["energy_fee"]=>
int(2048340)
["energy_usage_total"]=>
int(14631)
["raw_data"]=>
array(6) {
["contract"]=>
array(1) {
[0]=>
array(2) {
["parameter"]=>
array(2) {
["value"]=>
array(3) {
["data"]=>
string(136) "a9059cbb000000000000000000000000391ab53d7dcd641d45492a56a53e4c8fc8d5d470000000000000000000000000000000000000000000000000000000002fcf7ffa"
["owner_address"]=>
string(42) "4128a2e1886a856f2a80ab25c04a522d5bb928c2b8"
["contract_address"]=>
string(42) "41a614f803b6fd780986a42c78ec9c7f77e6ded13c"
}
["type_url"]=>
string(49) "type.googleapis.com/protocol.TriggerSmartContract"
}
["type"]=>
string(20) "TriggerSmartContract"
}
}
["ref_block_bytes"]=>
string(4) "5e32"
["ref_block_hash"]=>
string(16) "88c29e3164584f8e"
["expiration"]=>
int(1614215973000)
["fee_limit"]=>
int(10000000)
["timestamp"]=>
int(1614215917616)
}
["internal_transactions"]=>
array(0) {
}
}