ZOOBC / チェーンのセキュリティ
チェーンのセキュリティ
このチェーンを乗っ取るには、実際にどれだけのコストがかかるのか。抽選は一様で、影響力は線形、攻撃する価値があるのはレジストリだけです。だからこそ、そこに入るための待ち行列が防御になります。
ブロックごとに、1つのノードが抽選でそのブロックの生成者に選ばれます。抽選は、前のブロックのシードから導出されるレジストリ全体からの一様ランダムな選択です。最も裕福なノードでも、最も行儀の良いノードでもありません。登録されたすべてのノードが、毎回、等しく対象になります。
つまり、チェーンへの影響力とは単にレジストリに占めるあなたのシェアであり、それは線形です。51%に達した瞬間に何かが崩れる、という境界はありません。レジストリの10分の1を保有すれば、ブロックの10分の1を生成します。得られるのはそれがすべてです。
そのため、攻撃する価値があるのはレジストリだけであり、そこに入るための待ち行列が防御になります。席を買うことはできません。参加を望むほかの全員の後ろに並び、1ノードずつ加わるしかありません。以下の数字は、それにかかるコストです。
01 / 抽選
生成者の選ばれ方
前のブロックのシードから、すべてのノードが同じ無限の抽選列を計算します。ラウンド1で1つのノードが指名され、そのノードが15秒の枠内に公開しなければ、ラウンド2で別のノードが指名され、以降も同様に続きます。最初に公開したノードがブロックを生成します。
シード自体はsign(node_key, hash(previous seed))であり、すべてのバリデーターが検証します。Ed25519署名は決定的なので、ある生成者にとって有効なシードはちょうど1つしかなく、生成者が自分に有利なシードが出るまで試すことはできません。攻撃者に残された唯一の自由は、公開するか沈黙するかです。抽選で選ばれたブロックごとに1回、1ビットだけです。
参加スコアは選出に影響しません。影響すると思われがちですが、そうではありません。スコアが決めるのはただ1つ、そもそもレジストリに残れるかどうかです。順番を逃すとスコアが下がり、ゼロになると除名され、ステークは返還されます。完璧なスコアを持っていても、昨日参加したノードより次のブロックに選ばれる確率が上がることはありません。ステークも選出には影響しません。ステークで得られるのは、参加するための待ち行列での順番だけです。
03 / サービス拒否
唯一の現実的な攻撃:抽選を沈黙させる
ノードがトランザクションを含められるのは、最初の10ラウンド以内に抽選された場合だけです(max_priority_blocksmiths)。それより後に抽選されたノードもブロックを生成できますが、そのブロックは空でなければなりません。このルールが、ノードがオフラインのときでもチェーンを動かし続けます。ブロックが中身を失うのは、最初の抽選で選ばれたノードがすべて不在だった場合に限られます。
これは設計上で最も鋭い弱点でもあります。それらのノードは、前のブロックが届いた瞬間に15秒前に指名されます。その時間内にそれらすべてをオフラインにできる攻撃者は、空のブロックを強制でき、単に競争するのではなく、全員を検閲することになります。これはコンセンサスの問題ではなくサービス拒否の問題であり、だからこそこの数は、より小さくきりのいい値ではなく10に設定されています。
沈黙させるべきノード数
10
ブロックごとに指名
事前通知
15秒
順番が始まる前
偶発的な空ブロック
ノードの20%がオフラインの場合
この数を増やすコストはほぼゼロです。同時に候補ブロックを生成するノードがいくつか増えるだけで、1つ増えるごとに、攻撃者が同じ15秒以内に見つけ出して落とさなければならないマシンが1台増えます。
04 / 年単位のコスト
シェアを買うコスト
- 計算式
- 遅延 = clamp(基本値 ÷ レジストリ規模, 最小値, 最大値)
- 参加承認
- ステーク順に1つずつ
枠の獲得率はステークの比率です。待ち行列はロック済み残高の順に並ぶため、「枠の100%を獲得する」のは運ではなく、誰も攻撃者より高く入札しないという前提です。ここでの数字はすべて、攻撃者にとって最善のケースです。
誠実な運用者がノードあたりでより多くステークした瞬間、その運用者が前に入ります。承認の半分しか獲得できなければ、レジストリに占めるシェアは半分に近づいてそこで止まります。残り半分を獲得する誠実なノードが、あなたが自分の部分を増やすのと同じ速さでレジストリを拡大するからです。枠の獲得率を超える目標は遅いのではなく到達不可能であり、下の表ではそれをnever(到達不可)と表示しています.
現在の待機期間
承認されるノードあたり
⅓に必要なノード数
ブロックの3分の1を生成するため
⅓に必要な期間
継続的に並び続けた場合
½に必要なノード数
ブロックの半分を生成するため
½に必要な期間
継続的に並び続けた場合
ロックされるZBC
最低額、1ノードあたり100 ZBCの場合
05 / 成長
チェーンの成長とともに待機期間はどう変わるか
チェーン規模別
| レジストリ | ノードあたりの待機期間 | ⅓に必要なノード数 | 時刻 | ½に必要なノード数 | 時刻 |
|---|
06 / 唯一のトレードオフ
ジェネシスのレジストリこそが重要な数字である理由
承認は直列に行われるため、レジストリが倍になるまでの時間は単純にregistry size × wait per nodeです。これは設定ではなく恒等式であり、小さなレジストリでは短い待機期間と遅い乗っ取りを両立できないことを意味します。設計全体の中で、どんな計算式でも解消できない唯一のトレードオフです。
| ローンチ時のレジストリ | 待機1週間 | 待機2週間 | 2年で倍増させるのに必要な待機期間 |
|---|
つまり、てこになるのは曲線ではなくローンチです。12ノードで始めれば、誠実な運用者は誰もが数か月待つことになります。12ノードを倍増しにくくするには、それだけの時間が必要だからです。100ノードで始めれば、2週間の待機期間ですでに4年近くを稼げ、誰も締め出されません。ジェネシスのレジストリを大きくすることは、遅延をどう調整するよりも価値があります。
07 / 4つの特性
なぜこれが成り立つのか
承認は直列です。レジストリは、ネットワーク全体で一度に1つのノードしか承認しません。100ノード欲しいなら、1回待つのではなく、順番に100回待つことになります。この1つの事実が、資金力のある攻撃を数年がかりのプロジェクトに変えます。
必要なシェアはチェーンとともに大きくなります。10ノード中の1ノードは影響力の10分の1ですが、1,000ノード中の1ノードは無に等しいものです。ノードあたりの待機期間はレジストリが大きくなるにつれて短くなりますが、最小値を下回ることはないため、合計時間はそれでも増えていきます。
待ち行列には価格がついています。順番はロック済み残高の順に決まるため、攻撃者は単に待つだけでなく、参加を望む誠実な運用者全員に毎回競り勝たなければなりません。枠を1つ失うたびに、攻撃者は待機期間を失ううえに、誠実な運用者にノードを1つ与えることになります。
攻撃者は、試みている間もチェーンに資金を提供します。すべてのノードはZBCをロックします。10年がかりの攻撃とは、壊そうとしている資産そのものに、大きく、流動性がなく、完全に公開されたポジションを持つことを意味します。スラッシュされるものは何もありません。離脱しても、オフラインで除名されても、ステークは全額戻ります。この保証金で得られるのは待ち行列での順番であって、人質ではありません。
そして、何も蓄積されません。各ブロックは独立した抽選です。1年間完璧だったノードも、今朝承認されたノードと比べて次のブロックへの権利が大きいわけではなく、直近10回の順番を握った攻撃者が11回目を握る可能性が高くなるわけでもありません。積み上げられるポジションが存在しないからこそ、ここで影響力を得る唯一の持続的な方法は、ネットワークのより大きな誠実な一部になることなのです。