Взаимодействие с Tron нодой из PHP
Библиотека
Для работы с блокчейном Tron будем использовать библиотеку iexbase/tron-api:
1
composer require iexbase/tron-api --ignore-platform-reqs
Да, библиотека довольно старая (последний релиз в 2022 году). Но в принципе в ней всё что нужно есть и она поддерживает PHP 8. По сути библиотека скорее мертва, чем жива: последний pull request был вмержен в 2021 году. Есть альтернатива в виде Fenguoz/tron-php. Она более свежая: последний релиз был в 2024 году, но она например не умеет отправлять TRC10 токены и не умеет в смарт-контракты.
Можно вообще использовать любой HTTP-клиент (например Guzzle) и просто делать API-запросы к ноде.
Типы нод
У блокчейна Tron есть три типа нод:
- Super nodes генерируют новые блоки, а так же валидируют и записывают транзакции в эти блоки. Информация с таких нод общедоступна для всех пользователей через эксплореры, например Tronscan.
- Full nodes осуществляют полный контроль над on-chain данными (хранят их и синхронизируют), включая real-time обновления, бродакст транзакций и предоставление API.
- Solidity nodes интегрируют данные из соответствующих full нод и предоставляют API. Синхронизируют только solidified блоки.
По умолчанию библиотека в качестве нод использует https://api.trongrid.io
, поэтому если мы планируем работать с trongrid
, то получить номер последнего блока можно следующим образом:
1
2
3
$tron = new \IEXBase\TronAPI\Tron();
$blockData = $tron->getCurrentBlock();
echo "Last block number: " . $blockData['block_header']['raw_data']['number'];
Если планируем использовать свои ноды, то нужно указать это явно. Например, если хотим работать с тестнетом Shasta:
1
2
3
4
5
6
7
8
$shastaFullNode = new \IEXBase\TronAPI\Provider\HttpProvider(
'https://api.shasta.trongrid.io'
);
$shastaSolidityNode = new \IEXBase\TronAPI\Provider\HttpProvider(
'https://api.shasta.trongrid.io'
);
$tronShasta = new \IEXBase\TronAPI\Tron($shastaFullNode, $shastaSolidityNode);
Под капотом вызывается jsonrpc метод solidity ноды
walletsolidity/getnowblock
. По сути объектTron
- просто обертка с хэлперами методами для доступа сразу ко всем нодам. Например, запрос для получения блокаgetCurrentBlock()
можно переписать с запросом к ноде:
1 2 $blockData = $solidityNode->request('walletsolidity/getnowblock'); $blockNumber = $blockData['block_header']['raw_data']['number'];
Получение баланса
В блокчейне Tron можно получить TRX баланс адреса через апи метод solidity ноды walletsolidity/getaccount
. В нашем случае библиотека предоставляет удобный хэлпер для этого:
1
2
$balance = $tron->getBalance('TXHy2ftx3pxbvba3LRm8NoDLkeg949L7Ze');
echo $balance . PHP_EOL; // 153492332146
По умолчанию баланс вернется в минимальных единицах. Например, если баланс адреса 153,492.332146 TRX
, то мы получим число 153492332146
. Чтоб получить красиво отформатированное число (в виде decimal), нужно вторым аргументом передать true
:
1
2
$balance = $tron->getBalance('TXHy2ftx3pxbvba3LRm8NoDLkeg949L7Ze', true);
echo $balance . PHP_EOL; // 153,492.332146
Информация о ноде
Ради интереса модно получить данные о самой ноде, с которой мы общаемся. Хэлпера для этого нет, поэтому нужно будет сделать запрос напрямую. Будем вызывать API walletsolidity/getnodeinfo
:
1
2
$nodeInfo = $solidityNode->request('walletsolidity/getnodeinfo');
echo $nodeInfo['machineInfo']['osName']; // "Linux 3.10.0-1160.49.1.el7.x86_64"
Код выше выведет OS, которая работает на solidity ноде.