MSTR Cat

ブロックチェーン/レベル III · ネットワーク/3.1 ノード/レッスン 6

Bitcoin Coreおよびその他の実装

1つのプロトコル、多数のエンジン:ビットコインソフトウェアの系譜

用意するもの稼働中のBitcoin Coreノードターミナルまたはコマンドラインインターフェースへのアクセス

問い

  1. 2つのコードの判断が食い違ったとき、何がブロックであるかを決めるのは誰なのでしょうか?
  2. なぜ些細なデータベースエラーが、チェーンを二つに分断するほどの力を持つのでしょうか?
  3. 最も広く使われている実装がメンテナンスされなくなっただけで、ネットワークはどうなるのでしょうか?

探究

  1. ビットコインは、サトシ・ナカモトが書いた単一のC++クライアントとして始まりました。2011年にはQtライブラリを使ってインターフェースが書き直され、このソフトウェアはBitcoin-Qtと呼ばれるようになりました。2014年にはバージョン0.9で接尾辞が完全に外され、Bitcoin Coreとなりました。この名称変更はアイデンティティの転換を反映していました。それはもはや単なるサトシのツールではなく、ネットワークのルールを示す正規のリファレンス実装になったのです。
  2. コードベースの主導権は、2010年から率い2014年に退いたギャビン・アンドレセンから、ウラジミール・ファン・デル・ラーンへと引き継がれました。現在では、少数のメンテナーが厳格なピアレビューを経て変更をマージしています。バージョン番号は2021年に0.21から22.0へと飛び、成熟を示しました。メジャーリリースはおよそ年2回行われ、いずれも配布前に徹底的なテストを受けます。
  3. コンセンサスとは単なるロジックの問題ではなく、数万ものノードでバイト単位まで同一の動作が保たれることを意味します。2013年3月、バージョン0.8でストレージエンジンとしてLevelDBが導入されました。新しいソフトウェアが受け入れたブロックが、ロック制限のバグのためにBerkeley DBで動作する古いバージョンでは拒否されました。マイナーたちがダウングレードするまでチェーンは分裂したままとなり、コンセンサスコードそのものではない部分にある隠れた動作の違いでさえネットワークを分断しうることが示されました。
  4. 単一のコードベースが障害点になったり支配されたりするのを防ぐために、代替実装が存在します。btcdはGo、bcoinはJavaScript、libbitcoinはC++で書かれています。Luke DashjrがメンテナンスしているBitcoin Knotsは、Coreの上に適用されるパッチセットで、デフォルト設定が異なり、特にデータを運ぶトランザクションのフィルタリングがより厳格です。Florestaは効率的な検証のためにUtreexoデータ構造を利用しています。これらのプロジェクトは、Coreの開発プロセスに対するチェック機能を果たしています。
  5. 無効なブロックを受け入れてしまうバグは金銭的損失やチェーン分裂につながりうるため、コンセンサスを再実装するリスクは高いものです。これを緩和するため、libbitcoinkernelはコアとなるコンセンサスロジックを再利用可能なライブラリとして切り出すことを目指しています。これにより、他のソフトウェアはノードのコードベース全体を複製することなくトランザクションを検証でき、周辺のインフラが変わってもルールの一貫性が保たれます。
  6. ノードで「bitcoin-cli getnetworkinfo」を実行すると自身のバージョンを、「getpeerinfo」を実行すると各ピアが報告するソフトウェア(「subver」文字列)を確認できます。異なるソフトウェアスタックが使われていてもネットワークは相互運用性を保っていますが、Bitcoin Coreが圧倒的なシェアを持つため、プロトコルのアップグレードのペースは事実上Coreが決めています。アップグレードしないノードもソフトフォークを経てチェーンに追従し続けますが、コンセンサスの挙動が食い違うノードは分離されることがあります。

重要な事実

  • Bitcoin-Qtは2014年のバージョン0.9でBitcoin Coreに改名されました。
  • ウラジミール・ファン・デル・ラーンは2014年にギャビン・アンドレセンの後を継ぎ、リードメンテナーとなりました。
  • 2013年3月のチェーン分裂は、旧バージョンにあったBerkeley DBのロック制限のバグが原因で発生しました。
  • btcd、bcoin、libbitcoinは、それぞれGo、JavaScript、C++で書かれた代替実装です。
  • Bitcoin Knotsは、Luke Dashjrがメンテナンスしている、より厳格な中継ポリシーを持つCoreの派生版です。
  • まだ開発中のlibbitcoinkernelは、他のソフトウェアで再利用できるようにコンセンサス処理のコードを分離することを目指しています。

演習 九・六・三・一

9集めるビットコインのノード実装、またはコアクライアントの主要なフォークを9つ挙げてください。それぞれの主なプログラミング言語と現在のメンテナンス状況も記録してください。
6まとめるこれら9つを、リファレンス実装との関係に基づき、直接のフォーク、独立した書き直し、コンセンサスライブラリ、アーカイブ済みプロジェクト、活発な代替実装、実験的なものの6つのカテゴリーに分類してください。
3絞り込む6つのグループを、複数の実装がビットコインをより安全にするのか、それともリスクを高めるのかについての3つの論点に絞り込んでください。
1結晶化するコンセンサスの挙動が食い違った場合に、ある実装のデータベースのバグがどのようにして世界規模のチェーン分裂を引き起こしうるのかを1文で説明してください。

事実確認

日付、数字、主張は、下記に記載された公表資料と照合して確認しました。

インタラクティブ版で開く →

EN PT ES ZH KO RU DE FR MS