Develop with pleasure!

福岡でCloudとかBlockchainとか。

Speedy Trialを使ったTaprootのデプロイ始まる

Taprootのアクティベーション方法について長らく議論されていたけど、Speedy Trialという方式が採用され、BIP-9ベースにSpeedy Trialを実装したBitcoin Core 0.21.1がリリースされた↓

https://bitcoincore.org/en/releases/0.21.1/

デプロイ方法を巡る議論

前回のSegwitのデプロイは、BIP-9を使って行われた。ただ、Segwitのアクティベートまでは長期間かかり、アクティベートのために、Segwitサポートのシグナリングを設定していないブロックをリレーしないUASFや、Segwitサポートのシグナリングを強制することを目的とした新たなシグナリングを要求する2段階のアクティベートなど、すったもんだがあった。

この経験から、確実にアクティベートをするためのBIP-8のようなデプロイ方法も提案された↓

techmedia-think.hatenablog.com

特にLOT = TrueとするかFalseとするかが議論の的になっていたが、他にもいくつかのデプロイ方法が提案される中で、Speedy Trialという方式が注目され、今回採用されるに至った。

Speedy Trialとは?

Speedy Trialというのはソフトフォークのアクティベーションを確実に実行するようなデプロイ方法ではなく、

  • マイナーに対してソフトフォークの適用に3ヶ月間の期間を与える。
  • 3ヶ月以内にマイナーのシグナリングによりソフトフォークがロックインした場合、数ヶ月の猶予期間の後、そのソフトフォークをアクティベートする。
  • 3ヶ月以内にマイナーのシグナリングによりソフトフォークがロックインしなかった場合、別の仕組みでソフトフォークのアクティベーションを目指す。

という方法。

BIP-9を使ったデプロイでは、シグナリングを開始しても、マイナーによるロックインが進まないと、約1年後のタイムアウトまでずっと待っている必要がある(Segwitの場合はタイムアウトの3ヶ月前に↑のようないろんな動きがあってアクティベートしたけど)。それに対して、Speedy Trialの場合は、ダメだった場合に、1年という長い期間を待つのではなく、早めに別のアクティベーション方法に切り替えることができるというメリットがある。

Speedy Trialの実装

Speedy Trialの実装にはBIP-9ベースのものと、BIP-8ベースのものが提案されていたけど、今回Bitcoin Core 0.21.1に取り込まれたのはBIP-9ベースのもの。

BIP-9からの変更点

BIP-9自体はもともと、Speedy Trialのような仕様はないので、正確にはBIP-9のバリエーションという位置づけになる。Speedy Trialを実装するためのBIP-9からの主な変更点は↓

閾値の変更

BIP-9ではリターゲット期間2,016ブロックの95%がソフトフォークサポートの通知をすることで、ソフトフォークがロックインされるが、Speedy Trialでは、この閾値が90%に削減されている。

min_activate_heightパラメータの追加

BIP-9では、ソフトフォークがロックインされると、次のリターゲット期間でアクティベートされるが、Speedy Trialでは、3ヶ月の期間内のリターゲット期間でロックインしたら、数ヶ月の猶予期間後にアクティベートされるため、ロックイン後すぐにアクティベートされないように、min_activation_heightというパラメータが追加されている。そのため、ロックインした場合は、このパラメータのブロック高でアクティベートされる。

MTPとブロック高

アクティベーションで議論になった要素の1つが、パラメータ(スタートタイムやタイムアウト)をMTPで指定するかブロック高で指定するかという点。MTPはMedian Time Pastの略で、時間ベースの指定方法。判定に使用される時刻は、過去11ブロックのブロックのタイムスタンプの中央値が使われる。BIP-9ではMTPが使用され、BIP-8ではブロック高を使用している。MTPはブロックのタイムスタンプから計算されるので、マイナーによる操作が可能なパラメータであるのがデメリットである一方、アクティベーションパラメータを他のネットワーク(Testnetなど)と共有できるというメリットはある。

結果的に、スタートタイムとタイムアウトはいずれもMTPで指定されるが、

  • 実際にシグナルのカウントを開始するのは、スタートタイムのMTPが経過した後の最初のリターゲット期間から
  • カウントを停止するのは、タイムアウトのMTPが経過したリターゲット期間の終了時

と変更されている。

アクティベーションパラメータ

今回のTaprootのアクティベーションパラメータは↓

  • version bit:2
    ブロックの4バイトのversionフィールドのbit 2に1をセットしたらTaprootのサポートの通知になる。
  • スタートタイム:1619222400(2021年4月24 0:00 UTC
    ↑のルールにより、実際にシグナリングが始まるのはスタートタイムを経過した最初のリターゲット期間であるブロック高681408のブロックからで、このブロックがマイニングされたのは2021-05-02 05:27。
  • タイムアウト1628640000(2021年8月11 0:00 UTC
  • min_activation_height:709632(2021年11月上旬〜中旬に作られるであろうブロック709632

ということで、今日からSpeedy Trialを使ったTaprootのシグナリングが始まった。シグナリングの状況は↓のサイトで確認できるっぽい。興味あればブロックのversionフィールドのビット2を確認してみるのも良い。

https://taproot.watch/

Speedy TrialをサポートしたBitcoin Core 0.21.1がリリースされたのも5/2なので、まだシグナルは少ないけど、今後どう変化していくか興味深い。