状態同期
Aptosネットワーク内のノード(バリデータ、VFN、PFN など)は、常に最新のブロックチェーン状態に同期されている必要があります。各ノードで実行される状態同期(状態同期)コン ポーネントが、この役割を負います。状態同期は、ピアから新しいブロックチェーンデータを識別して取得し、データを検証してローカル ストレージに保存します。 このドキュメントでは、状態同期の仕組みと設定方法について解説します。
殆どのユーザーは状態同期を構成する必要有りません。状態同期は、ノードに最適な構成を自動的に選択します。状態同期は、特定のユースケースがある場合のみ手動で構成する必要があります。 間違った構成を選択すると同期時間が遅くなり、パフォーマンスが低下します。
状態同期
大まかに言うと、状態同期は2つの段階で動作します。まず、全てのノードが起動時にブートストラップします(ブートストラップ段階で)。これは、ノードがAptosブロックチェーンの最新の状態へ追い付く事を可能とします。次に、ノードは継続して同期する事でブロックチェーンの最新の状態を保ちます(継続的な同期段階)。これらの各フェーズには、異なる動作モードがあります。
ブートストラップ段階
ノードが起動すると、状態同期は構成されたブートストラップモードを使用してブートストラップを実行します。ブートストラップモードはいくつかあります。
- 起源以後の全てのトランザクションを実行します。 このモードでは、ノードはAptosネットワークから起源以降の全てのトランザクション、つまりブロックチェーンの履歴の開始以後全てのトランザクション を取得し、それらのトランザクションを再実行します。当然、このモードでは、ネットワークの開始以降の全トランザクションを処理する必要が有るため、最も時間がかかります。
- 起源以後のトランザクション出力を適用します。 このモードでは、ノードは起源以降のすべてのトランザクションを取得しますが、トランザクションの再実行をスキップし、代わりに以前バリデータ実行で生成されたトランザクションを出力します。このモードでは、CPU時間の必要量が減少しますが、ネットワークの開始以後の全てのトランザクションが処理されます。
- 起源以後のインテリジェントな同期。 このモードではノードは起源以後の全てのトランザクションを取得し、データチャンクごとに、トランザクションを実行するかトランザクションを出力するか、より速い方を行います。これにより、ノードがCPUとネットワークリソースの抑制効率をもっと良くする事が出来ます。このモードは、devnetおよびその他のテスト環境のデフォルトモードです。
- 高速同期。 このモードでは、ノードはブロックチェーン内のトランザクション履歴をスキップし、最新のブロックチェーン状態のみを直接ダウンロードします。その結果、ノードはトランザクション履歴データを保持しませんが、迅速にAptosネットワークへ追い付く事が出来ます。このモードは、テストネットとメインネットのデフォルトモードです。
デフォルトのブートストラップモードは、ネットワークの種類によります。
- テストネットとメインネット: デフォルトのブートストラップ モードは高速同期です。なぜなら、これらのネットワークは長期間存続し、大量の履歴データを持っているため。
- Devnetとその他のネットワーク: デフォルトのブートストラップ モードはインテリジェント同期です。なぜなら、これらのネットワークは通常、存続期間が短く、 履歴データの量が少ないため。
継続的な同期段階
ノードがブートストラップされ、初めAptosネットワークに追いついた後、状態同期は継続的な同期フェーズへ移行し、ブロックチェーンを最新の状態で保ちます。継続的な同期モードにはいくつかあります。
- トランザクションの実行。 このモードでは、新しいトランザクションがブロックチェーンにコミットされると、それを実行してノードを最新の状態に保ちます。
- トランザクションを出力する。 このモードでは、トランザクションの実行をスキップし、バリデーター実行によって以前に生成されたトランザクションの出力のみを適用する事で、ノードを最新の状態で保ちます。
- インテリジェント同期. このモードでは、データチャンクごとに、トランザクションを実行するかトランザクション出力を適用するか、いずれか早い方でノードを最新の状態に保ちます。これにより、ノードはCPUとネットワークリソースを効率良く抑制出来ます。これは、すべての環境のデフォルトモードです。
デフォルトの連続同期モードは常にインテリジェント同期です。このモードが最も効率的なためです。
状態同期を構成する
以下のスニペットは、異なるユースケースでのノードの状態同期を構成する手順を示しています。
これらの構成は、ノードの構成ファイル(例:fullnode.yaml
またはvalidator.yaml
)へ追加出来ます。
状態同期は、特定のユースケースで必要な場合でのみ手動で構成する必要があります。間違った構成を選択すると、同期時間が遅くなりパフォーマンスが低下します。
全てのトランザクションを実行する
起源以後の全てのトランザクションを実行し、コミットされた新しいトランザクションも引き続き実行するには、ノード構成ファイル(例えばfullnode.yaml
もしくはvalidator.yaml
)へ以下を追加します。
state_sync:
state_sync_driver:
bootstrapping_mode: ExecuteTransactionsFromGenesis
continuous_syncing_mode: ExecuteTransactions
ノードが同期している間aptos_state_sync_version{type="synced"}
メトリックが徐々に増加するのを確認出来ます。
全トランザクションを出力する
起源以降の全てのトランザクション出力を適用し、トランザクションがコミットされる度、新しいトランザクション出力を適用し続けるには、ノード構成ファイルへ以下を追加します。
state_sync:
state_sync_driver:
bootstrapping_mode: ApplyTransactionOutputsFromGenesis
continuous_syncing_mode: ApplyTransactionOutputs
ノードが同期している間aptos_state_sync_version{type="synced"}
メトリックが徐々に増加するのを確認出来ます。
インテリジェントな同期
起源以後の全てのトランザクションと出力を実行または適用するには(そして新しいトランザクションがコミットされても同じことを続けるにはノード構成ファイルへ以下を追加します。
state_sync:
state_sync_driver:
bootstrapping_mode: ExecuteOrApplyFromGenesis
continuous_syncing_mode: ExecuteTransactionsOrApplyOutputs
ノードが同期している間aptos_state_sync_version{type="synced"}
メトリックが徐々に増加するのを確認出来ます。
高速同期
高速同期は、バリデーターとVFNにとって最後の手段としてのみ使用する必要があります。これは、高速同期によってブロックチェーンの履歴がスキップされ、(i)ネットワーク内のデータの可用性が低下する (ブロックチェーンの履歴が高速同期ノードで切り捨てられるため)、(ii)バリデーターのコンセンサスパフォーマンスを妨害する(スキップされたデータが多すぎる場合)ためです。高速同期のバリデーターは、コンセンサスへ参加する資格が無い内は追加の実行時間が必要な場合があります。
最新のブロックチェーン状態をダウンロードし、コミットされた新しいトランザクションを引き続き処理するには、ノード構成ファイルに以下を追加します。
state_sync:
state_sync_driver:
bootstrapping_mode: DownloadLatestStates
continuous_syncing_mode: ExecuteTransactionsOrApplyOutputs
ノードが同期している間aptos_state_sync_version{type="synced_states"}
メトリックが徐々に増加して行くのが分かります。但しaptos_state_sync_version{type="synced"}
はノードがブートストラップされた後でのみ増加します。データの量、ネットワーク帯域幅、使用可能なノードリソースによっては、数時間かかる場合があります。
注: aptos_state_sync_version{type="synced_states"}
が増加しない場合は、以下の操作を行ってください。
- ノード構成ファイルが正しく更新されていることを再度確認してください。
- ノードが空のストレージデータベースで起動している事を確認します(以前、状態が同期されていない事)。
アーカイブPFNs
アーカイブPFN(ネットワークの開始、つまり起源以後の全ブロックチェーンデータを含むPFN)を操作するには、以下を行う必要が有ります。
- PFNがブートストラップモードとして高速同期を使用していないことを確認して下さい。高速同期ではトランザクション履歴がスキップされます。 そのかわり、起源から同期するモード(例: ジェネシスからのインテリジェント同期)を使用して下さい。
- データ削除ドキュメントの解説に従い、台帳プルーナーを無効にします。 これにより、データが削除されず、PFNは全ブロックチェーンデータを含みます。
以下2つの手順を同時に実行する事で、PFNは作成以降のすべてのデータを取得し、データを削除する事無く同期を継続出来ます。
アーカイブノードの実行と維持は高価で、時間がかかります。これは、ノードへ保存されるデータの量が際限なく増加するためです。そのため、アーカイブノードは公式に 廃止されました。ブロックチェーンの履歴全体を保存して維持したい場合はインデクサーを使用する事をお勧めします。
セキュリティの影響とデータの整合性
各異なる状態同期モードでは、ノードと同期されているデータが正しく生成され、検証者によって署名されている事を確認するため、データ整合性検証が実行されます。これは同期モードごとに若干異なって発生します。
- トランザクションの実行: 起源からのトランザクションの実行は、最も安全な同期モードです。これは、開始時からの全てのトランザクションがコンセンサスによって正しく合意され、全てのトランザクションがバリデータによって正しく実行された事を検証します。結果生じる全てのブロックチェーンの状態は、同期ノードによって再検証されます。
- トランザクションを出力する: 起源からのトランザクションの出力は、全てのトランザクションの実行より高速ですが、同期ノードはバリデーターがトランザクションを正しく実行したことを信頼する必要があります。ただし、その他のすべてのブロックチェーン状態は手動で再検証されます。例えば、コンセンサスメッセージ、トランザクション履歴、状態ハッシュなどは検証されます。
- インテリジェント同期: インテリジェント同期は、データチャンクごとに、トランザクション出力を実行か適用のどちらか速い方を行います。従って、このモードを使用する場合のセキュリティの影響は、トランザクションを出力する場合と同じです。
- 高速同期: 高速同期では、トランザクション履歴をスキップし、継続的に同期する前に最新のブロックチェーン状態をダウンロードします。これを行うには、同期ノードが、トランザクション履歴内のすべてのトランザクションについてバリデータが正しく合意した事を信頼し、バリデータによって全てのトランザクションが正しく実行された事を信頼する必要があります。ただし、その他のすべてのブロックチェーン状態は手動で再検証する必要が有ります。(例えば、エポックの変更やその結果のブロックチェーン状態など)
全ての同期モードは、バリデータセットから信頼のルートを取得し、ブロックチェーンデータ上のバリデータから暗号署名を取得します。
この仕組みの詳細は状態同期のブログ投稿を御覧下さい。