Solanaを支える技術-Turbine編-
みなさんこんにちは。さーもんです。今回は、Solanaの超高速処理システムを支える8つの技術のうちの一つ、Turbine(タービン)について説明していきたいと思います。
毎度のことですが、私自身の理解だけで書いているので、もし違っていたら指摘していただけると嬉しいです。
また、この記事はSolanaの公式が出しているドキュメントをざっくり訳して、できるだけわかりやすく日本語で書き改めたものです。もし僕の説明に疑わしいところがあれば、原文を読んでみることをおすすめします。
Turbineが必要な理由
さて、前記事で書いた通り、Solanaは毎秒約60000トランザクションを処理することができる、仮想通貨の中でも抜きんでたスペックを持つシステムです。しかし、この処理速度を実現しようとすると、いくつか問題が出てきます。Turbineは、その中の「帯域幅」の問題を解決するものです。
帯域幅の問題とはどういうことかというと、簡単に言うと「一つのノードが短時間で送信することのできるデータ量には限界がある」ということです。
分散システムであるブロックチェーン上では通常、ノードは他のすべてのノードに情報を送信しなければなりません。台帳は常にすべてのノードで同じものを共有していなければならないからです。
しかし、このようなデータの転送の仕方はすこし非効率的です。
実際のケースで考えてみましょう。20000人のバリデータがいるシステムで、128MBのブロック(250バイトのトランザクションが500000個くらい)を生成したとします。
(ちなみに、現時点でのSolanaはここまでの規模には達していませんが、実際に様々な場面で利用されるようになった場合、この程度の負荷は予想されるものだと思います)
この時通常のブロックチェーンでは、ブロックを生成したバリデータは、自身が生成した128MBのブロックを20000人のバリデータ全員に送信しなければなりません。
......無理ですね。
128MBのブロックを20000人となれば、そのデータ量は2560000MB、256GBです。しかも、高速処理を行うSolanaならば、この送信は1秒かからないうちに完了できなければなりません。
それはいくらなんでも無理です。仮にできたとしても、とても高性能なサーバーが必要になり、バリデータとしての参加の敷居が高くなりすぎてしまうでしょう。
というわけでこのような技術的理由で、高速処理とブロックチェーンは相性が悪いんです。
それをSolanaがどう解決したかというと、、、ここで出てくるのが「Turbine」です。
Turbineとは
Turbineは、ブロックチェーン上のノードが大きすぎるデータを送らなくてもいいようにするための方法です。
Turbineを実装したSolanaでは、前述したような「全ノードに完全なデータをを送る」ことはしません。
代わりに、もともとの128MBのブロックを2000個ほどに分割し、そうして生成した64KBのパケット(2000個)をそれぞれ別のノードに送信します。つまり、ブロックの生成者が送るデータ量は、たったの128MBに抑えることができるのです。
しかし、この状態では一部のノードが、しかも不完全なデータしか受け取れていません。そこで、パケットを受け取ったノードは、自分が所属するグループ(Neighborhood、近所)にそのパケットを転送します。
さらに、このNeighborhoodはツリー上に連なっており、さらに下の階層にあるNeighborhoodにもパケットを転送していきます。
このようにデータ送信をリレーすることで、一つのノードが多数のノードにデータを送信する(→遅延の原因になる)ことを防ぐことができます。
しかしこれだけでは、各ノードは1つのパケットしか保持できていません。そこでさらに、同じ階層どうしや異なるツリーに属するNeighborhoodにもデータを転送していきます。こうすれば、最終的に各ノードが128MBの元のデータを保持できます。
この方法は、一つのNeighborhoodに属するノードを増やすとさらに効率的になります。例えば、ネットワーク全体で40000のノードがあって、ツリーの頂点にデータ送信者がいるとき、各Neighborhoodに200ノードずつ属していれば、1×200×200=40000で、3階層ですべてのノードに情報の転送が完了することになります。
セキュリティ
さて、Turbineについて仕組みを一通り見ていきましたが、このシステムには一つ不安要素があります。それはセキュリティです。
一般的な「1人のデータ送信者がすべてのノードに直接データを送る」形式であれば、元のデータ送信者が悪意ある者でない限り、すべてのノードが正しい情報を得ることができます。しかし、Turbineのようにデータをリレーしていく形式だと、ツリーのどこかに悪意ある者がいたとき、そのノードと関係のあるすべてのノードが偽の情報を受信してしまう、またはデータを受け取れない可能性が考えられます。悪意が入り込む余地が増えるのです。
この問題についての対応として、「リード・ソロモン消去コード(Reed-Solomon erasure codes)」というものがあります。これは、大元のデータ送信者が送信するパケットを特殊な方法で分割するものです。どう特殊かというと、分割後の合計データサイズが分割前よりも大きくなってしまう反面、この余計に増えた分(これを消去コードと呼びます)は、データ修復に使うことができます。そうすることで悪意あるノードが原因で全てを正しく受信できなくともある程度の欠落なら復元できるので、影響を軽減することができます。
また、「PoS(プルーフオブステーク)」の特性をうまく活用した仕様も組み込まれています。
ご存じの通り、PoSは「ステークしている(持っている)トークンが多い人ほど信頼できる」という考え方のアルゴリズムです。
これは「トークンを多く持っている人ほどネットワークに敵対しにくい」と言い換えることもできます。(トークンを大量に持っていれば、ネットワークに打撃を与えて自分のトークンの価値を下げるような行動はしないでおこうとするインセンティブが働く)
これを利用して、Solanaではステークしているトークンの量によって、バリデータに重み付けをします。トークンを多く保有する、信頼できるバリデータはツリーのより上位に配置されます。
上位にあるノードは、そこに悪意があった場合、下位のより多くのノードに影響を及ぼすからです。そんな重要なポジションは、信頼できる大型トークンホルダーで固めてしまおうということです。
ちなみに、この方法にも「特定の状況下では悪意あるノード自身が自分をツリーの上部に配置できる」という弱点があったりしますが、これについては「各パケットがもつデジタル署名を元にパケットごとに別々のツリーを生成する」という手法によって被害を最小化しています。
(このへん難しいので、興味があるなら原文を参照してください)
まとめ
このようにTurbineとは「ブロックを小分けにして送信し、それをノードどうしでリレーしていく形をとることでネットワークの高速化を実現する」技術です。
これがSolanaを支える8つのコアテクノロジーの一つです。
(難しいです。。。)
さらにほかの技術についての記事も書くかもしれません。それではまた。
リンク集
原文 https://medium.com/solana-labs/turbine-solanas-block-propagation-protocol-solves-the-scalability-trilemma-2ddba46a51db
日本語記事 https://coinchoice.net/8-innovation-of-solnaa-towerbft-turibne_202006/
この記事が気に入ったらサポートをしてみませんか?