カルダノはカルダノエコシステムの進化する要求を満たすことが可能な、完全に信頼できる分散ネットワークシステムに進化することをゴールとしています。完全に分散化され、安全なブロックチェーンプラットフォームを確立するカルダノの重要なマイルストーンの一つであるカルダノのDynamic P2Pデザインについて、詳しい記事がカルダノのEssentialCardanoサイトで公開されました。
カルダノのDynamic P2Pデザインのビジョンは、モジュラリティ、スケーラビリティ、セキュリティ、パフォーマンスを優先しています。
詳細は「Engineering dive into Cardano’s Dynamic P2P design」で読むことができます。
以下はEssentialCardanoに掲載された記事「Engineering dive into Cardano’s Dynamic P2P design」を翻訳したものです。
カルダノのDynamic P2Pデザインへのエンジニアリングダイブ by EssentialCardano
by Armando Santos 2023年6月28日
ロバストでスケーラブルなネットワークシステムの作成における課題、ソリューション、トライアンフの旅を体験してください
このブログ記事は元々 engineering blogに投稿されました。
カルダノエコシステムが成長し進化し続ける中、カルダノエコシステムへの貢献者は引き続きカルダノのネットワークインフラストラクチャを改良し最適化し続けることを約束しています。v.1.35.6のノードで提供されたDynamic peer-to-peer (P2P) networkingのリリースは、IOGのネットワーキングチーム、Well-Typed、PNSol、そしてCardano Foundationの協力によるものであり、高性能な成果物であり、完全に分散化され、安全なブロックチェーンプラットフォームを確立するカルダノの旅において重要なマイルストーンを表しています。
カルダノがリアルタイムの確率的システムとして機能することを考慮すると、その性能とセキュリティは本質的に相互に関連しています。ネットワーキングチームは、トポロジカルやトポグラフィカルな考慮事項を含む様々な要因の間で理想的なバランスを見つけ、タイムリーな接続性を向上させることに引き続き取り組んでいます。
このブログ記事では、カルダノのDynamic P2Pデザインの開発におけるエンジニアリングの旅を紹介します。コアデザイン原則について詳しく説明し、途中で遭遇した課題を強調し、ロバストでスケーラブルなネットワークシステムを確立するためにチームが考案したソリューションを明らかにします。
Dynamic P2Pとは?
Dynamic P2Pの実装は、ピア選択プロセスを通じてアクティブトポロジを連続的に動的に改善し、ネットワーク全体の拡散時間を短縮することを目的としています。研究結果によると、ローカル情報だけに基づくポリシーを利用することは、ほぼ最適なグローバルな結果をもたらすことができます。これは、ブロックヘッダーを提供する同期が時期尚早であるピアの時期尚早度と頻度を監視することによって達成されます。
主な目標は、強い接続性を維持しながら、非常に「非最適的な」ピアを排除することです。このメトリックに基づいてより役立たないと考えられるピアは、定期的に「脱落」し、ランダムに選択された代替品に置き換えられます。シミュレーション結果から、この最適化方法が比較的少数の反復でほぼ最適なグローバルな結果に収束することが示されています。
実際には、Dynamic P2Pはピア選択の手動設定(たとえば、topology updater toolを使用する)を置き換えます。
手動設定では、ステークプールオペレータ(SPO)は、最低20のアクティブな接続を一貫して維持するために多数のピア(たとえば50)と接続を確立する必要がありました。これは、設定されたピアの静的性質とSPOリレーの可用性の変動による必要性によるものでした。
しかし、Dynamic P2Pを使用すると、ノードは特定のアクティブピア接続数(たとえば20)を維持し、チェーン上のすべての登録されたSPOリレーから選択できます。ピアとの接続が失われた場合、ノードは自動的に代替ピアを選択し、望ましいターゲットに達するまで接続を継続的に試行します。
その結果、Dynamic P2Pは、接続の過剰供給を必要とせず、より効率的で適応性のあるネットワークソリューションを提供することにより、接続の過剰供給を必要とせず、より効率的かつ適応性のあるネットワークソリューションを提供します。
デザインビジョン
Cardanoは、自治ノードから構成される協同システムとして運営されています。クライアントサーバーモデルとして設計されておらず、中央の制御点や中央で管理される特権のあるサーバークラスもありません。ネットワークのトポロジーは、最初のバイロン開発段階では連合型として始まったかもしれませんが、最終的にはCardanoエコシステムの進化する要求を満たすことができる完全に信頼できる分散ネットワークシステムに進化することを目的としています。すべてが最適な接続性とパフォーマンスを保証されます。
ネットワークチームがこのエンジニアリングアドベンチャーに乗り出したとき、彼らはその途中で多くの課題や複雑さに直面することを十分に認識していました。しかし、彼らはこれらの課題に立ち向かい、最終的にDynamic P2Pシステムのデザインを形成するための基本的なアイデアを継続的に改善しました。
- モジュール性と拡張性: システムはモジュール性を考慮して設計されており、必要に応じて個々のコンポーネントを交換または改善することが容易です。この拡張性により、新しい機能や改善をシームレスに統合することができ、デザインがCardanoエコシステムの進化するニーズに適応することが保証されます。モジュール性は、低レベルの設計が高レベルの仕様に対して正しいことを証明するために形式手法が適用される場合に特に役立ちます。システムをより小さく、より管理しやすいコンポーネントに分解することにより、各モジュールに対してプロパティベースのテストをより効果的に適用することができ、各部分の動作がよく定義され、期待される特性に準拠することが保証されます。もちろん、Haskellを主要なプログラミング言語として採用したことは、このレベルのモジュール性と拡張性を実現するのに重要な役割を果たしました。
- スケーラビリティ: ネットワークが成長するにつれて、Ouroborosのタイミング制約に準拠しながら、より多数のノードとトランザクションを処理できるシステムが必要になります。P2Pデザインビジョンでこのスケーラビリティ要件に対処するために、チームはスケーラビリティのプロパティを最初から考慮に入れ、インテリジェントなピア選択などの戦略を組み込みました。
- セキュリティと弾力性: 分散型ネットワークでは、弾力性とセキュリティが最も重要です。目標は、内部および外部の混乱に耐えうるシステムを構築することです。このため、ネットワークチームは、乱用に対する強力なエラーハンドリングメカニズムを実装し、ユーザーが他のユーザーのためにネットワークリソースを使い果たす非対称なサービス拒否攻撃を通じてシステムを攻撃できないようにしました。P2Pアプローチにより、各ノードはローカルに設定されたピアに接続することを優先することができます。これにより、ノードは信頼できるピアに接続を維持し、ネットワークで進展することができます。インバウンド接続はレート制限され、設定可能なピアターゲットにより、ノードはリソース消費を調整することができます。また、接続状態の注意深い管理により、双方向接続を再利用することが可能になり、ファイアウォールの背後にあるノードが接続性を安全に向上させながら、攻撃面積を縮小することができます。
- パフォーマンス: 高性能なネットワークは、シームレスなユーザーエクスペリエンスを確保するために必要不可欠です。効率的なデータ伝送を実現するための技術、マルチプレキシングを通じた効率的なデータ伝送、パイプライニングをサポートするプロトコルの利用など、デザインの最適化に多大な努力が投入されました。また、インテリジェントなピア選択は、レイテンシを低減し、反応性と信頼性の高いネットワークを確保する上で重要な役割を果たしています。
Cardanoネットワーク内の効果的なコミュニケーションを確立するには、低レイテンシと良好な接続性を実現することが必要です。これらの重要な要件を満たすために、Dynamic P2Pは、エコシステムの持続的な成長のための堅牢でスケーラブルで弾力性のある基盤を確保するよう設計されました。ただし、ピアの信頼性は、安全で信頼できるネットワークを維持する上で重要な要素であることを認識することが重要です。信頼性の詳細については、このブログ投稿の範囲を超えますが、P2Pデザインには潜在的なリスクを緩和するための複数の対策が組み込まれていることに注意する価値があります。
Ouroborosのブロックリレーにおけるピア選択の分析
Ouroborosのパフォーマンスとセキュリティを確保することは重要であり、その重要な側面の1つは、ネットワーク全体のすべてのノードに新しいブロックをタイムリーにリレーすることです。理想的には、P2Pネットワーク内の接続は、ブロックをすべてのノードにリレーするために必要な時間を最小限に抑えるように組織されるべきです。
しかし、この目標を達成するには、信頼できない環境で適用可能な限られた事前作業しかないため、複雑な課題が発生します。効果的な解決策は、迅速な通信と分散ネットワークの完全性とセキュリティを維持するためのバランスを取ることができる革新的なソリューションの開発を必要とします。
問題の説明
パフォーマンスを最適化するための効果的なソリューションは、ブロックがネットワーク全体を横断するために必要な「ホップ」の数を最小限に抑えることです。グラフの用語で言えば、これはブロックが横断する平均エッジ数を減らすことを意味します。また、各ホップまたはエッジの長さが重要です。地域内のリンクは、大陸間リンクに比べてレイテンシが低いですが、一部の大陸間リンクはグローバルなブロックリレーに必要です。例えば、ヨーロッパからアジアへのルーティングなど、不適切なソリューションには過剰な大陸間リンクが含まれる場合があります。
既存のネットワーキングアルゴリズムは、ブロックリレーのパスとして機能する最適な「スパニングツリー」を生成できます。ただし、これらのアルゴリズムは、ノードが正確な情報を交換するために互いに信頼することを前提としているため、ノード同士が本来信頼できないブロックチェーンP2Pネットワークでは適切ではありません。
理想的なソリューションは、共有された信頼されたデータに依存せずに、ノードが個別に評価できる「ローカル」情報に依存する必要があります。それでも、完全なグローバル情報に依存する最適なソリューションを持つことは、価値ある参照点となる場合があります。
予備的調査
ネットワークチームは、分散システムとそのプロトコルに特化したアテネ大学のネットワーク研究者と協力して、重要なタスクを担当しました。異なるネットワークポリシーをシミュレーションし、拡散時間のトレードオフを研究することです。
拡散に関する重要な問題は、どのノードがブロックを相互に転送するかを決定することであり、より正確には、どの拡散リンクがノード間に確立され、拡散速度が向上するかを決定することです。
研究者と一緒に、この問題に取り組むために、2つの主要なアプローチを追求しました。
- 最初のアプローチは、リンクが拡散プロセスとは独立していると仮定します。事前に定義されたルールに従ってリンクが確立された静的オーバーレイをシミュレーションすることが含まれます。複数の拡散が実行され、パフォーマンスが測定されます。
- 2番目のアプローチは、オーバーレイを動的に調整することを含みます。このアプローチでは、ノードは最初にネットワーク内のランダムノードと接続を確立し、常に隣人のパフォーマンス統計を監視します。定期的に、各ノードはこれらの統計に基づいて隣人のセットを調整し、どの隣人を保持し、どの隣人を置き換えるかを決定します。
このプロットは、ブロックがネットワーク全体に迅速に拡散し、最終的にすべてのノードに到達することを示しています。この実験では、すべてのノードが完全に同じClose-Randomポリシーを使用します。例えば、C6R4は、ノードが6つの近接ピアと4つのランダムピアに接続することを意味します。最初は、すべてのノードは情報がなく、特定のブロックをまだ受信していません。ただし、実験のある時点で情報を取得します。点線は、理論的な最適解を表しており、すべての情報を持つ通知されたノードがどのピアが最適かを知っていると仮定して、そのような接続を可能にします(神の視点ポリシー)。
Close-Randomポリシーが直接実装されたわけではないことを明確にすることが重要です。代わりに、実用的な理論ツールとして使用されました。ローカル情報のみを使用して近似できるほどシンプルでありながら、非ローカル要因を組み入れるバランスをとっています。
この分析は、主にローカル情報を使用して理想的なソリューションにどの程度近づけるかを示しています。興味深いことに、このアプローチは期待を上回ることが可能であることがわかりました。完璧に近い結果を達成することは素晴らしいことでしたが、チームはそれを超えることができることを発見しました。
図2は、前述の2つのアプローチからの結果を比較しています。シミュレーションでは、各ノードが6つの近接ノード(往復時間(RTT)に基づく)と4つのランダムノードを維持します。これらのリンクは、実験全体を通じて静的に保持されます(したがって、一定の青い線があります)。 ‘2つのグループ(<=100msおよび>100ms)’ポリシーでは、各ノードは一定数の近接リンクとリモートリンクを維持します。 ‘近接’は、その近隣へのRTTが100ms以下であることを示し、 ‘リモート’は、RTTが100ms以上であることを示します。ノードはすべてのランダムリンクから始まり、定期的にキャリブレーションを行います。このキャリブレーションでは、RTTが100ms未満の近隣を維持し、残りの近隣の一部を新しく選択されたランダムノードで置き換えます。
この「2つのグループ」ポリシーは、スコアリングポリシーの動作を評価するための簡単で効果的な近似値として機能します。ただし、このポリシーは現在使用されていないことに注意することが価値があります。
図3は、以前に説明されたClose-Randomポリシーと異なるピアスコアポリシーからの結果の比較分析を示しています。この代替ポリシーは、他のノードよりも先に新しいブロックヘッダをノードに提供する頻度に基づいてピアを評価します。この実験設定では、ノードはランダムリンクから始まり、定期的にキャリブレーションを実施します。このキャリブレーション間隔中に、下位20%または40%のピアを新しく選択されたノードで置き換えます。
グラフの青い線は現在使用されているポリシーを表しており(詳細は次のセクションで説明されています)、緑の線は理論的な最適解を示しています。
このグラフを詳しく調べ、前のグラフと比較すると、異なるスコアリングポリシーの効果の主要な変化を特定できます。ただし、これらの変化は、各実験で適用される異なるパラメーターのために直接比較できないことに注意することが重要です。いくつかの実験では完全な拡散時間を測定し、他の実験では99パーセンタイルを考慮しています。これはやや低い値を表します。また、ノード間のレイテンシトレースは実験によって異なり、異なる結果をもたらします。
この文脈では、「20%」ポリシーの99パーセンタイルは、「2つのグループ」と比較して低い平衡を示しています。ただし、これは上記の理由により直接的な「アップルとアップル」の比較ではありません。
現在使用しているポリシーは、ピアを選択する際にRTT以外の要素も考慮しています。より堅牢で信頼性の高いアプローチを求める中で、ノードが新しいヘッダまたはブロックを最初に提示したピアを報酬とするアプローチを採用しました。このアプローチは、ピアの貢献度を正確に反映する本物の測定値を提供し、RTTとは異なり、簡単に操作または偽造することはできません。
ローカル情報に基づくP2Pネットワーキング
Dynamic P2Pデザインでは、各ノードがネットワークのローカルビューを維持し、過去のパフォーマンスを考慮して潜在的な接続を評価します。ノードは常に接続を監視して調整し、より良いパフォーマンスを発揮するピアを探し、ネットワークポジションを最適化し、ブロックリレーに必要なホップ数を最小限に抑えます。
各ノードは、次の3つの知られたピアノードのセットを維持します。
- Coldピア:確立されたネットワーク接続がない知られたピア。
- Warmピア:ネットワークの測定に使用される確立されたベアラ接続を持つピア。アプリケーションレベルの合意プロトコルには使用されませんが、即座に利用可能なノードのセットとしての役割を果たします。
- Hotピア:アクティブなベアラ接続を持つピア。アプリケーションレベルの合意プロトコルに利用されます。
前述のように、ノードはこれらのピアに関する制限された情報を維持し、前の直接的な相互作用に基づいています。 Coldノードでは、前の直接的な相互作用がないため、この情報が欠落することが多いです。この情報は、他のシステムでの「評判」に類似していますが、純粋にローカルであり、他のノードと共有されません。
図4は、ピア選択ガバナー(PSG)によって管理される昇格/降格サイクルを示しています。このコンポーネントは、特定のターゲット(指定された数の既知のアクティブなピアを維持するなど)を達成するために責任を負います。
また、ローカル静的構成を使用して、特定のノードをHotまたはWarmピアとして指定することもできます。このアプローチにより、複数のリレーを持つステークプールなど、単一の組織によって管理されるノード間の固定された関係が可能になります。これは、SPOと他の展開シナリオとのプライベートピアリングの取り決めを促進します。
敵対的な行動の場合、ピアはすぐにホット、ウォーム、およびコールドセットから降格されることがあります。この決定は、Sybil攻撃を簡素化する可能性があるため、長期間負のピア情報を保持しないことを選択し、許可されたシステムでのリソース消費を制限します。
運用とローカルポリシー
ピアチャーンガバナー(PCG)は、ネットワークの健全性と効率を管理するために重要な役割を果たすコンポーネントであり、ネットワーク分割やエクリプス攻撃に関連する問題をナビゲートし、ホット、ウォーム、およびコールドピアのターゲット値を調整して、そのチャーンを促進します。
このプロセスでは、PCGは、有用性とパフォーマンスに基づいてピアを評価するスコアリング関数によって、ピアの昇格(コールドからウォーム、ウォームからホット)または降格(ホットからウォーム、ウォームからコールド)を決定します。
これらのスコアリング関数には、次のものが含まれます。
- Hot demotion policy:降格する「ホット」(高活動性で価値が高い)ピアを決定する責任があります。スコアは、ピアがネットワークに対する貢献をどの程度したかに基づいて計算されます。これには、最初に提供したブロックの数や提供したバイト数などの要因が考慮されます。通常の運用中は、これらの要因の組み合わせがスコアの計算に使用されます。ただし、バルクシンクデータ同期中は、提供されたバイト数が優先されます。
- Warm demotion policy and cold forget policy:「ウォーム」および「コールド」ピアを処理し、ネットワークからダウングレードまたは削除するべきピアを決定します。これらの決定は、一定レベルのランダム性とさまざまな特性に影響を受けます。考慮される要因には、前の失敗または温度計フラグが含まれます。このフラグは、信頼性が低いか、活動レベルが低いことを示します。
ノード同期プロセス中、PCGは、リソースの過剰利用を防ぐために、2つ以上のアクティブな接続が使用されていないことを確認します。ノードが完全に同期されると、PCGは定期的なチャーンを促進し、毎時20%のピアを更新します。これにより、堅牢で適応可能なネットワークが促進されます。
研究で探索されたClose-RandomまたはScore-basedのポリシーは、製品環境で直接複製されていませんが、実装されたポリシーの設計に大きな影響を与えました。したがって、研究結果は、Cardano製品環境内のネットワークポリシーを形成する上で重要な役割を果たしています。
開発アプローチ
CardanoのP2P実装は、Haskellをベースにしています。Haskellは、その正確さ、安全性、保守性のために広く認識されている関数型プログラミング言語です。Haskellの堅牢な型システムは、開発中に潜在的な問題を検出するのに役立ち、より堅牢で信頼性の高いコードを作成することができます。また、ネットワークチームは、時間ベースの離散イベントシミュレーションライブラリであるio-simを開発し、現在使用しています。このツールは、STM、MVarなどの機能を含むHaskellのランタイムシステムを忠実に再現し、エントロピーとタイミングに対して正確な制御を提供します。このレベルの制御により、再現性、回帰テスト、最悪のシナリオの検証が可能になります。Haskellとio-simの組み合わせにより、さまざまな条件下でP2Pプロダクションシステムで使用される同じコードを厳密にテストし、現実世界の課題に対応できるようにします。
信頼性のあるシステムを構築するために、ネットワークチームは広範なプロパティベースのテストを採用しました。これらのテストは、ユニットテストなどの従来のテストアプローチでは見落とされる可能性のある複雑なバグやコーナーケースを発見するために特別に設計されています。テストプロセスの特徴の1つは、システムの運用を何年も再現するシミュレーションを含めることです。この包括的なアプローチにより、数年分のアクティビティを模倣し、特定の条件下または長期間のみに表れるまれなバグを発見することができます。ただし、これらのテストの品質は、使用されるジェネレーターの品質に最終的に依存します。ジェネレーターは、多様で代表的な入力を生成し、徹底的に評価するために重要な役割を果たします。