使用 PHP 将 ERC20 代币从一个账户转移到另一个账户

Fur*_*qui 2 php ethereum erc20

这个问题在 PHP 开发人员中引起了很大的痛苦,他们想找到一种使用 ERC20 合约/代币的方法,即执行某些操作,例如检索合约的基本常量/信息(例如名称、符号、小数、totalSupply)、检查地址的余额、将这些 ERC20 代币发送到其他以太坊地址的能力等等……而无需通过 NodeJS 或其他 JS 平台来使用以太坊的 web3 API。

Fur*_*qui 6

ERC20 代币转移如何运作?

尽管 ERC20 合约的 ABI 带有内置的转移方法,但这不是您进行 ERC20 代币转移的方式。转移代币的方法涉及使用 Keccak 算法对格式正确的合同的转移方法语句进行编码,包括所有传递的参数。这确实是一个复杂的过程,但是当您作为开发人员时,使用库并不能让事情变得更容易,那么使用它有什么意义呢?因此,这是一种将 ERC20 代币从一个以太坊地址转移到另一个地址的简单而精明的方法……

交易费用注意:以太坊区块链上的任何交易都需要处理“gas”,因此如果您打算从中转移代币的以太坊地址有足够数量的代币但仍然有不足的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);
Run Code Online (Sandbox Code Playgroud)

准备你的变量并获取 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);
Run Code Online (Sandbox Code Playgroud)

编码代币传输:

// First argument is payee/recipient of this transfer
// Second argument is the amount of tokens that will be sent
$data = $token->encodedTransferData($payee, $amount);
Run Code Online (Sandbox Code Playgroud)

准备以太坊交易:

现在我们已经将所需的编码传输方法十六进制字符串作为我们的 $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
Run Code Online (Sandbox Code Playgroud)

就是这样!但说真的,不要忘记发送此交易:

// Send transaction with ETH account passphrase
$txId = $transaction->send("secret"); // Replace "secret" with actual passphrase of SENDER's ethereum account
Run Code Online (Sandbox Code Playgroud)

恭喜,您的 ERC20 代币转账交易已发送至以太坊 P2P 网络。您将收到作为 send() 方法返回的交易 ID,您可以使用该交易 ID 在任何以太坊区块链浏览器上检查此交易的状态!

感谢您的阅读!让我知道它是如何为您解决的,我的博客上也涵盖了其他类似的主题:https : //www.furqansiddiqui.com/