ZooBC ウィキ
Proof of Participation

二重署名(equivocation)

二重署名(equivocation)とは、1 つの生成者が同じ親ブロックの上に 2 つの異なるブロックに署名することです。そうなると、ノードによって先に目にするブロックが異なり、ネットワークがしばらく分裂するおそれがあります。ZooBC はこれに 3 つの方法で対処します。誠実なノードはクラッシュした後でも決して二重署名をしません。そのような 2 つのブロックを目にした登録済みノードは誰でも、EquivocationReport によってチェーン上でそれを証明できます。そして生成者には逃した番が 1 回課され、それに伴って収入とスコアを失います。

二重署名にあたるもの

抽選で生成者に選ばれたノードは、現在の先端ブロック、つまり親の上に 1 つのブロックを作ります。二重署名とは、その同じ親の上に、ヘッダーの異なる 2 つのブロックに署名することです。遅れたブロックは二重署名ではありません。そのブロックのブランチに加える重みが小さくなるだけです(フォーク選択と累積難易度 を参照)。異なる高さでブロックを作ることも二重署名ではありません。高さごとに親が異なるからです。

誠実な生成者は二重署名をしない

生成者は親ごとに自分が署名したブロックを記憶し、その記録をディスクにも保存しているため、再起動しても忘れることはありません。同じ親に対して再び抽選されたときは、新しいブロックを作るのではなく、すでに署名したブロックを再送します。

意図的な例外が 1 つあります。復旧限度、すなわち親から 3,600 秒を過ぎると、停止したチェーンは再び動き出せなければなりません。そのとき生成者はその親に対して新しいブロックに 1 つだけ署名してよく、これには何も課されません。その後はそのブロックを再送します。同様に、タイムスタンプが復旧限度をまたぐ 2 つのブロックの組(ちょうど一方だけが親の 3,600 秒より後)は、停止したチェーンの再開であって二重署名ではありません。

検出

1 つの登録済み生成者から、1 つの親に対して有効な署名付きヘッダーを 2 つ受け取ったノードは、それを証拠として扱います。

  • その生成者を嘘をついたことが証明された者として記録し、ピアとしてブラックリストに載せて接続を切ります。ただし、それによってノードがネットワークから孤立してしまう場合は除きます。
  • 親と生成者の組ごとに 1 つの EquivocationReport を提出します。
  • 両方のブロックは通常どおり検証に回します。どちらが残るかはフォーク選択が決め、完全な同点の場合は、すべてのノードで先端ハッシュの小さいブランチが勝ちます。

EquivocationReport

このレポート(トランザクションタイプ 60)は証拠そのものを運びます。2 つの署名付きヘッダーで、それぞれの後に生成者の 64 バイトの署名が続きます。ヘッダーが 284 バイトなら本体は 704 バイトで、4 バイトの長さ、ヘッダー 1、署名 1、4 バイトの長さ、ヘッダー 2、署名 2 という構成です。

704 バイトのレポート本体を 6 つの箱で表したもの。その下に 2 つのヘッダーが並び、オフセット 76 に同じ生成者の鍵、オフセット 172 に同じ親のハッシュがあります。
704 バイトのレポート本体を 6 つの箱で表したもの。その下に 2 つのヘッダーが並び、オフセット 76 に同じ生成者の鍵、オフセット 172 に同じ親のハッシュがあります。

チェーンは次の 13 項目を、この順に確認します。

  1. レポートのタイプが有効化されていること
  2. 手数料がちょうど 0 であること(報告は登録済みノードの義務だからです)
  3. 本体を解析でき、各ヘッダーが署名済みヘッダーのサイズ(204 バイト、シード証明付きなら 284 バイト)であること
  4. 2 つのヘッダーが互いに異なること
  5. バイトオフセット 76 にある生成者の鍵が両方で同じであること
  6. オフセット 172 にある親のハッシュが両方で同じであること
  7. 両方の署名がその生成者の鍵で検証できること
  8. 親がこのチェーンのブロックであること
  9. その組が 1 時間の復旧限度をまたいでいないこと
  10. レポートが、二重署名された高さから 720 ブロック以内に届くこと
  11. 生成者が登録済みノードであること
  12. 報告者が登録済みノードであること
  13. この生成者がその高さについてまだ課されていないこと

2 つ目のブロックを見たという申告は何の証明にもなりません。証明になるのは 2 つの署名です。署名は誰でも確認できるため、席による投票は必要ありません。

代償

有効なレポートは、生成者に逃した番を 1 回課します。これは生成者と高さの組ごとに 1 回だけです。バージョン 0.5.8 で決定されたルールのもとでは、証明された二重署名によってノードは次に自分のブロックを作るまで欠席状態にもなります。コインベースも手数料もロンジェビティの分け前も得られず、参加スコアは下がっていきます。4 回続けて番を逃すとノードは一時停止されます。逃した番、一時停止、除名 を参照してください。

残高は動きません。報告者には報酬がなく、生成者のステークから何かが取り上げられることもありません。ZBC は決してバーンされません(ZBC は決してバーンされない を参照)。

ヘッダー A と B が EquivocationReport(タイプ 60)に入り、それがブロックに入ります。結果は逃した番 1 回、次の自分のブロックまで欠席、収入なし、スコア低下です。その横では生成者への接続が切られ、ZBC はバーンされません。
ヘッダー A と B が EquivocationReport(タイプ 60)に入り、それがブロックに入ります。結果は逃した番 1 回、次の自分のブロックまで欠席、収入なし、スコア低下です。その横では生成者への接続が切られ、ZBC はバーンされません。

関連項目