Gunosy Blockchain Blog

Gunosyの開発メンバーが知見を共有するブログです。

トークンコントラクトの仕組みとERC20トークンを用いたサービス設計の概要

はじめに

こんにちは。新規事業開発室の山口 (@yamarkz) です。

最近の界隈の話題を追っていると主に2つのトピックに注目が集まっていると感じています。その2つとは「トークンエコノミーの未来」と「Plasma」です。 先日参加したBeyond Blocks Tokyo というイベントでもこの2つのトピックが取り上げられ、パネルディスカッションの題材にもなっていました。

本記事では「トークンエコノミーの未来」のトピックに注目し、トークンとは何なのか?また、技術的な観点から見た場合のトークンとはどういったものなのかを紹介していきたいと思います。

※ EthereumやSolidityでトークンやスマートコントラクトを利用することを前提とします

「Plasma」について下記の記事で紹介しています。

blockchain.gunosy.io

トークン

トークンとは何なのか? ブロックチェーン技術に関わっていればおそらく一度は耳にしたことがあるキーワードだと思います。

Googleなどで検索すると既に多くのトークンに関する解説記事が見受けられます。

トークンに対する考えや理解は人それぞれ異なるかと思いますが、ここではトークンを 「付加価値を分割的、かつ定量的に扱うためのデータ」 と定義します。※ あくまで、個人の考えと理解に基づいた定義です

付加価値とは、サービスを利用するための権利証明であったり、収益分配権の所有を証明するもののことです。付加価値のついたデータをトークンという単位 (100トークン, 300トークン etc...) にすることで分割的、定量的に扱います。

身近な例ではT-Pointも付加価値のついたデータで、これはポイントという単位で扱っています。この場合の付加価値は商品購入時にポイントがフィアットに還元されるというところです。

また、ブロックチェーン技術を用いたプロジェクトの最たる成功例であるBitcoinも広義的にはトークンであると言えます。Bitcoinは「Electronic Cash」とSatoshi Nakamoitoが定義したことによりCash (現金) として価値が認められ、実際に決済に利用できるようになってきました。参考

f:id:yamarkz:20180407163842p:plain:w400

そして、トークンに合わせて話題に上がるのがICO (Initial Coin Offering)による資金調達です。ICOではプロジェクトへの投資の対価としてプロジェクトに関連したトークンを発行します。 現在、多くのICOがEthereum上で行われています。なぜEthereumを利用するのかというと、ICOによる新たなトークンの発行が容易であることと、発行したトークンを用いたサービス構築 (周辺のエコシステム含め) が容易であるからです。実施する上での土壌が整っているのが一番の理由です。

次に、多くのICO実施実績があるEthereumでトークンはどういった形で表現されているのかをより深く見ていきたいと思います。

(余談ですが、Ethereum自体も2014年の7月にBitcoinを用いたICOを実施しており、プロジェクト推進の資金調達を行いました。参考)

ICOについては下記記事でも紹介しています。

blockchain.gunosy.io

トークンコントラクト

Ethereumプラットフォーム上でICOを実施し、トークンを発行する場合、トークンはコントラクトを用いて表現されます。 このトークンの表現が実際にどういったものなのかを技術的な観点から紹介していきます。

技術的な観点から見た場合、トークンコントラクトは 「所有者のアドレスとトークン残高(balance)を紐づけたデータを管理するスマートコントラクト」 と定義することができます。

「紐づけたデータ」 を Solidityではmapping型 (Key => Value) のデータ構造を用いて表現しています。このmapping型は他言語では連想配列などとも言われています。 トークンコントラクトでは(address => balance)というmapping型の構造を用いてデータ管理を行います。

f:id:yamarkz:20180407155227p:plain:w400

一般的なトークンコントラクトでは最初にコントラクトを作成する(デプロイする)タイミングで、デプロイを行うユーザーが初期値で定義した残高がトークン全体の残高となります。この残高の数字の単位を「トークン」と呼んでいます。

