PHP如何使用ERC20代币(Token)

今天我想展示如何在PHP中使用符合ERC20的Tokens代币。这个问题在PHP开发人员中让人十分痛苦,找出了一种使用ERC20智能合约和代币Tokens的方法,即执行某些操作,例如查询合约的基本常量和信息(例如,名称、符号、数值、账户余额)、检查地址的账户信息、发送这些ERC20 Tokens到其他以太坊地址等。不经过Node.js或其他js平台来与以太坊的web3 API工作。

我已经通过以太坊 RPC协议做了些工作,将以太坊与我的项目的其他加密算法集成在一起,为此,我用PHP编写了一个轻便好用的库,它是开放源码的使用MIT许可,有兴趣的可以访问这里Ethereum RPC lib,但这只是开始了,后来我增加了支持其他特性,包括使用以太坊 ABI合约,所以这给了我一个机会来创建一个单独的包来扩展我这个以太坊RPC库,并内置了ERC20合约ABI和方法,这里是:ERC20-PHP lib

虽然这些库已经有一段时间了,但像往常一样,我在写博客的时候不太马虎。不管怎样,如果你安装了PHP 7.1,你就可以开始了!(或者,你可以选择分叉这些存储库并进行必要的更改以使其与较旧的PHP版本兼容)

安装

1
composer require furqansiddiqui/erc20-php

或者可以直接从github下载并根据需要配置加载。

实例化

1
2
3
4
5
6
7
8
9
10
11
<?php

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 Tokens的合约地址;根据你的项目,你应该在你的数据库中有所有你将使用的ERC20 Tokens的合约地址,但是对于这个demo演示中,我将随机选择两个ERC20的合约地址。在EtherScan tokens页面上的前10名:https://etherscan.io/tokens

1
2
3
4
5
6
7
$token = $erc20->token("0x05f4a42e251f2d52b8ed15e9fedaacfcef1fad27");
// $token is now an instance of "ERC20_Token" class, now let's retrieve basic details about this token

var_dump($token->name()); // string(7) "Zilliqa"
var_dump($token->decimals()); // int(12)
var_dump($token->symbol()); // string(3) "ZIL"
var_dump($token->totalSupply()); // string(24) "12600000000.000000000000"

现在让我们试试更多内容:

1
2
3
4
5
$token = $erc20->token("0xd26114cd6EE289AccF82350c8d8487fedB8A0C07");
var_dump($token->name()); // string(8) "OMGToken"
var_dump($token->decimals()); // int(18)
var_dump($token->symbol()); // string(3) "OMG"
var_dump($token->totalSupply()); // string(28) "140245398.245132780789239631"

所以我们需要的是一个有效的ERC20合约地址来处理它。听起来还不错,对吧?

查询帐户余额:

为了查询一个账户地址的数字加密币余额,只需要你提供地址,并调用balanceOf方法:

1
2
$token = $erc20->token("0x...contract-address");
var_dump($token->balanceOf("0x...address")); // string(26) "1216709.519608225542850811"

返回余额将被给到合约使用的精度。

发送ECR20 token

ERC20合约ABI有一个transfer方法,但不幸的是,ERC20 token比调用这种转移方法需要做更多的工作,而不是简单的调用。基本上,将ERC20 token从一个以太坊帐户转账到另一个帐户的过程涉及将转账方法与其参数一起编码,然后将该编码值作为以太坊交易的data参数。

ERC20 token转账到底如何工作?

尽管ERC20合约的ABI带有内置的转账方法,但这不是你如何执行ERC20 token转账。这个方法包括使用Keccak算法对正确格式化的合约传递方法语句进行编码,包括所有传递的参数。这确实是一个复杂的过程,但是对一个开发人员不能让你更方便的时候,使用这个库有什么意义呢?因此,这里有一个简单而精干的方法将ERC20 token从一个以太坊地址转账到另一个地址。

交易费用说明:以太坊区块链上的任何交易都需要使用gas,因此,如果你打算从token中转账一定数量的token,但eth数量不足时,则交易将不通过!

ERC20 Token转账

让我们从实例化必要的类开始:

1
2
3
4
5
6
7
8
9
10
11
12
<?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 token的例子:

1
2
3
4
5
6
7
$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);

转账编码:

1
2
3
// 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变量,接下来我们将准备和调度这个交易,但是这里是关键提示:

  • 交易收款人:ERC20 token转账交易被发送到ERC20合约地址,在以前的步骤中已经对原始收件人的地址进行了编码,因此不会混淆,交易必须被发送到智能合约的地址。
  • 交易金额:就像收款人一样,ERC20 token转账金额已经被编码在我们的data变量中,因此交易的ETH金额应该设置为“0”。

准备交易:

1
2
3
$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

就这样!但请注意,不要忘记发送此项交易:

1
2
// Send transaction with ETH account passphrase
$txId = $transaction->send("secret"); // Replace "secret" with actual passphrase of SENDER's ethereum

恭喜你,你的ERC20代币转账交易已被发送到以太坊的P2P网络。将从send()方法接收交易ID作为返回,你可以使用该交易ID检查任何以太坊区块链查询交易的状态!

谢谢大家的阅读!

======================================================================

另外如果你想直接看看区块链在以太坊中是如何使用的,可以学习下面的教程:

php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

其他区块链教程:

  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。
  • web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • EOS智能合约与DApp开发入门教程,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后运用react和各知识点完成一个便签DApp的开发。

汇智网原创翻译,转载请标明出处。这里是原文