圈钱跑路 发行自己的ERC20 Token

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zz709196484/article/details/79331286

发行自己的ERC20 Token

这次主要实现 发行一个自己的ERC20 标准的 Token. (然后进行ICO, 圈钱跑路, 走上人生巅峰,XD)

其实把Token 叫做代币, 容易让人产生误解.实际上是一种凭证, 只是被现在狂热的人们搅浑了.

Token的持有人可以完全控制资产,遵守ERC20的token可以跟踪任何人在任何时间拥有多少token.

现在币圈的狂热之势四起, 昨天一个朋友, 发来一串神秘代码, 说转账有 3000多的糖果.
这里偷偷的放一下地址, 可以去玩玩..

ENU: 0x275b69AA7c8C1d648A0557656bCe1C286e69a29d

Tx

这个转账记录还真是来势汹汹. 然后就好奇的 用浏览器 看了看合约代码

string public constant name = "Enumivo";
string public constant symbol = "ENU";
uint public constant decimals = 8;

uint256 public totalSupply = 1000000000e8;
uint256 public totalDistributed = 100000000e8;
uint256 public totalRemaining = totalSupply.sub(totalDistributed);
uint256 public value;

这个 totalSupply 是不是相当惊人… 这个估计是用来测试的合约, 不知道被谁发现了来.

所以, 这玩意这么火, 这次就自己实现一个!

ERC20 Token标准

实现这样的一个token 实际上还是使用Solidity语言编写的合约来实现, 只是合约的形式符合了ERC20 的标准. 这样就可以被区块浏览器识别成一个 Token.

官方标准 ERC-20 Token Standard

手册里说明了代码的应有的函数和成员 (看E文 还是难受, 找到了一篇译文, 不过是机翻的, 看着玩吧)

以太坊ERC20 Token标准完整说明

合约的框架如下

// https://github.com/ethereum/EIPs/issues/20
// 接口标准
  contract ERC20 {
      function totalSupply() constant returns (uint totalSupply);   // 总发行量
      function balanceOf(address _owner) constant returns (uint balance);
      function transfer(address _to, uint _value) returns (bool success);   // 代币分发(注意, 这个只有合约的Creator 可以调用)
      function transferFrom(address _from, address _to, uint _value) returns (bool success);    // 这里是拥有者和拥有者之间的代币转移
      function approve(address _spender, uint _value) returns (bool success);
      function allowance(address _owner, address _spender) constant returns (uint remaining);

      event Transfer(address indexed _from, address indexed _to, uint _value);
      event Approval(address indexed _owner, address indexed _spender, uint _value);

// Token信息
    string public constant name = "4FunCoin";
    string public constant symbol = "4FC";
    uint8 public constant decimals = 18;  // token的精度, 大部分都是18
}

Token实现代码

下面就是自己的token的实现代码, 其实我们根据官方的合约框架进行填充, 这里对代码进行注解.

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }  // token的 接受者 这里声明接口, 将会在我们的ABI里

