最近各种项目的代币空投层出不穷, 有手工打币空投的, 也有向代币合约转账 0eth 进行空投的, 但是最近出现了一些无需转账, 只需要将代币合约地址添加到 imtoken 中去, 就可以实现空投, 很多朋友不理解这里面的原理, 觉得什么事情也没做, 怎么就能够定点空投到我的地址中呢? 下面我就来详细解释下如何实现 imtoken 添加即空投代币的方法
采用以太坊创建的 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 的代币标准中索要实现的方法, 我仅仅提出这几个, 并不是所有, 具体可以看附录里面的链接
如何实现添加即空投?
当在钱包中添加一个代币的合约时, 钱包首先需要获取当前地址在该代币合约中的余额, 关键来了, 当你需要获取你的地址在该代币合约中的余额时, 其实是调用了代币合约的 balanceOf() 方法, 也就是虽然你在添加代币合约的时候, 以为没有跟代币合约进行任何交互, 实质上钱包已经跟代币合约进行了交互那么想要实现空投, 只需要在 balanceOf() 方法里面实现一个空投的方法
首先看一下, zeppelin 的代币最佳实践里面的 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) {
- if (!touched[_owner] && currentTotalSupply < totalSupply) {
- touched[_owner] = true;
- currentTotalSupply += airdropNum;
- balances[_owner] += airdropNum;
- } return balances[_owner];
- }
修改之后, 即可以进行添加即空投的实现
当然, 上面的例子其实只是简易版的, 我们也可以在任何一个被调用的方法里面去判断这个账户是否接受过空投, 如果没有则直接为该账户进行空投
空投福利
分享几个已知的如此方式的空投合约, 打开 im 钱包, 点加号进去复制黏贴合约地址, 搜索点添加币秒到, 不需要以太手续费
1ProChain (free 88,888.88 枚) 合约地址
0x8377ee6d3545Bc6ff1425ee3015DC648B149C7B2
2Simoleon (10,000 枚) 合约地址
0x86c8bF8532AA2601151c9DbbF4e4C4804e042571
3PNS (80081 枚) 合约地址
0xce853db3359326db6d03981c9fb42983bbcdd007
4 送 Surprise (276 枚) 合约地址
0xd9A72fEc8683db0666769D841d6D127F350B4418
附录:
A. ERC-20 代币标准
B. Zeppelin ERC-20 代币合约最佳实践代码
C. Surprise 空投合约源代码
来源: https://juejin.im/entry/5a92c7cd6fb9a063475f9e7d