当前位置:   article > 正文

solidity Dapp ERC20添加即空投合约_erc20代币能不能加入联盟链

erc20代币能不能加入联盟链

    ERC20时代一个比较火的话题,空投;空投的方式有很多种。方法一,你在钱包里添加该币种,然后就获取到了空投了;方法二,你向Token合约地址转0个eth,即可获取空投,需要你花点手续费;无论是项目方或者币友们,似乎都比较中意第一种方法,毕竟不用花钱,而且还很方便。今天我们就研究一下这个东西是这么实现的。

    首先你需要知道ERC20协议,不知道童鞋们,可以自己到网上去找找看,或者等我有时间写一下。ERC20协议中规定了需要实现balanceOf()函数,返回指定地址的账户余额。

  1. // balanceOf方法原型
  2. function balanceOf(address _owner) constant returns (uint256 balance)

   一般当你在钱包中添加一个新的token时,钱包的后台程序需要获取当你的token,即他肯定会调用到上边这个函数;既然你知道它肯定会调用它,那我们只需要重写一下balanceOf()这个函数就可以了,在函数里加入空投的功能。这样就能实现添加即空投的功能。

  1.   function balanceOf(address _address) constant returns (uint256) {
  2.       return getBalance(_address);
  3.   }
  4. function getBalance(address _address) internal returns (uint256) {
  5.     if (_totalSupply < _cutoff && !initialized[_address]) {
  6.             return balances[_address] + _airdropAmount;
  7.         }
  8.         else {
  9.             return balances[_address];
  10.         }
  11.     }

     上边就是一个具体的实现,直接看第二个函数就好了,_cutoff是发币的总量,_totalSupply是当前已经空投出去的token总量;initialized[_address]的作用就是判断这个地址是不是已经空投过了;满足这两个条件之后呢,就可以给地址空投了;

     其实到这里,空投的功能并没有完,还漏了最重要的一步,为什么这么说呢?

     我们始终要牢记这是个分布式的系统,你的这个查询余额的操作,其实只是对自己节点操作,所以你也只是影响自己的节点,网络上其他节点都不知道你改动,因为你的操作没有通知其他节点,即发交易。虽然你能在钱包里看到有余额,其实这是假的,如果你要把token发送出去,肯定会失败,为什么,因为其他节点不知道你有这种token的余额。

    那你肯定也奇怪,为啥你用钱包转账token没有问题呢?那是因为他们对transfer()也做了手脚,下边我们具体看一下。

  1. function transfer(address _to, uint256 _amount) returns (bool success) {
  2. initialize(msg.sender); //特别注意这个函数
  3. if (balances[msg.sender] >= _amount
  4. && _amount > 0) {
  5. initialize(_to);
  6. if (balances[_to] + _amount > balances[_to]) {
  7. balances[msg.sender] -= _amount;
  8. balances[_to] += _amount;
  9. Transfer(msg.sender, _to, _amount);
  10. return true;
  11. } else {
  12. return false;
  13. }
  14. } else {
  15. return false;
  16. }
  17. }

      我们再来看一下特别注意的函数initialize()。

  1. function initialize(address _address) internal returns (bool success) {
  2. if (_totalSupply < _cutoff && !initialized[_address]) {
  3. initialized[_address] = true;
  4. balances[_address] = _airdropAmount;
  5. _totalSupply += _airdropAmount;
  6. }
  7. return true;
  8. }

       怎么样是不是有点眼熟,和balanceof()类似。没错。在你转账之前,会进行判断你的账户是否空投过,没有空投过,会进行一次空投。

      这样就完美解决了我们之前的问题,钱包的节点由于添加的时候已经空投过了,所以这里调用transfer()时,直接就进行了转账;而网络上的其他节点在你进行转账的时候,检测到你没有空投过,就会先给你空投,然后在进行转账,所以你转账就ok了。

      现在明白了吗?添加即空投其实压根就没有给你空投,你需要转账一下,才可以真正的获得空投,总结一下就是,你必须花一笔矿工费才会真正获取到空投。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/369177
推荐阅读
相关标签
  

闽ICP备14008679号