【问题标题】:Transfer ERC20 token from one account to another using PHP使用 PHP 将 ERC20 代币从一个账户转移到另一个账户
【发布时间】:2018-11-09 01:30:34
【问题描述】:

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

【问题讨论】:

    标签: php ethereum erc20


    【解决方案1】:

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

    准备你的变量并获取 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 变量,接下来我们将准备和分派此交易,但这里是关键注意事项:

    交易收款人: 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/

    【讨论】:

      【解决方案2】:

      我只使用Guzzle 编写了一个简单的Ethereum 适配器,它可以处理任何复杂的智能合约查询和交易。随意复制和修改您自己的项目: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' ]]); }

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

      【讨论】:

        猜你喜欢
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        相关资源
        最近更新 更多