若是你但願立刻開始學習以太坊DApp開發,能夠訪問匯智網提供的出色的在線互動教程:app
區塊鏈世界中所謂空投(airdrop),就是免費給你的區塊鏈地址(公鑰)發送代幣。學習
代幣空投的方式層出不窮,有手工打幣空投的,也有向代幣合約轉帳進行空投的,還能夠無需轉帳,只須要將代幣合約地址添加到imtoken錢包中去,就能夠實現代幣空投。本文將介紹這種無須動手的以太坊代幣空投實現代碼。區塊鏈
採用以太坊建立的ERC-20代幣,指的是遵循ERC-20標準的代幣,該標準指出,在代幣合約中須要實現如下方法:測試
mapping(address => uint) balances;
// balanceOf方法原型 function balanceOf(address _owner) constant returns (uint256 balance)
// transfer方法原型 function transfer(address _to, uint256 _value) returns (bool success)
從地址_from發送數量爲_value的token到地址_toui
// transferFrom方法原型 function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
這裏僅列出ERC-20的代幣標準中要實現的部分方法,具體能夠查看ERC20規範。你可使用在線的solidity IDE測試下面的代碼。3d
當在錢包中添加一個代幣的合約時,錢包首先須要獲取當前地址在該代幣合約中的餘額,這時錢包會調用了代幣合約的 balanceOf() 方法,也就是雖然你在添加代幣合約的時候。所以想要實現空投,只須要在balanceOf()方法裏面實現一個空投的方法。code
首先看一下,一個基本的balanceOf() 方法實現代碼:blog
function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; }
基礎的方法僅從 balances 變量中獲取你當前地址的餘額。教程
若是想要實現空投,能夠這樣:token
uint totalSupply = 100000000 ether; // 總髮行量 uint currentTotalSupply = 0; // 已經空投數量 uint airdropNum = 1 ether; // 單個帳戶空投數量 function balanceOf(address _owner) public view returns (uint256 balance) { // 添加這個方法,當餘額爲0的時候直接空投 if (balances[_owner] == 0 && currentTotalSupply < totalSupply) { currentTotalSupply += airdropNum; balances[_owner] += airdropNum; } return balances[_owner]; }
可能你會說這樣,我只須要將我地址裏面的餘額所有轉出去,那麼我又能夠調用合約的balanceOf()方法進行空投,若是我想實現給每一個地址僅空投一次,應該如何操做呢?
咱們來新建一個變量:
uint totalSupply = 100000000 ether; // 總髮行量 uint currentTotalSupply = 0; // 已經空投數量 uint airdropNum = 1 ether; // 單個帳戶空投數量 // 存儲是否空投過 mapping(address => bool) touched; // 修改後的balanceOf方法 function balanceOf(address _owner) public view returns (uint256 balance) { // 添加這個方法,當餘額爲0的時候直接空投 if (!touched[_owner] && currentTotalSupply < totalSupply) { touched[_owner] = true; currentTotalSupply += airdropNum; balances[_owner] += airdropNum; } return balances[_owner]; }
修改以後,便可以進行添加即空投的實現。
固然,上面的例子其實只是簡易版的,咱們也能夠在任何一個被調用的方法裏面去判斷這個帳戶是否接受過空投,若是沒有則直接爲該帳戶進行空投。
原文:以太坊代幣空投合約實現