ERC20代币合约详解,附实现代码

目前几乎全部用于艾希欧筹集资金的代币,都是基于一样的技术:以太坊ERC-20标准。 所以这些代币实际上就是实现了ERC20标准的智能合约。在下文中,咱们将全面剖析ERC20 标准规范,并给出一个ERC20代币合约的完整实现代码。此外,在下文中咱们将不加区分地使用 __通证__和__代币__来表示遵循ERC20规范的智能合约,虽然前者彻底涵盖了后者的范围。git

若是你但愿立刻开始学习以太坊智能合约和应用开发,能够访问汇智网提供的出色的在线互动教程:github

ERC20是Fabian Vogelsteller在2015年底提出的以太坊改进建议,它是许多流行的合约都在遵循的标准。 ERC20使通证智能合约的行为很是相似于传统的加密货币,例如在不一样帐户之间发送和接收、 查看通证总供应量或者查看某个地址可用的通证余额​,就像比特币或以太币同样。这相似于用以太坊钱包 发送和接收以太币、查看流通中的以太币总量、查看特定钱包的货币余额等。app

ERC20接口

ERC20定义了一些标准的接口函数:balanceOf 、 totalSupply 、transfer 、transferFrom 、approve和allowance 。 以及一些可选的字段,例如通证名称、符号以及小数保留位数等。你能够在github 查看ERC-20全文。函数

下面的代码声明一个简明的ERC20智能合约:学习

contract ERC20 {
   function totalSupply() constant returns (uint theTotalSupply);
   function balanceOf(address _owner) constant returns (uint balance);
   function transfer(address _to, uint _value) returns (bool success);
   function transferFrom(address _from, address _to, uint _value) returns (bool success);
   function approve(address _spender, uint _value) returns (bool success);
   function allowance(address _owner, address _spender) constant returns (uint remaining);
   event Transfer(address indexed _from, address indexed _to, uint _value);
   event Approval(address indexed _owner, address indexed _spender, uint _value);
}

合约中每一个字段的描述及示例以下。ui

totalSupply()

尽管与比特币同样,通证供给总量能够很容易地固定下来,但此函数容许合约实例计算 并返回存在于流通中的通证总量。this

contract MyERCToken {
  //在本示例中,通证供给量是固定的,但也能够将其设定为可修改的
  uint256 _totalSupply = 1000000;
  
  function totalSupply() constant returns (uint256 theTotalSupply) {
    //函数声明中已经定义了返回变量theTotalSupply
    theTotalSupply = _totalSupply;
    return theTotalSupply;
  }
}

balanceOf()

该函数容许智能合约返回指定帐户地址的通证余额。 该函数接受一个地址做为参数, 因此任何地址的通证余额都是公开的。加密

contract MyERCToken {
  //建立映射表来记录帐户余额
  mapping(address => uint256) balances;
  // Owner of this contract
  //合约拥有者
  address public owner;
  
  function balanceOf(address _owner) constant returns (uint256 balance) {
    //返回指定地址的通证余额
    return balances[_owner];
  }
}

approve()

此函数的调用方受权给定的地址能够从其地址中提款。3d

在这里,以及后面的代码片断中,你可能会看到一个变量msg 。 这是由外部应用程序(如钱包)提供 的隐含字段,以便更好地与合约进行交互。 以太坊虚拟机(EVM)容许咱们使用该字段来存储和处理 由外部应用程序提供的数据。code

在这个例子中, msg.sender是合约方法调用方的地址。

contract MyERCToken {
  //建立映射表记录通证持有者、被受权者以及受权数量
  mapping(address => mapping (address => uint256)) allowed;
  
  function approve(address _spender, uint256 _amount) returns (bool success) {
    allowed[msg.sender][_spender] = _amount;
    //当受权时触发Approval事件
    Approval(msg.sender, _spender, _amount);
    return true;
  }
}

transfer()

该函数让调用方将指定数量的通证发送到另外一个地址,就像加密货币交易同样。

contract MyERCToken {
  mapping(address => uint256) balances;
  
  //返回值为true时,表示转帐成功
  function transfer(address _to, uint256 _amount) returns (bool success) {
    //若是发送方有足够的资金而且发送数量非0 ,则发送给指定地址
    if (balances[msg.sender] >= _amount 
      && _amount > 0
      && balances[_to] + _amount > balances[_to]) {
      balances[msg.sender] -= _amount;
      balances[_to] += _amount;
      //触发Transfer事件
      Transfer(msg.sender, _to, _amount);
        return true;
      } else {
        return false;
      }
   }
}

transferFrom()

该函数容许智能合约自动执行转帐流程并表明全部者发送给定数量的通证。

看到这的时候你可能会有点困惑:为何有了transfer(),还须要transferFrom()?。

回一下在平常生活中,经过转帐来支付帐单的状况。 一般你须要本身去办转帐汇款来支付帐单,这 就像使用transfer() :你须要本身执行,没有其余人的帮助。

在另外一种状况下,你能够与银行签定自动代支付协议。 这就像使用transferFrom() : 银行的机器会自动以你的名义进行转帐支持。 有了这个函数,合约就能够表明你自动 发送通证到另外一个地址,而无需你的干预。

contract MyERCToken {
  mapping(address => uint256) balances;
  
  function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) {
    if (balances[_from] >= _amount
      && allowed[_from][msg.sender] >= _amount
      && _amount > 0
      && balances[_to] + _amount > balances[_to]) {
    balances[_from] -= _amount;
    balances[_to] += _amount;
    Transfer(_from, _to, _amount);
      return true;
    } else {
      return false;
    }
  }
}

name - 通证名称

name是一个可选字段,但许多流行的通证都定义了这个字段,以便像Mist和MyEtherWallet 这样的钱包可以识别它们:

contract MyERCToken {
  string public constant name = "My Custom ERC20 Token";
}

symbol - 通证符号

symbol是另外一个用于标识通证的可选字段,一般采用三到四个字母的缩写,就像BTC、ETH、AUG或SJCX同样,

contract MyERCToken {
  string public constant symbol = "MET";
}

decimals - 小数位数

这是一个可选字段,用于肯定通证数量的小数位数。 最多见的小数位数是18。

contract MyERCToken {
  uint8 public constant decimals = 18;
}

这个ERC20通证的源代码能够在Github找到。

ERC20标准开辟了一套新的智能合约,能够像比特币或以太坊同样建立和分发,并且, 这些代币能够在交易所托管,像其余资产同样进行交易,所以投资者也能够轻松地购买和出售这些代币。

原文:ERC20剖析:最火的以太坊智能合约

相关文章
相关标签/搜索