Welcome - Bitcoin Hard Fork Research
↑の2つめの、James Hilliardが書いたマルチステージマージマイニングヘッダハードフォーク↓について見てみる。
https://github.com/jameshilliard/bips/blob/bip-msmmhhf/bip-msmmhhf.mediawiki
簡単に言うと、ハードフォークを2段階で実施する提案で、初期フェーズでは新しいチェーンのブロックで、元のチェーンのブロックをマージマイニングする。
その間、元のチェーンでは空ブロックが生成され新しくコインが生成されることもない。一定期間経過したら、元のチェーンのマージマイニングをやめ、そのタイミングで元のチェーンとマージマイニングするために使っていたヘッダフォーマットも変更するという内容。
動機
プールマイニングにおいては、ヘッダフォーマットを大幅に変更することでしか修正できないブロック保留攻撃*1などの深刻な問題が存在する。
また他にも非マージマイニングと互換性のある方法でのみ可能な、多くの望ましいヘッダフォーマットの変更がある。
元のチェーンを永久に無効にできない場合、2つの実行可能なチェーンが存在するリスクが高くなる。
仕様
直近の4032ブロックのうち3900ブロック(約96.7%)にバージョンフラグがセットされていた場合、このフォークをアクティベートする。このフラグは以下の2つのステージ(マージマインステージ、ヘッダ変更ステージ)を同時にロックインする。
マージマインステージ
最初のハードフォークはマージマイニングを使用して実装する。元のチェーンではトランザクションを一切含まないことに加えて、新しいコインが生成されない。
さらに元のチェーン上でntime
を操作し意図的に難易度を上げ、アップグレードしていない全クライアントが現在の時刻に追い付かないようにするコンセンサスルールを追加する。意図的なntime
の操作は、新しいチェーンのブロックのコンセンサスルールとして実装される。
新しいヘッダ
new_header.prev = 前のブロックヘッダのハッシュ new_header.small_nonce = 4バイトのnonce new_header.big_nonce = 8バイトのnonce new_header.... (新しいフィールドを追加可能)
フェイクブロック
元のチェーンに対して↓のフェイクブロックを作る。
block.version = 4 block.prev = new_header.prev block.merkle = コインベースでマークルルートを計算(コインベースのみで他のトランザクションを含まない) block.timestamp = 前のブロックのmedian time past + 1 block.bits = calculate_bits() block.nonce = new_header.small_nonce block.tx_count = 1
(過去11ブロックのタイムスタンプの中央値 + 1秒した時間が次のブロックのタイムスタンプになる)
コインベース
フェイクブロックのコインベースは↓
coinbase.version = 1 coinbase.tx_in_count = 0 coinbase.tx_out_count = 1 coinbase.tx_out[0].value = 0 coinbase.tx_out[0].pk_script = "OP_RETURN"
(コインの報酬を受け取るコインベースのコインの値が0なので、新しいコインは生成されていないことになる。)
これはメインチェーンを破壊する最後の手段となる攻撃である。median time pastは非常にゆっくりと増加する(6ブロックに1秒)。これはマイニングの難易度の更新タイミングであるretarget period(2016ブロック)の間に336秒しかブロックのタイムスタンが増えないことを意味し、こうなるとretarget peroid毎に難易度は(調整の上限である)4倍に上昇することになる。
Bitcoinのチェーンが一定の難易度にとどまっていると、4倍時間がかかるようになる。
2週間後: 4倍の難易度 (1期間につき2週間) 10週間後: 16倍の難易度 (1期間につき8週間) 42週間後: 256倍の難易度 (1期間につき32週間)
ヘッダ変更ステージ
これはハードフォークの最終段階で、ヘッダーフォーマットがマージマイニングと互換性がなくなる。マージマインステージから42,336ブロック後で、元のチェーンのretarget periodの境界ブロックがスタートしたタイミングでアクティベートされる。アクティベーションの条件は、タイムワープ後元のチェーンが6048ブロック経過したタイミング。
論拠
この解決策は、1つのロックイン期間を使った2段階のハードフォークをする。
最初の段階では、難易度の調整をするための2016ブロックのマイニングが非常に困難になるまで元のチェーンのネットワークの難易度を意図的に増加させるためntime
の増加を抑制し、元のチェーンを実質使えくするよう設計されている。これによりハードフォークに対応していないクライアントにとってハードフォークへの対応が必要なことが明らかになる。
2つのステージが同時にロックインすることで、クライアントのマージマイニングもヘッダ変更ステージでロックされ、ヘッダ変更ステージを迎えると元のチェーンも停止することを保証する。1年以上のマージマイニングを経て元のチェーンの難易度を大幅に上昇させ、現時点の時刻まで追いつくよう難易度を減少させるにはとてつもないコストがかかるようになる。
後方互換性
このハードフォークが実施されると、ハードフォークをサポートしていないフルノード及び軽量ノードはどちらも無効になる。移行には全ノードのアップグレードが必要で、マイナーは圧倒的大多数のサポートを表明する必要がある。
所感
- マージマイニングで、元のチェーンのタイムスタンプに細工して意図的に元のチェーンの難易度を上昇させていくアプローチ面白い。
- 厳密には元チェーンでのマイニングの結果コインを生成する権利を得てるんだけど、コインベーストランザクションにOP_RETUNの出力で実質そのコイン捨ててる。
- HFのためにマージマイニングを採用する提案で内容としてはシンプル。他の拡張については特に触れていない。
*1:プールの運営者に経済的な損失を与える攻撃で、マイナーがマイニングに成功して有効なハッシュを見つけてもプールに報告しないという攻撃