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

Proof of Participation が防ぐもの

Proof of Participation は強力な攻撃者を想定して設計されました。任意の数のノードとアカウントを動かし、ネットワーク上のすべてのメッセージを見ることができ、論理上のどんな欠陥も突き、資金も豊富な攻撃者です。前提とするのは、攻撃者が署名を偽造できず、ハッシュの衝突を見つけられず、すべてのトークンを買い占めることはできないということだけです。そのような攻撃者に対して、盗むこと、検閲すること、履歴を書き換えること、チェーンを混乱させることの 4 つを防ぐことを目指しています。このページでは、主な攻撃とそれに答えるルールを順に取り上げます。

ブロック生成を買う

Proof of Work では力はハードウェアに、Proof of Stake ではコインに従います。どちらも素早く買うことができます。Proof of Participation では、一時停止中でないすべての登録済みの席が、残高やハードウェアにかかわらず、次のブロックに抽選される同じ確率を持ちます(抽選 を参照)。コインやマシンだけでは何も買えません。力には席が必要です。

席は、プロトコルが定めるペースで、キューを通じてのみ得られます。最初の新規ノードはジェネシスの 7 日後に加入します。その後は各加入が次の待ち時間を決めます。600 日を、その新規ノードより前に数えられた席の数で割り、7 日から 90 日の間に保ったものです。ジェネシス席は最大 11 までしか数えられず、一時停止中の席は数えられません。席が 11 なら待ち時間は約 54.5 日なので、2 番目の新規ノードは 61.5 日目ごろに到着します。キューはステークに待機時間を掛けた値で並べられるため、攻撃者は誠実な応募者よりも高く賭けなければなりません。

シビルの身元

シビル攻撃者は、影響力を得るために多数の身元を作ります。Proof of Participation では身元とはレジストリの席であり、各席には現実のコストがあります。

  • お金。 少なくともキューの最低額をロックしたステークです。最低額は 100 ZBC から始まります(席は 1 アトミック単位から 250 ZBC の間で投票でき、参入時にはキュー内ステークの中央値の半分によって引き上げられることがあります)。その 10 % はリスクにさらされます。
  • 時間。 ステーク × 待機時間で並ぶキューでの順番と、ペースの決まった加入です。新規ノードの間隔は数週間から数か月です。
  • 仕事。 新しい席は参加スコア 20 % から始まり、成熟するまで何も稼げません。成熟には加入から 4 スコア単位と自分のブロック 1 つが必要で、ノード数 2,880 未満では 2 日です。その後も自分の番にブロックを作り、中継し続けなければなりません。

沈黙した席は欠席状態とみなされ、何も稼げずスコアを失い、ゼロになると除名されて、ロックの 10 % がロンジェビティプールに入ります。欠席中や一時停止中に離脱した場合や、キューから離脱した場合も、同じ 10 % を失います。健全な状態での離脱では、7 日間のクールダウンの後にロックの全額が戻ります。逃した番、一時停止、除名 と レジストリからの離脱 を参照してください。

身元 1 つあたりのコストを示す 3 つの列。お金:キューの最低額(100 ZBC から)以上のステーク、10 % がリスク。時間:ステーク × 待機によるキューの順序、サイクルごとに加入 1 つ。仕事:20 % から開始、成熟まで収入なし、沈黙するとスコア 0 で除名。
身元 1 つあたりのコストを示す 3 つの列。お金:キューの最低額(100 ZBC から)以上のステーク、10 % がリスク。時間:ステーク × 待機によるキューの順序、サイクルごとに加入 1 つ。仕事:20 % から開始、成熟まで収入なし、沈黙するとスコア 0 で除名。

席の過半数

攻撃者が本当に席の過半数を支配したとします。攻撃者はほとんどのブロックを作り、最も重いブランチを作ることができます。これはどの最重チェーン方式でも過半数が手に入れるものです。攻撃者には次のことができます。

  • トランザクションを自分のブロックから除外することで、遅らせたり検閲したりする
  • より重いブランチを作ることで、ロールバック制限の範囲内で最近のブロックを置き換える

