本文将介绍如何在以太坊智能合约中实现代币的空投. 区块链世界中所谓空投 (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. 以太坊入门实战 http://t.cn/RmeEwxJ 2. 以太坊电商 DApp 实战 http://t.cn/RnmDmaD
来源: https://www.cnblogs.com/helloworld2018/p/8989686.html