以太坊代幣空投合約實現

weixin_33806914發表於2018-05-04

本文將介紹如何在以太坊智慧合約中實現代幣的空投。區塊鏈世界中所謂空投(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];
}

修改之後,即可以進行新增即空投的實現。

當然,上面的例子其實只是簡易版的,我們也可以在任何一個被呼叫的方法裡面去判斷這個賬戶是否接受過空投,如果沒有則直接為該賬戶進行空投。

本文根據網路資料整理。

如果你希望高效的學習以太坊DApp開發,可以訪問匯智網提供的最熱門線上互動教程:

其他更多內容也可以訪問這個以太坊部落格

相關文章