试试10分钟创建并发行自己的数字货币

根据 Coinist 数据显示,2017 年全年的 ICO 融资规模达到 38 亿美元。大部分主流 ICO 代币都是基于以太坊(Ethereum)平台开发,ICO 热潮也支撑着以太币价格从 2017年1月1日的 8 美元涨到最近的 886 美元,总市值超过 800 亿美元。然而因为以太坊友好的开发接口,实际上你完全也可以在十分钟内创建属于你自己的数字货币或者说代币。

这一切就要归功于 ERC20 协议,作为以太坊的协议之一规定了代币合约的基本架构,遵守ERC20协议的任意一种代币都可以在其他应用(钱包,交易所等)中使用。有了 ERC20 协议,人们不需要重复开发代币基础功能,极大降低代币开发的门槛,让开发者可以将代币应用到更多领域,发起更多 ICO 项目;由于不同 ERC20 代币都兼容 ERC20 协议,这样两个 ERC20 代币之间就能够进行交易,也使得用户对持有代币更有信心。可以说ERC20 协议正是ETH 800 亿美元市值的幕后功臣。

ERC20 协议包含完成代币交易必须要实现的一些方法,其中包含代币交易,查询代币余额,代币总供应量等。智能合约接口代码如下:

pragma solidity ^0.4.18;

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

其中必须实现的方法和事件包括:

  1. totalSupply:查询代币总供应量
  2. balanceOf:查询特定地址的余额
  3. allowance:查询能够从地址 _owner 提出的代币数量
  4. transfer:从地址 _owner 转移代币到地址 _to,必须触发 Transfer 事件
  5. approve:允许 _spender 从当前地址多次提币,总量为 _value
  6. transferFrom:从地址 _from 转移代币到地址 _to,必须触发 Transfer 事件。这个方法是用于提币流程,能给予开发者实现自定义行为
  7. Transfer 事件:在代币转移中触发,转移数量为 0 时也必须触发该事件
  8. Approval 事件:成功调用 approve 时触发

其他可选实现的方法有:

  1. name:返回代币名
  2. symbol:返回代币符号
  3. decimals:返回代币使用的位数,用于余额显示

需要保证智能合约代码没有错误并有足够的安全是非常根本的,智能合约审查服务商Zeppelin Solutions,他们把一些最佳实践整理到了OpenZeppelin框架中,我们可以使用和扩展这些合约,以在更少的时间内创建更安全的DAPP。比如使用OpenZeppelin中代币合约模板即可快速创建属于你自己的数字货币,具体来说,我们打算扩展其中提供了StandardToken.sol来创建一个我们自己的支持ERC-20标准的数字货币,不妨命名为Tutorial代币。

为此,我们可以创建名为TutorialToken.sol的智能合约,内容如下:

pragma solidity ^0.4.4;
import 'zeppelin-solidity/contracts/token/StandardToken.sol';

contract TutorialToken is StandardToken {
    
    string public name = 'TutorialToken';
    string public symbol = 'TT';
    uint public decimals = 2;
    uint public INITIAL_SUPPLY = 12000;

    function TutorialToken() {
        totalSupply = INITIAL_SUPPLY;
        balances[msg.sender] = INITIAL_SUPPLY;
    }

}

在上面的代码中,引入了StandardToken.sol,并且我们声明TutorialToken继承自StandardToken。这样就继承了StandardToken合约中所有变量和函数。接着我们只要在子类重定义对应的变量与函数就行了。

首先我们来设置代币的参数,需要定义自己的代币名称name,代币符号symbol,代币单位decimals和初始发行量INITIAL_SUPPLY。

string public name = 'TutorialToken';
string public symbol = 'TT';
uint public decimals = 2;
uint public INITIAL_SUPPLY = 12000;

其中name和symbol变量,定义了代币的一个独一无二的标识。decimals变量定义了代币可被细分的程度。在上面的例子里decimals我们的取值为2,效果类似于美元和美分。最后,INITIAL_SUPPLY变量定义了在合约部署时,代币将创建的数量。在这个例子中,我们选择的是12000。

最后在构造函数中我们简单添加代码来设置totalSupply来等于INITIAL_SUPPLY,同时把所有的币赋值给部署者的帐户。

function TutorialToken() {
    totalSupply = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
}

使用这个模板,我们只需手写小于15行的Solidity代码就创建了一个自己的符合ERC-20协议的代币。接下来部署这个代币合约,并与代币进行交互即大功告成,你不妨试试创建自己的数字货币,整个过程还未必超过十分钟。

尽管ERC-20协议十分成功,但是仍然不能完全适应当前代币设计的各种要求。因此以太坊又在ERC20协议的基础上继承并发展提出 ERC721 与 ERC827这两个目前比较火的扩展协议。

ERC721协议是针对不可置换代币(non-fungile tokens)的智能合约标准接口,不可置换代币简称NFTs,简单理解为每枚代币都是独一无二的。也就是说ERC721的每枚代币都拥有独立唯一的tokenId编号。前段时间风靡的以太坊养猫游戏中的猫就其实都是ERC721的代币。游戏中每只猫都是拥有不一样基因的猫, 归根到底其实也就是拥有不同属性的代币:猫的编号就是代币的编号, 而猫的基因就是代币的属性。ERC721的接口定义如下所示,基本变化就是加入tokenId参数:

pragma solidity ^0.4.18;

/**
 * @title ERC721 interface
 * @dev see https://github.com/ethereum/eips/issues/721
 */
contract ERC721 {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function transfer(address _to, uint256 _tokenId) public;
  function approve(address _to, uint256 _tokenId) public;
  function takeOwnership(uint256 _tokenId) public;
}

ERC827协议在ERC20基础上新增了方法,在ERC827协议中代币和数据都可以交易,而且支持第三方在被授权的情况下直接使用用户持有的代币,解决了交易源和授权的相关问题。ERC827的接口定义如下所示,可以看出是继承自ERC20协议因此也完全兼容:

pragma solidity ^0.4.13;

import "../ERC20/ERC20.sol";


/**
   @title ERC827 interface, an extension of ERC20 token standard
   Interface of a ERC827 token, following the ERC20 standard with extra
   methods to transfer value and data and execute calls in transfers and
   approvals.
 */
contract ERC827 is ERC20 {

  function approve( address _spender, uint256 _value, bytes _data ) public returns (bool);
  function transfer( address _to, uint256 _value, bytes _data ) public returns (bool);
  function transferFrom( address _from, address _to, uint256 _value, bytes _data ) public returns (bool);

}

随着区块链技术的发展,以太坊每天都有各种协议产生与变化,我们期待未来所有这些不同类型的代币都可以自由地交换。虚拟资产预计将来会有几万亿的市场,届时也将是各种以太坊标准大放异彩的时候。

本文是全系列中第2 / 8篇:区块链技术

打赏作者
提交看法

抢沙发

还没有评论,你可以来抢沙发