win10下开发部署Dapp(6):发布ERC20标准的token

凡是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。

猜你喜欢

转载自blog.csdn.net/johnnymartin/article/details/79636519