contract TokenERC20 {
/*********Token的属性说明************/
    string public name = 4FunCoin;
    string public symbol = 4FC;
    uint8 public decimals = 18;  // 18 是建议的默认值
    uint256 public totalSupply; // 发行量

    // 建立映射 地址对应了 uint' 便是他的余额
    mapping (address => uint256) public balanceOf;   
        // 地址对应余额
    mapping (address => mapping (address => uint256)) public allowance;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Burn(address indexed from, uint256 value);

    // 这里是构造函数, 实例创建时候执行
    function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
        totalSupply = initialSupply * 10 ** uint256(decimals);  // 这里确定了总发行量

        balanceOf[msg.sender] = totalSupply;    // 这里就比较重要, 这里相当于实现了, 把token 全部给合约的Creator

        name = tokenName;
        symbol = tokenSymbol;
    }

    // token的发送函数
    function _transfer(address _from, address _to, uint _value) internal {

        require(_to != 0x0);    // 不是零地址
        require(balanceOf[_from] >= _value);        // 有足够的余额来发送
        require(balanceOf[_to] + _value > balanceOf[_to]);  // 这里也有意思, 不能发送负数的值(hhhh)

        uint previousBalances = balanceOf[_from] + balanceOf[_to];  // 这个是为了校验, 避免过程出错, 总量不变对吧?
        balanceOf[_from] -= _value; //发钱 不多说
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);   // 这里触发了转账的事件 , 见上event
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);  // 判断总额是否一致, 避免过程出错
    }

    function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value); // 这里已经储存了 合约创建者的信息, 这个函数是只能被合约创建者使用
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // 这句很重要, 地址对应的合约地址(也就是token余额)
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;   // 这里是可花费总量
        return true;
    }

    function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }
    // 正如其名, 这个是烧币(SB)的.. ,用于后面把多token 烧掉
    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);   // 必须要有这么多
        balanceOf[msg.sender] -= _value;
        totalSupply -= _value;
        Burn(msg.sender, _value);
        return true;
    }
    // 这个是用户自焚.....
    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);        // 一样要有这么多
        require(_value <= allowance[_from][msg.sender]);    // 
        balanceOf[_from] -= _value;
        allowance[_from][msg.sender] -= _value;
        totalSupply -= _value;
        Burn(_from, _value);
        return true;
    }
}

通过以上代码,就算是实现了一个符合ERC20 标准的Token, 通过读代码,也是学到了其具体实现, 代码的总结,在后面实现吧.
这次主要是实现这个token的部署.

Token合约部署

上面实现了一个token的代码, 现在需要的是把他部署到以太坊网络上去.
这里我们使用官方的IDE REMIX

环境:

由于实际上我们的合约部署是需要消耗ether的, 所以这里我们选择以太坊的测试网络, 这样不会消耗主网资源, 利国利民

创建测试钱包

ropsten

这里已经在ropsten网络上创建了一个钱包, 注意左上角的网络选择是 Ropsten网络就好, 然后我们创建自己的钱包, 这个很简单, 就不多讲

现在钱包是有了, 没币呀. 不慌! 没币,我们要去, 由于是测试网络, 所以这些东西就很随便了, 有水龙头,给我们免费发放!

Ethereum Ropsten Faucet

直接在上面的地址直接领就好, (要是现在的行情, 点一下7000块呢 嘿嘿嘿)

编译合约代码

打开我们的在线IDE, 贴上代码

REMIX

RUN

上面会自动识别成 injected web3 (实际上这个js 是matemask在网页进行注入了)

Create前面就是我们创建合约的构造函数的参数, 从左到右是发行量, 名字, 和 符号

1000, "AnFun", "AFC"

之后点击创建,会弹出mateMask的支付请求

pay

画外音:这里可见, 整个过程只用消耗GAS的费用, 可谓相当低 , 然而就这样的东西, 堂而皇之的被各种利用, 成空气币!!!

点击提交(submit), 我们会看到我们的支付记录,

Txhash

可见, 合约已经创建!

Token的添加和交易

打开我们的小狐狸, 在token的选项中, 点击添加token, 把我们的合约地址(见上图)填入, 自动的识别我们的信息, 再次刷新可见, 我的token 已经到手了!(圈钱跑路去 2333).

0xc67Cc41C6517d97df3DD1eCC7885c209fE04bFa8 这里给出地址, 想要的免费空投 2333

tokens

现在我们有了token了, 下面进行交易, 这里是使用

MY_WALLET 这个可不是钱包, 只是一个在线的接口

同样的确认网络一直, 找到Token 即可!

后面的话

也是通过这样的一篇文章可见, 有些所谓的token是多么的黑暗.
参考出处

代码参考

这里自己也是学习, 并且加上了注释. 在下一篇, 详细的写写上述代码的 Solidity的知识

以后的博文将转战自己的博客 链接在此~ 也希望大家多多交流~

这里也是自己推的公众号, 也可以关注一波~
INT

猜你喜欢

转载自blog.csdn.net/zz709196484/article/details/79331286