, , , ,

10 декабря, 2024

Работа с Tron ( TRX ) на PHP

Сегодня хотел бы рассказать про такую замечательную криптовалюту как TRON ( TRX ), а так же показать как достаточно просто можно создать сервис процессинга оплаты при помощи АПИ — https://api.trongrid.io на любимом многими РHP

Почему я считаю, что TRX замечательным:

  • Сеть Tron работает очень быстро с минимальными затратами. TRON способен обрабатывать до 2000 транзакций в секунду, что значительно больше, чем у Ethereum (15-30 транзакций/секунда) или Bitcoin (5-7 транзакций/секунда).
  • Транзакции в TRON практически бесплатны. Это делает его отличным выбором для частых и мелких переводов, особенно в DeFi-приложениях и микротранзакциях.
  • Огромная популярность стэйблкоина в сети TRON (TRC20) из-за скорости и минимальных комиссий

Теперь я хотел бы продемонстрировать простой способ как можно процессить проведение платежей на примере реализации простого API на PHP с использованием Symfony.

Каким образом настроить докер для работы Symfony а так же как развернуть на Symfony API я углоблятся не буду ( может напишу про это отдельный пост чуть позже ), а вот как установить библиотеку и подключить ее к проекту на Symfony расскажу.

Для установки библиотеки для работы с АПИ TRX потребуется composer

Устанавливаем необходимый пакет:

# composer require iexbase/tron-api

Я хочу создать API который будет реализовывать 2 метода REST API:

  1. метод создания кошелька
  2. метод получения баланса кошелька

В целом думаю этого будет достаточно для того чтобы создать кошелек TRON для оплаты чего-либо и далее регулярно выполняя запросы на метод получения данных о балансе можно будет производить проверку проведения платежа, если сумма платежа будет соответствовать той под которую создавался кошелек, тогда оплату можно считать успешной.

<?php

namespace App\Controller;

use IEXBase\TronAPI\Exception\TronException;
use IEXBase\TronAPI\Provider\HttpProvider;
use IEXBase\TronAPI\Tron;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;

class CreateWalletController extends AbstractController
{
    /**
     * @throws TronException
     */
    #[Route('/wallet', name: 'create_wallet', methods: ['POST'])]
    public function __invoke(Request $request): JsonResponse
    {
        $fullNode = new HttpProvider('https://api.trongrid.io'); // Нода Tron
        $solidityNode = new HttpProvider('https://api.trongrid.io');
        $eventServer = new HttpProvider('https://api.trongrid.io');
        $tron = new Tron($fullNode, $solidityNode, $eventServer);
        $wallet = $tron->generateAddress();
        $data = $wallet->getRawData();

        return new JsonResponse([
            'wallet' => $data['address_base58']
        ]);
    }
}

Это простой метод POST при вызове которого будет создан кошелек.
Тут важно отметить, что приватный ключ не будет нигде сохранен и передан, поэтому с кошельком далее нельзя будет выполнить какие-либо действия ( тут приводится упрощенный код для того чтобы показать как это можно сделать на PHP )

После получения публичного адреса нового кошелька можно запустить воркер, который бы проверял поступление денежных средств на данный кошелек, для этого потребуется создать метод GET с передачей параметра — адреса кошелька для проверки его баланса.

<?php

namespace App\Controller;

use IEXBase\TronAPI\Exception\TronException;
use IEXBase\TronAPI\Provider\HttpProvider;
use IEXBase\TronAPI\Tron;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;

class GetAddressInfo
{
    #[Route('/address/{address}', name: 'get_address_info')]
    public function __invoke(string $address): JsonResponse {
        $fullNode = new HttpProvider('https://api.trongrid.io');
        $solidityNode = new HttpProvider('https://api.trongrid.io');
        $eventServer = new HttpProvider('https://api.trongrid.io');

        try {
            $tron = new Tron($fullNode, $solidityNode, $eventServer);
            $tron->setAddress($address);
            $balance = $tron->getBalance();
            $info = $tron->getAccount();
        } catch (TronException $e) {
            exit($e->getMessage());
        }
        return new JsonResponse([
            'address' => $address,
            'create_date' => date('Y-m-d H:i:s', $info['create_time']/1000),
            'balance' => $balance,
        ]);
    }
}

Таким образом мы можем получить баланс кошелька и сопоставить его с ожидаемой суммой в TRX для оплаты того под что создавался кошелек. Тут важно понимать, что подобная система не является полностью работоспособной. Чтобы далее что-то делать со средствами которые поступили на счет нового кошелька, потребуется как минимум приватный ключ, но я думаю эти методы вполне могут подойти для каркаса будущего приложения в парадигме web3

Продолжение следует.