用語集 / プロトコルとアップグレード
バージョンビット
- バージョンビットとは?
- バージョンビットとは、ブロックヘッダーの32ビットのバージョンフィールドを、独立したスイッチの列として扱う仕組みであり、マイナーが複数のソフトフォークへの支持を同時に表明できるようにするものです。
BIP-9で規定されています。
バージョンビット1つは、保留中のソフトフォーク1件を表し、一定のブロック数の窓の中で集計されます。BIP-9ではビット0から28までが用意されており、2,016ブロックの期間内に1,916ブロックがそのビットを立てるとデプロイメントはロックインし、1年を目安とするタイムアウトに達すると失敗します。これらのシグナルを読むことで、ウォレットが求める機能がネットワークのルールになるかどうかを数か月前から知ることができます。
仕組み
バージョンビットは5つの状態を持つ状態機械として動作し、各ノードが、自身が把握している各デプロイメントについて、難易度調整期間ごとに1回、自分で計算します。
状態はDEFINED、STARTED、LOCKED_IN、ACTIVE、FAILEDです。2,016ブロックの難易度調整期間内のすべてのブロックは同じ状態を共有するため、状態の遷移は2,016の倍数の高さでしか起こりません。あるデプロイメントは、前のブロックのmedian time pastが設定された開始時刻を過ぎるとDEFINEDからSTARTEDへ移ります。median time pastとは、あるブロックとその直前10ブロックのタイムスタンプの中央値です。
STARTEDになると、ノードはちょうど2,016個の祖先ブロックをさかのぼり、バージョンの上位3ビットが001であり、かつそのデプロイメントのビットが立っているブロックを数えます。それ以外はゼロとして数えられるため、別のバージョン方式を実行しているマイナーが誤ってシグナルを出すことはありません。メインネットではそのうち1,916ブロック、テストネットでは1,512ブロックが必要です。median time pastがタイムアウトを過ぎるまで基準に届かなければ、デプロイメントは恒久的にFAILEDになります。BIP-9は、そのタイムアウトを開始時刻から31,536,000秒(1年)後に置くことを提案しており、停滞した提案がそのビットを解放し、待ち行列を永久にふさがないようにしています。
人を戸惑わせる点が1つあります。ブロックの状態はそのブロック自身のバージョンフィールドには決して依存せず、祖先のバージョンフィールドにのみ依存するため、マイナーがルールに投票しても、その票が投票を行ったブロック自体を拘束することはありません。上位3ビットを001に固定することは、シグナルを出すブロックのバージョンを0x20000000から0x3FFFFFFFの範囲内に固定することにもなり、パターン010と011は、最終的にバージョンビットを置き換える仕組みのために自由に残されます。
ビットは消費されるのではなく再利用されます。デプロイメントが有効化するかタイムアウトすると、そのビットは後の提案に使えます。ただしBIP-9が推奨する休閑期間を置き、不具合のあるソフトウェアが先に発見されるようにします。仕様はまた、ノードに対し、認識できないビットを追跡し、未知のデプロイメントがロックインしたときに大きな警告を出すよう求めており、アップグレードしていないソフトウェアが、適用できないルールが近づいていることを知らせる仕組みになっています。
どこで見られるか
ビットコインのメインネットでは、BIP-9自身のパラメーターのもとで2件のデプロイメントが実施されており、このBIPのデプロイメント一覧にその両方が表で示されています。
1件目はcsvという名称で、ビット0を使用し、開始時刻は2016-05-01、有効期限は2017-05-01で、ブロック419,328で有効になりました。これはBIP-68、BIP-112、BIP-113をまとめたもので、BIP-9が、それまで有効だったトランザクションを無効にする変更として挙げるもののうち3つです。2件目はsegwitで、ビット1を使用し、期間は2016-11-15から2017-11-15までで、ブロック481,824で有効になりました。逃す可能性もあった期限の内側での有効化でした。
この方式はマイニングの基盤にも表れています。BIP-9はgetblocktemplate呼び出しを拡張し、すでに有効なデプロイメントの名前を並べるrules配列、保留中の各デプロイメントの名前をそのビットに対応づけるvbavailableオブジェクト、サーバーが要求するビットのマスクである任意のvbrequiredを加えました。プールはこれらのキーを読んで何をシグナルするかを決め、それが出荷されたリリースを追跡サイト上の割合に変えます。
バージョンビットvsバージョン2ブロック
バージョン2ブロックはバージョンフィールドにカウンターを持ち、バージョンビットは同じ4バイトにビットベクターを持ちます。BIP-34ではこのフィールドが整数として比較されていたため、同時に進行できるアップグレードは1件だけで、成功するたびに有効なブロックが使える値が恒久的に消費されました。BIP-9はその代償を明示しています。BIP-34、BIP-66、BIP-65の後には0x7FFFFFFBのバージョン値しか残っておらず、どのビットベクター方式も独立したデプロイメントは30件までに制限されます。代わりに上位3ビットを固定することで、残りは並行して動作し再利用できる29本のレーンになりました。