转载请注明出处: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