若是你但愿立刻开始学习以太坊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]; }
修改以后,便可以进行添加即空投的实现。
固然,上面的例子其实只是简易版的,咱们也能够在任何一个被调用的方法里面去判断这个帐户是否接受过空投,若是没有则直接为该帐户进行空投。
原文:以太坊代币空投合约实现