トークンのやり取りは「トークンを送信する」「トークンを購入する」「トークンを受け取る」などと一般的に表現されています。これらの表現からEthereumネットワーク上でトークンと呼ばれる何らかのデータが個人のアカウント間で送受信されているような状況が連想されますが、実際の振る舞いは異なります。

f:id:yamarkz:20180409094937p:plain:w400

トークンの送受信による実際の振る舞いは、トークンコントラクトの状態変更 (balance値の変更) です。アカウントAとアカウントBのやりとりで完結しているように思えますが、実際には間にトークンコントラクトが存在しています。

このトークン送受信の振る舞いに関する例として、アカウントAからアカウントBに対して100トークンを送信する場面を想定します。

f:id:yamarkz:20180407155922p:plain:w400

アカウントAからアカウントBに対して100トークン送信したい場合の流れ

  • アカウントAはトークンコントラクトに対して、自身のバランスからアカウントBのバランスに対してトークン量を100移動するトランザクションを送信する
  • トークンコントラクトはトランザクションを受け、指定された関数を実行し、自身の状態を更新。この更新では、アカウントAのバランスから100を差し引き、アカウントBのバランスに100を増加させます
  • アカウントBは、「アカウントAがトークンの送信が完了した」というのを確認後、トークンコントラクトに対して、自身のバランスの値がいくつなのか問い合わせを行います
  • 問い合わせの結果、アカウントAがトークン送信のトランザクション送信前に確認した値よりも100トークン増加していることを確認
  • このトークンコントラクトへの問い合わせで自身のトークン数が増加していることの確認ができたことで取引が成立したことになる

f:id:yamarkz:20180407160201p:plain:w400

以上がシンプルなトークン送受信の仕組みです。

これらの仕組みを踏まえると、トークンコントラクトは アカウントが価値あるデータをいくつ所有しているのかを証明している存在 であると言えます。

トークンはアカウント間でのやり取りにトークンコントラクトの存在があることによって成り立っています。

なので、自身がいくつトークンを所有しているのか?を確認する場合は、トークンコントラクトに対して問い合わせることで確認することができます。

ERC20トークン

上記で紹介したEthereum上でのトークンコントラクトに対して、共通のインターフェースと振る舞いを提供する試みとしてERC20が標準として定義されました。

こちらもトークンに関連してよく話題に上がるので、耳にしたことがあるかと思います。

この標準化は共通インターフェースを定めることで増加するトークンの管理を楽にすることが主な狙いです。

EIP-20として定義されています。下記リンク参考

EIPs/eip-20.md at master · ethereum/EIPs · GitHub

ERC20とは何か? ERC20がなぜ生まれたのか? については以前紹介したViperと呼ばれるコントラクト開発言語の紹介記事で触れているのでそちらを参考にしてみてください。

blockchain.gunosy.io

ERC20トークンを実際に作成し、仕組みを理解したいという方は下記記事を参考にしてみてください。

qiita.com

また、開発環境の構築は下記記事を参考にして見てください。

blockchain.gunosy.io

ERC20トークンを用いたサービス設計

ERC20で標準インターフェースは定められているものの、具体的にどういった振る舞いで動くのかはイメージするのが難しいと思います。

なので、例としてERC20トークンを利用したサービス作る場合にどのように動くのかを見ていきます。

f:id:yamarkz:20180409094744p:plain:w400

ERC20で標準化されているインターフェースを用いてトークンを消費し、サービスコントラクトの振る舞いを実行する場面です。

approve() / transferFrom() / allowance()

サービスコントラクト側でトークンを消費する仕組みを構築する際には、ERC20で定められているapprove()とtransferFrom()という2つの関数を利用します。

  • approve()

approve()関数は、第三者(この場合、サービスコントラクト) に送信者の残高 (アカウントに紐づくバランス) からトークンを転送することを許可するために用いられます。トークンはallowedというmapping型のデータ構造に保存されます

  • transferFrom()

