2019年6月18日、ERC1155がイーサリアムのトークン標準として正式に認められました。ERC1155はマルチトークンスタンダードと呼ばれており、1つのコントラクトで複数のトークンを扱える標準となっています。
目次
ERC1155とは
イーサリアムの代表的なトークン規格としてERC20とERC721があります。ERC1155を説明する前に簡単にそれぞれの規格を説明すると、ERC20とはイーサリアム上で通貨としてのトークンを発行するための標準で、REC721とはトークンに様々な情報を付け加えることにより唯一無二の価値を持ったトークンを発行するための標準になります。
ERC20とERC721に関しては、以前の記事で詳しく紹介していますのでこちらもご参照ください。
そして、ERC1155はこれら2つの規格の特徴を合わせ持ったハイブリットな規格とも言われ、1つのコントラクトからERC20の特徴を持ったトークンもERC721を使った唯一無二の価値を持つトークンも作ることができる仕組みになっています。今までのERC20やERC721などの規格では1つのコントラクトでは1つのトークンの作成と管理しかできなかったのですが、ERC1155では1つのコントラクトで複数のトークンを扱うことができます。この特徴が今までのトークン規格と大きく異なる点であり、ERC1155の特徴であると言えます。
ERC1155はEnjin CTOのWitek Radomski氏により考案されました。Eijin社は2009年からゲーム市場に参入しオンラインゲームのプラットホームとして独自の地位を築いており、近頃では、ブロックチェーンゲームのブームと共にブロックチェーンゲーム市場にも本格的に参入しています。現在、Enjinはイーサリアムベースのゲームを作成できるコミュニティープラットフォームを開発しており、多くのユーザーに利用されています。
EijinがERC1155を作った背景は、ブロックチェーンゲームはゲーム内で利用されるアイテムやキャラクターをトークンとして扱っており、それらの管理はとても複雑な仕組みになっており、そこに大きな課題を感じていました。その課題を解決するためにERC1155は開発され、すでに多くのブロックチェーンゲームに取り入れられています。ERC1155はブロックチェーンゲームのユーザー体験をよりよいものにすると言われており、ブロックチェーンゲーマーの中では大きな注目を集めています。
ERC1155を使うメリット
ERC1155はERC20やERC721と比較して、2つの大きな特徴があります。1つ目が複数のトークンをグループとして送ることができること。2つ目は1度のトランザクションで複数の相手にトークンを送ることができることです。ERC1155の発表当初は、Ethereumブロックチェーンを使う際に必要なガス代を削減できることがERC1155のメリットとして挙げられていました。ですが、最近ではブロックチェーンゲームにおけるガス代の問題はサイドチェーンや独自のデータベースを用いることなどメインのブロックチェーンを使わない形で解決されてきてます。
したがって、ERC1155を使うメリットをガス代を削減できること以外で考えると、開発が簡単になることも挙げることができます。実際に2つの特徴に沿って開発が楽になることをみていきましょう。
複数のトークンを送る
ERC20やERC721の規格では複数のトークンを送る際には1つ1つのトークンを別々に送る必要がありました。例えばERC20で作られたTokenAとTokenBを誰かに送りたい場合には、まず最初にそれぞれのERC20トークンが作成されたコントラクトで「approve」と呼ばれる「トークンを送ることを許可をする関数」を呼び出す必要があります。その後、それぞれのトークンを1つにまとめ誰かに送るという流れになります。このように、2つの異なるERC20トークンを送る際には4つのステップが必要になります。
画像:ERC-1155: The Crypto Item Standard より
ですが、ERC1155では複数のトークンを誰かに送る場合は2つのステップのみで完了します。ERC20やERC721では1つコントラクトで1つのトークンしか発行できなかったのですが、ERC1155では同じコントラクトで複数のトークンを発行することができ、それら複数のトークンを1つのグループとして送ることができます。そのためトークンを送るためのステップを大きく削減することができます。誤解がないように追記しておきますと、送ろうとしているトークンは全て同じERC1155の基準にそったコントラクトから発行されたトークンで管理されている必要があります。ERC1155の標準に沿っていても違うコントラクトから作成されたトークンである場合は、ERC20やERC721と同様のステップを取ることになります。
画像:ERC-1155: The Crypto Item Standard より
複数の相手にトークンを送る
ERC20やERC721の規格ではトークンを複数の相手に送る際にはそれぞれの相手に個別に送る必要があり、そのトランザクション毎にガス代が発生していました。ですがERC1155では複数のトークンを複数の相手に送ることを1回のドランザクションで行うことできるので、トランザクションの数を減らすことができます。これらの複数のトークンも前述したように、同じコントラクトから作成されたトークンに限ります。
画像:ERC-1155: The Crypto Item Standard より
ERC1155の特徴
実際にERC1155のコードを見ていきましょう。ERCでは使う際に必要なことや基準などがGithubに公開されており、統一の規格を公開することによって開発者が開発しやすくなっています。実際に開発を行う際もERCの基準に沿って開発するようにしましょう。
EIP 1155: ERC-1155 Multi Token Standard
EIPs/eip-1155.md at master · ethereum/EIPs (GitHub)
interface ERC1155
interface ERC1155 /* is ERC165 */ { event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value); event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); event URI(string _value, uint256 indexed _id); function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external; function balanceOf(address _owner, uint256 _id) external view returns (uint256); function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); function setApprovalForAll(address _operator, bool _approved) external; function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
ERC1155のトークンを提供する際はこのようなインターフェースになります。
実際にsafeBatchTransferFromの関数を見てみましょう。この関数はERC1155の特徴である複数のトークンをグループとして送ることを可能にするための関数です。関数の引数をみてみるとuint256[] calldata _ids, uint256[] calldata _valuesがあります。uint256[] と指定されていることで引数に複数の数を渡すことができるので、_idsで送るトークンの種類を指定して、それらのトークンの送る量を_valuesで決めていることがわかります。この関数はERC20やERC721のトークンを送る際の関数と大きく異なる点です。
interface ERC1155TokenReceiver
interface ERC1155TokenReceiver { function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _value, bytes calldata _data) external returns(bytes4); function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external returns(bytes4); }
こちらはトークンを受け取る際のインターフェースとなっています。
ERC1155BatchReceive関数によって複数のトークンを複数の相手に送ることを可能にしています。同様に関数の引数をみてみるとuint256[] calldata _ids, uint256[] calldata _valuesとなっており、送るトークンの種類とその量が指定されています。
ERC1155の今後
ERC1155はERC20やERC721と比べて拡張性が高い規格となっているので、すでにERC1155を取り入れているゲームタイトルもあります。ただ注意しておきたいのが、ゲームのタイトルごとに独自のERC1155のコントラクトを作成してるのではなく、ERC1155のコントラクトで作成されたEijinのプラットフォーム上にてそれぞれのゲームタイトルがトークンを発行している点です。ですが現状では、EthereumのウォレットアプリであるMetamaskがERC1155に対応していないこと、ERC1155はERC721との互換性がないこと、どちらかの規格を選んで開発する必要があること、などからERC1155には解決すべき課題も多く残っています。また、すでに運用されているゲームではREC1155との互換性がないためERC721を継続して使っているゲームタイトルも多くあります。
同じコントラクトで作成されたコントラクトであればERC1155の特徴を生かしてトークンの流動性をあげることができますが、多くのゲームタイトルがERC1155でのトークン発行に切り替えるにはまだまだ時間がかかりそうです。
ERC1155のユースケースとしては、トークンを発行する権限を誰に対しても与えることができるため、ある特定の分野において使われる共通のトークン発行プラットフォームのような形で使われることが予想されます。今までのトークンはそれぞれのコントラクトで発行されていたため別々のトークンを同時に扱いずらかったのですが、同じコントラクトでトークンを発行することにより複数のトークンを同時に扱いやすくなります。そのため、共通のトークン発行プラットフォームの他にも回数券などとしても使える可能性があり、ERC1155の特徴を活かした様々なユースケースが出てくる可能性があります。
複数のトークンを扱いやすくなるとどのようなユースケースが出て来るのか、今後の動向から目が離せません。