本文主要介绍如何编写以太坊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上的一个插件钱包,安装非常简单。
2.2 通过MetaMask连接测试网络
打开MetaMask后点击图标右侧可以选择连接的网络,可以看到Main主网,Ropsten、Kovan、Rinkeby均为测试网络,这里选择Rinkeby。
可以通过Create Account随意创建ETH账户:
2.3 如何在测试网络中获得ETH
创建完ETH账户发现账户的ETH余额均为0,部署合约和调用合约方法都需要花费gas,我们需要一定的ETH在测试网络进行测试。
下面介绍如何获取测试网络的免费ETH:
可以看到需要通过三种社交账号来获得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”,可以看我的代币的相关信息。
再点击合约地址可以看到该合约的转账记录,和持币的情况: