検証サブシステム

提供: tezos-wiki
移動先: 案内検索

.. _validation:

検証サブシステム[編集]

このドキュメントでは、ピアツーピア層と経済プロトコルの間にあるTezosシェルの検証サブシステムの内部動作について説明します。この部分は、ネットワークから来たチェーン、ブロック、操作を検証し、伝播する価値があるかどうかを判断する役割を担います。 :ref:バリデータ<validator_component> </ code>、:ref:<code>プリバリデータ&lt; prevalidator_component&gt; </ code>、および:ref:<code> ; DDB_component&gt; </ code>。

| Tezos検証ダイアグラム|

バリデータ[編集]

.. _validator_component:

バリデーターは、ネットワークまたはベイカーからのブロックが有効であるかどうかをチェックするコンポーネントです。w.r.t.経済プロトコルによって定義されたルール、およびブロックチェーンの現在のヘッドと見なされるブロックを選択するために使用されます。

バリデーターは、ワーカーの集合として書かれています。ローカルイベントループは、メッセージパッシングを介して互いに通信します。ワーカーは、接続されたピア、検証する入力ブロック、アクティブ(テスト)チェーンに従って、動的に生成され、強制終了されます。

連鎖バリデータ ワーカーは、それが生きていると考えている各連鎖に対してバリデーターによって起動されます。各チェーンバリデーターは、このチェーンに属するブロックを処理し、このチェーンに最適なヘッドを選択します。主鎖バリデーターは起源で始まる主鎖のために生まれ、能動的なテスト鎖があるときは第2のものです。チェーンをフォークすることは、経済的議定書の中から決定される。 Alpha版では、これは、メイン・チェーンを自己修正する前に新しいプロトコルを試すためにのみ使用されます。

チェーンバリデーターは、接続されたピアごとに1つの "ピアバリデータ"ワーカーを生成します。このセットは、ピア・ツー・ピア・コンポーネントからの接続および切断信号に従って、オンザフライで更新、拡張または縮小されます。各ピアバリデータは、関連するピアからの新しいヘッド提案をループで一度に1つずつ処理します。単純なケースでは、現在のローカルヘッドの直下にある新しいヘッド提案をピアが受け取ると、単純な「ヘッドインクリメント」タスクが起動されます。すべての操作が取得され、ブロックの検証がトリガーされます。現在のヘッドと検査された提案の差が1つ以上のブロックである場合、主に初期ブートストラップフェーズの間に、ピアワーカーは「ブートストラップパイプライン」タスクを起動します。

第3のスキームは、代替チェーンを検証するために計画されています(まだ実装されていません): マルチパスバリデーター 。この方法はかなり複雑です。その目的は、すべてのチェーンデータをダウンロードすることなく、できるだけ早く誤ったブロックを検出することです。これは、最初にブロックヘッダーを検証し、次にフィットネスに作用する操作、そして最後に残りの操作によって機能します。このメカニズムは実際には少し柔軟性があり、任意の数の操作リストが可能です。シェルは、プロトコルヘッダーと操作が十分近い時間ウィンドウにある先祖ブロックのコンテキストで検証されるように、プロトコルによってエクスポートされる所定の長さのフォークのみを考慮します。バージョンAlphaでは、ブロックヘッダーで実行されるチェックは、ベーキングスロット、ベーカーシグネチャ、およびタイムスタンプデルタが正しいことです。また、2つの連続するブロック間の適合度の差がAlphaに限定されているため、大きすぎるフィットネスギャップを検出することもできます。適性に基づいて動作するオペレーションは、裏書と裏書の署名を検証するチェックで構成されています。これが妥当であるためには、フォークリミットは、ベーキングおよびエンドーサングスロットが設定される前に巻戻しを許可しないように設定されています。

これらの3つのピアバリデータタスク(ヘッドインクリメント、ブートストラップパイプライン、マルチパス)のそれぞれは、必要なデータを取得するために分散DBとやりとりします(ヘッダーと操作をブロックします)。ブロックに必要なものがすべてあるときは、ブロックバリデーターを呼び出します。

「ブロックバリデーター」は、すべての必要なデータがすでにピアツーピアネットワークから取得されていると仮定して、ブロックを(順番に)検証します。ブロックが有効な場合、ブロックは対応するチェーンバリデーターに通知します。この場合、チェーンバリデーターは、この情報を関連する「プリバリデーター」に伝播し、プロトコルの決定に従ってテストネットワークを強制終了または起動させることができます。

プリバリデータ[編集]

.. _prevalidator_component:

各チェインバリデーターには、このチェインの操作のピアツーピア通信による送信を担う、「プリバリデーター」(これは、将来的にはオプションとなり、RAMの少ないマシンでノードを実行できるようになります)ピアネットワーク。

スパムを防止するために、このプレバリデータは、有効と見なされる一連の操作と、ブロードキャストに選択された操作のセットを選択する必要があります。これは、ダミーブロックを常にベーキングし、現在のヘッドに浮かべて、新しい操作を受け取ったときに成長させることによって行われます。

含まれる操作は、無条件にブロードキャストできます。

含まれるオペレーションはカテゴリに分類されます。いくつか(悪い署名やガーベジ・バイト・シーケンスなど)は破棄されます。それらは一時的に制限されたセットに入れられ、それを送信したピアが蹴られます。他の操作は一時的に拒否されます。早すぎたり遅すぎたりします。たとえば、Alphaでは契約にカウンタがあり、将来のカウンタでの操作は一時的に拒否されたものとして分類されます。悪意のあるピアは、そのような操作でmempoolを簡単に氾濫させる可能性があります。そのため、境界のあるセットに入れられます。もう1つの有界集合は、第3の種類の非包含のためにも保持されます。

分散DB[編集]

.. _DDB_component:

検証のために必要なリソースの集約は、分散型データベースに集約されています。このコンポーネントは、リクエストされたリソースごとにスロットを割り当てます。優先順位は、要求するピアバリデータの数に依存します。

.. | Tezos検証ダイアグラム| image :: validation.svg