每天一个知识点:ERC-20 代币标准

本文作者来自【U赞全球发烧友】,U赞社区将从今天开始,为大家每日分享一个区块链的知识点。

U赞,U Network 价值内容第一公链,是全球第一个去中心化内容估值和发布平台。

每天5分钟,助你在区块链的世界里自由翱翔~

本期分享者

U赞发烧友顺达

以下为分享内容:

简介

ERC-20是以太坊的一种token合约标准,为token合约提供了接口的共同标准,允许以太坊上发行的各种代币被其他应用使用,如钱包、去中心化交易所等。目前很多区块链项目所发行的代币就是基于以太坊的ERC-20标准,下图是Etherscan上查询到的一些ERC-20代币的信息:

Token合约是什么?

现在仍存在着大量关于“token合约到底是什么”的争论。本质上来说,一个token合约就是一个包含了一个对账户地址及其余额的映射的智能合约(Smart Contract)。账户余额表示一种由合约创建者定义的值:一个token合约也许使用余额来表示物理对象,或是表示另一种货币价值,还可以表示持有人的名誉。余额的单位通常被称为token。

当token从一个账户被转移到另一个账户的时候,token合约更新两个账户的余额。比如,一笔从 0x2299…3ab7 到 0x1f59…3492 的10个token的转账将导致余额列表如下图所示进行更新:

如果该token合约允许的话,变更一种token的总供给可能有两种办法。token的总供给可以通过铸造新token来增加。举个例子,铸造出100个token到地址 0x4ba5…ae22 将导致余额如下图所示进行更新:

token的总供给也可以通过“销毁”现有的token来减少。比如, 0x4919…413d 销毁了50个token,这将导致余额如下图所示更新:

销毁token的另一种方式是将token发送到一个未创建私钥的地址,通常来说就是0地址。这会使得这些token不可用,在这方面,它与销毁token有同样的效果,但并没有减少token的总数。比如, 0x93f1…1b09 用此种方式销毁了50个token将导致如下图所示的余额:

简单的token合约在一个从地址到余额的映射中保存上述信息。当更多复杂的情景出现时,比如发放股息,替代性结构或者增补性结构常常要变得更强悍。但是,不管那些操作上的细节的话,对外部可见的token余额总是像上面的图示那样的。

ERC-20 代币标准的说明

下面的合约展示了ERC-20标准规定的标准接口,为token合约提供了基础的代币转移、授权第三方提取代币等功能。

Methods

name

返回代币的名称,如 “MyToken”

function name() constant returns (string name)

symbol

返回代币的标识,如“HIX”

function symbol() constant returns (string symbol)

decimals

返回代币使用的小数位数,如decimals为8时意味着代币最小可以划分到0.00000001

function decimals() constant returns (uint8 decimals)

totalSupply

返回代币的总供应量

function totalSupply() constant returns (uint256 totalSupply)

balanceOf

返回地址 _owner 对应账户的代币余额

function balanceOf(address _owner) constant returns (uint256 balance)

transfer

将 _value 数量的代币转移给地址 _to, 并且必须触发 Transfer 事件。当 _from 账户没有足够的代币可以使用时,函数应该抛出异常(throw)。

注意:_value 为0时也必须当做正常的转账来处理,并且要触发 Transfer 事件

function transfer(address _to, uint256 _value) returns (bool success)

transferFrom

将 _value 数量的代币从地址 _from 转移到地址 _to,并且必须触发 Transfer 事件 。

transferFrom 方法可以用于允许一个合约以你的名义进行代币的转移。若 _from 账户没有通过某些机制对消息的发送者进行授权的话,这个函数应该抛出异常(throw)。

注意:_value 为0时也必须当做正常的转账来处理,并且要触发 Transfer 事件

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

approve

允许 _spender 从你的账户多次提款,直到到达上限 _value。如果这个函数被再次调用,当前的限额会被新的 _value 覆盖。

function approve(address _spender, uint256 _value) returns (bool success)

allowance

返回当前 _spender 能从 _owner 处提款的数额大小。

function allowance(address _owner, address _spender) constant returns (uint256 remaining)

Events

Transfer

当发生代币转移时必须触发,包括数额为0的代币转移。

当一个token合约创建新代币时,也应该触发 Transfer 事件,此时的 _from 设置为 0x0

event Transfer(address indexed _from, address indexed _to, uint256 _value)

Approval

成功调用 approve(address _spender, uint256 _value) 时必须触发 Approval 事件

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

ERC-20 标准的实现

目前以太坊网络上已经有非常多符合ERC-20标准的代币。不同的团队针对ERC-20标准有着不同的实现,以下是两个ERC-20标准实现的例子:

https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol

https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20.sol

参考资料:

ERC-20标准的官方文档:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

科普 | 理解ERC-20 token合约:http://ethfans.org/ajian1984/articles/686

更多学习内容,添加小猪手微信

回复“知识点”进群免费学习

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180706G1GW6W00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券