はじめに
この記事は株式会社digglueの新卒を含む社員向けの勉強会で利用した内容です。今回のテーマはTokenについて。内容や表現の間違いなどがあるかもしれませんがご了承ください。
導入
ERCトークンを理解しようと思うと、ERC20, ER721などなど様々なトークン規格がありかつ開発のスピードは目覚ましい状態で、全体を把握するのが難しいと感じるかもしれません。
しかし、トークンを理解する上で大事なことはそれぞれの規格の詳細を追う事ではなく、そもそもトークンとは何かということを理解し目的を把握することです。
今回はそれぞれの細かい差異に触れるのではなく、そもそもトークンとは何かという事の整理から初めて、ERCトークンの大きな類型と考え方を把握していきます。
Tokenとは
まずトークンの定義を書きます。トークンの定義は辞書によると:
“a thing serving as a visible or tangible representation of a fact, quality, feeling, etc.”
要素に分けると以下の通りです。
- 事実や質などの「無形」なものを
- 代わりに象徴する
- 知覚可能なもの
遊戯王カードをやっているとスケーブゴートトークンなどがイメージがつきやすいでしょう。
通行証、チケット、免許証、権利証なども定義からするとトークンと言えると思います。
プログラミングでは認証Token(アクセス権限の印となるもの)というデータを扱ったりします。
証券などの文脈では、Security Tokenなどという言葉を使います。Securityとは、ファイナンス用語で「交換可能な金融資産」を意味します。
抵当権、証券などなどがSecurity Tokenです。(ここは詳しくないので、間違っていたら補足してください。)
何れにせよ、トークンの主な目的は概念的なものを知覚可能にすることで直感的に扱えるようにすることでしょう。
Tokenの性質とは?
Tokenの用途により以下のような性質が含まれます。
- 数量を表す(お金)
- 対象を一意に特定する(土地の所有権など)
- 送付できる(土地所有権の譲渡)
- 売買できる(株券)
- 担保にできる(土地の担保)
- 利用して消費される(チケット)
- 身分証明を表す(免許証など)
- 偽造防止の仕組み(お金のすかし)
- 発行(お金、株券)
etc… 他には何があるでしょう?
ERC20(数量的なもの)
ERC20はEthereum上のスマートコントラクトで実装された、お金のように数量的なものを表すトークンです。株券、証券、仮想通貨などが主な用途となります。
とすると、すぐ思いつくもので必要な機能は「譲渡、担保、改ざん防止、発行」などでしょうか。
実際には以下の関数が実装されています。
- totalSupply(): 発行総量の確認
- balanceOf(): 特定のアドレスの残高確認
- transfer(address recipient, uint256 amount): 特定の人への送金
- approve(address spender, uint256 amount) : 特定の人へ利用権利を譲渡
- transferFrom(address sender, address recipient, uint256 amount): approveされた金額を送金する
その他にも、ERC20Tokenのサブクラスとして以下のようなものがあります。
- ERC20Burnable: (バーン(焼却))可能なToken
- ERC20Capped: 発行上限が決まったToken
- ERC20Mintable: 自由に発行数をコントロールできるToken
- ERC20Pausable: バグが見つかった時に全ての送金を一時停止できるToken
ERC20は規格に過ぎないので、規格に沿ってどう実装するかは各々の自由となり、組み合わせにより無限のバリエーションが存在します。
そのため、利用する際に重要なのは満たしたいTokenの性質をまず考えることとなります。
ERC721(固有なもの)
ERC721は、数量的なものではなく唯一性のあるものを示します。例えば、土地の所有権などは「どこかの土地20エイカー」ではなく「その土地」を所有します。
このように、数量的ではないものに対する所有を示すための用途があります。
ERC721が備えている関数は以下のようなものです。
- ownerOf(uint256 tokenId): 特定のTokenの所有者のアドレスを確認
- balanceOf(address owner): 特定のアドレスのトークン数確認
- approve(address spender, uint256 amount) : 特定の人へToken送付権を譲渡
- transferFrom(address from, address to, uint256 tokenId): 特定の人への送付、またはapproveされたTokenの送付
ERC20と殆どの機能は一致しています。transferとtransferFromはERC721規格では同一の関数にまとめられました。
ERC721Burnable, ERC721Mintable, ERC721Pausable、などのサブクラスとなる規格が存在するのはERC20と同様です。
ERC725(ID)
ERC725はアイデンティティー管理のためのTokenです。ERC725はスマートコントラクトで実装されているのですが、EOAと同様にコントラクトの作成やトランザクションの実行などの機能とインターフェースを持っています。そのため、他のスマートコントラクトから見るとあたかもEOAのように振舞います。
ERC725を使ってコントラクト上にアカウントを持つ事のメリットの一つは、メタデータを格納できることです。例えば身長や名前などの値を保存し、デジタル上のプロフィールとして利用することができます。
さらに、このアカウントは他にも様々なプログラムを組み込んで実装することができます。複数の電子署名によってしか送金できない、一定の期間にならないと利用できないなどの条件を組み込むことができ、通常のアカウントでは実現できなかった仕組みを加えることができます。
ERC735はERC725をさらに拡張し、電子証明書データを格納することで身分確認・認証に利用する機能を与えています。
シーケンス図
ERC735を利用することで、スマートコントラクトがオラクルを利用せずにアドレスの身分確認を行えるようになります。
ERC735の利用のデモサイトがあるので、触れてみるとよくわかるでしょう。
その他の規格
- ERC20(Fungible)系
ERC20:
ERC223: コントラクトアドレスへの誤送信防止機能付き
ERC621: 発行上限を自由に変えられる
ERC777: ERC20を置き換える新しい規格で、他のコントラクトなどにトークンの送金権限を付与するなどが可能となる。
ERC884: デラウェア州が法的に認可したIPO用のToken規格 ETC948: サブスクリプション支払いが可能 ERC1608: ローンのトークン - ERC721系(NonFungible)
ERC721
ERC864: 分割所有が可能 - ERC1155(ハイブリッド)
- ERC725系(ID系)
ERC725
ERC735
Links
- Why Crypto Users Need to Know: The ERC20 Standard
- ERC20 source code
- Security (finance)
- ERC721: github
- ERC777
- ERC884
- ERC725とERC735
- ERC725 github
- ERC735 github
- ERC735 pros con
- Managing Identity with a UI for ERC 725
- ERC725Play Ground
人材募集!
株式会社digglueではコンサルタント及びエンジニアを募集しています。
ブロックチェーンに関して、既によく理解している方だけでなく、これから学びたい方、仕事として実績を積みたい方、将来を考えてテクノロジーに触れておきたい方などでも大歓迎です。
ビジョン・ミッションなどに関しては、こちらのnote(digglueはどこへ向かうか) を参照ください。
ご質問・応募はコンタクトフォームかinfo@digglue.comまでご連絡ください。