transferFrom()関数は、第三者(この場合、サービスコントラクト)によりトークン転送を行うために用いられます

  • allowance()

allowance()関数は、approve()関数でallowedに割り当てたトークンの値を返すview関数です

サービス設計

サービス利用者 (Sender)が1GUNトークン (Gunosy Token) を消費してサービスコントラクトを操作し、サービスを利用する場合の流れ

  • SenderはToken Contractに対して approve()関数を実行し、1GUNトークンを転送することを承認します
  • SenderはService Contractに対して hoge()関数を実行し、サービスを利用します
  • Service Contractはhoge()関数の中でToken Contractに対してtransferFrom()を実行します。この時transferFromで移動するトークンはapprove()関数で承認されている必要があります
  • transferFrom()関数の実行し、SenderのトークンをService Contractに転送します。これでトークンを移動したことになり、Service Contractが振舞われ、結果がSenderに返ります

f:id:yamarkz:20180409094744p:plain:w400

以上がシンプルなトークンを用いたサービス利用の仕組みです。

ERC20トークンの派生系

ERC20に続いて様々なトークンスタンダードが生まれています。

ERC223

ERC20が抱える問題点を解決するトークン規格として提案されている規格。提案はされているものの、正式採用はされていない 。status: Draft

主なメリットとしては

  • tokenFallback の追加により誤ったトークン送信を防ぐ機能が追加

  • transfer の単一インターフェースでトークンの送信が完結している

  • approvetransferFrom を利用しない形式でトークンを利用するサービスコントラクトを操作できるようにすることでGasの浪費とトランザクションの増加を防ぐ狙い

  • サービスコントラクト実装者は transfer だけでトークン操作が可能になる (個人的にこれ最高)

参考

github.com

ERC721

Non-Fungible Token (代替不可トークン) の規格として標準化

CryptoKittiesのkittyの表現がこのトークンを用いて行われています。

参考

github.com

ERC20トークン対応のウォレット

ICOブームなどによりERC20トークンは昨年から爆発的に増加しました。

これらのトークンを購入し利用や、交換する場合にはERC20トークン対応のウォレットを用いる必要があります。

以下、ERC20に対応で便利な主要ウォレットサービスです、いくつか触ってみて使いやすい物を利用しましょう。

MyEtherWallet

www.myetherwallet.com

MetaMask

metamask.io

Ginco

ginco.io

tokenPocket

tokenpocket.jp

まとめ

  • トークンとは、付加価値を分割的、かつ定量的に扱うためのデータ
  • 新たなトークンの開発はEthereumのプラットフォームを利用するのが良い
  • Ethereum上でのトークンはコントラクトを用いて表現され、addressとbalanceのmapping型を用いてデータを管理している
  • トークンの共通インターフェースを定め、管理を容易にするためにERC20が定められた
  • トークンを用いたサービス構築では、approveとtransferFromを利用する
  • 自身が所有するトークンを管理するウォレットアプリも様々出てきている

最後に

今回はトークンについて技術的な観点からの表現を中心に紹介してきました。

本記事を元にトークンとは実際は何なのか?どういった仕組みを構築する必要があるのかを理解していただけたら幸いです。

宣伝

Gunosyではブロックチェーンを始めとしてスマートスピーカー、VR/ARと言った新規領域での研究・開発を進めており、メンバーを募集しています。

少し話を聞いてみたい!という方も歓迎していますので、下記のリンクからの応募お待ちしております。

www.wantedly.com

また弊社Gunosyでは、blockchain.tokyo を主催するなど、ブロックチェーンや仮想通貨に関する調査を行っています。

blockchain.tokyoは明日、DMMさんを会場に開催します。残念ながら7回目の募集は終了しています。 来月も開催する予定です。イベントグループへメンバー登録をしていただくとイベント参加者募集の通知が来るので、こちらもぜひ登録してみてください。

blockchain-tokyo.connpass.com