Develop with pleasure!

福岡でCloudとかBlockchainとか。

ブロックのバージョンをアップグレードする際のルール(BIP-34)

BIP-9のversion bitsを読んでるとBIP-34が関連してたのでまずはこっちを見てみる。

bips/bip-0034.mediawiki at master · bitcoin/bips · GitHub

Bitcoinのブロックやトランザクションはバイナリ構造をバージョン管理されていて、現在のバージョン(このBIPが書かれた当時)は1である。BIP-34ではバージョン管理されたブロックやトランザクションのアップグレード方法を提案している。新たに生成されたコインベーストランザクションやブロックにユニークな値が追加されると、バージョン2に更新しようというもの。

動機

  1. Bitcoinネットワークがトランザクションやブロックのバイナリ構造をアップグレードする合意形成のルールと振る舞いについて明確にする。
  2. ブロックとトランザクションの一意性を強制し、関係のないブロックの検証を支援する。

仕様

  1. バージョンが1より大きいトランザクションは非スタンダードなものとして扱う。(オフィシャルクライアントはそのトランザクションをマイニングしないし中継もしないだろう)
  2. コインベーストランザクションのscriptSigの最初のアイテムにblock heightを追加し、ブロックのバージョンを2にインクリメントする。block heightのフォーマットは"serialized CScript" で、最初のバイトが数値で、その後のバイトは数値をリトルエンディアンで表したデータとなる。heightはブロックチェーンでマイニングされたブロックのheightで、ジェネシスブロックのheightは0。
  3. 75%ルール:直近の1000ブロックの内750ブロックがバージョン2以上の場合、無効なバージョン2のブロックをリジェクトする。
  4. 95%ルール:直近の1000ブロックの内950ブロックがバージョン2以上の場合、全てのバージョン1のブロックをリジェクトする。

後方互換

全ての古いクライアントはこの変更に対して互換性がある。ユーザや売り手は影響を受けない。マイナーはバージョン2のブロックにアップグレードすることが強く推奨される。マイナーの95%がバージョン2にアップグレードしたら、アップグレードしてないマイナーがアップグレードに失敗すると孤立することになる。

実装

Transition to requiring block height in block coinbases by gavinandresen · Pull Request #1526 · bitcoin/bitcoin · GitHub

結果

この結果、ブロック高が 227,835 (timestamp 2013-03-24 15:49:13 GMT) のブロックが最後のバージョン1のブロックとなった。

※ちなみに2016-04-16現在、ブロックのバージョンは4。

まとめ&所感

  • BIP-34はブロックのバージョンを1→2にアップグレードする際にコインベースにブロックのheightを付加するようにする旨と、ブロックのバージョンをアップグレードする際の仕様を定義したもの。
  • バージョン2からコインベースのフォーマットにブロックのheightをパラメータとして付加するようになった。現在のコインベースのフォーマット仕様はこちら
  • ブロックのバージョンは1から始まり、現在は4までアップグレードされている。
  • バージョン2〜4までのアップデート内容は↓
    • Version 2
      Bitcoin Core 0.7.0(2012年9月)でBIP-34のソフトフォークで導入された。↑の通り、有効なバージョン2のブロックはコインベースにブロックのheightがパラメータとして必要になる。
      ↑に記載されているブロックのリジェクトルールに則り、Bitcoin Core 0.7.0 以降では224,412以降のブロックでブロックのheightがコインベースに含まれていないブロックを拒否し、227,930以降のブロックでバージョン1のブロックを拒否するようになった。
    • Version 3
      Version 3のブロックは、Bitcoin Core 0.10.0(2015年2月)でBIP-68のソフトフォークで導入された。このフォークが2015年7月時点で完全に有効になると、BIP-68に定義されているように新しいブロック内の全てのECDSA署名に厳格なDERエンコーディングが必要となった。
    • Version 4
      Version4のブロックはBIP-65のソフトフォークで導入された。Version 4に対応したブロックはOP_CHECKLOCKTIMEVERIFYをサポートするようになる。