波场TRC20 Token PHP交互及Dapp开发相关

总结下 波场TRC20 Token与PHP交互及DApp开发相关。

PHP交互

使用composer安装iexbase/tron-api,该库依赖gmp扩展,不然会报BigInteger的错。

存在的问题

  1. 只支持TRC10 Token,不支持TRC20,需要自己去实现。

  2. 这个库本地验证地址的方法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

  1. 参考iexbase/tron-api-python的issue42,并不完全适用于PHP版本,需要修改相关参数

  2. 签名交易并广播

Token发行

工具

  1. Chrome扩展:Tronlink
  2. NPM:tronbox,使用方法同truffle

合约代码同Etherum,除了solidity版本号,其它无需修改。

  1. 主网发行Token及合约验证参考 官方教程, tronbox在测试网络上可以,主网上老报错,ERROR: No contract or not a valid smart contract

  2. 官方在线工具,推荐这个

合约部署链接 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) {
    }
  }

Leave a Comment

豫ICP备19001387号-1