批量转账的原理

我们将讲解三种空投的实现方式,前两中都是在重新部署一个空投合约,第三种则是在代币代码部署之前就写好空投代码

有不少的代币已经在以太坊上线部署,一旦上线之后是不能修改代码的,所以这些代币要想实现空投就必须重新部署一个空投合约。利用空投合约进行转账。这种方式主要用到了ERC20标准中的两个函数

  1. approve: 此函数的调用方授权给定的地址可以从其地址中提款。
  2. transferFrom: 该函数允许智能合约自动执行转账流程并代表所有者发送给定数量的通证。
  3. 复制代码

第一种方式

我们可以利用approve函数给空投合约地址给与权限,让他可以调用一个地址中的代币,然后循环调用空投合约中的transferFrom进行批量转账

先写一个简单的空投合约代码

  1. pragma solidity ^0.4.0;
  2. contract Airdrop {
  3. function batch(address tokenAddr, address []toAddr, uint256 []value) returns (bool){
  4. require(toAddr.length == value.length && toAddr.length >= 1);
  5. bytes4 fID= bytes4(keccak256("transferFrom(address,address,uint256)"));
  6. for(uint256 i = 0 ; i < toAddr.length; i++){
  7. if(!tokenAddr.call(fID, msg.sender, toAddr[i], value[i])) { revert(); }
  8. }
  9. }
  10. }

定义了batch函数进行空投,会接受三个参数:

  1. 合约地址
  2. 接受地址列表
  3. 空投值的列表,和地址列表一一对应

可以看到在for循环当中利用transferFrom函数进行批量转账

按照之前部署合约的步骤进行部署,在命令行中输入airdrop


对上面的步骤简单讲解一下,首先我们查看空投合约地址可以调用的数量为0

allowance返回空投合约地址可以调动一个地址代币的数量

对地址进行解锁,并利用approve赋予权限,在挖矿之后继续查看,发现空投合约可以调用eth.accounts[0]这个地址当中的20个代币

给予权限之后,我们就开始空投!

  1. airdrop.batch.sendTransaction('0x6cbde372b5d3ceeee74fd56a6681eea2c3a4e94c',['0xd1d4e4a5ea685295b22d9fbe68b0cc6a8736ecf9','0xa90cf1c04ad3e96f081b599db2a7c12251ada066','0xc7e452aa3230d3699852687f7deb3c160d6ebab0','0x3e9197eb3faa278d455a35d4e9f0bc529dd5732f','0xb2dd757d40ea4b10df06e9c91e62109b82e0420b'],[1,2,3,2,1],{gas:300000})

会有人发现上面的命令不是直接执行batch方法,而是调用了sendTransactoin,这是因为我在命令行下,默认的gas很低,但是这笔交易的数据很多,所以会因为gas用光而失败,不直接调用batch是为了最后的参数gas:300000把gas设置的高一点。当然你直接调用batch方法也是可以的,但是不要最后的{gas:300000}

从上面可以看到批量转账完成