みんなでブロックチェーン資料を読もう!~IOTA編~

前回のBigchainDBに引き続き、1/18、2/1に2回に渡って実施したEXE Whitepaperの模様をレポートします。今回テーマとなったのは、ブロックチェーンじゃない暗号通貨「IOTA」です。このホワイトペーパーは知る人ぞ知る難解なもので、例えば、

みたいな数式がごろごろ出てきます。私は過去に2回読破を試みましたが、全然駄目でした(笑)。そんな難解なホワイトペーパーも「みんなで読めば怖くない!」という事で開催しました。皆で知恵を出し合った結果、数式はさておきホワイトペーパーが何を言わんとしているかだいたい理解できるようになりました。その内容を報告出来ればと思います。

IOTAとは?概要説明

ホワイトペーパーについてお話しする前に、IOTAの概要を簡単に説明します。IOTAは2016年7月にローンチされた暗号通貨で、「送金手数料がかからない」「スケーラビリティがある(取引性能に限界が無い)」という既存の暗号通貨には無かった特徴を持っています。これらの特徴は、IoT機器間でマイクロペイメントを行なう際に大変都合が良いため、非常に注目を集めています。これを可能にしているのが、Tangleという構造で有向非巡回グラフ(DAG)をベースにしたものになっています。Bitcoinについて知っている方は下記の比較を見るとなんとなく理解がしやすいかと思います。

IOTAのホワイトペーパーについて

IOTAのホワイトペーパーはこちらから確認する事が出来ます。また、solaさんという方が日本語に訳しているので、こちらも確認してもらえればと思います。ホワイトペーパーのタイトル「The Tangle」が示す通り、Tangleという構造がいかに二重支払いを防ぐかを証明した、まさに論文形式の内容になっています。

そのため、頑張ってホワイトペーパーを読んだとしても、それによってIOTAを全て理解したことにはならないので注意が必要です。例えば、IOTAの構成要素として、Full NodeとLight Walletがあり、複数のFull NodeでTangle構造のデータの同期を取り、エンドユーザーやIoT機器はLight Walletで取引を行なうといった話がありますが、ホワイトペーパーには、Full Nodeという意味合いの「ノード」としか出て来ないです。

こうした技術的な解説に関しては、Qiita記事などを検索すると出てくるのでご参考ください。また、Discord上にユーザーコミュニティが立ち上がっているので、分からない点があれば、下記URLを参考に参加してみてください。

https://iotafan.jp/community/how_to_join-20170905/

ホワイトペーパーは、全5章からなっており、4章が難解な内容になっていますが、特に重要なのも4章になります。さっそく、各章ごとに解説したいと思います。

  1. システムの紹介と説明
  2. 荷重等
  3. システムの安定性とカット集合
    1. 通常どれくらい早く累積荷重が成長するか
  4. 起こりうる攻撃シナリオ
    1. パラサイトチェーン攻撃と新しいチップ選択アルゴリズム
    2. 分裂攻撃
  5. 量子計算への耐性

1章:システムの紹介と説明 / IOTAとは

1章は、IOTA(Tangle)の基本的な構造について説明しています。IOTA上でトランザクション(支払取引等)を発行する人は、過去に発行されたトランザクションを2つ承認するルールがあり、これによりトランザクション同士が下記のように1かたまりのネットワークを形成します。

例えば「F」のトランザクションに注目すると、「B」「D」「E」によって直接承認を受けています。また、「A」「C」も「F」のトランザクションを間接的に承認していると言えます。

この考え方が以降重要になってきます。ちなみに、Tangle構造では、全てのトランザクションから直接的・間接的に承認を受けている最初のトランザクションが存在し、これをジェネシストランザクションと呼びます。

2章:荷重等 / IOTAとは

2章では、荷重という考え方が登場します。荷重とは、ノードがトランザクションに投資した仕事量に応じて決まる3の累乗値のようですが、現状の実態としては一律「1」として扱われるようです。ホワイトペーパーでも、「3章以降は一律「1」で考えて」と書かれています。ちなみに「何故3の累乗値なのか?」と会の中で質問が出ましたが、はっきりとした答えは出ませんでした。ご存知の方教えてください!

さて、2章では荷重以外にもいくつか定義が登場します。下図を見つつ読み進めて下さい。

