ERC-20标准
ERC-20标准是在2015年11月份推出的,使用这种规则的代币,表现出一种通用的和可预测的方式。简单地说,任何 ERC-20 代币都能立即兼容以太坊钱包(几乎所有支持以太币的钱包,包括Jaxx、MEW、imToken等,也支持 erc-20的代币),由于交易所已经知道这些代币是如何操作的,它们可以很容易地整合这些代币。这就意味着,在很多情况下,这些代币都是可以立即进行交易的。
ERC-20代币标准【官方文档】:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
ERC-20是各个代币的标准接口,ERC-20代币仅仅是以太坊代币的子集。为了充分兼容ERC-20,开发者需要将一组特定的函数(接口)集成到他们的智能合约中,以便在高层面能够执行以下操作:
- 获得代币总供应量
- 获得账户余额
- 转让代币
- 批准花费代币
ERC-20让以太坊区块链上的其他智能合约和去中心化应用之间无缝交互。一些具有部分但非所有ERC20标准功能的代币被认为是部分ERC-20兼容,这还要视其具体缺失的功能而定,但总体是它们仍然很容易与外部交互。
ERC-20标准存在的问题
ERC-20标准无法通过接收方合同处理传入的交易,这是该令牌存在的最大问题,也是开发者一直希望改进的地方。ERC-20令牌无法将令牌发送给一个与这些令牌不兼容的契约,也正因为这样,部分资金存在丢失的风险。Reddit上的一篇文章指出,由于被发送到“错误”的合同上,大约价值40万美元的ERC-20令牌被困,这对整个以太坊生态系统而言是一个巨大的威胁。
场景:将令牌直接发送给令牌的智能合同将导致资金损失,这是因为一个令牌的合同只会跟踪和分配资金。
例如,当您从钱包中向另一个用户发送令牌时,该钱包将调用令牌的合约来更新数据库,所以如果您试图将令牌直接传输到令牌的合约中,那么由于该令牌的合约无法响应,所以金钱就“丢失”了。
ERC-223要解决的首要问题
自从引入ERC-20令牌标准以来,几乎所有的基于以太坊的令牌都成功的接受了这个新标准。然而其自身的缺点需要及时解决,这便是ERC-223令牌诞生的原因。
ERC-223令牌标准将向现有的ERC-20标准引入一个新功能,以防止意外转移的发生。
ERC-223标准
ERC-223允许用户通过一个函数transfer调用,将令牌发送到合约或电子钱包地址,而不需要针对钱包交易或合约交易做不同的处理
如果接收者是钱包,则ERC-223令牌传输将与ERC-20传输相同。
如果接收方是合约,ERC-223令牌合约将尝试在接收方合约中调用tokenFallback函数。如果接收方没有tokenFallback函数,合约事务将失败。 tokenFallback函数是Ether事务的后备功能模拟,可用于处理传入事务。有一种方法可以将bytes _data附加到类似于连接到Ether事务的_data的令牌事务。
它将通过令牌合约,并将通过接收方合同的tokenFallback函数处理。还有一种方法可以在没有数据参数的情况下使用ERC223令牌合约传输函数,或者使用没有传输函数数据的ERC-20 ABI。 在这种情况下_data将为空字节数组。
ERC-223定义的接口
1 | //获取总量 |
1 | //得到token的名字 |
1 | //得到token的符号 |
1 | //得到token的小数点后几位 |
1 | //得到地址是_owner的账户的余额 |
1 | //转移令牌 |
由于向后兼容性原因,因为ERC20传输函数没有字节参数。
1、如果_to是合约,则此函数必须传输令牌并调_to中的函数tokenFallback(address,uint256,bytes)。
2、如果_to(接收方合同)中没有实现tokenFallback函数,则事务必须失败,并且不会发生令牌的传输。
3、如果_to是外部拥有的地址,则必须发送事务,而不尝试在_to中执行tokenFallback。
4、_data可以附加到这个令牌交易中,它将永远保持在块状(需要更多的gas)。 _data可以是空的。
注意:检查_to是合约还是地址的推荐方法是组装_to的代码。 如果_to中没有代码,那么这是一个外部拥有的地址,否则就是一个合约。
重要: 将在接收方合约中调用的令牌备用功能必须命名为tokenFallback,并使用参数address,uint256,bytes。 此函数必须具有0xc0ee0b8a签名。
事件
1 | //当token转移的时候触发,合约和token一起工作 |
1 | //令牌持有者发送令牌时处理从令牌合同所调用的令牌传输的功能 |
_from是令牌发送者,_value是传入令牌的数量,_data是附加的数据,类似于Ether事务中的数据。 适用于以太交易的回退功能,并且不返回任何内容。
注意:msg.sender将是tokenFallback函数内的令牌合同。 过滤哪些令牌(通过令牌契约地址)发送可能很重要。 令牌发送者(谁发起了代币交易的人)在_from thetokenFallback函数内。
重要: 这个函数必须命名为tokenFallback,并使用参数地址uint256,字节来匹配函数签名0xc0ee0b8a。
示例代码
1 | //ERC223.sol |
1 |
|
1 | pragma solidity ^0.4.9; |