Перенос токена ERC20 из одной учетной записи в другую с использованием PHP
Эта проблема вызвала большую боль у разработчиков PHP, чтобы найти способ работать с контрактами / токенами ERC20, то есть выполнять определенные действия, такие как получение основных констант / информации контракта (например, имя, символ, десятичные числа, totalSupply), проверка баланса адреса возможность отправлять эти токены ERC20 на другие адреса Ethereum и т. д. без прохождения через NodeJS или другие платформы JS для работы с API Ethereum web3.
2 ответа
Как работает передача токена ERC20?
Хотя ABI контракта ERC20 поставляется со встроенным методом передачи, но это не то, как вы делаете передачу токена ERC20. Метод для передачи токенов включает кодирование правильно отформатированного оператора метода передачи контракта, включая все переданные аргументы, с использованием алгоритма Keccak. Это действительно сложный процесс, но какой смысл использовать библиотеку, если она не облегчает работу разработчика? Итак, вот простой и продуманный способ переноса токенов ERC20 с одного адреса Ethereum на другой…
Плата за транзакцию Примечание: Любая транзакция по блокчейну Ethereum требует обработки "газом", поэтому, если адрес Ethereum, с которого вы собираетесь передавать токены, имеет достаточное количество токенов, но при этом имеет НЕДОСТАТОЧНОЕ количество ETH, транзакция НЕ пройдёт!
Библиотека
Этот ответ использует erc20-php
библиотека, которую можно установить с помощью composer:
composer require furqansiddiqui/erc20-php
ERC20 передача токенов
Начнем с создания необходимых классов:
<?php
declare(strict_types=1);
use EthereumRPC\EthereumRPC;
use ERC20\ERC20;
// Instantiate Ethereum RPC lib with your server credentials (i.e. Ethereum-Go)
// This example assumes Ethereum RPC server running on standard port 8545 on localhost
$geth = new EthereumRPC('127.0.0.1', 8545);
// Instantiate ERC20 lib by passing Instance of EthereumRPC lib as constructor argument
$erc20 = new ERC20($geth);
Подготовьте свой vars и возьмите экземпляр токена ERC20:
$contract = "0x...contract-address"; // ERC20 contract address
$payer = "0x...payer-address"; // Sender's Ethereum account
$payee = "0x...payee-address"; // Recipient's Ethereum account
$amount = "1.2345"; // Amount of tokens to transfer
// Grab instance of ERC20_Token class
$token = $erc20->token($contract);
Кодирование передачи токена:
// First argument is payee/recipient of this transfer
// Second argument is the amount of tokens that will be sent
$data = $token->encodedTransferData($payee, $amount);
Подготовьте транзакцию Ethereum:
Теперь, когда у нас есть требуемая закодированная шестнадцатеричная строка метода передачи в качестве переменной $ data, мы будем готовить и отправлять эту транзакцию, но вот ключевые замечания:
Получатель транзакции: транзакции передачи токена ERC20 отправляются на адрес контракта ERC20, вы закодировали адрес исходного получателя на предыдущем шаге, поэтому не нужно путать, транзакция должна быть отправлена на адрес смарт-контракта.
Сумма транзакции: так же, как и получатель, сумма перевода токена ERC20 уже закодирована в нашем $data var, поэтому сумма транзакции ETH должна быть установлена на "0"
Подготовка транзакции:
$transaction = $geth->personal()->transaction($payer, $contract) // from $payer to $contract address
->amount("0") // Amount should be ZERO
->data($data); // Our encoded ERC20 token transfer data from previous step
и это все! А если серьезно, не забудьте отправить эту транзакцию:
// Send transaction with ETH account passphrase
$txId = $transaction->send("secret"); // Replace "secret" with actual passphrase of SENDER's ethereum account
Поздравляем, ваша транзакция передачи токена ERC20 отправлена в сеть Ethereum P2P. Вы получите идентификатор транзакции в качестве возврата от метода send(), и вы можете использовать этот идентификатор транзакции для проверки статуса этой транзакции в любом проводнике цепочек цепочек Ethereum!
Спасибо за чтение! Дайте мне знать, как это сработало для вас, у меня есть другие подобные темы, освещенные в моем блоге: https://www.furqansiddiqui.com/
Я написал простую Ethereum
использование адаптера Guzzle
только которые могут обрабатывать любые сложные запросы и транзакции. Не стесняйтесь копировать и модифицировать для своего собственного проекта: https://github.com/daikon-cqrs/ethereum-adapter. Вот пример передачи токена:
public function transferToken(string $tokenContract, string $from, string $to, float $value): array {
$signature = $this->getFunctionSignature('transfer(address,uint256)');
$to = str_pad(substr($to, 2), 64, '0', STR_PAD_LEFT);
$value = str_pad($this->bcdechex($this->toWei($value)), 64, '0', STR_PAD_LEFT);
return $this->call('eth_sendTransaction', [[
'from' => $from,
'to' => $tokenContract,
'data' => $signature.$to.$value,
'value' => '0x0'
]]);
}
Имейте в виду, что из-за того, как узлы Ethereum обрабатывают одноразовые номера, управление синхронными транзакциями может быть сложной проблемой, и, вероятно, в конечном итоге требует асинхронной обработки на стороне PHP.
Это довольно сложная задача, так как вам нужно очень глубокое понимание того, как работают токены, и вам понадобится хотя бы один узел. Если вы ищете более простой метод, который работает с любым языком программирования, вы можете проверить Tokengateway. Это REST API, который позволяет отправлять любой токен ERC20, получать информацию о любом токене ERC20, получать баланс любого токена ERC20 и многое другое. Также нет необходимости настраивать узел.