ERC-20 代币标准(Token Standard)

简要说明:

代币(Token)的标准接口。

原文章:https://eips.ethereum.org/EIPS/eip-20

摘要:

以下标准允许在智能合约中实施代币的标准 API。 该标准提供了转移代币的基本功能,并允许代币获得批准,以便其他链上第三方可以使用它们。

动机:

标准接口允许以太坊上的任何代币被其他应用程序重复使用,如钱包、去中心化交易所等。

API 规范:

函数:

注意:

  • 以下规范使用 Solidity 0.4.17(或更高版本)中的语法
  • 调用者必须处理return (bool success)返回false,不能假定false永远不会返回

可选函数 - name:

函数返回代币的名称 - 如:"MyToken"

可选 - 此方法可用于提高可用性,但接口和其他合约不得期望存在这些值。

function name() public view returns (string)

可选函数:symbol

返回代币的代号(通常为字母缩写),如”HIX”,”UPT”。

可选 - 此方法可用于提高可用性,但接口和其他合约不得期望存在这些值。

function symbol() public view returns (string)

可选函数:decimals

返回Token使用的小数位数,例如”8”,意味着将 Token 除以”100000000”以获取其用户表示形式。

可选 - 此方法可用于提高可用性,但接口和其他合约不得期望存在这些值。

function decimals() public view returns (uint8)

函数:totalSupply

返回总 Token 供应量

function totalSupply() public view returns (uint256)

函数:balanceOf

返回地址为 _owner 的另一个帐户的帐户余额。

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

函数:transfer

将 _value 数量的代币转移到地址 _to,并且必须触发 Transfer 事件。 如果消息调用者的账户余额没有足够的代币可供花费,该函数应该抛出异常。

注意转移 0 个代币必须被视为正常传输并触发 Transfer 事件。

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

函数:transferFrom

_from_to地址转移_value数量的代币,函数必须触发事件TransfertransferFrom函数,可以允许第三方代表我们转移代币。

如果_from账号没有授权调用账户转移代币,则该函数需要抛出异常。

注意:转移 0 个 Token 也是正常转移动作,同样需要触发Transfer事件

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

函数:approve

授权_spender可以从我们账户最多转移代币的数量_value,可以多次转移,总量不超过_value

这个函数可以再次调用,以覆盖授权额度_value

注意:为了阻止向量攻击,调用者可以在调整授权额度时,先设置为0,然后再设置为一个其他额度

简述:向量攻击,加入 Alice 开始时授权 Bob N 的额度,现在 Alice 想调整为 M,于是发起了一笔调整授权的交易,这个时候 Bob 看到了这笔交易,迅速通过 transferFrom 交易(用更高的手续费,矿工优先打包)把 N 个币转移走,等待 Alice 调整授权的交易打包后,Bob 又获取了 M 个授权,这就相当于 Bob 获取了 N + M 个授权,而不是 Alice 想要的 M 个授权(抢跑)

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

函数:allowance

查询_owner授权给_spender的额度。

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

事件 Events

事件:Transfer

当有代币转移时(包括转移0),必须触发 Transfer 事件。

创建新代币的代币合约应该在创建代币时触发一个 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)

实现:

以太坊网络上已经部署了大量符合 ERC20 标准的代币。 不同的团队编写了不同的实现,这些实现具有不同的权衡:从节省gas到提高安全性。

实现示例

讨论历史

相关讨论的历史链接: