接上篇ERC20代幣批量轉帳實現和解析bash
咱們將講解三種空投的實現方式,前兩中都是在從新部署一個空投合約,第三種則是在代幣代碼部署以前就寫好空投代碼app
有很多的代幣已經在以太坊上線部署,一旦上線以後是不能修改代碼的,因此這些代幣要想實現空投就必須從新部署一個空投合約。利用空投合約進行轉帳。這種方式主要用到了ERC20標準中的兩個函數函數
approve: 此函數的調用方受權給定的地址能夠從其地址中提款。
transferFrom: 該函數容許智能合約自動執行轉帳流程並表明全部者發送給定數量的通證。
複製代碼
咱們能夠利用approve
函數給空投合約地址給與權限,讓他能夠調用一個地址中的代幣,而後循環調用空投合約中的transferFrom
進行批量轉帳post
先寫一個簡單的空投合約代碼ui
pragma solidity ^0.4.0;
contract Airdrop {
function batch(address tokenAddr, address []toAddr, uint256 []value) returns (bool){
require(toAddr.length == value.length && toAddr.length >= 1);
bytes4 fID= bytes4(keccak256("transferFrom(address,address,uint256)"));
for(uint256 i = 0 ; i < toAddr.length; i++){
if(!tokenAddr.call(fID, msg.sender, toAddr[i], value[i])) { revert(); }
}
}
}
複製代碼
定義了batch
函數進行空投,會接受三個參數:spa
能夠看到在for循環當中利用transferFrom
函數進行批量轉帳命令行
按照以前部署合約的步驟進行部署,在命令行中輸入airdrop
3d
若是看到上圖,就說明你部署成功啦!code
接下來就利用該合約進行空投,首先須要利用approve
給與空投合約必定的權限cdn
對上面的步驟簡單講解一下,首先咱們查看空投合約地址能夠調用的數量爲0
allowance
返回空投合約地址能夠調動一個地址代幣的數量
對地址進行解鎖,並利用approve
賦予權限,在挖礦以後繼續查看,發現空投合約能夠調用eth.accounts[0]
這個地址當中的20個代幣
給予權限以後,咱們就開始空投!
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}
從上面能夠看到批量轉帳完成
第一種方式須要咱們利用approve
給合約地址給予必定的權限,可是若是咱們把合約地址當成一個帳戶地址,給他轉一些代幣,那麼空投合約就能夠用本身地址當中的幣進行轉帳了。
先寫一個能夠實現這種方式的合約代碼
pragma solidity ^0.4.18;
contract Ownable {
address public owner;
function Ownable() public {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
}
interface Token {
function balanceOf(address _owner) public constant returns (uint256 );
function transfer(address _to, uint256 _value) public ;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
}
contract Airdropper is Ownable {
function AirTransfer(address[] _recipients, uint[] _values, address _tokenAddress) onlyOwner public returns (bool) {
require(_recipients.length > 0);
Token token = Token(_tokenAddress);
for(uint j = 0; j < _recipients.length; j++){
token.transfer(_recipients[j], _values[j]);
}
return true;
}
}
複製代碼
從代碼中能夠看到咱們是利用合約地址當中的代幣進行交易的,按照以前部署代幣的步驟咱們進行部署
部署成功以後,向空投合約轉一些代幣,而後調用空投合約的方法進行空投,實施的步驟和第一種方式大同小異,就不在贅述了,具體看下圖
前面兩種方式都是在合約外部在從新部署一個合約用於空投,第三種方式則是在合約中就實現空投,實現的思路其實和以前的方法同樣,只不過是集合到了合約當中
將下面的代碼加到合約當中
function batch(address []toAddr, uint256 []value) returns (bool){
require(toAddr.length == value.length && toAddr.length >= 1);
for(uint256 i = 0 ; i < toAddr.length; i++){
transfer(toAddr[i], value[i]);
}
}
複製代碼
按照以前的步驟部署到geth私有鏈中,查看合約
能夠發現,如今的合約當中已經有了batch
方法了,而後進行交易就能夠了
空投合約的三種方式就實現了,其實原理都很簡單