以太坊开发:如何在测试网络发布代币

本文主要介绍如何编写以太坊ERC20的代币,并且在以太坊测试网络部署。

为什么需要先在测试网络进行测试合约?因为如果直接把合约部署到主网,测试不充分的情况下消耗的是真实的ETH,而测试环境ETH都是免费的。

1.以太坊ERC20代币规范

官方ERC20规范文档:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

首先需要编写代币智能合约,必须遵从ERC20标准接口:


contract Token{
    uint256 public totalSupply; //代币发行总数

   //查询某个地址下代币数量
    function balanceOf(address _owner) public constant returns (uint256 balance); 
   //向其他地址发送代币
    function transfer(address _to, uint256 _value) public returns (bool success);

   //从一个地址提取代币到另外一个地址
    function transferFrom(address _from, address _to, uint256 _value) public returns
    (bool success);

   //授权允许从一个地址到另外一个地址转代币
    function approve(address _spender, uint256 _value) public returns (bool success);

  //查询某个地址允许从另外一个地址转走代币的数量
    function allowance(address _owner, address _spender) public constant returns
    (uint256 remaining);

     //当向其他地址发送代币触发 
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    //当从一个代码提取代币到另外一个地址时触发
    event Approval(address indexed _owner, address indexed _spender, uint256
    _value);
}


实现这些接口:


contract Token{
    uint256 public totalSupply;

    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns
    (bool success);

    function approve(address _spender, uint256 _value) public returns (bool success);

    function allowance(address _owner, address _spender) public constant returns
    (uint256 remaining);

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

contract TokenTemplate is Token {

    string public name;//代币名称,如BitShare
    uint8 public decimals;//代币精度,即小数点后几位
    string public symbol;//代币简称,如bts
    address owner;

    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;

   //如果希望合约能够正常接受eth
    function () payable{
        
    }

   //创建合约时,初始化总代币数,名称等相关信息
    function TokenTemplate(uint256 _initialAmount, string _tokenName, uint8 _decimalUnits, string _tokenSymbol) public {
        totalSupply = _initialAmount * 10 ** uint256(_decimalUnits);
        balances[msg.sender] = totalSupply;

        name = _tokenName;
        decimals = _decimalUnits;
        symbol = _tokenSymbol;

        owner = msg.sender;
    }

    function transfer(address _to, uint256 _value) public returns (bool success) {
        require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
        require(_to != 0x0);
        balances[msg.sender] -= _value;
        balances[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
        return true;
    }


    function transferFrom(address _from, address _to, uint256 _value) public returns
    (bool success) {
        require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);
        balances[_to] += _value;
        balances[_from] -= _value;
        allowed[_from][msg.sender] -= _value;
        emit Transfer(_from, _to, _value);
        return true;
    }
    function balanceOf(address _owner) public constant returns (uint256 balance) {
        return balances[_owner];
    }


    function approve(address _spender, uint256 _value) public returns (bool success)
    {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }

    function destory(){
        if (owner == msg.sender) {
            selfdestruct(owner);
        }
    }

}

2.连接测试网络并且部署代币

2.1 安装MetaMask

编写完合约,现在需要连接上以太坊的测试环境,我们需要使用以太坊轻钱包MetaMask。它是chrome上的一个插件钱包,安装非常简单。

安装MetaMask

2.2 通过MetaMask连接测试网络

打开MetaMask后点击图标右侧可以选择连接的网络,可以看到Main主网,Ropsten、Kovan、Rinkeby均为测试网络,这里选择Rinkeby。

可以通过Create Account随意创建ETH账户:

2.3 如何在测试网络中获得ETH

创建完ETH账户发现账户的ETH余额均为0,部署合约和调用合约方法都需要花费gas,我们需要一定的ETH在测试网络进行测试。

下面介绍如何获取测试网络的免费ETH:

  • 打开:https://faucet.rinkeby.io/

可以看到需要通过三种社交账号来获得ETH,这里介绍Google + 方式。

  • 打开:https://plus.google.com/ 并登录自己的google账号

将自己的ETH地址填写上去点击“发布”:

发布完成后点击:

将打开的页面的URL复制下来:

  • 将URL复制到https://faucet.rinkeby.io/ 点击“Give me Ether”,有几种金额选择,3个ETH是最快的,只需要几十秒。

提交完之后过一会可以看到我的地址正在充值中,loading完毕再看到metemask就可以看到金额到账了。

2.4 将合约部署到测试网络

  • 打开IDE:http://remix.ethereum.org/ 编译代币合约合约,选择Injected Web3 连接钱包。
  • 输入创建合约的参数,点击create创建合约

点击“create”后metamask会自动弹出进行支付gas,用默认的就可以了,直接submit

等待矿工打包完成后,合约创建成功,在Remix IDE界面上可以看到合约已经生成,并能查看到合约地址。

点击IDE 控制台输出的url,可查看这次部署合约的交易信息。

  • 在etherscan验证你的合约,打开https://rinkeby.etherscan.io/输入你的合约地址,点击“Verify And Pulish”,建议翻墙后操作,不然后续验证可能会失败。

输入相关信息

点击“Verify And Pulish”

验证成功!

  • 在etherscan查看代币合约的信息

调用合约的transfer方法,将部分代币发送到其他地址,完成后打开https://rinkeby.etherscan.io/token-search 输入代币的合约地址点击“Search”,可以看我的代币的相关信息。

再点击合约地址可以看到该合约的转账记录,和持币的情况:

你可能感兴趣的:(以太坊开发:如何在测试网络发布代币)