使用PHP将ERC20令牌从一个帐户转移到另一个帐户

时间:2018-05-30 09:00:15

标签: php ethereum erc20

这个问题引起了PHP开发人员的痛苦,想出了一种使用ERC20合同/令牌的方法,即执行某些操作,例如检索合同的基本常量/信息(例如名称,符号,小数,总供应),检查余额地址,能够将这些ERC20令牌发送到其他以太坊地址等等......无需通过NodeJS或其他JS平台与以太坊的web3 API协同工作。

3 个答案:

答案 0 :(得分:3)

ERC20令牌转移的工作原理是什么?

尽管ERC20合约的ABI内置了传输方法,但这并不是您进行ERC20令牌传输的方式。传递令牌的方法涉及使用Keccak算法编码正确格式化的契约传递方法语句,包括所有传递的参数。这确实是一个复杂的过程,但是当它不能让你作为开发人员变得更容易时,使用库的意义何在?所以,这是一个简单而精明的方法,将ERC20令牌从一个以太坊地址转移到另一个......

交易费用注意:以太坊区块链上的任何交易都需要处理“气体”,因此,如果您打算从其转移令牌的以太坊地址具有足够数量的令牌,但仍然具有足够的金额交易,交易不会通过!

<强>库

此答案使用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);

准备以太坊交易:

现在我们已经将所需的编码传输方法十六进制字符串作为$ data var,接下来我们将准备并调度此事务,但这里是关键注释:

交易收款人: 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令牌转移事务已分发到以太坊P2P网络。您将从send()方法收到交易ID作为回报,您可以使用该交易ID在任何以太坊区块链资源管理器上检查此交易的状态!

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

答案 1 :(得分:1)

我只使用HTTP/1.1 200 OK Cache-Control: no-cache Expires: Fri, 01 Jun 2018 13:42:40 GMT Date: Fri, 01 Jun 2018 13:42:40 GMT Pragma: no-cache Expires: Fri, 01 Jun 2018 13:42:40 GMT Date: Fri, 01 Jun 2018 13:42:40 GMT Pragma: no-cache Content-Type: application/json X-FRAME-OPTIONS: SAMEORIGIN Transfer-Encoding: chunked Server: Jetty(6.1.26.cloudera.4) {"Path":"/user/dr.who"} 编写了一个简单的Ethereum适配器,它可以处理智能合约查询的任何复杂性。交易。您可以随意复制和修改自己的项目:https://github.com/daikon-cqrs/ethereum-adapter。这是一个令牌转移示例:

Guzzle

请记住,由于以太网节点处理随机数的方式,同步事务管理可能是一个难以解决的问题,并且可能最终需要在PHP端进行异步处理。

答案 2 :(得分:0)

这是一项非常艰巨的任务,因为您需要对令牌的工作方式有非常深入的了解,并且至少需要一个节点。如果您正在寻找一种适用于任何编程语言的更简单的方法,则可以查看Tokengateway。它是一个REST API,允许发送任何ERC20令牌,获取有关任何ERC20令牌的信息,获取任何ERC20令牌的余额等。另外,无需设置节点。