Network Communication

アイデンティティ(ID)

各ノードは、ネットワーク上にアイデンティティ(ID)を持っています(コンセンサスプロセスのIDとは異なります)。ネットワーク・アイデンティティ(ID)は、TLS証明書の公開鍵のフィンガープリントに基づいています。ノードは起動するたびに新しい秘密鍵を生成するため、一意のIDが確保されます。

各IDは、そのノードが到達可能なIPとポートのペアであるアドレスにリンクしています。このアドレスはエンドポイントとも呼ばれます。

ノード間の接続

あるノードが既知のエンドポイントである他のノードに接続したい場合、エンドポイントアドレスに対してTLS接続を有効にします。この場合、一般的なTLS用語を用いたコンテキストでは、接続ノードがクライアント、リモートノードがサーバー接続となります。

接続設定の際、クライアントはサーバーの証明書をチェックした上で、エンドポイントが想定している公開IDと一致させ、正しいノードに接続していることを確認します。さらに、ダウングレード攻撃から保護するため、TLSパラメータの接続や証明書には、同様のサイファーやダイジェストなどが含まれている必要があります。

同時に、接続ノードは自分の証明書をクライアント証明書として送信し、サーバーが同様のチェックイン(更新)の戻し、クライアントIDの確立を可能にします。最終的には、このプロセスを経てどのピアに接続しているかを両ノードが確認できるようになります。

一方向の接続の場合、サーバーは、接続が確立されると即座にそのエンドポイントのノードに接続を戻すようにします(サーバによるエンドポイントの確定方法については、「ノードの検出」を参照)。

メッセージの一方向送信の時のみ接続が使用され、接続を開始したノードのみ、そこでのメッセージ送信が可能となります。

ネットワーク

ノードは、ネットワーク内のノードに接続すると即座にノードの検出に加わります。一般的には、どのノードも上述した通りネットワーク上の他ノードへの接続を試み、完全に接続されたネットワークになります。

ネットワーク上では、ブロードキャストとゴシップの2つのクラスのデータ転送が行われます。ブロードキャストメッセージは、保証なしに接続されているノード全てに一度送信されます。ゴシップのプロセスについては後述します。

一般的には、アクティブなバリデーターが送信するコンセンサス・メッセージのみがブロードキャストされます。それ以外はすべてゴシップされます。

ゴシップ

複数の種類のオブジェクトがゴシップされるが、最も顕著なものはブロック、デプロイ、エンドポイントです(アイデンティティ(ID)を参照)。これらのオブジェクトはいずれも不変であり、一意のハッシュで識別可能となります。

ゴシップとは、ある値を各ノードに直接送信することなく、ネットワーク全体に分散させる処理のことである。このプロセスにより、一部のノードのみが送信元に接続され、レイテンシーのコストに応じてネットワーク上の要件と最終的に消費された帯域幅が処理されます。

このプロセスの概要は下記のとおりです。

ゴシップされる特定のメッセージM、理想の飽和度S、最大影響数Lが与えられる。

  1. 現在接続されているすべてのノードからk個のノードの集合体Tを選びます
  2. 集合体Tの各ノードにMを送信し、どのノードが影響を反映済みの状態であるかを記録する(Mを受信済み、もしくは、既知の場合そのノードは反映済みとみなす)
  3. 既に影響が反映された状態のノードに対して、もう1つランダムなノードをTの外側に追加し、そのノードにMを送信し、再び反応を記録する
  4. L個の反映済みの新しいノードを確認するか,すでにS個の反映済みノードが確認でき次第、終了とします

この様なプロセスを経て,ほぼ全てのノードに時間をかけてメッセージが行き渡ります。

欠損データのリクエスト

ゴシップとブロードキャストでは、殆どの場合、十分にネットワーク全体へのデータ分散が行われ、ノードは必要な欠落データをピアにリクエストも可能です。一般的な例としてブロックの欠落データがあります。

バリデーション(検証)

オブジェクトには依存関係の概念があります。例えば、ブロックはハッシュが記載されているデプロイ全てに依存しています。ノードは、その全ての依存関係がローカルノードで利用可能となれば、オブジェクトを有効とみなします。

ノードがまだ有効ではないオブジェクトをピアから受け取った場合、ノードはそのオブジェクトを処理する前に検証を完了しようとします。ゴシップの場合は、依存関係全てを取得するまで、オブジェクトに対するゴシップを一時停止します。

どのノードも、有効なオブジェクトのみを伝播することになっています。万が一、ノードが、ピアから送信されたオブジェクトの欠落している依存関係をすべて取得しない場合は、ノードはそのピアを罰することができます。

ノードの検出

ノードの検出は、各ノードが定期的に自分の公開アドレスをゴシップすることで起こります。ゴシップを介してアドレスを受け取ると、各ノードは直ちにそのアドレスへの接続確立を試み、結果、成功した際のエンドポイントを記録します。