こんにちは、珍獣です。

今年は RubyKaigi に行って来ました!

突然ですが、Bancor というプロトコルをご存知でしょうか?

RubyKaigi 1日目に bancor: Token economy made with Ruby というセッションがあったので、聴講させていただきました!

端的にいうと、Bancorプロトコルめっちゃすごいんです。

今回は、そのBancorプロトコルがどんなものなのか簡単に解説するのと、セッションで紹介していたgemの中身を少しだけのぞいてみます。

それではどうぞ!

Bancor プロトコルとは?

Bancor は、「バンコール」と読み、市場での価値の流動性を高めるための規約です。

この説明だとよくわからないと思うので、もう少し具体的に説明します。

普通は売りたいときに売れない

既に存在する仮想通貨の仕組みを使うことで、発行する気になれば簡単に自分独自のトークンの発行をすることが可能です。
市場にも、超マイナーなトークンがわんさかありますが、大抵マイナーなトークンは「欲しいひとが超少ない」というジレンマがあります。

いわゆる、「板が薄い」ってやつですね。マイナーなだけに、売り買いされず、流動性が低い。

そうすると、何が困るかと言うと 売りたいときに売れない んです。
例えばの話、もう手放そうかなーと思っても、こっちは ¥105/枚 で売りたいけれど、買い手は ¥95/枚 で買いたいという。

この価格差がなくなり、買い手と売り手の価格が一致するまで、トレードが止まってしまうんですよね。

これを解決するのが Bancorプロトコル です。

Bancorなら売りたいときに売れる!

Bancorプロトコルのポイントは大きく 2 つあります。

1. トークンの価格は数式により自動決定される
2. 準備金(reserved_token)を準備する

あらかじめ、準備金を準備しておくことで、買い手や売り手がいなくてもトレードできるんです。

これ、すごくないですか? 買い手や売り手がいなくてもトレードできるんです。 (大事なことなので2回言いました)

トークン価格を決める式は非常に単純で、以下になります。

$$\large{トークン価格 = \frac{準備金残高}{トークン総発行量 * 固定準備率}}$$

English: $$\large{Price = \frac{Supply}{Balance * CRR}}$$

例えば、Bancorプロトコルに準じた新しい通過「ABC」を発行するとしましょう。元手は 100ETH。

はじめに決めるのは、固定準備率だけです。あとは基本的に自動で決まります。
固定準備率は、発行時に決めるもので固定値です。後から変えることはできません。

whitepaper のグラフを見ると、10% にしておくことで、発行枚数が多くなると1枚あたりの価格も伸びていきそうです。(CW と CRR は同じ意味です)

引用: whitepaper

試しに10%にしてみましょう。
定義から、トークン総発行量に対して10%の準備金が必要になるので、価格を決める式に当てはめて確認してみると、

$$\large{トークン価格 = \frac{0.1x}{x * 0.1}} = 1$$

となります。

※ ここ、単に僕が勘違いしているだけなのかもしれないのですが、Bancorプロトコルで発行した場合の初期価格の調整をどのようにするのか、ご存知の方いらっしゃいましたら、ぜひコメントください...!

実際にトレードが行われる際は、もう少し複雑な別の式で計算され、それが取引価格となるのですが、概念だけ簡単に説明しますね。

Bancor プロトコルの通過を買う場合

今回は100ETHから固定準備率を10%としたので、準備金は10ETHですね。

最初の価格は 1ETH/ABC なので、 1ETH を使って 1ABC を購入します。

(正確には、1ETHでは1ABCの購入はできないのですが、買えると仮定して話します)


引用: Bancor Protocol はトークンエコノミーを支える大発明となるか?

すると、支払ったETHは準備金として蓄積されます。全部で11ETHが準備金となりました。

固定準備率は10%で固定されるので、ABC発行量が調整されます。

11ETHが全体の10%になるように調整が入るので、Bancorプロトコルに則った通貨を購入すると、その通貨の総数が増えていくんです。

つまり、通貨の新規発行(鋳造) がなされます。

Bancor プロトコルの通過を売る場合

もうお分かりかと思いますが、売る場合は買う場合の逆になります。
同じく、100ETHから固定準備率を10%としたので、準備金は10ETHです。

はじめは発行者しかその通貨を持っていないのでアレですが、1ABC売ってみたとします。


引用: Bancor Protocol はトークンエコノミーを支える大発明となるか?

すると、準備金からすべて支払われます。準備金の残りは9ETHとなりました。

今度は9ETHが全体の10%になるように調整が入るので、通貨の総数が減ります。

つまり、通貨の焼却処分(Burn) がなされます。

準備金はなくならないか?

結論から言うと、全部売られない限り準備金はなくなりません

売りが多くなると1枚あたりの価格が安くなるだけですね。買い手がつかず一切売れないことはなくなります。

初めて聞いたとき、マジで天才かよと思いましたw

Bancor gem でやっていること

さて、最後になりますが本題です。

今回 RubyKaigi で公開している Bancor gem ですが、何やっているかというと、単なる計算シミュレーションです。

以下引用。

require "bancor/version"

module Bancor
  class Protocol
    attr_reader :total_supply, :reserved_token, :price, :transaction_price

    def initialize(eth:, rate:, crr:)
      @total_supply = eth * rate
      @reserved_token = @total_supply * crr
      @price = @reserved_token / (@total_supply * crr)
      @crr = crr
    end

    def issue_by_reserve_token(amount)
      smart_token_amount = @total_supply * (((1 + (amount / @reserved_token)) ** @crr) - 1)
      @reserved_token = @reserved_token + amount
      @total_supply = @total_supply + smart_token_amount
      @price = @reserved_token / (@total_supply * @crr)
      smart_token_amount
    end

    def destroy_by_reserve_token(amount)
      smart_token_amount = @reserved_token * (1 - ((1 - (amount / @total_supply)) ** (1/@crr)))
      @reserved_token = @reserved_token - smart_token_amount
      @total_supply = @total_supply - amount
      @price = @reserved_token / (@total_supply * @crr)
      smart_token_amount
    end

    def issue_by_smart_token(amount)
      transaction_price = @reserved_token * ((((amount / @total_supply) + 1) ** (1/@crr)) - 1)
      @total_supply = @total_supply + amount
      @reserved_token = @reserved_token + transaction_price
      @price = @reserved_token / (@total_supply * @crr)
      transaction_price
    end

    def destroy_by_smart_token(amount)
      transaction_price = @reserved_token * (1 - ((1 - (amount / @total_supply)) ** (1/@crr)))
      @total_supply = @total_supply - amount
      @reserved_token = @reserved_token - transaction_price
      @price = @reserved_token / (@total_supply * @crr)
      transaction_price
    end
  end
end

準備金と固定準備率(crr)さえ決めてしまえば、あとは自動的に決まるはずなので、多少修正できそうな雰囲気ですね。

実際にトレードする場合はrubyを使うことは残念ながらなさそうな気がしていますが、RubyKaigiでBancorを目にするとは思っていなかったので嬉しくて書いちゃいました。

Bancor についてもっと詳しく知りたい方は、mediumの

を読むと、仕組みがよくわかると思います。だいぶ参考にさせていただきました。

ではでは!珍獣でした!

おすすめの記事