累積荷重 自身の荷重と直接的・間接的に承認されたトランザクションの荷重の合計。例えば、「F」の累積荷重は10(A+B+C+D+E+F)になります。
高さ ジェネシストランザクションまでの最長パスの長さ。例えば、「F」の高さは2(F→G→Genesis)になります。
深さ 未承認トランザクションまでの最長パスの長さ。例えば、「F」の深さは2(C→E→F等)になります。
スコア 自身の荷重と直接・間接的に承認したトランザクションの荷重の合計。例えば、「A」のスコアは9(A+B+D+F+G)になります。

Tangleのネットワークを安定的に維持していくためには、承認済のトランザクションではなく、なるべく未承認のトランザクションを承認していく必要があります。二重支払いの可能性がある未承認トランザクションをどのように選択するかを、これらの値とアルゴリズムを駆使して見分けているようです。ただ、以降の章では累積荷重しかメインで出てこないので、まずは累積荷重だけ意識すれば良いと思います。

3章:システムの安定性とカット集合 / IOTAとは

3章から数式が色々出てきて、理解が難しくなります。言わんとしている事は、Tangleの構造において、未承認のトランザクションがどんどん増加していつまで経っても承認されないようなシステムの欠陥が無い事を数式で証明したという事です。証明では、チップが少なく頻繁に1個になる低負荷状態とチップが多い高負荷状態の2つのパターンに分けて導いています。

まず、低負荷状態において、トランザクションが生成される速度をλとすると、チップが承認を受けるまでの時間は、1/λ となります。あまりピンと来ないのでグラフに書き出してみました。

例えば、λが「1」の場合で考えてみます。ある時点tから1秒経つと、λ=1なのでチップが1個増加します。もう1秒経つと、チップが2個になりますが、チップが承認を受けるまでの時間も上記の式( 1/λ )から1なので、1個目のチップが承認され、チップは1個となります。もう1秒経っても同じく、2個目のチップが承認されるので、チップは再び1個となります。これを繰り返すと、常にチップの数は1個となり、無限に発散しない(=承認されないチップが増加していかない)のでシステムは安定と証明されます。

次に高負荷状態の場合です。こちらは、初期のチップの数をL0とすると、チップが承認を受けるまでの時間は、L0/2λ となります。これをグラフに書き出すと下記になります。

例えば、λが「1」の場合、時間が進む毎にチップ数は1個ずつ増加していきます。上式により、チップが承認を受ける時間は30なので、t+30の時点で、累計チップ生成数は30個、承認チップ数が1個となるので、差し引き29個となります。以降も同様に29個が続いていきます。つまり、これも無限に発散しない(=承認されないチップが増加していかない)のでシステムは安定と証明されます。

通常どれくらい早く累積荷重が成長するか?

累積荷重がどのように増えていくかを数式で導いています。ここが、数式のオンパレードなので詳しくは理解出来ませんでしたが、参加者の皆さんとディスカッションを経たことで、なんとなく数式が言わんとしている事は分かりました。こちらも低負荷状態と高負荷状態でそれぞれ説明しています。

低負荷状態の場合、累積荷重はλと同じように増加していきます。下図を見て下さい。

例えば、λ=2を考えた場合、時点t+1において赤の累積荷重は2増加して3になります。時点t+2でも、さらに2増加して赤の累積荷重は5になります。なので、低負荷状態の累積荷重の増加スピードはλと同じになります。

高負荷状態の場合は、もう少し複雑です。

例えば、λ=10,000の場合、時点t+1において赤の累積荷重は概ね2増加して3になります。(全ての黃トランザクションが1個の赤のトランザクションを承認する事も考えられますが、確率的にはほとんど無く、平均的には2つのトランザクションの承認を受ける)時点t+2では、2つの黄トランザクションがそれぞれ別の2つの緑トランザクションの承認を受けられたら、倍の4増加して7になります。(実際には、同じトランザクションが承認する場合もあるので、これよりもゆるやかに増加していく)これを繰り返すと、時点t+14のところで、生成したトランザクションが、赤のトランザクションを全て間接承認することになるので、以降は10,000ずつ累積荷重が増加していきます。それを示したのが、ホワイトペーパーで書かれている下記の図です。

4章:起こりうる攻撃シナリオ / IOTAとは

