凡是ethereum上的token,都必须要符合一个标准:ERC20标准。该标准共有9个函数:
- name
- symbol
- decimals
- totalSupply
- balanceOf
- allowance
- transfer
- transferFrom
- approve
前6个函数可以利用solidity的语法糖:默认给public的storage变量生成一个同名getter,我们只需给前6个函数定义同名的public变量即可。下面我们就用最简单的代码实现一个符合ERC20标准的token。
pragma solidity ^0.4.18;
contract MartinToken {
string public name = "Martin"; //token 名称
string public symbol = "MTC"; //token 符号
uint256 public decimals = 18; //token 小数位数
uint256 public totalSupply = 10000 * 10 ** (uint256(18)); //总发行量
mapping (address => uint256) public balanceOf; //存放账户余额的map
mapping (address => mapping (address => uint256)) public allowance;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
modifier validAddress {
assert(0x0 != msg.sender);
_;
}
//构造函数,仅在合约创建时被调用,里面的sender即为合约创建者,我们把token全部发放到创建者账户。
function MartinToken() public{
balanceOf[msg.sender] = totalSupply;
emit Transfer(0x0, msg.sender, totalSupply);
}
//将指定数量的token从sender账户发送到_to账户
function transfer(address _to, uint256 _value) public validAddress returns (bool success) {
require(balanceOf[msg.sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
//将A账户的N个token转移到B的账户中,前提是事前A‘批准’给B账户M个token,M >= N。
function transferFrom(address _from, address _to, uint256 _value) public validAddress returns (bool success) {
require(balanceOf[_from] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
require(allowance[_from][msg.sender] >= _value);
balanceOf[_to] += _value;
balanceOf[_from] -= _value;
allowance[_from][msg.sender] -= _value;
emit Transfer(_from, _to, _value);
return true;
}
//sender批准给制定的账户一定量的token
function approve(address _spender, uint256 _value)public validAddress returns (bool success) {
require(_value == 0 || allowance[msg.sender][_spender] == 0);
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
}
合约发布后,创建者的账户下就会有10000个token了,我们使用的小数精度是18,也就是我们跟ether有着相同的单位,实际显示出来的应该是10^22,单位是wei。