以太坊批量转账PHP开发包支持以太币ERC20代币的批量转账,有效减少交易手续费。官方下载地址:http://sc.hubwiz.com/codebag/eth-batch-transfer/。
1、以太坊批量转账PHP开发包简介
以太坊批量转账PHP开发包的主要特性如下:
- 支持以太币和ERC20代币一对多转账
- 只需要支付一个交易的手续费
- 支持使用公共节点(例如Infura)或自己部署节点
以太坊批量转账PHP开发包运行于PHP7.1+环境下,主要类及相互关系如下图所示:
以太坊批量转账PHP开发包的主要代码文件清单如下:
代码文件 | 说明 |
---|---|
contract/BatchTransferContract.sol | 批量转账合约 |
contract/Erc20.sol | Erc20接口合约 |
contract/SafeMath.sol | 安全计算合约 |
contract/EzToken.sol | 示例代币合约 |
ethtool/src/BatchTransfer.php | 批量转账合约PHP API |
ethtool/src/EthApi.php | EthApi接口定义 |
ethtool/src/EthApiWeb3.php | EthApi接口的Web3实现类 |
ethtool/src/Credential.php | 身份凭证类 |
ethtool/src/RawContract.php | 支持裸交易的合约封装类 |
build-contract.sh | 合约编译工具脚本 |
deploy-contract.php | 批量转账合约部署PHP程序 |
Deploy-contract-eztoken.php | 示例代币合约部署工具脚本 |
demo/ether-batch-transfer.php | 以太币批量转账演示 |
demo/erc20-approve.php | Erc20代币授权演示 |
demo/erc20-batch-transfer.php | Erc20代币批量转账演示 |
2、合约部署
以下部分说明如何使用附带的脚本和PHP程序部署合约。当然你也可以使用Solidity在线IDE部署合约。
进入开发包目录,执行如下命令编译合约:
~$ cd ~/ebt
~/ebt$ ./build-contract.sh
执行如下命令部署合约:
~/ebt$ php deploy-contract.php
在~/ebt/contract/build/目录下的合约部署地址文件(后缀.addr)中记录有合约的部署地址。
3、批量转账PHP API初始化
PHP侧提供的BatchTransfer.php包含了BatchTransfer类的实现,实例化BatchTransfer需要指定三个参数:EthApi对象、批量转账合约部署地址以及包含私钥的Credential对象。例如:
use EthTool\EthApiWeb3;
use EthTool\Credential;
use EthTool\BatchTransfer;
$url = 'https://infura.io/v3/....'; //节点URL
$btContractAddress = '0xd86c8f…cf560d5610'; //批量转账合约地址
$bt = new BatchTransfer(
new EthApiWeb3($url), //EthApi实例
Credential::fromKey($key), //Credential实例
$btContractAddress //批量转账合约地址
);
4、以太币一对多转账PHP API
使用BatchTransfer对象的sendEther()方法向多个目标地址转账以太币,调用发起账户负责支付转账总额和手续费。例如:
$recipients = [
'0xffcf8fdee72ac11b5c542428b35eef5769c409f0', //目标地址
'0x22d491bde2303f2f43325b2108d26f1eaba1e32b '
];
$values = [
'2000000', //目标金额,单位:WEI
'6000000';
];
$txid = $bt.sendEther($recipients,$values); //批量转账交易
echo 'txid => ' . $txid . PHP_EOL; //显示交易哈希
sendEther()
方法默认的gas参数和链ID为:
- gasLimit:4000000
- gasPrice:10 GWEI
- chainId:1
可以在调用时传入自定义的值,例如:
$gasLimit = '1000000'; //gas上限:1 M
$gasPrice = '2000000000'; //gas价格:2 GWEI
$chainId = 4; //目标链:ropsten
$txid = $bt.sendEther($recipients,$values,$gasLimit,$gasPrice,$chainId);
5、ERC20代币一对多转账PHP API
与以太币不同的是,在使用BatchTransfer对象的sendToken()方法向多个目标地址转帐指定的ERC20代币之前,需要首先调用approveContract()方法授权批量转账合约可以操作发起账号持有的代币。例如,下面的代码允许批量转账合约操作发起账号的指定数量的指定代币:
$tokenAddress = '…'; //代币合约地址
$value = '100000000000'; //授权数量
$txid = $bt->approveContract($tokenAddress,$value); //授权
对一个特定的发起账号/代币对,授权操作只需要进行一次。在授权交易成功后,既可以调用sendToken()方法进行一对多转账。例如:
$tokenAddress = '…'; //代币合约地址
$recipients = [
'0xffcf8fdee72ac11b5c542428b35eef5769c409f0', //目标地址
'0x22d491bde2303f2f43325b2108d26f1eaba1e32b '
];
$values = [
'2000000', //代币最小单位
'6000000';
];
$txid = $bt.sendToken($tokenAddress,$recipients,$values); //批量转账交易
echo 'txid => ' . $txid . PHP_EOL; //显示交易哈希
同样,可以指定sendToken()方法调用时的gas参数和链ID,这里不再重复。
以太坊批量转账PHP开发包下载地址:http://sc.hubwiz.com/codebag/eth-batch-transfer/