コールドウォレット開発グループの原です。
2020年11月15日にBitcoin Cash (BCH)の定期ハードフォークが行われました。 ここでは、今回のハードフォークの内容を解説します。
変更点の概要
今回のハードフォークでは、ASERTという新しい難易度調整アルゴリズムが導入されました。
また、前回のハードフォークまであったAutomatic Replay Protectionは、今回から廃止されました。
ASERT
ここでは、ASERTの導入された経緯や特徴について説明します。
今までの難易度調整アルゴリズム
これまでBCHで使われていた難易度調整アルゴリズムは、2017年11月のハードフォークで導入されたcw-144
というアルゴリズムでした。このアルゴリズムは直近144ブロックの生成間隔やchainworkというチェーンを伸ばすために使われた計算量を示す値を使って難易度が決められていました。
このアルゴリズムはBTCに比べて難易度がハッシュレートに応じて調整されやすく、その分難易度のぶれが大きいという特徴がありました。
そして、難易度のぶれが大きいことを利用して、難易度の低い間だけBCHをマイニングし、難易度が高くなったらBTCなどをマイニングするということが行われるようになりました。これはturbo blocksやswitch miningなどと呼ばれています。
この行為により、下記のような問題が発生していました。
- BCHだけをマイニングするマイナーは難易度が高い間もマイニングし続けるため損をする
- ブロック生成間隔が不安定になり、何時間もブロックが生成されないことがある
そのため、難易度のぶれを改善するアルゴリズムとして、ASERT(正式名称はaserti3-2d)が導入されました。
ASERT
ASERTでは、最新のブロックをevaluation block
として、その次のブロックのtarget
を下記の式で計算します。
target
はマイニングの難易度を決める値で、ブロックのハッシュ値がtarget
以下だと有効なブロックとして扱われます。一般的に難易度と言われる値はプロトコル上のtarget
の最大値を現在のtarget
で割った値を指します。そのため、target
の値が小さいほど難易度は高くなります。
:
anchor block
のtarget
:
evaluation block
とanchor block
の親のtimestampの差: 目標のブロック生成間隔(600秒)
:
evaluation block
とanchor block
のblock heightの差: 定数のパラメータ、単位は秒。mainnetは172800(=2日)
:
evaluation block
の次のブロックのtarget
計算は整数値のみで行い、 の計算は3次の近似多項式を使います。
また、
anchor block
はASERT有効化前の最後のブロックを指します。
ASERTの特徴として、と実際のブロック生成間隔との差が開くほど難易度調整幅が大きくなるというものがあります。
具体的なブロック生成間隔を当てはめた例を紹介します。
例
ブロック生成間隔が10分の場合
この場合、難易度は変化しません。
ブロック生成間隔が5分になった場合
この場合、576ブロック目(2日目)でtarget
は半分(難易度は倍)になります。
ブロック生成間隔が60分になった場合
この場合、57.6ブロック目(2日目)でtarget
は倍(難易度は半分)になります。
Automatic Replay Protectionの廃止
BCHには計画的なハードフォークでネットワークが正常に分岐されるために、Automatic Replay Protectionという仕組みが導入されていました。
しかし、この仕組みはハードフォークの際に次のハードフォークの日時を決める必要があり、前回のハードフォークではIFPが議論の不十分なままハードフォークに間に合わせるために実装されるということが起きてしまいました。
この仕組みはBitcoin ABCのノード実装以外ではほぼ採用されていないこともあり、今回からは廃止されることになりました。
BCHとABC
今回のハードフォークでは、Bitcoin ABCがBCHのコンセンサスに追従しなかったため、ABCがソフトフォークにより分岐しました。 これに関連して、今回のハードフォークまでにBCHとABCとの間で起きたことについて紹介します。
- [~5月] IFPの議論から、Bitcoin ABCのIFPに反対する開発者がBitcoin Cash Node(BCHN)を立ち上げる
- [7月頃] ASERTが提案される
- [7月頃] ABC側でGrasbergという別の難易度調整アルゴリズムが提案される
- [~8月] コミュニティの議論の中でASERTが優勢となる
- ABC以外の主なノード実装はASERTを採用することを表明しました`
[8月] ABCがASERTを受け入れるが、同時にIFPを強制するルールも追加する
- このIFPはブロック報酬の8%をABC開発者に送ることを強制するという、前回よりも厳しいルールになっていました
- このIFPによりABCがソフトフォークすることになりました
- [11月] ABCがBCHNのネットワークに従う実装もサポートし始める (Bitcoin ABC BCHN Edition)
ハードフォーク後の動向
今回のハードフォークは661648ブロックでチェーンが分岐しました。その後起きた出来事について紹介します。
- 分岐後のハッシュレートはBCH:ABCが95:5ほどの割合
- 難易度の遷移: https://blockchair.com/bitcoin-cash/charts/difficulty?interval=1m&compare=bitcoin-abc
- BCHNなどのメジャーなノード
- 大きな影響はなくBCHを継承した
- ABC
- ハッシュレートの急激な低下によりハードフォーク後24時間で7ブロックしか生成されなかった
- すでに難易度調整により正常になっています
- ABCに対して攻撃的なメッセージのついた空ブロックが生成され続ける
- ブロック報酬の100%をABC開発者に送るマイナーによって51%攻撃を受ける
- 攻撃者によって変更されたIFPのルール: https://github.com/DevVoluntarism/bitcoin-abc/commit/b37e310aa64c5e87f11e92549a5897fc51abd142
- この51%攻撃は技術的にはソフトフォークと同じことを行っています
- 空ブロックを無視するためにABCがチェーンを分岐させる
- ハッシュレートの急激な低下によりハードフォーク後24時間で7ブロックしか生成されなかった
ハードフォーク前後のブロック生成間隔
ASERTの効果を確認するために、ハードフォーク前後のブロック生成間隔を図にしてみました。 赤い線は目標のブロック生成間隔である600秒です。 ハードフォーク前のブロック生成間隔については、ハードフォーク直前は一部のマイナーが様子見のため撤退していたこともありturbo blocksの影響が少なかったため、比較的ハードフォークなど情勢の影響が少ない7月頃のブロックを参照しています。
また、それぞれの期間のブロック生成間隔の平均と標準偏差は下記のようになっていました。
ブロック高 | 平均 | 標準偏差 |
---|---|---|
642000 - 643999 (2020年7月頃) | 595.4 | 956.7 |
664000 - 665999 (ハードフォーク後) | 606.4 | 689.8 |
ハッシュレートなども違うため単純な比較は難しいと思いますが、ハードフォーク後の方がブロック生成間隔が安定しており、ASERTにより実際にブロック生成の遅延が改善されたと言えそうです。
終わりに
今回の難易度調整アルゴリズムの変更により、ブロック生成間隔が安定してより使いやすくなることが期待されます。
ABCとの分裂はBTC、BSVに続きBCHにとって3度目の分裂となりましたが、BCHNをはじめとして開発者やマイナーなどの協力により今回はほぼ混乱なく分裂を乗り越えることができました。分散性を重視した開発をしているBCHとして、コミュニティに認められない開発者からネットワークを守ることに成功した良い事例になったと思います。
一緒にCoincheckを盛り上げてくれるメンバーを募集しています!
様々なポジションを募集しておりますので、是非ご興味ある方はご応募ください。まずは話を聞いてみたいという方も大歓迎です。