ZooBC ウィキ
セキュリティとアーキテクチャ

スナップショットとファストシンク

何年も続いているチェーンに参加するノードは、ブロック 0 以降のすべてのブロックをリプレイする必要はありません。スパインチェーンに従い、スパインが指定する最新のスナップショットをダウンロードし、それを 1 つずつ、そしてピアと照らして確認し、その後に作られたブロックだけを適用します。これがファストシンクです。チェーンの状態について、ノードがウェブサイトや単一のピアの言葉を鵜呑みにすることは一度もありません。

スナップショット

スナップショットとは、ある高さにおけるチェーンの状態全体、つまりすべての残高、席、レコードです。main_snapshot_interval ブロックごと、mainnet では 172,800 ブロック、約 30 日ごとに、各ノードはその起点の高さより 760 ブロック下の時点の状態のスナップショットを書き出します(devnet では 240 ブロックごとで、深さは 80 ブロックです)。ノードは作業を最大 60 ブロックずらして行いますが、どのノードのスナップショットもバイト単位でまったく同じです。

スナップショットは 1 つの CBOR ドキュメントで、チェーンの状態テーブル(57 個)、最近のブロックヘッダー、最近のトランザクション、保持の費用がまだ支払われているトランザクション(データ保持のための支払い(ロンジェビティ) を参照)、そして最近公開されたレシートを含みます。これは 102,400 バイトのチャンクに分割され、各チャンクはその SHA3-256 ハッシュで名前付けされます。それらのハッシュの一覧に、ファイル全体のハッシュ、参照の高さ、有効期限、チェーンのジェネシスハッシュを加えたものがマニフェストで、スパインブロックがそれを公開します。

スナップショットの中身は何も署名されていません。その権威は、それを指定するスパインブロックにあります。そのブロックは席の 3 分の 2 によって共同署名されており、各席は署名の前に、マニフェストを自分自身のスナップショットとハッシュの 1 つひとつまで比較しています。

各ノードは、最新の 3 世代のスナップショットだけを保持します。ブロック 0 以降のすべてのスナップショットは、すべてのノードではなく分散ストレージが保持し、各スナップショットのチャンクは抽選で選ばれた 5 つの登録済みノードが保持します(アーカイブと過去の読み取り を参照)。

ファストシンクの手順

ノードは、少なくとも 100 ブロック遅れていて、自分の高さより上の使用可能なマニフェストを持っているときに、ファストシンクを試みます。そのマニフェストを運ぶスパインブロックを、その署名とともに保持していなければなりません。最新のマニフェストは、有効期限を過ぎても使用可能なままです。

  1. スパインを同期します。 大きく遅れているノードは、参照が自分の先端より上にあるスパインブロックでも、そのブロック自身の署名のしきい値(3 分の 2、またはフォールバックのブロックでは過半数)を満たしていれば保存します。ブロックの内容は、後でメインチェーンがその参照に達したときに確認し、不一致があれば警告を出して停止します。
  2. チャンクを取得します。 接続している登録済みピアから最大 16 の分割で取得し、各チャンクをその名前であるハッシュと照合します。
  3. ファイル全体を確認します。 マニフェストのファイル全体のハッシュと照合します。
  4. 状態を読み込みます。 1 つのデータベーストランザクションの中で行います。
  5. サンプルをピアと照合します(後述)。
  6. 残りのブロックを適用します。 先端まで 1 つずつ、完全な検証を行いながら適用します。
番号付きの 6 つの手順:スパインチェーン(3 分の 2 が署名)、マニフェスト(ハッシュの一覧)、複数のピアからのチャンク、状態の読み込み、ピアとのサンプル照合、先端までの残りのブロック。スナップショットは 172,800 ブロック(約 30 日)ごとです。
番号付きの 6 つの手順:スパインチェーン(3 分の 2 が署名)、マニフェスト(ハッシュの一覧)、複数のピアからのチャンク、状態の読み込み、ピアとのサンプル照合、先端までの残りのブロック。スナップショットは 172,800 ブロック(約 30 日)ごとです。

アテステーション:ピアとの状態の照合

ハッシュが一致すれば、そのバイト列がマニフェストの指定するものであることは証明されます。しかし、そのバイト列が本当の状態であることまでは証明されません。スパインの共同署名者はすでにすべてのマニフェストを自分自身のスナップショットと比較していますが、バージョン 0.5.8 以降、参加するノードは偽のマニフェストを渡された場合に備えて、独自の確認を加えます。

読み込みの後、ノードは新しい状態から最大 8 つのアカウントと 8 つのレジストリのノードを選びます。この選択はスナップショット自身のハッシュによって決まるため、参加するすべてのノードが同じ行を選び、偽造者はどの行を整合させればよいかを前もって知ることができません。ノードは 3 つのランダムな登録済みピアに、スナップショットの高さにおける各アカウントの残高と、各ノードの鍵とステータスを尋ねます。1 つのチェーンの 1 つの高さについての誠実な答えは、すべて同じになります。

  • 少なくとも 2 つのピアが一致し、矛盾するものがなければ、ノードは先へ進みます。
  • 矛盾する答えが少数でなければ、問い合わせを 7 つのピアに広げ、その場合は少なくとも 2 つの一致する答えと、回答したピアの少なくとも 3 分の 2 の一致が必要です。
  • それ以外の場合はスナップショットを拒否し、ブロックごとの同期に戻ります。

回答するピアが少なすぎる場合、ノードはハッシュだけを根拠に先へ進みます。

スナップショットのハッシュから、ノードは 8 つのアカウントと 8 つのノードを選び、3 つのピアに尋ねます。少なくとも 2 つが一致し矛盾がなければ進みます。矛盾が少数でなければ 7 つのピアに尋ね、少なくとも 3 分の 2 が一致すれば進み、そうでなければ拒否してブロックごとに同期します。
スナップショットのハッシュから、ノードは 8 つのアカウントと 8 つのノードを選び、3 つのピアに尋ねます。少なくとも 2 つが一致し矛盾がなければ進みます。矛盾が少数でなければ 7 つのピアに尋ね、少なくとも 3 分の 2 が一致すれば進み、そうでなければ拒否してブロックごとに同期します。

結果を信頼できる理由

  • スナップショットを指定するスパインブロックは、各席がマニフェストを自分自身のスナップショットと比較した後に、席の 3 分の 2 によって共同署名されています。
  • すべてのチャンクとファイル全体が、マニフェストのハッシュと一致しなければなりません。
  • 十分な数のピアが答える限り、読み込まれた状態のサンプルが、ランダムに選ばれた独立した登録済みピアと照合されます。
  • スナップショット以降のすべてのブロックは完全に検証されます。
  • スパイン自体も、ノードのリリースに同梱される リリースピン によって固定できます。

スナップショットに手作業で署名する者はおらず、ウェブサイトが信頼されることもなく、ブロック 0 から何かがリプレイされることもありません。

関連項目