ERC230 VS ERC223
ERC223对ERC220的改进
ERC223是以太坊上最新的代币(token)接口标准,主要是为了解决ERC220代币转账丢失问题,那么怎么解决的呢,一起来看看.
1. ERC220 存在问题
ERC220接口中存在诸多转账接口,以transfer为例.
/// @notice send `_value` token to `_to` from `msg.sender`
/// @param _to The address of the recipient
/// @param _value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transfer(address _to, uint256 _value) public returns (bool success);
这个接口意思就是我给一个指定地址转多少token,功能非常简单,但是当初设计的时候没有考虑到的一个问题就是如果接收者是一个智能合约,那么合约是没法感知自己收到了多少token的.
当然ERC220只是一个接口标准(类似于dll接口),具体实现者完全可以考虑_to是智能合约时,采取一些特殊动作.
2. ERC223 标准化_to是合约地址时如何响应
上文提到具体实现者可以自己采取特殊动作,但是这缺乏规范,无法推广.
2.1 合约规范化的响应动作
function transfer(address to, uint value) public returns (bool ok);
function transfer(address to, uint value, bytes data) public returns (bool ok);
第一个接口兼容ERC220,第二个则是扩展ERC220,可以传递给合约一些数据(参数data).
具体实现就是,如果to是合约,那么会尝试调用该合约的tokenFallback函数,如果成功,则token转移成功,否则失败.
这个思路实际上就是以太坊上智能合约接收以太币时有一个fallback函数.
2.2 更灵活的响应机制
transfer(address _to, uint _value, bytes _data, string _custom_fallback)
如果接收方合约没有提供tokenFallback函数,则可以通过合约的fallback函数来传递信息,让合约知道有人给他转token了.
具体就是在这里
assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data));
这里的_to.call.value(0)(...) 就是直接调用合约fallback函数,但是我没给你转以太币,只是给你捎了个信儿,可以包含更多的自定义信息.当然gas也不便宜啊..