Skip to main content
ネットワークに参加するノードは、2つの問いに答えなければなりません。チェーンの現在地までどうやって到達するか、そこにどうやって留まり続けるかです。ステートシンクはその両方に答えます。両者のトレードオフは隠されておらず、明示されています。

追いつき方は2通り

ブートストラップ(何もない状態から現在のバージョンへ到達すること)には、根本的に異なる2つのやり方があります。 履歴をリプレイする。ジェネシスから始めて前へ進みます。すべてのトランザクションを実行し直すか、実行がすでに生成した出力を適用するかのいずれかです。結果として得られるのは、履歴全体(すべてのバージョン、すべての証明、すべてのトランザクション)を保持したノードです。そのぶん遅く、チェーンが動き続けるほど日ごとに遅くなります。 現在の状態をダウンロードする。履歴を飛ばし、最新バージョン時点の状態のキーと値を取得して、コミット済みのルートに照らして検証します。ノードはごくわずかな時間で現在に追いつきますが、チェーンがそこに至った経緯については何も知りません。
新しいノード
ブートストラップの方式
履歴をリプレイジェネシスから再実行、または保存された出力を適用遅く、チェーンが動くほど日ごとに遅くなる
現在の状態をダウンロード最新バージョンのキーと値を、コミット済みルートに照らして検証ごくわずかな時間で現在に追いつく
現在のバージョン以降は継続的な同期
二つの経路は等価ではない現在の状態をダウンロードしたノードは、過去のクエリに答えられず、ポジションが現在の姿になった経緯も説明できません。インデクサーや監査に提供するノードには、飛ばした履歴が必要です。
リプレイ経路の中にも、さらに選択肢があります。トランザクションを再実行するか、保存された出力を適用するか、その時々で速いほうをノードに選ばせるかです。再実行のほうが検査としては強力です。記録された結果を信用するのではなく、結果を再現するからです。出力の適用はより高速です。混在モードが存在するのは、ノードがどれだけ遅れているかによって正解が変わるからです。
これは運用上の判断であり、何も考えずに受け入れてよいデフォルトではありません。現在の状態をダウンロードしたノードは、過去に関するクエリに答えられず、あるポジションが現在の姿になった経緯も説明できません。読むべき履歴を持っていないからです。インデクサーや監査プロセスに提供するノードには、飛ばしたその履歴が必要です。

現在に留まる

現在のバージョンへ到達したあと、ノードはコミット済みのブロックが届くたびに取り込むことで追随します。ここでもトランザクションを実行するか出力を適用するかの選択があり、検証の強度と速度のトレードオフも同じです。 ブートストラップとの違いは、差が「大きく、縮んでいくもの」ではなく「小さく、一定のもの」だという点です。十分に遅れたノードは、任意の大きさの差を少しずつ埋めようとするのではなく、ブートストラップ経路へ戻ります。

データの流れ方

同期は、あるノードが別のノードへブロックの範囲を要求するだけのものではありません。特定のピアが依存先にならず、ひとつの障害で進行が止まらないように、層に分かれています。 押さえておく価値のある帰結はこうです。同期中のノードはピアを信用していません。どのチャンクも、ネットワークがコミットしたルートに対する証明を伴って届きます。矛盾したものを返すピアは、信じられるのではなく拒否されます。ピアの選択は性能上の判断であって、信頼の判断ではありません。

検証

ステートシンクでは、送り主が誰であるかを根拠に受け入れられるものは何もありません。 状態の値はコミット済みのステートルートに照らして検証されます。トランザクションと出力はアキュムレータに照らして検証されます。ブートストラップを終えたノードは、そのルートがバリデータのクォーラム(定足数)の署名したものと一致する状態を持ちます。高速経路が安全なのはこのためです。現在の状態のダウンロードは履歴を飛ばしますが、検証は飛ばしません。

次に読む

ストレージと証明

同期を検証可能にしている構造です。

ノードを運用する

ノードの役割と、運用について問い合わせる方法です。

ネットワークトポロジー

同期中のノードが話している相手が、どのティアのノードなのかです。

インデクサー

現在の状態では答えられないことに、履歴がどう答えるのかです。