最近ビットコインにおいて、昨年末にコード自体はBitcoin Coreに導入されたTaprootのソフトフォークの具体的なアクティベーション方法が議論の的となっています。

今日は過去のソフトフォークのアクティベーション方法の問題点と、その根本的な原因を解決する1つの提案について軽く触れます。ソフトフォークとハードフォークの違いや、Taprootの内容についてはビットコイナー反省会にて近日公開予定のサトシ学園シリーズの動画を収録したので、公開されたらぜひご覧ください。

ソフトフォークのアクティベーション方法

ビットコインは何度かソフトフォークを経験してきましたが、規模が大きくなるにつれ、ソフトフォークの導入により慎重さが求められるようになってきました。前回のソフトフォークである2017年のSegWit導入時は、一定期間内にブロック数の95% (≒ハッシュレートの95%)が導入準備完了をシグナリングしないとアクティベーションされないBIP9という仕組みで行いました。

しかしブロックサイズ論争の真っ只中だったため、マイナーによる投票のように解釈されてしまい、たった5%のブロック数で導入を阻むことができてしまうことから混乱を引き起こしてしまいました。

今回は導入されないまま期限を迎えたときの挙動を指定できるBIP8という仕組みを使って新たな導入方法を試そう、という向きで話が進んでいますが、期限切れ時にデフォルトでアクティベートされてしまう設定(Lock-in On Timeout LOT=true)の是非や、シグナリング期間を複数組み合わせて問題発生のリスクを低減する具体的な手順について意見が割れています。

TAPROOTのアクティベーション方法が揉めている理由

Taprootのアクティベーション方法が揉めている理由には、ネットワークの安定性、コア開発者の影響力、Taprootの利便性といった複数の理由が関係しています。

まず、ソフトフォークでもマイナーの大半が準備できていない状態で発生してしまうとネットワークの安定性が低下したり、一時的な分岐が発生してしまうことがあります。したがって、LOT=trueで進めてしまうと、期日到来時にネットワークが混乱してしまう可能性が残ります。ただ当然マイナー自身も事業である以上、混乱回避のインセンティブが働くため、一定の効果が期待されることは否定できません。

実際にSegwit導入時も、ユーザーが勝手にソフトフォークをアクティベートするUASFという展開が現実味を帯びてきてからマイナーが対応し、無事に導入されました。コア開発者の影響力という面でも懸念点があります。ビットコインはあくまでユーザーのもので、専門家である開発者は意見を表明したり提案をすることはあっても、ネットワークの変更について勝手に決めるものではないという見方が比較的強いのがビットコインです。

しかし、ソフトフォークの導入方法をLOT=trueとすると「開発者によるトップダウンの決定」のようなメッセージ性を持ってしまうのではないか、という懸念です。私はこれはかなり深刻な問題だと思っていて、下手すると長期間ビットコインの信用に影を落としてしまうことになるため、なるべく回避したいところだと感じます。

ただ、反対意見があるなら構想段階でいくらでも言えたから、全体的に受け入れられていて問題ないという主張にも納得はできます。

逆に、LOT=falseだと事実上Segwitのときと同じアクティベーション方法を取ることになり、Taprootには反対意見がほぼないとはいえごく一部のマイナーの悪意や怠慢によって導入が阻まれ続ける可能性があり、この拒否権のようなものを振りかざす前例を重ねる可能性が問題となっています。

ちなみに私はLOTの設定によらずマイナーはユーザーが求める状態に寄せていくだろうという意見です。強いて言えば、最初はLOT=falseでマイナーが自主的に導入準備をするのがガバナンス的な疑問に繋がりにくいので好ましいと思いますが、それはソフトフォークのアクティベーション方法の問題解決を先延ばしにしているだけだという批判には反論できません。
マイナーが無料で拒否権を行使できるのが問題

さて、ここまでで述べた現行のソフトフォークのアクティベーション方法の根本的な理由は、一部のマイナーが無料で拒否権を行使できることという指摘があります。採掘したブロックに特定のデータを含めることでシグナリングするということは、シグナリングの有無に関わらずブロックの報酬が得られるからです。その点を解決するために、アクティベーションを延期させるのにブロック報酬を放棄する必要がある仕組みの提案があります。

拒否権行使にもリスクが伴う"SPORK"という提案

それはJeremy Rubinが過去に提案した”Spork": Probabilistic Bitcoin Soft Forksという提案です。BIP9において、マイナーが準備完了・準備未完了を表明したり、状態を切り替えるのにコストはかかりません。アクティベーションを先延ばしにすることにコストをかけさせようということが提案の要となります。そこで「確率的なソフトフォーク」という提案をSporkと呼ぶことにしました。どういうことかというと、平均すると一定数のブロックに1つ、d > hash(hash(block)||"upgrade name")となるブロックが表れるようなブロックフィルターを考えます。hash(block)を求めるのにマイニングが必要なので、マイニング以上の近道で計算することはできません。

マイニングしていたら、一定期間に1つ「ソフトフォークをアクティベーションするブロック」が見つかるという状況です。

例えば6ヶ月後を目処に新たなソフトフォークをアクティベートするには、上の条件を満たすブロックが6ヶ月に1つ見つかると予測できる水準にdを設定します。

すると、およそ6ヶ月で確率的にアップグレードが発生しますが、もっと早いかもしれませんし、もっと遅いかもしれません。偶然この条件を満たすブロックを発見したマイナーが取れる行動は2つあります。

1つはそのブロックを発表してソフトフォークをアクティベートさせることで、もう1つはそのブロックを握りつぶしてソフトフォークを延期させることです。例えばそのマイナーがアクティベート自体に反対している場合は、その分の報酬を放棄することで6ヶ月ほど先延ばしにすることが期待できます。

もしくは、見つかったのが早すぎてまだリスクが高いと判断した場合は、ネットワークの安定性を保つために握りつぶすかもしれません。Sporkは確率的なため、マイナー全員が否定的でなければいずれアクティベーションが予想されます。

もし6ヶ月で済むはずのアクティベートが3年かかっていれば、数回ブロック報酬を放棄してまで延期するほどの激しい抵抗があったということが事後的に推測できます。さて、この方法もソフトフォークが既定路線と捉えられてしまう問題はありますが、反対意見の表明や全体的なムードの計測は開発前のアイデアの段階で行うことが前提とされています。

おそらくTaprootのアクティベーションには使用されませんし、一度も使われないかもしれないですが、けっこう面白いアイデアではないでしょうか。このようなアイデアもあるよという意味で紹介させていただきました。

おわりに

ソフトフォークのアクティベーション方法論は、ビットコインに関連するものの中では一番といっていいほどガバナンスっぽいので泥臭いです。何より、インセンティブの調整が難しく、BIP9やLOT=falseのBIP8において実際にある程度以上の規模のマイニングプールは無料で拒否権を得てしまっている状態です。

そこでむやみな延期にコストを掛ける必要があるようにインセンティブを修正するSporkのような提案は目の付け所が良いように思い、紹介させていただきました。Taprootのアクティベートに関しては、急いで中央集権的と捉えられかねない行動を取るとビットコイン自体への信用が長期的に毀損されうるので、ここは慎重に進めてほしいなと私は強く思います。