转载请注明出处:www.huamo.online
字节杭州 求贤若渴:
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的实现:
参考链接
https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/edit
https://github.com/Giveth/minime/blob/master/contracts/MiniMeToken.sol
转载请注明出处:www.huamo.online