ブロックチェーン/レベル II · 仕組み/2.3 ブロックとチェーン/レッスン 1
ブロックヘッダー
チェーン全体を支える80バイトのメタデータ
用意するもの生の16進データを表示できるブロックエクスプローラー16進数エディタまたはオンラインSHA-256ハッシュ計算ツール
問い
- わずか80バイトの構造が、数百万ドル相当のトランザクションデータに対して、どのようにして暗号学的にコミットするのでしょうか?
- マイナーが有利になるようにタイムスタンプフィールドを操作することを、具体的にどのようなルールが防いでいるのでしょうか?
- なぜスマートフォンは、全履歴をダウンロードせずにビットコインネットワークのセキュリティを検証できるのでしょうか?
探究
- ビットコインの各ブロックは80バイトのヘッダーで始まり、その後に可変長のトランザクションリストが続きます。トランザクションリストは1ブロックあたり最大約400万バイトに達することがありますが、プルーフ・オブ・ワーク(PoW)のハッシュ計算とチェーンの識別に使われるのはヘッダーだけです。この極端なサイズの差により、ヘッダーはブロック全体を表すコンパクトなフィンガープリントとして機能し、ノードは大量のデータをダウンロードする前にメタデータを処理できます。
- 最初のフィールドは「version」で、4バイトを占めます。もともとはソフトウェアの改訂を追跡するためのものでしたが、現在はBIP9に基づくソフトフォークのシグナリングビットを運んでいます。マイナーは、新しいコンセンサスルールが有効化される前に、その支持を示すために特定のバージョン番号を設定します。このフィールドには制約もあります。たとえばBIP34では、バージョン2のブロックに対し、コインベーストランザクションのスクリプトへブロック高を埋め込むことが義務づけられました。これは、ヘッダーがネットワーク全体に構造的な変更をどのように強制するかを示しています。
- 「前のブロックのハッシュ(previous block hash)」(32バイト)は、直前のヘッダーのダブルSHA-256ハッシュを格納することで、各ブロックを親ブロックに結びつけます。過去のブロックの1バイトでも変更するとそのハッシュが変わり、以降のすべてのブロックとのリンクが断たれます。このハッシュの連鎖により、後続のすべてのブロックの計算作業をやり直さない限り、過去のデータは改ざんできません。
- 「マークルルート」(32バイト)は、ブロック内のすべてのトランザクションの暗号学的なフィンガープリントとして機能します。トランザクションIDのペアを再帰的にハッシュし、値が1つだけ残るまで続けることで導かれます。この構造により簡易支払い検証が可能になり、ライトクライアントはブロック全体をダウンロードしなくても、このルートと少数の兄弟ハッシュだけで、特定のトランザクションが含まれていることを証明できます。
- 「timestamp」(4バイト)は、作成時刻をUnixエポック秒で記録します。操作を防ぐため、コンセンサスルールがこのフィールドを制限しています。直前の11ブロックの時刻の中央値を上回らなければならず、ノード自身の時計より2時間以上先であれば、そのノードに拒否されます(Bitcoin Core 27以降はノードのシステム時刻、それ以前のバージョンではピアによって補正された時刻を使用)。これらの制約により、ネットワークの伝播遅延によるある程度のばらつきを許容しつつ、ブロック時刻は難易度計算に十分な正確さを保ちます。
- 残りのフィールドは、プルーフ・オブ・ワークのターゲットをコンパクトにエンコードした「nBits」(4バイト)と、有効なハッシュを見つけるためにマイナーが変化させる任意の数値「nonce」(4バイト)です。ヘッダーは小さいため、2009年以降のすべてのヘッダーを保存しても100MB未満で済みます。ライトクライアントはこの全履歴を保持し、すべてのプルーフ・オブ・ワークの制約を独自に検証したうえで、トランザクションを確認することなく、累積作業量が最も多いチェーンを有効なものとみなせます。
重要な事実
- ビットコインのブロックヘッダーは、ちょうど6つのフィールドで構成され、合計80バイトです。
- 「version」フィールドは、BIP9で定義されたソフトフォークのシグナリングビットを運びます。
- ブロックのタイムスタンプは、直前の11ブロックの中央値を上回り、かつ検証するノードの時計より2時間以上先であってはなりません。
- トランザクションデータがあるため、完全なブロックはヘッダーの5万倍近い大きさになることがあります。
- ジェネシスブロック以降のビットコインのヘッダーをすべて保存しても、必要なストレージ容量は100MB未満です。
- 「nBits」フィールドは、難易度のターゲットをコンパクトなuint32形式で格納します。
演習 九・六・三・一
9集めるエクスプローラーでブロックから読み取れる情報を9つ挙げてください。6つのヘッダーフィールドに加え、そこから導かれるブロックハッシュ、ブロック高、難易度です。
6まとめる9つを6つにグループ分けしてください:チェーンの連結、トランザクションへのコミットメント、時刻、マイニングのターゲット、マイニングの探索、導出値。
3絞り込む6つを、ヘッダーがネットワークのために果たす3つの役割に絞り込んでください。
1結晶化する80バイトのヘッダーと数メガバイトのトランザクションリストの関係を、暗号学的コミットメントの観点から定義する文を1つ書いてください。
事実確認
日付、数字、主張は、下記に記載された公表資料と照合して確認しました。