何かを偽造することはできません。すべてのノードがすべてのブロックを確認します。各トランザクションの署名、各ブロックのシードの証明、各レシート、各コインベースの額です。過半数であっても、鍵を持たないアカウントの ZBC を使うことはできず、固定されたコインベースのスケジュールを超えて自分に支払うこともできず、720 ブロック(3 時間)より古い履歴や、最後のスパインのチェックポイントより下の履歴を書き換えることもできません(ファイナリティとロールバック を参照)。また、番が飛ばされた後に作られたブロックは重みが小さく、働かない席は収入とスコアを失います。

2 つの列。できること:トランザクションの検閲や遅延、直近 720 ブロック内のブロックの置き換え。できないこと:署名の偽造、他人のコインの使用、追加のコインの発行、スパインのチェックポイントより下に戻ること。直近 720 ブロックと、さらに過去のスパインのチェックポイントが示されたチェーン:古い履歴は動きません。
2 つの列。できること:トランザクションの検閲や遅延、直近 720 ブロック内のブロックの置き換え。できないこと:署名の偽造、他人のコインの使用、追加のコインの発行、スパインのチェックポイントより下に戻ること。直近 720 ブロックと、さらに過去のスパインのチェックポイントが示されたチェーン:古い履歴は動きません。

シードの操作

すべての抽選を動かすシードは検証可能ランダム関数の出力であり、生成者は複数の値からそれを選ぶことはできません。唯一の手段はブロックを出さないことですが、それには逃した番、収入、スコアという代償があり、シードを次に抽選されたノードに渡すだけです(ブロックシード(VRF) を参照)。

ずっと過去からの履歴の書き換え

ロングレンジ攻撃は、たとえばずっと前にレジストリを離れたノードの古い鍵を使って、遠い過去から別の履歴を作ります。次の防御のそれぞれが、単独でもそれを止めます。

  • 稼働中のノードは 720 ブロックを超えてロールバックすることはありません。
  • どのノードも、スパインチェーン 上で共同署名された最後のチェックポイントより下で再編成しません。
  • 新しいノードはスパインに従います。スパインのブロックには席の 3 分の 2 が必要で、スパインはどのノード鍵が加わりどれが離れたかを記録しているため、ずっと前に離れた鍵はその署名者リストに載っていません。
  • 新しいノードがインストールするリリースは リリースピン を運ぶことができるため、偽造されたスパインの履歴は起動時に拒否されます。

鍵に有効期限はなく、ブランチを手作業で審査する者もいません。

エクリプス

エクリプス攻撃では、攻撃者がノードを自分のピアで取り囲み、そのノードに攻撃者のチェーンしか見えないようにします。登録済みノードに対しては、これは困難です。割り当てられたピア(mainnet では 12)は期間ブロックのシードから抽選され、40 ブロック(約 10 分)ごとに抽選し直されるため、攻撃者はそれを選べません(レシートとネットワークトポロジー を参照)。ピアは、チェーンのジェネシスハッシュも記した署名付きハンドシェイクで自分のノード鍵を証明します。そして誠実なピアは 1 つで十分です。フォーク選択は重みで決まるため、より重いブランチを報告する接続が 1 つあれば、ノードはそれを取得してブロックごとに確認できます。先端が古くなったノードは、登録済みピアのサンプルの 3 分の 2 が報告する先端に従います。

ピア間の通信は暗号化されていない平文の gRPC です。保護は秘密性からではなく、署名と検証から得られます。

その他の攻撃

  • ブロックの二重署名は EquivocationReport によって証明され、逃した番として課されます(二重署名(equivocation) を参照)。
  • 署名済みトランザクションを別の ZooBC チェーンでリプレイしても失敗します。すべての署名がチェーンのジェネシスハッシュを対象にしているからです(チェーン束縛署名 を参照)。
  • 偽造されたスナップショットは、共同署名されたスパインが指定するハッシュと、登録済みピアと照合されるサンプルによって見破られます(スナップショットとファストシンク を参照)。

関連項目