本文將介紹如何在以太坊智能合約中實現代幣的空投。區塊鏈世界中所謂空投(airdrop),就是免費給你的區塊鏈地址(公鑰)發送代幣。
代幣空投的方式層出不窮,有手工打幣空投的,也有向代幣合約轉賬進行空投的,還可以無需轉賬,只需要將代幣合約地址添加到imtoken錢包中去,就可以實現代幣空投。本文將介紹這種無須動手的以太坊代幣空投實現代碼。
ERC-20代幣
采用以太坊創建的ERC-20代幣,指的是遵循ERC-20標准的代幣,該標准指出,在代幣合約中需要實現以下方法:
- balances: 余額變量,該變量里面存儲了所有擁有代幣的地址的余額
mapping(address => uint) balances;
- balanceOf():返回指定地址的賬戶余額
// balanceOf方法原型
function balanceOf(address _owner) constant returns (uint256 balance)
- transfer():轉移 _value 數量的token到地址 _to
// transfer方法原型
function transfer(address _to, uint256 _value) returns (bool success)
- transferFrom()
從地址_from發送數量為_value的token到地址_to
// transferFrom方法原型
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
這里僅列出ERC-20的代幣標准中要實現的部分方法,具體可以查看ERC20規范。
如何實現自動空投?
當在錢包中添加一個代幣的合約時,錢包首先需要獲取當前地址在該代幣合約中的余額,這時錢包會調用了代幣合約的 balanceOf() 方法,也就是雖然你在添加代幣合約的時候。因此想要實現空投,只需要在balanceOf()方法里面實現一個空投的方法。
首先看一下,一個基本的balanceOf() 方法實現代碼:
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
基礎的方法僅從 balances 變量中獲取你當前地址的余額。
如果想要實現空投,可以這樣:
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];
}
修改之后,即可以進行添加即空投的實現。
當然,上面的例子其實只是簡易版的,我們也可以在任何一個被調用的方法里面去判斷這個賬戶是否接受過空投,如果沒有則直接為該賬戶進行空投。
本文根據網絡資料整理。
安利教程:1.以太坊入門實戰 2.以太坊電商DApp實戰 3.java開發以太坊區塊鏈的教程,web3j開發詳解