ERC-223 是由 Dexaran 于 2017 年编写的以太坊及其他 EVM 链代币标准。它让代币的行为与 ether 一致:当你把 ERC-223 代币发送到智能合约时,合约会收到通知,并可以接受或拒绝这些代币,因此发往错误合约的代币不会丢失。存入只需一笔交易,无需授权步骤。
ERC-223 为代币转账增加了一条规则:如果接收方是智能合约,代币会先询问它。钱包的使用方式保持不变。
你调用 transfer(to, amount),其函数名和签名与 ERC-20 相同,因此任何钱包都可以发送 ERC-223 代币。
如果接收方是智能合约,代币会调用它的 tokenReceived 函数,就像 ether 会触发合约的 receive 函数一样。
为该代币设计的合约会处理这笔存入。未为其设计的合约会回滚交易,代币仍留在你的钱包中。
// ERC-223(EIP-223)接收合约
function tokenReceived(address _from, uint _value, bytes calldata _data) external returns (bytes4)
// 未实现该函数?转账会回滚,代币仍归发送方所有。ERC-20 设计于 2015 年。它的转账函数不会通知接收方,因此收到不支持代币的合约无法拒绝它们。这些代币会被锁在该合约中,通常是永久锁定。
向 dApp 存入时,ERC-20 还需要两笔交易:先 approve,再 transferFrom。为了节省 gas,许多交易所会要求一次性的无限授权。这样合约可以随时转移你的代币,一旦合约被攻击,已授权的代币可能被盗。
ERC-223 同时解决了这两个问题:接收方总会被询问,存入也只需一次转账。
| 特性 | ERC-20 | ERC-223 |
|---|---|---|
| 发送到合约 | 合约不会收到通知,不支持的代币会被卡住。 | 合约会收到通知,并拒绝无法处理的代币。 |
| 存入 dApp | 两笔交易:先 approve,再 transferFrom | 一笔交易:transfer |
| 授权 | 必需。无限授权会让资金面临风险。 | 不需要 |
| 一次兑换的 gas(示例) | 257K(授权 45K + 兑换 212K) | 220K,无需授权 |
| 行为与 ether 一致 | 否 | 是 |
| 标准状态 | Final(EIP-20,2015) | Final(EIP-223,2017) |
gas 数据来自在 DEX223 上对同一代币进行的一次实测兑换。实际结果因代币和网络状况而异。
你不必二选一。EIP-7417 代币转换器可随时把任何 ERC-20 代币按 1:1 转换为其 ERC-223 版本,也可以转换回来。两个版本是同一种代币。
存入 ERC-20 版本即可获得 ERC-223 版本,反之亦然。转换回来没有任何限制。
在 DEX223 上,每个池都同时接受代币的两个版本。你可以为交易的每一方选择 ERC-20 或 ERC-223。
在 DEX223 上进行 ERC-20 与 ERC-223 之间的转换,只需支付网络 gas。
兼容。ERC-223 保留了相同的 transfer 函数,因此钱包可以发送它;EIP-7417 转换器还能把任何 ERC-20 代币按 1:1 转换为其 ERC-223 版本,并可转换回来。
是的。EIP-223「Token with transaction handling model」在以太坊改进提案(EIP)中的状态为 Final。
Dexaran 于 2017 年提出 ERC-223。该 EIP 创建于 2017 年 5 月 3 日。
转账会失败,代币仍留在你的钱包中。而使用 ERC-20 时,同样的错误通常会让代币被永久锁定。
不需要。存入只是一次由接收合约处理的转账,因此没有 approve 步骤,也没有需要撤销的无限授权。
使用 DEX223 应用中的代币转换器。它支持 1:1 双向转换,不收取协议费用,只需支付网络 gas。