二重署名(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 という構成です。
チェーンは次の 13 項目を、この順に確認します。
- レポートのタイプが有効化されていること
- 手数料がちょうど 0 であること(報告は登録済みノードの義務だからです)
- 本体を解析でき、各ヘッダーが署名済みヘッダーのサイズ(204 バイト、シード証明付きなら 284 バイト)であること
- 2 つのヘッダーが互いに異なること
- バイトオフセット 76 にある生成者の鍵が両方で同じであること
- オフセット 172 にある親のハッシュが両方で同じであること
- 両方の署名がその生成者の鍵で検証できること
- 親がこのチェーンのブロックであること
- その組が 1 時間の復旧限度をまたいでいないこと
- レポートが、二重署名された高さから 720 ブロック以内に届くこと
- 生成者が登録済みノードであること
- 報告者が登録済みノードであること
- この生成者がその高さについてまだ課されていないこと
2 つ目のブロックを見たという申告は何の証明にもなりません。証明になるのは 2 つの署名です。署名は誰でも確認できるため、席による投票は必要ありません。
代償
有効なレポートは、生成者に逃した番を 1 回課します。これは生成者と高さの組ごとに 1 回だけです。バージョン 0.5.8 で決定されたルールのもとでは、証明された二重署名によってノードは次に自分のブロックを作るまで欠席状態にもなります。コインベースも手数料もロンジェビティの分け前も得られず、参加スコアは下がっていきます。4 回続けて番を逃すとノードは一時停止されます。逃した番、一時停止、除名 を参照してください。
残高は動きません。報告者には報酬がなく、生成者のステークから何かが取り上げられることもありません。ZBC は決してバーンされません(ZBC は決してバーンされない を参照)。