アーカイブと過去の読み取り
通常の ZooBC のノードが保持するのは最近の履歴だけです。30 日から 60 日分のブロックと、最新の 3 つのスナップショットです。アーカイブは、3 年前のあるアカウントの残高など、遠い過去についての問いに答えます。ブロック 0 以降のすべてのスナップショットを、1 台のマシンに置くのではなく分散ストレージに広げて保持し、スパインチェーンに照らしてバイト単位で確認できるようにします。
すべてのノードが保持するもの
mainnet では 172,800 ブロック(約 30 日)ごとに、各ノードがスナップショットを書き出します。チェーンの状態全体、つまりその高さより 760 ブロック下の時点でのすべての残高、レジストリの席、レコードです。ノードは作業の時期をずらしますが、どのノードのバイト列も同じです。スナップショットは 1 つの CBOR ドキュメントで、SHA3-256 ハッシュで名前付けされた 102,400 バイトのチャンクに分割されます。ファイル全体のハッシュ、すべてのチャンクのハッシュ、参照の高さを含むそのマニフェストは、登録済みの席の 3 分の 2 が共同署名する 1 日 1 ブロックのゆっくりとしたチェーンである スパインチェーン のブロックで公開されます。
スナップショットの中身は何も署名されていません。その権威はそれを指定する共同署名されたスパインブロックにあるため、スナップショットは、そのバイト列がマニフェストのハッシュと一致する限り、誰が提供しても本物です。スナップショットは、新しいノードが素早く参加する手段でもあります(スナップショットとファストシンク)。
各ノードが自分のディスクに保持するのは、最新の 3 世代のスナップショットだけです。他のノードの参加を手伝うにはそれで十分で、これまでに作られたすべてのスナップショットをすべてのノードが保持すれば、各運用者のディスクは毎月増えていくことになります。古いブロックもプルーニングされます(履歴のプルーニング)。
アーカイブ
バージョン 0.5.8 からは、ブロック 0 以来のすべてのスナップショットを保持するのは、すべてのノードではなく分散ストレージです。各スナップショットのチャンクは、保存されたファイルのピースと同様に、抽選で選ばれた 5 つの登録済みノード(storage_replication)が保持します(分散ストレージプール)。各ノードが保持するのは自分の最新の 3 つのスナップショットだけで、すべてを保持するノードはありません。
履歴を保持する単一のマシンはないため、単一の運用者がそれを失ったり出し渋ったりすることはできません。1 つの組織が運用するアーカイブサーバーは、たとえ ZooBC Foundation のものであっても、まさにそのような単一障害点になります。また、何も捨てられません。アーカイブは最初のスナップショットまで遡ります。
アーカイブのチャンクを保持することは、登録済みノードのストレージの義務の一部です。ストレージエポックごとに、ロンジェビティプールの 10 % が、サンプルとして選ばれたチャンクを証明したノードに均等に支払われます(プール)。
過去を読む
過去のある時点の状態を知りたい読み手は、スパインをその時点に取られたスナップショットまで遡り、そのマニフェストを読みます。スナップショットのチャンクを保持者から取得し、それぞれをマニフェストの中のハッシュと照合するため、保持者が偽のチャンクを紛れ込ませることはできません。そしてスナップショットを組み立て直し、全体のハッシュを確認し、その高さの状態、つまりその時点のすべての残高、席、レコードを再構築します。履歴を保持する単一のノードはなく、アーカイブノードも必要ありません。
この確認には保持者への信頼は必要ありません。スパインは席によって共同署名されており、そのマニフェストがすべてのチャンクのハッシュを固定しているため、偽のチャンクはすぐに分かります。
過去を見るその他の方法
- ロンジェビティのデポジットは、選んだ 1 つのトランザクションとそのブロックを、デポジットが続く限りすべてのノードに保持させます(データ保持のための支払い(ロンジェビティ))。
- 運用者は
keep_all_historyによって、自分のノードにすべての履歴を保持できます。これはローカルな選択であって、既定ではありません。 - アーカイブノードは、ノードの横でインデックス作成のサービスを動かし、エクスプローラーの検索と統計を提供します(エクスプローラーとアーカイブノード)。