ERC223について
「ERC」というのは、「Ethereum Request for Comments」の略称であり、トークンを実装するためのERC-20やNon-Fungible Token(非代替性)トークンを実装するためのERC-721などは有名です。
実際にはどのような規格があるのかというと、下記の23種類もの規格が存在しています。
- ERC-20
- ERC-223
- ERC-667
- ERC-721
- ERC-777
- ERC-809
- ERC-864
- ERC-865
- ERC-874
- ERC-888
- ERC-918
- ERC-965
- ERC-981
- ERC-994
- ERC-995
- ERC-998
- ERC-1067
- ERC-1132
- ERC-1155
- ERC-1178
- ERC-1190
- ERC-1203
- ERC-1238
この中でも今回は、ERC223に絞ってお伝えしたいと思います。
Twitter界隈では少し話題になっているのですが、中身のないプロジェクトやscamが、ホワイトペーパー上でERC-223推しをしているというのです。であれば、ERC-223自体について多くの方に伝える必要があると感じたため、執筆に至りました。
コントラクトアドレスとEOA
ERC: 223
Title: Token standard
Author: Dexaran, dexaran@ethereumclassic.org
Status: Draft
Type: ERC
Created: 5-03.2017
Resolution: https://github.com/Dexaran/ERC223-token-standard
Recommended implementation: https://github.com/Dexaran/ERC223-token-standard/tree/Recommended
ERC20のトークン規格では、ユーザーは誤送金によって資金損失を招いていました。
ERC規格のトークン毎にどれくらいの資金が紛失しているのかを、下記にて簡単にまとめてあります。この中にEthereumの損失に関するデータはありませんが、他のトークンと比較して損失額は大きいようです。
- QTUM:$ 1,204,273
- EOS:$1,015,131
- GNT:$249,627
- STORJ:$217,477
- Tronix:$201,232
- DGD:$151,826
- OMG:$149,941
なぜ、このような誤送金が発生するのかというと、ERC規格のトークンはスマートコントラクトの稼働やトークンの識別に用いる「コントラクトアドレス」と、通常の送金を可能にする「EOA(Externally Owned Account)」の2種類が存在しており、ユーザー間のトークンの交換にはEOAを用います。
ユーザー間のトークンの交換に間違ってコントラクトアドレスを使用して、行き場を無くしたトークンが送信者の手元に戻ってくることはありませんが、取引所からの送金をする場合、万一誤送金をしてもエラー又は運営側の承認作業にて未然に防ぐことが可能です。しかし、分散型取引所(DEX)による誤送金でユーザーに資金が戻ってくることはありません。
ちなみにICO時に送金するアドレスは、コントラクトアドレスで指定のアドレスにETHを送金することで、コントラクトが稼働して送金したETHと引き換えにトークンが送られてきます。ICO時にMyEtherWallet(MEW)やMetamaskからICOに参加する旨が綴られている理由は、取引所からではコントラクトアドレスに送金することができないからなのです。
コントラクトアドレスは、etherscanで確認することができます。
コントラクトアドレスもEOAも「0x」からはじまるアドレスであるため、見分けが難しく実際の送金時にアドレスの見分けや判断は敷居が高いと言えます。その問題の解決にERC-223が用いられています。
ERC-223による誤送金の解決
ERC-20規格の上位互換と言われているERC-223規格を用いることでユーザーの誤送金による資金の紛失問題を解決します。どのような仕組みで解決するのかを説明したいと思います。
上位互換として”transfer”とtokenFallback
という2種類の新たな関数が仕様に追加されました。このなかの”tokenFallback”という関数が、送信者がコントラクトアドレスに送金しようとしているのか、EOAに送金しようとしているのかを確認します。”tokenFallback”関数は送金内容を確認して、トークンがコントラクトアドレスに誤送金だと判断すると、持ち主に送り返します。また、EOAへの送金時には”transfer”関数に基づいて送金が実施されます。この確認作業は送信先がコントラクトアドレスかEOAなのか関係なしに全てに対して確認作業が行われます。
余談にはなりますが、”transfer”関数はERC-20互換の時にも実装されていたのですが、互換性を持たせるために古い”transfer”関数を残して新たな”transfer”関数も仕様に含まれています。違いとしては引数に”bytes_data”が追加されており、トランザクションデータを持たせる役割があります。
ERC-20互換”transfer”
function transfer(address to, uint value) returns (bool)
ERC-223″transfer”
function transfer(address to, uint value, bytes _data) returns (bool)
このようにERC-223は、ユーザービリティ向上のために必要不可欠な仕様となっています。