EIP20
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
数量的代币,函数必须触发事件Transfer
。transferFrom
函数,可以允许第三方代表我们转移代币。
如果_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到提高安全性。
实现示例
讨论历史
相关讨论的历史链接:
- Original proposal from Vitalik Buterin: https://github.com/ethereum/wiki/wiki/Standardized_Contract_APIs/499c882f3ec123537fc2fccd57eaa29e6032fe4a
- Reddit discussion: https://www.reddit.com/r/ethereum/comments/3n8fkn/lets_talk_about_the_coin_standard/
- Original Issue #20: https://github.com/ethereum/EIPs/issues/20