はじめに
ERC20で問題となっているトークン消失、今回はこの問題を解決するERC223について解説します。
本記事は、過去にコンセンサス・ベイスが主宰していたオンラインサロンの記事です。記事は2017年~2018年にかけて執筆されたため、一部は、既に古くなっている可能性があります。あらかじめご了承ください。
ERC223ではトークンの送付方法をEtherの処理と同様になるよう変更します。そうすることで、ユーザーがEtherかトークンかを意識することなく送付処理が実行できるようになり、コントラクト開発者が安心してトークンを利用できるようになると考えられています。
Ethereum ERC223トークンとは
ERC20トークンで問題となっているのは、トークンそのものをトークンを処理するスマートコントラクト(レシーバーコントラクト)に直接送付してしまった場合、コントラクトが反応できずにトークンが消失してしまうことです。この問題の解決策として、レシーバーコントラクトにあやまって送付されたトークンを保持しないようにするtokenFallback機能の実装がERC223で提案されています。
そもそも、ERC20では以下2種類のトークン送付方法があります:
- トークンコントラクトのtransferをコール、トークンを受け取るウォレットのアドレスに送付
- トークンコントラクトのapproveをコール、応答したレシーバーコントラクトのtransferFromコールによりトークンをレシーバーコントラクトに送付
問題は、あやまって、transferによりレシーバーコントラクトのアドレスにトークンを直接送付したときに発生します。レシーバーコントラクトには直接送付されたきたトークンを処理する方法がなく、またサポートされていないトークンの受け取りを拒否する方法もないため、あやまって送付されてしまったトークンはレシーバーコントラクト内でアクセス不能の状態となり結果的に消失します。
実際、少なくともUSD40万相当のトークンがアクセス不能となり消失しています:
- 244,131 GNT in Golem contract
- 200 REP in Augur contract
- 777 DGD in Digix DAO contract
- 10,150 1ST in FirstBlood contract
- 30 MLN in Melonport contract
この問題を解決するため、ERC223ではトークンの送付方法をEtherの処理と同様になるよう変更します。そうすることで、ユーザーがEtherかトークンかを意識することなく送付処理が実行できるようになり、コントラクト開発者が安心してトークンを利用できるようになるでしょう。
具体的には、ERC223トークンのトークン送付は以下のように処理されます:
- 送付先がコントラクトでもウォレットでもトークンコントラクトのtransferをコール
- 送付先がウォレットの場合、ERC20トークンと同様に処理
- 送付先がコントラクトの場合、トークンコントラクトはレシーバーコントラクトのtokenFallbackをコール
– tokenFallbackがない場合はトランザクション失敗と処理
– tokenFallbackがある場合はレシーバーコントラクトに従って処理
tokenFallbackはEtherのfallback相当の機能で、引き継いだトランザクションを処理するために利用されます。
ERC223トークンの詳細については以下を参照してください。
ERC223 token standard · Issue #223 · ethereum/EIPs · GitHub
https://github.com/ethereum/EIPs/issues/223
ERC223トークンはERC20に対して後方互換性があり、ERC20に準拠したコントラクトやサービスはERC223トークンでも正しく機能します。
また、トークンをコントラクトに送付するトランザクションに必要なgasは、ERC20(approveとtransferFromの組合せ処理)で処理した場合の半分以下となります。