従来のブロックチェーンでは、ブロックの伝播はピアツーピア ネットワークを通じて行われ、新しいブロックとトランザクションが伝播中のすべてのノードにブロードキャストされます。このプロセスは通常、順次実行されるか、フラッディングされます。ただし、この方法はスケーラブルではありません。通信の数が非常に多いため、ネットワークが拡大するにつれて管理が難しくなるためです。
35,000 のバリデーターのネットワークを考えてみましょう。リーダーは 128 MB のブロック (トランザクションあたり 250 バイトで約 500,000 トランザクション) を 35,000 のバリデーターすべてに送信する必要があります。従来のブロック伝播実装では、リーダーは各バリデーターに固有の接続を持ち、128 MB 全体を 35,000 回送信する必要があります。その結果、合計データ送信量は 4.69 TB になりますが、これは一般的な帯域幅能力をはるかに超えており、これほど多くの接続に対応するのは不可能です。
ブロックの配布が遅いという問題を解決するために、Solana は Turbine を導入しました。これは、クラスターが元帳エントリをすべてのノードにブロードキャストするために使用する多層ブロック伝播メカニズムです。大まかに言えば、Turbine はブロックを小さなブロックに分割し、一連のノードに配布することで、個々のノードの負荷を軽減します。
タービンとは何ですか?
Turbine のアーキテクチャは、BitTorrent に大きく影響を受けています。どちらもデータ チャンク (大きなデータを小さな断片に分割する) に依存し、ピアツーピア ネットワークを利用してデータを配信します。Turbine はストリーミングに最適化されています。UDP のみを使用してデータを送信し、レイテンシの利点を提供します。リーダー (ブロック プロデューサー) がデータをストリーミングするときに、ネットワークを介してパケットごとにランダム パスを実装します。この高速なブロック伝播により、Solana は高いスループットを維持できます。
さらに、Turbine はデータの可用性の問題にも対処し、すべてのノードがトランザクションを効率的に検証するために必要なデータにアクセスできるようにします。これは、他のブロックチェーン ネットワークで一般的なボトルネックである膨大な帯域幅を必要とせずに実現されます。
タービンのブロック伝播プロセス
ブロックが伝播される前に、リーダーはトランザクションの着信ストリームに基づいてブロックを構築し、順序付けます。ブロックが構築されると、Turbine を介してネットワークの残りの部分に送信する準備が整います。このプロセスはブロック伝播と呼ばれます。その後、メッセージがバリデータ間で渡され、これらのメッセージはブロック データ内にカプセル化され、コミットメント ステータス「確認済み」または「確定済み」のいずれかを満たします。
リーダーがブロック全体を構築して提案する一方で、実際のデータはシュレッド(部分ブロック)としてネットワーク内の他のバリデーターに送信されます。シュレッドはバリデーター間で送信される原子単位です。このシュレッドと伝播のプロセスにより、Solana 全体でブロック データが迅速かつ効率的に分散され、高いスループットとネットワーク セキュリティが維持されます。
注: 確認済みブロックは元帳投票の過半数を獲得していますが、確定ブロックは確認済みであり、ターゲット ブロックの上に 31 以上の確認済みブロックが構築されています。
消失訂正符号
シュレッドは、タービン ツリーに送信される前に、特定の種類のエラー訂正コードを使用するデータ保護方法であるリード ソロモン消失訂正符号でエンコードされます。この方法は、障害やエラーが発生した場合にデータ損失を防ぐように設計されています。データを小さなブロックに分割し、各ブロックを追加情報でエンコードします。
Turbine は、誤ったデータや不完全なデータを再ブロードキャストする可能性のあるバリデータ間のパケットの再送信に大きく依存しています。再送信により、ネットワーク全体のパケット損失が増大し、ホップごとにパケットが宛先に到達できない可能性が高まります。たとえば、リーダーがブロックのパケットの 20% を消去コードとして送信する場合、ネットワークはブロックを失うことなくパケットの 20% をドロップできます。リーダーは、最近観測されたネットワーク全体のパケット損失やツリーの深さなどの変数を考慮して、ネットワークの状態に基づいてこの数値 (FEC レート) を動的に調整できます。
Solana では、データ シュレッドはリーダーによって構築された元のブロックの部分ブロックであり、リカバリ シュレッドはリード ソロモンによって生成された消失訂正符号化ブロックです。Solana のブロックは通常、32:32 の FEC を活用します (64 パケットのうち 32 パケットが失われても再送信の必要はありません)。
タービンツリー
Solana は、構造化されたネットワーク トポロジである Turbine Tree を使用して、バリデーター間でのシュレッドの効率的な伝播を促進します。シュレッドがそれぞれのシュレッド グループに適切にエンコードされると、Turbine Tree を通じて配布され、ネットワーク内の他のバリデーターに最新の状態が通知される準備が整います。
タービン ツリーは全員に知られているため、各バリデーターは、そのシュレッドを中継する責任がある場所を正確に把握できます。タービン ツリーは、現在の DATA_PLANE_FANOUT 値が 200 の場合、通常は 2 ホップまたは 3 ホップのツリーです (アクティブなバリデーターの数によって異なります)。
さらに、ノードは、十分なシュレッドを受信しない場合、または損失率が FEC 率を超える場合、ゴシップと修復に頼ることができます。現在の実装では、ブロックを再構築するのに十分なシュレッドが不足しているノードは、リーダーに再送信の要求を送信します。決定論的な Turbine では、完全なブロックを受信したノードは、要求元のノードに必要な修復シュレッドを送信できるため、データを要求しているツリーの領域までデータ送信をさらにプッシュできます。
結論
このレポートでは、大きなブロックを小さな断片に分割して、ネットワーク全体にデータを効率的に分散する Solana の Turbine ブロック伝播メカニズムについて検証しました。消失訂正符号によってデータの整合性が確保される仕組みと、Turbine Tree によってバリデータ間の迅速な転送が促進される仕組みについて説明しました。