Перенести токен ERC20 из одной учетной записи в другую с помощью PHP

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


person Furqan Siddiqui    schedule 30.05.2018    source источник


Ответы (2)


Как работает передача токена ERC20?

Несмотря на то, что ABI контракта ERC20 поставляется со встроенным методом передачи, это не то, как вы выполняете передачу токена ERC20. Метод передачи токенов включает в себя кодирование правильно отформатированного оператора метода передачи контракта, включая все переданные аргументы, с использованием алгоритма Keccak. Это действительно сложный процесс, но какой смысл использовать библиотеку, если она не облегчает вам работу как разработчику? Итак, вот простой и продуманный метод переноса токенов ERC20 с одного адреса Ethereum на другой ...

Примечание о комиссии за транзакцию. Любая транзакция в блокчейне Ethereum требует обработки «газа», поэтому, если адрес Ethereum, с которого вы собираетесь переводить токены, имеет достаточное количество токенов, но все еще имеет НЕДОСТАТОЧНОЕ количество ETH, транзакция НЕ пройдёт!

Библиотека

В этом ответе используется библиотека erc20-php, которую можно установить с помощью композитора:

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);

Подготовьте свои вары и возьмите экземпляр токена 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, поэтому сумма транзакции 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 была отправлена ​​в P2P-сеть Ethereum. Вы получите идентификатор транзакции в качестве возврата из метода send (), и вы можете использовать этот идентификатор транзакции для проверки статуса этой транзакции в любом проводнике блокчейна Ethereum!

Спасибо за чтение! Сообщите мне, как это сработало для вас. В моем блоге есть и другие похожие темы: https://www.furqansiddiqui.com/

person Furqan Siddiqui    schedule 30.05.2018

Я написал простой 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.

person Mr Hash    schedule 01.06.2018