Bancor プロトコル:Smart Tokenの革新性とは。「Coincidence of Wantsの解決」とそれがもたらす「取引の再発明」

# Bancor（バンコール） とは？
　第二次世界大戦中にあのケインズ(John Maynard Keynes)さんと、ドイツ生まれのイギリスの経済学者Ernst Friedrich Schumacherさんによって提案された**超国家的な通貨**で多国間決済が主な目的であった。しかし、アメリカ合衆国の反対によって実現には至らなかった。
## Bancor プロトコルとは？
　政府など関係なく世界の人々が勝手に作り出した仮想通貨とそれを可能にしたブロックチェーンという技術を使ってBancorを実現しようという動きがついにICO (Initial Coin Offering)まで漕ぎ着けた。しかも、[資金調達額はわずか３時間で1億4400万ドルという新記録](https://jp.cointelegraph.com/news/broken-record-bancor-raises-144-mln-in-less-than-three-hoursjp)。その規模とメディアの取り上げ方を見ると、本来の超国家通貨実現というよりは投機対象のイメージが一人歩きしていると私は感じているが、なんにせよ今世界から注目を集めているEthereumのスマートコントラクトを基盤としたプロトコルである。Bancorはその記録的な資金調達をEthereumで396,720ETH集め、Bancor Network Token(BNT)という**スマートトークン**を79.3百万BNT分発行するそうだ。しかし、その実はどうなのか。Bancor Protocol の[ホームページ](https://bancor.network/)に[Whitepaper（白書）](https://bancor.network/static/Bancor_Protocol_Whitepaper_en.pdf)がダウンロードできる形になっており誰でも理論と技術を理解できるようにはなっているものの...

**数学が多め。**

である。

しかし、大きな特徴を要約すると

>①Coincidence of Wants Problem（売買価格の双方合意問題）の解決
>②資金を集め、それを準備金として通貨（トークン）を発行し、その流動性を保証する取引市場をユーザーが自由につくりだせる環境の提供

の２点である。と私は結論づけ今回は特に①を実現した技術を解説したいと思う。

# Coincidence of Wants Problemの解決とは？
　**売買価格の双方合意問題**と無理矢理日本語訳してみたものの、あまりしっくりこないので文章で説明する。
　今までの取引市場は、AをX円で売りたい人はAをX円で買いたい人を見つけないと取引が成立しない、そんな真逆の欲求(Wants)を持つ２人の偶然(Coincidence)の出会いに頼った仕組みで運営されていた。そうすると、参加者、つまりその取引所を使う買う人、売る人の人数の規模がある程度ないとその偶然が起こらず、それは取引所として成り立てなかった。そのため、規模の小さな通貨や財産、例えば地域通貨や小規模コミュニティのトークンは取引の成立が難しく**流動性**を確保できないため、取引所に上場（出品）できず、それの一般社会への流通と繁栄自体が困難であった。
　Bancorはそんな問題を**技術的に解決する手段を初めて提案**したのである。

----*Coincidence of Wantsの実例*----

![spread.png](https://qiita-image-store.s3.amazonaws.com/0/187795/e7e0e11d-47c1-75a3-1186-de04f2f61c21.png) 
*[Coincheck](https://coincheck.com)でのBTCと日本円取引現場のとあるシーン。取引対象として一番優先される最上段を見ると、BTCを買いたい価格（緑）は291,370円だが、売りたい方（赤）は291,440円を提示。70円の差のSpread（スプレッド）と呼んだりされる。こうなると取引が硬直してしまう。提示価格に妥協して70円の差を詰めていくか、新しい買い手（売り手）が割り込んでくるまでBTCと日本円の取引は止まったままになる。*

　上記の例はBTCと日本円なので取引規模は大きく、長くても１、２分で硬直は解かれるが、マイナーな通貨だとそうはいかない。しかし、この問題がBancorを基盤にすると発生しないとなると、規模を問わずして、地域通貨や個人レベルのトークンは、取引硬直とそれに因した衰退を恐れずしてグローバル取引市場に参加できるようになる。通貨の世界でいわゆる[ロングテール](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%B3%E3%82%B0%E3%83%86%E3%83%BC%E3%83%AB)の存在を可能にする。

# 技術的解決を世界初に提案
　では、そうするためにBancorはどう解決したのか。売買価格が一致しづらいのは人が価格を決めているからである。つまり、**価格決定を数学的アプローチで自動化**すれば解決できるという仮説をBancorは立てた。しかし、その説明をする前にもう一つBancorの重要な特色を説明しなければならない。それは、Bancorで発行されたトークンは必ず価値を裏付けをするReserve Token（準備金）が必要だということである。
##Reserve Tokenとは？
例えると昔の金本位制を思い出してほしい。中央銀行が紙幣を発行する際は、発行した紙幣と同額の金を保管していつでも紙幣と金の兌換を保証しなければならなかった。そうすることでただの紙切れに価値を持たせることができたのである。Reserve Tokenとは、いうなれば金本位制の金の役割を持ったトークンである。ある団体AがトークンAを発行する際は、ゼロから価値を生み出すのではなく、必ず[ERC20トークン](https://theethereum.wiki/w/index.php/ERC20_Token_Standard)かEtherを担保にトークンAを発行しなければならない。（ただ、Ether自体は手数料・マイニング収入とPoW作業の電気代の差をEtherの価値の源泉にしているので、BancorのトークンはEther本位制というよりは、間接的に、PoWコスト本位制という方が近い。）こうすることで新規発行されるトークンの価値を保証することとトークン発行団体（先の例だと団体A）の資金調達を同時に行うことができる。

# Bancorの革新的な価格決定アプローチ: Smart Token
　Smart Token（スマートトークン）とは先の例だとBancorプロトコルを使うトークンAのことで、**Reserve Tokenと兌換が保証されているトークン**である。先週の記録的なICOもBancorの団体「Bprotocol Foundation」がEtherをReserve Tokenとして集めてBancor Network Token（BNT）をSmart Tokenとして発行するためのものだった。（横文字多様で申し訳ないです）

##価格決定方程式
　その価格決定方法である。Bancorの白書によると、Smart Tokenの価格決定は以下のような方程式で表される。

```math:
価格決定方程式：Price = \frac{Balance}{Supply*CRR}
```
ここでいう、BalanceはReserve Tokenの保有量（金本位制でいう中央銀行の金の保有量）。SupplyはSmart Tokenの供給量（紙幣の発行数）、CRRはConstant Reserve Ratio（固定準備率）といってICOの際に集めたReserve Tokenのうち何パーセントを準備金として保有しておくかの割合であり、発行者が最初に決める数値である。

##取引の具体例
　具体例を使って説明する。
　
　団体Bは新規トークンBNTを発行するにあたり**30万ETHを集めた**とする。レートは**1BNT=1ETH**と設定して同時に**30万BNT**を発行する。そして、30万ETHのうち24万ETHは団体Bのプロジェクト投資に使われることにし、残った**6万ETHをReserveとして保有**することにする。この場合**CRRは20%**である。
この場合の価格決定方程式の様子を見てみると、
>Balance = 60,000[ETH]、Supply = 300,000[BNT]、CRR = 0.2

```math:
Price[ETH/BNT] = \frac{60,000}{300,000 * 0.2} =1.0[ETH/BNT]
```
 ...となり、価格が正しく計算されていることが分かる。

###取引① - スマートトークンの購入
**ここで一番乗りの取引としてある人が300ETHを使ってBNTを購入したとする。**
>Reserve TokenでSmart Tokenを買いたい場合。（ETH -> BNTの変換）
以下の関数で獲得するSmart Tokenの量'T'を決定する。

```math:
T = S((1+\frac{E}{R})^F-1)
```
>S = Smart Tokenの供給量、E = 使われるReserve Token、R = Reserve Tokenの保有量、F = CRR

今回の取引の例だと、S = 300,000、E = 300、R = 60,000。

```math:
T = 300,000*((1+\frac{300}{60,000})^{0.2}-1) = 299.401793724[BNT]
```
300ETHの変換で約299.4BNTが手に入ることとなる。おそらくここで疑問が湧くと思われる。レートが1BNT=1ETHだったはずなのにどうしてピッタリ300BNTをもらわずによくわからない関数を通して挙げ句の果てに少ない額（約0.6BNT足りない）に変換されるのかと。
　理由は価格決定の仕組みにある。Bancorの価格決定は自動的に行われており、取引のサイズを関数の引数にとっている。つまり、今回は300ETHの変換だったので300ETHの変換の最中のΔE[ETH]分の価格変動も考慮に入れると、ちみちみとしたΔE[ETH]分の変換のたびにレートが変わっており、ΔT分のBNTの購入ごとにBNT高にレートが動いているため、最終的に手に入るBNTの量はやや少なめになる。ETH->BNTの変換なら、BNTが購入されるのでBNT高に進むように、BNT->ETHの兌換なら、BNTが売却されるのでBNT安に進むように、また、それによってCRR（固定準備率）が一定に保持されるように、価格が絶妙に遷移していくよう計算式はつくられ、またその数式の正当性は[証明](https://drive.google.com/file/d/0B3HPNP-GDn7aRkVaV3dkVl9NS2M/view)されている。
　今回の取引を図に表すと
![figure_1'.png](https://qiita-image-store.s3.amazonaws.com/0/187795/a475c29d-c4f4-de12-d3b4-5fb6406a4722.png)
となる。この図の見方だが、棒自体は取引を表しており、棒の横幅がBNT供給量の変動（緑棒なら増加、赤なら減少）、棒の高さは取引の実質レート、折れ線の始点は取引直前のレート、終点は取引直後のレート、折れ線は取引中の価格の移り変わりを表す。また、棒の面積はBalance（ETH保有量）の増加量（緑）か減少量（赤）を表す。
　今回の300BNTの購入によってレートがどう変化したかを上記の価格決定方程式を使って計算してみよう。

```math:
New Price = \frac{60,300}{300299.401794*0.2} = 1.00399800399 [ETH/BNT]
```
Reserve保有量はBNT購入に使った300ETH分が増えて60,300ETHに、BNT発行量は先ほど計算した'T'分が**新規発行**されて約300299.4[BNT]となり、固定値であるCRR=0.2で計算されると、取引後 1BNT = 約1.004[ETH]　となりBNT高になったと分かる。上記の図でも折れ線の終点が1.004に位置していることが確認できる。

###取引② - スマートトークンの購入
**では、この取引に続けてまた別の誰かがBNTの購入（ETH->BNTの変換）を700ETHで行うとする。**
Tを求める関数をまた使う。パラメータが前回の取引後の値になっていることに注意する。
R = 60,300[ETH]、S = 300299.401794[BNT]、E = 700[ETH]、CRRは変動しないのでそのまま0.2。
これらを当てはめて求まる、T = 693.997438221[BNT]となる。

Reserve保有量、BNT供給を更新して価格決定方程式を使うと、

```math:
New Price = \frac{61,000}{300993.399232*0.2} = 1.01331125792 [ETH/BNT]
```
となり、２つの取引を続けて図に表示すると...
![figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/187795/365103c5-fbfe-33c0-0281-51879209b17d.png)
となる。だいぶBNT高が進んだようだ。
さて、そろそろBNT安にしてみよう。

###取引③ - スマートトークンの売却
**誰かが1302BNTをETHに兌換する取引を要求する。**
>Smart TokenでReserve Tokenを買いたい場合。（BNT -> ETHの兌換）
以下の関数で獲得するReserve Tokenの量'E'を決定する。

```math:
E = R(1-\sqrt[F]{1-\frac{T}{S}} )
```
>R = Reserve Tokenの保有量、S = Smart Tokenの供給量、T = 使われるSmart Token量、F = CRR

　今回の取引では、
　R = 61,000、T = 1,302、S = 300933.399232、F = 0.2。
　代入して計算すると獲得するETHの量、T = 1307.96652459  [ETH]　となる。
　図示すると、
![figure_3.png](https://qiita-image-store.s3.amazonaws.com/0/187795/22b45373-7a82-b8ca-d904-da91b7a50cee.png)
となり、レートがだいぶBNT安に進んで、ICO時のレートを下回る結果になった。
数字を求めると、Reserve保有量 = 59692.0334754[ETH]、BNT供給 = 299691.399232[BNT]となり価格決定方程式に代入すると、この取引後のレート（図の折れ線の終点）は、0.995891667702[ETH/BNT]と求まる。

###取引④ - スマートトークンの購入
**では、最後にもう一度ETHでBNTを購入する。支払う（Reserveに追加する）量は100ETHとする。**
　*気づいたかもしれないが、取引相手は必要ないので取引がその時計算された価格で必ず成立するのが、このBancorの新規性である。*

さて、この取引の結果レートはどう変化するか？一度、試しに計算してみるといい。

それでは簡単に解説。
今回は、ETH->BNT　の変換なので、使う関数はT=...のやつになる。
これに、S=299691.399232、E=100、R=59692.0334754、F=0.2を代入すると、T = 100.345308532[BNT]という結果がでる。
そして、このTを現在のBNT供給に加えてSの値を更新し、（S:=S+T）
また、Reserve保有量も支払い分のE=100ETHを加えてRも更新し、（R:=R+E）
価格決定方程式に代入。

```math:
P = \frac{R}{S*F} = \frac{59792.0334754}{299791.74454 * 0.2} = 0.997226150558 [ETH/BNT]
```
でした。感覚は掴めただろうか？
###最終的な価格変動
ちなみに、今までの４つの取引の図はこうなる。
![figure_4.png](https://qiita-image-store.s3.amazonaws.com/0/187795/3e6148a6-220e-7b56-3658-5e6ade3d571b.png)

また、今回の例はBancorの[Whitepaper](https://bancor.network/static/Bancor_Protocol_Whitepaper_en.pdf)、P.9　Example #1から抜粋した。

　Whitepaperでは、Example #2としてReserve Tokenを二つもつSmart Tokenの例も見ることができる。この例では、GNO（Gnosis）とBNTをReserveとして保有し、BNTGNOというSmart Tokenを発行した状況を説明している。この結果、BNTGNOを使えば、GNOとBNTといった二つのトークンを上記価格決定方程式に支配された取引所で交換ができるというわけだ。Bancorではこのような複数のトークンの取引の媒介の働きをするSmart Tokenのことを特に**Token Changer**と呼ぶ。

　このように、Reserveを集めさえすれば、トークンの取引所を作ることも可能である。また、価格決定の仕組みが外部の取引所PoloniexやZaifと違うため、価格がずれていくのも予想されるが、その差を使って利益を得ようとする鞘取引によってToken Changerによる取引所は常に外部の影響を受けながらレートは平衡を保たれる。

　また、Example #2ではBNTをReserveとして利用していると言ったが、どこかのSmart Tokenは別のところのReserve Tokenとなりうる。その共通のトークンをReserveとしてつながりを持たせることで、トークン同士のネットワーク（network of tokens）を形作っていくとBancorは主張している。その共通トークン（network token）の値上がりは関係するノードのSmart Tokenの価値も上げることになり、また、どこかのノードのSmart Tokenの価格上昇はそのReserve Tokenの価格を押し上げ、ネットワーク全体で共通利益を享受できる。ここらへんはWhitepaperで詳しく記載されているので[そちら](https://bancor.network/static/Bancor_Protocol_Whitepaper_en.pdf)から見てほしい。

#最後に
　この記事を書いている時点（6/20, 2017）では、まだBancorはICOが幕を閉じたばかりで、Alphaバージョンのテストネットが用意されているだけであり、この革新的なアイデアが実世界の中でどう生きていくのかまだ不確定である。去年のThe DAOの様に出発前騒がれた後、出発後にトラブルや不具合に見舞われて最終的にEthereumを分断させるような、最悪の自体を引き起こす可能性だってあるのだ。
　また、最悪の事態を引き起こさなくても、Bancor自体が思ったより普及せずに中途半端なまま期待はずれの結果となり、今回の記録的な資金調達に一役買った投資者たちをガッカリさせるような結果になることもあり得る。特に、誰でもトークンを作れるため、ネットワークのどこかで無法地帯のような箇所も現れるかもしれない。（最近のメルカリの出品を見ても分かる。）
　リスクなしに革新は生まれないと言われればそれまでだが、我々としては雰囲気に流されてバブルに乗るのではなく、しかと目で見極めた道を靴底に確かな地を感じて、この仮想通貨という新天地を開拓していく心がけは必要である。この記事がそんな方々の役に立てたらとても喜ばしいことである。まだ、この先に何が待っているかは分からないが、このBancorは今後注目に値するものとなってくことは間違いない。



*記事に間違い等ありましたら、下のコメント欄でご報告をお願い致します。また、英語にはなってしまいますが[こちら](https://sites.google.com/site/kingernote/home)で今回の図に関して詳しく説明しております。*

*図の生成にあたりPythonのmatploylibを使用し、プログラムを書きました。ソースコードはGitHubの[こちら](https://github.com/siCpSATO/Crypto/blob/master/bancor2.py)からご覧になれます。*