前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >以太坊代币空投合约的实现

以太坊代币空投合约的实现

作者头像
笔阁
发布2018-09-04 16:51:59
1.9K0
发布2018-09-04 16:51:59
举报
文章被收录于专栏:极客编程极客编程

本文将介绍如何在以太坊智能合约中实现代币的空投。区块链以太坊世界中所谓空投(airdrop),就是免费给你的区块链地址(公钥)发送代币。

代币空投的方式层出不穷,有手工打币空投的,也有向代币合约转账进行空投的,还可以无需转账,只需要将代币合约地址添加到imtoken钱包中去,就可以实现代币空投。本文将介绍这种无须动手的以太坊代币空投实现代码。

ERC-20代币

采用以太坊创建的ERC-20代币,指的是遵循ERC-20标准的代币,该标准指出,在代币合约中需要实现以下方法:

  • balances: 余额变量,该变量里面存储了所有拥有代币的地址的余额
代码语言:javascript
复制
mapping(address => uint) balances;
  • balanceOf():返回指定地址的账户余额
代码语言:javascript
复制
// balanceOf方法原型
function balanceOf(address _owner) constant returns (uint256 balance)
  • transfer():转移 _value 数量的token到地址 _to
代码语言:javascript
复制
// transfer方法原型
function transfer(address _to, uint256 _value) returns (bool success)
  • transferFrom()

从地址_from发送数量为_value的token到地址_to

代码语言:javascript
复制
// transferFrom方法原型
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

这里仅列出ERC-20的代币标准中要实现的部分方法,具体可以查看ERC20规范。

如何实现自动空投?

当在钱包中添加一个代币的合约时,钱包首先需要获取当前地址在该代币合约中的余额,这时钱包会调用了代币合约的 balanceOf() 方法,也就是虽然你在添加代币合约的时候。因此想要实现空投,只需要在balanceOf()方法里面实现一个空投的方法。

首先看一下,一个基本的balanceOf() 方法实现代码:

代码语言:javascript
复制
function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
}

基础的方法仅从 balances 变量中获取你当前地址的余额。

如果想要实现空投,可以这样:

代码语言:javascript
复制
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()方法进行空投,如果我想实现给每个地址仅空投一次,应该如何操作呢?

我们来新建一个变量:

代码语言:javascript
复制
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开发,可以访问汇智网提供的最热门在线互动教程:

其他更多内容也可以访问这个以太坊博客

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ERC-20代币
  • 如何实现自动空投?
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档