Bitcoin Cashの定期ハードフォーク(2020-11-15)の解説

コールドウォレット開発グループの原です。

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の値が小さいほど難易度は高くなります。

next\_target = old\_target * 2^{time\_delta - ideal\_block\_time * (height\_delta + 1) \over halflife}
  • old\_target: anchor blocktarget
  • time\_delta: evaluation blockanchor blockの親のtimestampの差
  • ideal\_block\_time: 目標のブロック生成間隔(600秒)
  • height\_delta: evaluation blockanchor blockのblock heightの差
  • halflife: 定数のパラメータ、単位は秒。mainnetは172800(=2日)
  • next\_target: evaluation blockの次のブロックのtarget

計算は整数値のみで行い、 2^nの計算は3次の近似多項式を使います。 また、anchor blockはASERT有効化前の最後のブロックを指します。

ASERTの特徴として、ideal\_block\_timeと実際のブロック生成間隔との差が開くほど難易度調整幅が大きくなるというものがあります。

具体的なブロック生成間隔を当てはめた例を紹介します。

ブロック生成間隔が10分の場合

\begin{aligned}
    next\_target &= old\_target * 2^{600 * (height\_delta + 1) - 600 * (height\_delta + 1) \over 172800} \\
    &= old\_target
    \end{aligned}

この場合、難易度は変化しません。

ブロック生成間隔が5分になった場合

\begin{aligned}
    next\_target &= old\_target * 2^{300 * (height\_delta + 1) - 600 * (height\_delta + 1) \over 172800} \\
    &= old\_target * 2^{-300 * (height\_delta + 1) \over 172800}
    \end{aligned}

この場合、576ブロック目(2日目)でtargetは半分(難易度は倍)になります。

ブロック生成間隔が60分になった場合

\begin{aligned}
    next\_target &= old\_target * 2^{3600 * (height\_delta + 1) - 600 * (height\_delta + 1) \over 172800} \\
    &= old\_target * 2^{3000 * (height\_delta + 1) \over 172800}
    \end{aligned}

この場合、57.6ブロック目(2日目)でtargetは倍(難易度は半分)になります。

Automatic Replay Protectionの廃止

BCHには計画的なハードフォークでネットワークが正常に分岐されるために、Automatic Replay Protectionという仕組みが導入されていました。

しかし、この仕組みはハードフォークの際に次のハードフォークの日時を決める必要があり、前回のハードフォークではIFPが議論の不十分なままハードフォークに間に合わせるために実装されるということが起きてしまいました。

この仕組みはBitcoin ABCのノード実装以外ではほぼ採用されていないこともあり、今回からは廃止されることになりました。

BCHとABC

今回のハードフォークでは、Bitcoin ABCがBCHのコンセンサスに追従しなかったため、ABCがソフトフォークにより分岐しました。 これに関連して、今回のハードフォークまでにBCHとABCとの間で起きたことについて紹介します。

ハードフォーク後の動向

今回のハードフォークは661648ブロックでチェーンが分岐しました。その後起きた出来事について紹介します。

ハードフォーク前後のブロック生成間隔

ASERTの効果を確認するために、ハードフォーク前後のブロック生成間隔を図にしてみました。 赤い線は目標のブロック生成間隔である600秒です。 ハードフォーク前のブロック生成間隔については、ハードフォーク直前は一部のマイナーが様子見のため撤退していたこともありturbo blocksの影響が少なかったため、比較的ハードフォークなど情勢の影響が少ない7月頃のブロックを参照しています。

2020年7月頃のブロック生成間隔
ハードフォーク後のブロック生成間隔

また、それぞれの期間のブロック生成間隔の平均と標準偏差は下記のようになっていました。

ブロック高 平均 標準偏差
642000 - 643999 (2020年7月頃) 595.4 956.7
664000 - 665999 (ハードフォーク後) 606.4 689.8

ハッシュレートなども違うため単純な比較は難しいと思いますが、ハードフォーク後の方がブロック生成間隔が安定しており、ASERTにより実際にブロック生成の遅延が改善されたと言えそうです。

終わりに

今回の難易度調整アルゴリズムの変更により、ブロック生成間隔が安定してより使いやすくなることが期待されます。

ABCとの分裂はBTC、BSVに続きBCHにとって3度目の分裂となりましたが、BCHNをはじめとして開発者やマイナーなどの協力により今回はほぼ混乱なく分裂を乗り越えることができました。分散性を重視した開発をしているBCHとして、コミュニティに認められない開発者からネットワークを守ることに成功した良い事例になったと思います。

一緒にCoincheckを盛り上げてくれるメンバーを募集しています!

様々なポジションを募集しておりますので、是非ご興味ある方はご応募ください。まずは話を聞いてみたいという方も大歓迎です。

参考資料