4章では、悪意を持った攻撃者が行なうであろう攻撃方法と対抗策を示しています。ホワイトペーパーではちゃんと書かれていませんが、「ノード」は大きく3種類存在します。

①誠実なノード IRI(IOTA Reference Implementation)と呼ばれるソフトウェアを使って実行されるノード。コミュニティで合意の取れた統一プロトコルのみ(MCMC戦略等)を使用している。
②攻撃者 誠実なノードを出し抜いて二重支払いを達成しようとしているノード。(パラサイトチェーン攻撃、分裂攻撃等)
③怠惰なノード プロトコルやTangleのアップデートの対応をサボるノード。

4章では、大きく2つの攻撃パターンについて書かれています。1つ目が、膨大な計算能力で二重支払いのトランザクションそのものの荷重を大きくするやり方です。

この攻撃方法の対策は簡単で、累積荷重を一律「1」にすれば良いです。そんなので良いのかなとは思います(笑)

2つ目の攻撃方法が、膨大な計算能力で二重支払いのトランザクションを承認するトランザクションを大量に発行するやり方です。

この攻撃への対策ですが、なんとありません!つまり、誠実なノードの全生成能力よりも攻撃者の生成能力が上回ればTangleのネットワークは破綻します。これはBitcoinにも言える話ですね。

IOTAへのパラサイトチェーン攻撃と新しいチップ選択アルゴリズム

攻撃者ノードが膨大な計算能力を持てば、二重支払い出来てしまうわけですが、これには相当な資金も必要になるので、あまり現実的では無いです。ところが、パラサイトチェーン攻撃と呼ばれる攻撃は、少ない計算能力でも二重支払いが出来ると言われています。

これは、誠実なノードが承認すべきチップの選択をランダムにやっているために発生する問題になります。この対策として考案されたのがマルコフ連鎖モンテカルロ法(MCMC)を適用したチップ選択戦略です。詳細は省きますが、累積荷重の大きいメインのTangle側のチップを選択しやすくなり、パラサイトチェーン攻撃を防いでいます。

IOTAへの分裂攻撃

「累積荷重の大きいTangleが選ばれるなら、Tangleを2つに分裂させれば良いのでは?」という事で考えられたのが分裂攻撃です。なんとなく分かるかもですが、少ない計算能力でTangleを分裂させるのは至難のようなので、発生頻度は少ない攻撃となります。こちらの対策としては、MCMCを実施する際、より深い位置から行えば、累積荷重の差が開いて、どちらかのトランザクションに集中するので二重支払は成立しなくなります。このあたりはそもそもMCMCがどういうものかを理解すると分かるみたいです(私は分かりません!!)

5章:量子計算への耐性 / IOTAとは

この章はEXE Whitepaperの中では時間切れで出来ませんでした。メインは4章までで、こちらは補足的な意味合いだと思っています。書いている内容としては、

  1. Bitcoinのブロック生成は、現在2^68回のハッシュをチェックする必要がある。量子コンピュータは古典コンピュータの√N回で済むようなので、約170億(2^34)倍も効率が良い。つまり、量子コンピュータが実用化されればBitcoinはジ・エンド。
  2. IOTAはPoW計算に上限(3^8)を設けており、ナンス値を見つけるタスクが膨大にならないようになっている。そのため、敵対者が量子コンピュータを利用したとしてもBitcoinより恩恵が無い

ホワイトペーパーには触れていませんが、使用される電子署名もWinternitz署名という量子計算対策を施した署名を使っており、量子計算への耐性というのは他には少ないIOTAの特徴となっています。

まとめ / IOTAとは

いかがでしたでしょうか。皆さんのIOTAへの理解の足しになれば幸いです。Slideshare版もあるので、こちらも流し読みして頂ければと思います。

今回のEXE Whitepaperでは、IOTAにかなり精通しているtawagaoさんにご助言いただき、大変助かりました。この場を借りて御礼を申し上げます。今後のEXE Whitepaperでも、ホワイトペーパーのテーマに詳しい方をお呼びして、皆さん一体となって難解なホワイトペーパーを理解し、ブロックチェーンに関連した開発やビジネスに底上げとなればと思っています。今後もEXE Whitepaperに注目してください!!

おすすめの記事