Ethereum上につくられるトークン
Ethereumは、今最もDapps開発で利用されているプラットフォームです。Dappsとは分散型アプリケーションの略称で、ブロックチェーン上にアプリケーションを配置する(デプロイする)ことで、中央管理者が不要で透明性の高いシステム構築が可能となります。例えば、"トークン"と呼ばれる仮想通貨は、Ethereum上のDappsとして作成されているケースが多いです。
なぜEthereum上のDappsで多くの通貨が作成されているのでしょうか。それは、ERCと呼ばれる共通規格が他のプラットフォームに先んじて整備されていることが理由の1つでしょう。
ERCとはEthereum Request for Commentsの略称で、Ethereumに関連する技術仕様の提案書を指します。Ethereumのコミュニティは他のブロックチェーンコミュニティに比べ活発で、現在までに多くのERCが議論されています。
その中で最も有名なERC20は、通貨としての機能を定義した規格です。いわゆる"地域通貨"や"〇〇コイン"と呼ばれる類の多くは、このERC20をベースとして作られています。そのため、ERC20の仕様さえ理解してしまえば誰でも簡単に通貨(コイン)を作成して世界中に公開ことができます。
ただし、その通貨が広く知られて使われるかはまた別の問題になります。本記事では、幅広いユースケースに対応できる世界観をトークンでどのように実現するか詳しく見ていきます。
ERC20と呼ばれる通貨型トークン
ERC20に関する説明は多くの記事で詳しく紹介されているため本記事では割愛させていただきますが、ERC20をベースに開発者が通貨をつくる場合、以下3ステップで利用可能な通貨を公開することができます。
1. 必須機能の実装
プログラミングで何か新しいものを作成する場合、1から全てを実装することは非常に高コストです。Ethereum開発を行う場合も例外ではなく、多くの場合はOpenZeppelinと呼ばれる、既に実装されたライブラリ集を利用しながら開発を進めます。
OpenZeppelinには、「IERC20.sol」という定義ファイルが提供されており、ここにはERC20で必要となる機能が明確に定義されています。
この「IERC20.sol」を継承した独自のコントラクト(ロジック)を自分で実装することで、独自のコインに必要な機能を作成することができます。幸い、OpenZeppelinには見本となる実装例が既に存在しているため、初学者でも適宜参考にしながら開発を進めることができます。
[ERC20の主な必須機能] ※2018.11.3時点
No | 機能名(メソッド名) | 概要 |
1 | transfer | 所有しているトークンを指定した数量だけ宛先アドレスへ送金します |
2 | balanceOf | 所有しているトークンの残高を確認します |
3 | totalSupply | トークンの全発行数量を確認します |
※他にもいくつか存在しますが、比較的イメージしやすい3つのみをピックアップしています。
2. 追加機能の実装
必須機能には、トークンの残高を確認し宛先アドレスに送金するといった基本的な機能は存在しますが、これだけではあまり面白くありません。独自通貨の特徴となる機能を追加したい場合は、そのロジックも自由に追加することが可能です。
例えば、多くの人にトークンが分配されるよう、毎月ランダムにトークンを分配するといった独自ルールを組み込むこともできますし、あるいは有効期限を設けて超過した場合は自動的にトークンが消滅することで、利用者にトークンの積極的な使用を促すこともできます。
また、送金するという機能が実行された直後に、送金量の一部を特定の人に還元するといったような基本機能の拡張も可能です。
想像力の及ぶ限り、自由にルールを追加していくことができますので、創造主の気分に浸りつつ独自の世界観を構築していくことができます。
ただし、次に紹介するデプロイを実行してしまうと、基本的には変更することができませんので、なるべく事前に検証テストを実施しておく必要があります。
3. デプロイ(コントラクトの配置)
ブロックチェーン上に作成したコントラクトをデプロイ(アプリケーションを公開)します。デプロイ時に通貨名や通貨の発行量を定義することができるので、適切な命名・数値を定義します。
本記事執筆時点では、OpenZeppelinに含まれる「ERC20Detailed.sol」の中にプロパティを使った実装例が提供されています。
[ERC20の主なプロパティ]※2018.11.3時点
No | プロパティ名 | 概要 |
1 | _name | 作成するトークンの通貨名(例: Ethereum) |
2 | _symbol | 作成するトークンのシンボル(例: ETH) |
3 | _decimals | 作成するトークンの有効小数桁数(例: 18) |
デプロイ先としては、最終的に日本円と交換可能なメインネットと呼ばれるものと、テスト用に使用されるテストネットがあります。テストネットにも複数の種類があるため、目的に応じてデプロイ先を選定しましょう。
以上で独自の通貨を作成し公開することができます。デプロイの方法など技術的な内容は本記事で割愛しておりますが、多くの記事に詳細な手順が公開されておりますので、開発者以外の方もぜひ一度試してみてください。
ここまで見てきたフローでは、基本的に1つの通貨に閉じた話になりますので、円とドルを交換するように複数のトークンを扱うことはできません。複数のトークンを扱う方法は下記の章でご紹介していきます。
ERC721による個性の実装
もう1つ有名なトークンの規格に、ERC721と呼ばれるものがあります。ERC20が"お金"という位置づけならば、ERC721は"個性"となります。例えば人間の場合、一人ひとりが異なるDNAを持っており、顔や性格が似ていることはあっても全く同じ人は存在しません。ERC721では、この個性をIDという一意な番号を振ることで実現しています。このIDは「トークンID」と呼ばれ、ERC721コントラクトはトークンIDと所有者アドレスをマッピング情報として管理しています。
ERC721のような個性をもつものをNFT(ノンファンジブルトークン)、ERC20のような等しく交換可能なものをFT(ファンジブルトークン)と呼びます。
[ERC721の主な必須機能]※2018.11.3時点
No | 機能名(メソッド名) | 概要 |
1 | safeTransferFrom | トークンIDを適切なアドレスに譲渡します |
2 | balanceOf | 所有しているトークンIDの数を確認します |
3 | ownerOf | 指定したトークンIDの所有者を確認します |
トークンIDで表現される例としては、キャラクターや装備品があります。例えばゲームの場合、自分が保有しているキャラをトークンIDとして管理しておくことで、自分しか持っていない世界で唯一のキャラをブロックチェーン上で表現することができます。アイテムも同様に表現することができ、希少性に応じて価値が変動します。実際に既に存在するゲームでは、レアキャラやレアアイテムを手に入れるために数百万円の取引が行われていたりします。
ERC20とERC721を同じ世界観で使用するために
ここからが本記事の本題になります。基本的に、ERC20とERC721はそれぞれ別々のコントラクトとして作成・デプロイされるため、これら2つを組み合わせて利用する場合には、両者の橋渡しをする新たなコントラクトを別途作成する必要があります。
例えば上図のように、あるキャラクターを独自通貨で販売する場合、キャラクタの購入に必要な通貨を仲介用コントラクトが一旦預かり、条件が満たされた場合のみキャラクタの所有権を書き換えるような仲介コントラクトのロジックを作成します。この場合、最低でも3つのコントラクトが必要になるため、設計や実装の難易度は上昇します。
また、コントラクトの実行にはガスと呼ばれる手数料(Ether)が必要になりますが、複数のコントラクトを連結して実行させることにより、当然消費するガスの量も肥大化します。
バイブリッド型規格のERC1155
ERC1155という規格は、このような複雑性や高コストな設計を排除するために誕生しました。ERC1155の特徴を端的に表すと、ERC20とERC721の各トークンを同じ形式で管理することができるようになります。両者を一意に表現される「アイテムID」に紐づいた特徴として管理することで、FT(ファンジブルトークン)とNFT(ノンファンジブルトークン)の交換は、アイテムIDに紐づいている所有者のアドレスを付け替えるだけで可能となります。そのため、仲介コントラクトの作成も不要です。
また、ERC1155はプラットフォーム型になっているため、複数種類のFT/NFTを共存させることができます。これまでは、AコインとBコインを発行する場合、両者は別々のコントラクトとして作成・デプロイされてきましたが、ERC1155では同一コントラクト内にAコインとBコインを定義することができます。
さらに、デプロイ時に定義を決定するERC20やERC721とは違い、ERC1155ではデプロイ後にトークンの特徴を定義するため、開発者以外の一般ユーザでも自由にトークンを追加作成できるようなプラットフォームを作成することもできます。(詳細は後述)
※ERC20/721でもアップデート用の追加機能を実装することで後から再定義することは可能ですが、複数の種類を共存させるには別々のコントラクトが必要になります。
ERC1155は2018.11.3時点もディスカッション中で、ERC20/721のように正式に仕様が固まった規格ではありません。直近では、2018.10.18にも「Crypto Items Token Standard」から「Multi Token Standard」へと名称が変更されました。 本記事では2018.10.28時点での最新情報を元に記載しています。
[ERC1155の主な機能]※2018.11.3時点
No | 機能名(メソッド名) | 概要 |
1 | create | FT/NFTのアイテムタイプを定義します |
2 | mintFungible | FTとして定義されたアイテムタイプのトークンを指定数量分だけ発行します |
3 | mintNonFungible | NFTとして定義されたアイテムタイプをベースに指定数分IDを発行します |
ERC1155にてトークンがつくられる過程は以下のようになります。
1. アイテムの定義(create)
前述の通り、ERC1155では「アイテムID」と呼ばれる単位で全てのトークンを管理していきます。まずはcreate機能を実行し、アイテムの「型」を定義することからスタートします。この時アイテムIDが発行されますが、createが実行される度に、nonceと呼ばれるコントラクト内のカウンタが1ずつ増加し、アプリ全体でアイテムIDの一意性が保証されています。
また、createを実行する際にはNFTとして作成するかFTとして作成するかを必ず指定する必要があり、両者は先頭IDの先頭ビットを「0」と「1」で区別しています。ただし、この段階では利用可能なトークンではなく、以下に記載する後続機能を呼ぶ出す必要があります。
2. アイテムの生成
定義された型のトークンを利用可能にする場合、FT/NFTでそれぞれ指定の機能を実行する必要があります。
2-1: FTの生成(mintFungible)
FTを使用可能なものとして生成するためには、mintFungibleという機能を実行する必要があります。FTの場合、1.で生成したアイテムIDはトークンの種類を表しており、1.で定義された種類のトークンを新規発行(追加発行)していくのがmintFungibleの役割です。例えば、1回目のmintFungibleでは、10000を総発行量として新規発行し、続いてmintFungibleを実行して5000を追加発行するようなことができます。
また、通貨の種類はアイテムIDで管理されているため、createを実行することで複数の通貨をいくらでも追加することができます。ERC20の場合、複数の通貨は別々のコントラクトとして作成されているため、両者のトレードには新たな仲介コントラクトが必要でしたが、ERC1155で定義された通貨の場合は、同じコントラクトで管理されているため、各保有者アドレスのもつ残高数量を書き換えるだけでよく、非常にシンプルで扱いやすくなります。
ERC1155の通貨にもERC20と同様、transferやbalanceOfといったお馴染みの機能が用意されており、ERC20を作成したことがある人なら違和感なく扱うことができるでしょう。
2-2: NFTの生成(mintNonFungible)
NFTを使用可能なものとして生成するためには、mintNonFungibleという機能を実行する必要があります。NFTの場合、1.で生成したアイテムIDはトークンの型を表しており、mintNonFungible実行時に128ビットが追加された最終的なNFTのアイテムIDが生成されます。同じ型のトークンを複数回生成した場合でも、追加分の128ビットは常に+1されて合成されるため、最終的なアイテムIDが重複することはありません。
NFTをcreateすることで、異なる種類の型を定義することができるため、好きなタイミングで新たなキャラクターやアイテムを追加していくことが可能です。mintNonFungibleを実行した回数だけ同じ型のトークンが発行されるため、例えば世界に50体しか存在しないキャラと10000体存在するキャラを同時に管理することもできます。
もちろん、全て同じコントラクトで管理されているため、NFT同士の交換は簡単に実行できますし、FTとNFTとの交換も容易です。
ERC1155の仕組みを拡張して世界観を設計する
以上がERC1155の標準的な使用例になります。ERC1155が誕生した背景としては、ERC20とERC721を同一コントラクトで利用したいという狙いのもと上述の機能が用意されていますが、ここからは筆者の見解を交えた応用例を記載していきます。
1. アイテムのグルーピング
アイテムIDは0と1が並ぶビット配列です。FTとNFTを見分ける方法として、先頭のビットが「1」の場合NFT、「0」の場合はFTと定義されています。これを応用し、特定の位置が「1」であることに意味を持たせるで、特定のユースケースでしか利用できないような制約の追加や、グループ化によるアイテムの整理が可能になります。
例えば上図の場合、先頭から3桁目を識別し同じ「1」の場合のみトレード可能な限定アイテムを表現しています。アイテムの型は128ビットで表現されるため、着目する桁数を変えることで柔軟なグルーピングができます。また、複数の桁をまとめて識別することで、2種類以上のグループ化も実現可能です。
グルーピングはあくまで手段ですので、該当グループに対してどのようなルールをマッピングしていくかが重要になります。前述で独自の世界観を構築できることの重要性を説きましたが、グルーピングによって、特定のグループのみに適応されるルールがつくれるため、より表現の幅が広がります。
2. マルチトークンプラットフォーム
ERC1155は一度適切に設計されると、一般利用ユーザでも好きなタイミングでトークンを作成・公開することができるようになります。これを利用して、小さなトークンエコノミーをエリアごとに作成し、エリアを飛び越えたベース通貨をつくることで、マルチトークンエコノミーを作成することができます。
ERC20の場合、新たに通貨を追加で定義・公開するためには上述の開発フローを行う必要がありました。これは開発者なら可能ですが、一般ユーザにはハードルが高いです。一方でERC1155の場合、createを実行するAPIを公開することにより、Web画面やスマホアプリに用意された通貨追加ボタンのような、一般ユーザが実行できるインタフェースから新たな通貨を作成することができるようになります。
上図の例では、3つのエリアそれぞれで利用される通貨をFTで用意しています。この通貨を利用する人や組織を「Node」として表しており、NFTをそのエリアのFTでトレードすることでトークンが循環する様子を表現しています。さらに、Aコイン/Bコイン/Cコインそれぞれと交換される基軸通貨を中央に用意することで、エリアを飛び越えた通貨の移動が可能になります。
こういったプラットフォームを用意することで、どのトークンエコノミーが発展あるいは衰退するか、社会実験として見守ることもできますし、会社などの組織でグループごとに経済圏をつくり、各グループごとに生成された通貨の変動相場を見ながら適切な競争を生み出すことができるかもしれません。
総括
ERC1155は今後も定義が変更となる可能性がありますが、ERC1155の考え方をベースにコントラクトを作成することで、あらゆる表現が単一コントラクトで簡単に表現できるようになります。また、ERC721xなど優れた規格が次々に発表されており、ブロックチェーン界隈の動向は非常に激しいものとなっておりますが、コントラクトの考え方自体がいきなり大きく変わるものではありません。まずはお手軽なERCトークンの規格を読んで、開発者であれば実際に動かしてみて、コントラクト開発のベースとなる考え方を身につけることが、新たな分散型システムのアイディアに繋がる近道かもしれません。
ERCトークンを使用した設計に関してご質問・ご相談などございましたらお気軽にご連絡ください。「トークンでこんなものつくりたい!」という相談にもお答えします。
Twitter👉https://twitter.com/shunpei42ba_