Перенос токена ERC20 из одной учетной записи в другую с использованием PHP - PullRequest
0 голосов
/ 30 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 01 июня 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.

0 голосов
/ 30 мая 2018

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

Несмотря на то, что ABI контракта ERC20 поставляется со встроенным методом передачи, но это не то, как вы делаете перенос токена ERC20.Метод для передачи токенов включает в себя кодирование правильно отформатированного оператора метода передачи контракта, включая все переданные аргументы, с использованием алгоритма Keccak.Это действительно сложный процесс, но какой смысл использовать библиотеку, если она не облегчает работу разработчика?Итак, вот простой и продуманный способ переноса токенов ERC20 с одного адреса 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);

Подготовьте свой 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/

...