Ethereum ERC20规范

转载请注明出处:www.huamo.online
字节杭州 求贤若渴:

  1. https://job.toutiao.com/s/JXTdQaH
  2. https://job.toutiao.com/s/JXTMWW3
  3. https://job.toutiao.com/s/JXT1tpC
  4. https://job.toutiao.com/s/JXTdu6h

ERC20规范

简述

ERC-20定义了代币的标准接口

摘要

以下标准允许在智能合约中实现一套标准的代币API。提供了转账的基本功能,并且允许代币被拥有,这样它们就可以被链上的其它人使用。

动机

一套标准的接口可以让以太坊上的任何代币都能被其它应用复用:包括钱包到去中心化交易所等等应用。

规范

Methods

说明:调用者必须returns(bool success)中处理false的情况。调用者不能臆想false从不发生!

name()【可选】

该方法返回代币名称。例如MyToken

这是个可选方法:这个方法可以提高可用性,但是接口和其它合约绝对不能期望这些值必然存在。

1
function name() view returns (string name)

symbol()【可选】

该方法返回代币代号。例如HIX

这是个可选方法:同上,该方法可以提高可用性,但是其它合约绝对不能期望这些值必然存在。

1
function symbol() view returns (string symbol)

decimals()【可选】

该方法返回代币精度,以数值表示。例如8,就意味着这个代币可以精确到小数点后8位。

这是个可选方法:同上,该方法可以提高可用性,但是其它合约绝对不能期望这些值必然存在。

1
function decimals() view returns (uint8 decimals)

totalSupply()【必选】

该方法返回代币总供应量。

1
function totalSupply() view returns (uint256 totalSupply)

balanceOf()【必选】

该方法返回地址为_owner的账户的代币余额。

1
function balanceOf(address _owner) view returns (uint256 balance)

transfer()【必选】

该方法用来向_to地址转账_value数量的代币,并且该方法必须触发Transfer事件。如果_from账户余额不足,该方法应该throw异常。

说明:转账0数量也必须视为正常转账行为,并且触发Transfer事件。

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

transferFrom()【必选】

该方法从_from地址向_to地址转账_value数量的代币,必须触发Transfer事件。

transferFrom()方法用于取回提现这种场景,允许合约代表你来转账代币。除非_from账户通过某种机制授权了调用者(例如调用者就是_from),否则这个方法应该throw异常。

说明:转账0数量也必须视为正常转账行为,并且触发Transfer事件。

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

approve()【必选】

该方法允许_spender从你的账户多次提款,总计最高可提_value数量的代币。如果该方法重复调用,那么将会使用_value覆写当前的批准额度。

说明:为了防止API攻击(攻击场景详见这里),客户端应该提供一种用户接口:当他们对同一个_spender更新_value时,应该先将批准额度设置为0,然后再设置为新的_value然而,合约本身不应该强制这么实现,以保证向后兼容之前部署的合约。

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

allowance()【必选】

该方法返回_spender账户可以从_owner账户提款的额度还剩多少。

1
function allowance(address _owner, address _spender) view returns (uint256 remaining)

Events

Transfer事件

当代币被转账时必须被触发,包括0数量转账。

一个代币合约产生新代币时应该触发一个Transfer事件,其中_from地址被设置为0x0

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

Approval事件

每当成功调用了approve(address _spender, uint256 _value)方法后,就必须触发该事件。

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

实现

目前以太坊主网上有很多ERC20合约被开发部署,大家出于不同的权衡有各种不同的实现:从节省gas到提高安全性等等方面。

我自己的实现:

样例实现:

还有在再次approve()之前强制设置为0的实现:

参考链接

转载请注明出处:www.huamo.online