Эта проблема вызвала большую боль у разработчиков PHP, чтобы выяснить способ работы с контрактами / токенами ERC20, то есть выполнить определенные действия, такие как получение основных констант / информации контракта (например, имя, символ, десятичные числа, totalSupply), проверка баланса адреса возможность отправлять эти токены ERC20 на другие адреса Ethereum и т. д. без прохождения через NodeJS или другие платформы JS для работы с API Ethereum web3.
Как работает передача токена 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.