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

ファイナリティとロールバック

ZooBC のブロックは 2 つの形で確定します。720 ブロック(3 時間)より深くなれば、ネットワークと歩調を合わせているノードがそれをロールバックすることはありません。そして、席の 3 分の 2 が共同署名したスパインブロックがそのブロック、またはそれより後のブロックをチェックポイントとして指定すれば、競合するブランチがどれほどの重みを主張しても、どのノードもそれより下で再編成を行うことはまったくありません。これらの制限の反対側に取り残されたノードも、そこにとどまるわけではありません。自身を行き詰まり(wedged)状態と宣言し、ネットワークから自身を再構築します。

厳格な制限内でのロールバック

ZooBC のノードは最も重いブランチに従います(フォーク選択と累積難易度 を参照)。ノードはより重いブランチを知ると、自分の最近のブロックを 2 つのブランチが分かれた地点までロールバックし、それからもう一方のブランチのブロックを 1 つずつ確認しながら適用します。ロールバックでは、取り除かれたブロックのコインベースも含め、すべての状態テーブルを版管理された行から目標の高さの状態に戻します。

このロールバックには厳格な制限 max_rollback_height があります。mainnet では 720 ブロック、1 ブロック 15 秒で 3 時間、devnet では 60 ブロック(15 分)です。それより深いロールバックが必要なブランチは、その重みにかかわらず拒否されます。

ノードが盲目的にロールバックすることは決してないため、この制限は安全です。ノードは自分のチェーンに手を付ける前に、競合するブランチを取得して重みを量ります。実際の分岐点を見つけ、何かをダウンロードする前に深さを確認し、ブランチの重みをページ単位で量り、限られた回数の試行で諦め、ブランチがより重いと証明されたときにはじめてロールバックします。

ケース 1:直近 720 ブロック以内の分岐はロールバックされ、より重いブランチが適用されます。ケース 2:720 より深い分岐は拒否されます。より長く切り離されていたノードは行き詰まり状態になり、ピアがより重いブランチを確認するとスパインのスナップショットから再構築します。
ケース 1:直近 720 ブロック以内の分岐はロールバックされ、より重いブランチが適用されます。ケース 2:720 より深い分岐は拒否されます。より長く切り離されていたノードは行き詰まり状態になり、ピアがより重いブランチを確認するとスパインのスナップショットから再構築します。

チェックポイントという下限

スパインチェーン は、2 つ目のより強い保証を加えます。各スパインブロックはメインチェーンの参照ブロックを指定し、高さだけでなくそのハッシュと重みによって正確に固定します。十分な共同署名を持つスパインブロックをノードが保存すると、その参照の高さがチェーンの確定済み高さになります。

この高さを越える再編成は起こりません。ノードは、分岐点が確定済み高さより下にあるフォークを、ブロックを 1 つも取得する前に拒否し、それより下のブロックを取り除くよう求められた場合もやはり拒否します。スパインブロックには登録済みの席の 3 分の 2 の共同署名が必要で、各署名者はまず内容を自分のチェーンと照合するため、チェックポイントはレジストリ全体による声明です。誠実なノードはすべて、それを保存した時点で確定したものとして扱い、さらなるスパインブロックを待つことはありません。

チェックポイントがロールバック制限より深い理由

ここでは 2 つの数値が関わります。ノードは最大 720 ブロックまでロールバックできます。そしてスパインのチェックポイントは、それが指定するスナップショットと同様に、先端から 760 ブロック下のチェーンを記述します(main_snapshot_min_height)。

チェックポイントがロールバック制限より浅ければ、正当な再編成によってまだ置き換えられうるブロックをスパインが確定させてしまい、署名されたチェックポイントと全員が従うチェーンが食い違う可能性があります。そのため、ジェネシスの構築ツールは main_snapshot_min_height が max_rollback_height を少なくとも 20 ブロック上回ることを求めます。mainnet は 720 に対して 760 で 40 ブロックの余裕があり、devnet は 60 に対して 80 で同じ形を保っています。チェックポイントが指定するブロックはすべて、許されるどのロールバックの範囲よりもすでに深いところにあります。

先端から遡る物差し:0 から 720 ブロックはまだロールバックされうる範囲、720 から 760 は少なくとも 20 の余裕、760 でチェックポイントとスナップショットが確定したものを示します。devnet:ロールバック 60、深さ 80。
先端から遡る物差し:0 から 720 ブロックはまだロールバックされうる範囲、720 から 760 は少なくとも 20 の余裕、760 でチェックポイントとスナップショットが確定したものを示します。devnet:ロールバック 60、深さ 80。

取り残されたノード:行き詰まりと再構築

ロールバック制限より長く切り離されていたノードは、ネットワークの他のノードが、自分の手の届かないところにあるより重いブランチに従っていることに気づく場合があります。そのノードはそこまでロールバックしませんが、永遠に単独で進み続けるわけでもありません。

少なくとも 3 つの登録済みピアが手の届かないより重いブランチを確認すると、ノードは自身を行き詰まり(wedged)状態と宣言し、自分のブランチでの生成を停止します。ノード自身の行き詰まり検出器(ローカルなルール)も、1 つの高さで、少なくとも 2 つのピアを相手に、少なくとも 1,800 秒(30 分)にわたってフォークの解決に 10 回続けて失敗していないかを監視しています。バージョン 0.5.8 以降の既定である auto_resync がオンなら、行き詰まったノードはローカルのチェーンを破棄し、スパインのチェックポイントとスナップショットから始めて、ネットワークから再構築します(スナップショットとファストシンク を参照)。

遅れたノードはレジストリに従う

先端が 7,200 秒(2 時間)より古いノードは、先にいると主張するピアを無条件には信用しません。登録済みピアのサンプルの少なくとも 3 分の 2(n のピアのうち少なくとも ceil(2 × n / 3)、n は 3 以上)が報告する先端に従います。

確率的なファイナリティとの比較

Proof of Work では、ブロックへの信頼はその深さとともに高まりますが、確実になることは決してありません。Bitcoin の利用者は、支払いを確定したとみなす前に 6 ブロック待つことがよくあります。ZooBC はその習慣をルールで置き換えています。3 時間という厳格なロールバック制限と、約 1 日に 1 回の共同署名されたチェックポイントで、それより下の履歴は変わりません。その代償として、少数派のブランチで 3 時間を超えて切り離されたノードは、ロールバックによって戻ることはできず、代わりに再構築します。

関連項目