ビットコインブロック構造:ブロックの解剖学
ビットコインのブロック構造を80バイトヘッダーからコインベーストランザクション、SegWit証人データ、ブロックウェイトまで詳細に分析。実際のブロックヘッダーの16進数解析を含みます。
平均約10分ごとに新しいブロックがビットコインブロックチェーンに追加される。このブロックはトランザクションをカプセル化し、暗号学的ハッシュを通じて前のブロックとリンクし、それを作成するために計算作業が行われたことの証拠を埋め込む、慎重に構造化されたデータコンテナだ。ブロックの正確な構造をバイト単位で理解することは、ビットコインが不変性、分散性、トラストレス検証という特性をどのように実現しているかを理解する上で基本となる。
ビットコインブロックは2つの主要コンポーネントで構成される:ブロックヘッダー(正確に80バイト)とブロックボディ(可変サイズ、トランザクションを含む)。これらが一体となってブロックチェーンの原子単位 — 後続ブロックの下に埋もれると事実上不可逆となる不可分のレコード — を形成する。
ブロックヘッダー:チェーンを守る80バイト
ブロックヘッダーはビットコインで最も情報密度の高い構造だ。わずか80バイトに6つのフィールドをエンコードし、チェーン連結、トランザクション整合性検証、タイムスタンプ情報、難易度ターゲット、プルーフ・オブ・ワークのノンスを集合的に提供する。
フィールド別分析
| フィールド | サイズ | 説明 |
|---|---|---|
| バージョン | 4バイト | ブロックバージョン番号、どの検証ルールに従うかを示す |
| 前ブロックハッシュ | 32バイト | 前ブロックヘッダーのSHA-256dハッシュ |
| マークルルート | 32バイト | ブロック内全トランザクションのマークルツリーのルートハッシュ |
| タイムスタンプ | 4バイト | Unix時間(1970-01-01 00:00:00 UTCからの秒数) |
| ビット(ターゲット) | 4バイト | 難易度ターゲットのコンパクト表現 |
| ノンス | 4バイト | 有効なハッシュを見つけるためにマイナーが増加させるカウンター |
| 合計 | 80バイト |
バージョン(4バイト)
バージョンフィールドは元々プロトコルアップグレードをシグナリングするためのものだった。ブロックバージョン1はジェネシスブロックから2012年まで使用された。バージョン2はBIP-34で導入され、コインベーストランザクションにブロック高を要求した。バージョン3(BIP-66)は署名の厳密なDERエンコーディングを施行した。
BIP-9(2016年)以降、バージョンフィールドは「バージョンビット」シグナリングに転用された。順次増加する代わりに、特定のソフトフォーク提案への支持をシグナリングするために個別ビットを設定できる。このメカニズムはTaprootのアクティベーション(BIP-341)にビット2を通じて使用された。
前ブロックハッシュ(32バイト)
このフィールドは先行ブロックの80バイトヘッダーのダブルSHA-256ハッシュを含む。これがブロックチェーンの「チェーン」だ — データ構造をブロックの線形的で順序付けられたシーケンスにする暗号学的リンク。
ハッシュは内部バイト順序(リトルエンディアン)で格納され、ブロックエクスプローラーで表示される人間が読める形式の逆順となる。
このフィールドが不変性の保証を作る:過去のブロックのデータを変更するとそのブロックのハッシュが変わり、次のブロックの前ブロックハッシュフィールドが無効になり、すべての後続ブロックにカスケードする。
マークルルート(32バイト)
マークルルートはブロック内のすべてのトランザクションから構築されるバイナリハッシュツリーの頂点だ。ブロックのトランザクションセットのコンパクトで改ざん耐性のある要約を提供する。
構築プロセス:
- 各トランザクションをダブルSHA-256でハッシュしてリーフハッシュ(txid)を生成
- 隣接するリーフハッシュを連結して再度ハッシュし、親ノードを生成
- いずれかのレベルでノード数が奇数の場合、最後のノードを複製
- 単一の32バイトルートが残るまで上方に繰り返す
マークルルートは簡易支払い検証(SPV)を可能にする:軽量クライアントがブロック全体をダウンロードせずに、マークル証明(トランザクションからルートへのパスに沿った少数のハッシュセット)のみを要求して特定のトランザクションがブロックに含まれているか検証できる。2,000トランザクションのブロックでは約11ハッシュ(log₂(2000) ≈ 11)のみ必要 — 数メガバイトの代わりに約352バイトだ。
タイムスタンプ(4バイト)
タイムスタンプはUnixエポック以降の秒数を表す符号なし32ビット整数だ。マイナーがこの値を設定するが、検証ルールに従う必要がある:
- タイムスタンプは前11ブロックの中央値(Median Time Past、MTP)より大きくなければならない
- タイムスタンプはノードのローカル時間より2時間以上先であってはならない
32ビットタイムスタンプは2106年2月7日06:28:15 UTCにオーバーフローする。
ビット / ターゲット(4バイト)
bitsフィールドはプルーフ・オブ・ワークの難易度ターゲットをコンパクト形式でエンコードする。ターゲットは256ビットの数値であり、このターゲットより低いハッシュが有効なプルーフ・オブ・ワークとみなされる。
エンコード形式:
bits = 0xAABBCCDD
指数 = AA
係数 = 0x00BBCCDD
ターゲット = 係数 × 2^(8 × (指数 - 3))
難易度は2,016ブロックごと(約2週間ごと)にリターゲットされる。前の2,016ブロックが予想20,160分より速く採掘されればターゲットが減少(難易度上昇)、遅ければターゲットが増加(難易度減少)する。調整は急激な変動を防ぐため両方向とも最大4倍に制限される。
ノンス(4バイト)
ノンス(一度使用される数)は、マイナーが有効なプルーフ・オブ・ワークを見つけるために反復するフィールドだ。0から開始して2³²(約43億)の可能な値すべてを増加させながら、各ノンス値に対してSHA-256d(ヘッダー)を計算し、結果がターゲットより低いか確認する。
現代のマイニングハードウェアが毎秒数百テラハッシュ(TH/s)を処理するため、4バイトのノンス空間は1秒もかからず使い果たされる。マイナーは新しいノンス探索空間を作るために他のヘッダーフィールドを変更する必要がある:
- タイムスタンプ:1秒ずつ増加可能
- コインベースの追加ノンス:コインベーストランザクションを変更するとマークルルートが変わり、まったく新しい探索空間が生まれる
実際のブロックヘッダーの16進数分析
ブロック000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f — サトシ・ナカモトが2009年1月3日に採掘したジェネシスブロック(ブロック0)を解剖しよう。
生の80バイトヘッダー(16進数):
01000000 # バージョン: 1
0000000000000000000000000000000000000000
00000000000000000000000000000000 # 前ブロックハッシュ: すべてゼロ(前身なし)
3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3
888a51323a9fb8aa4b1e5e4a # マークルルート
29ab5f49 # タイムスタンプ: 1231006505 (2009-01-03 18:15:05 UTC)
ffff001d # ビット: 0x1d00ffff(初期難易度)
1dac2b7c # ノンス: 2083236893
バージョン 01000000 → 整数1のリトルエンディアン。ブロックバージョン1。
前ブロックハッシュ 0000...0000 → 32バイトのゼロ。ジェネシスブロックには前身がない。チェーンでこのフィールドがすべてゼロの唯一のブロック。
タイムスタンプ 29ab5f49 → 0x495fab29のリトルエンディアン = 1231006505(10進数)。2009年1月3日土曜日18:15:05 UTC。ビットコインが誕生した瞬間だ。
ビット ffff001d → 0x1d00ffffのリトルエンディアン。ビットコインが使用した最も簡単なターゲットをエンコード — 単一マイナーのネットワークに適切。
ノンス 1dac2b7c → 0x7c2bac1dのリトルエンディアン = 2083236893(10進数)。サトシはターゲットより低いハッシュを生成するものを見つけるまで20億以上のノンス値を反復した。
ブロックボディ
ヘッダーの下に実際のトランザクションを含むブロックボディがある。
コインベーストランザクション
すべてのブロックの最初のトランザクションはコインベーストランザクション(生成トランザクションとも呼ばれる)だ。これはビットコインで新しいコインを作成する唯一のトランザクションタイプ — 実際の入力がなく、ブロック報酬をマイナーに付与する出力を生成する。
入力:特別な属性を持つ単一入力:
- 前トランザクションハッシュ:32バイトのゼロ — 消費する前のトランザクションがない
- 前出力インデックス:0xFFFFFFFF — 実際の出力参照ではないことを示す最大値
- コインベースデータ:最大100バイトの任意データ。BIP-34以降、最初のバイトはブロック高をエンコードする必要がある
サトシはジェネシスブロックのコインベースデータに「The Times 03/Jan/2009 Chancellor on brink of second bailout for banks」というテキストを埋め込んだ — タイムスタンプの証拠であり、ビットコインが置き換えるよう設計された通貨システムに対する政治的声明だ。
出力:ブロック報酬は半減スケジュールに従う:
- ブロック0-209,999:50 BTC
- ブロック210,000-419,999:25 BTC
- ブロック420,000-629,999:12.5 BTC
- ブロック630,000-839,999:6.25 BTC
- ブロック840,000-1,049,999:3.125 BTC(2026年現在のエポック)
コインベーストランザクションには特別な成熟ルールがある:出力はそのブロックの上に100の追加ブロックが採掘されるまで消費できない。
証人データとSegWit
SegWit(Segregated Witness)は2017年8月にアクティベートされ、ブロック内のトランザクションデータの編成方法を根本的に変更した。SegWit以前は署名(証人)データがトランザクション入力に直接埋め込まれていた。SegWitはこのデータを別の「証人」構造に移動させた。
SegWitブロックはコインベーストランザクションに証人コミットメントを含む。これは各ブロック内に2つの並列マークルツリーを作成する:
- トランザクションマークルツリー(ヘッダー内):証人データを含まないtxidで構築
- 証人マークルツリー(コインベース内):証人データを含むwtxidで構築
この分離はトランザクション展性問題を解決した:txidが署名データを含まないため、第三者が署名を変更してtxidを改変できない。これは信頼性の高い支払いチャネル構築(ライトニングネットワーク)の前提条件だった。
ブロックサイズ vs ブロックウェイト
SegWit以前、ビットコインはブロックサイズに1MB(1,000,000バイト)のハード制限を適用していた。SegWitはバイトベースのサイズ制限をウェイトベースのシステムに置き換えた:
ブロックウェイト = (非証人データ × 4)+(証人データ × 1)
最大ブロックウェイトは4,000,000ウェイトユニット(4 MWU)だ。
この公式は証人データに非証人データ比75%の割引を与える。根拠:
- 非証人データ(入力、出力、金額)はUTXOセットに永続的に保存する必要があり、ノードの処理コストが高い
- 証人データ(署名)は初期検証にのみ必要で、その後プルーニング可能
仮想サイズ(vsize)
手数料計算にはvsize(仮想バイト、vbytes)を使用する:
vsize = ウェイト / 4(切り上げ)
手数料率はvbyteあたりのサトシ(sat/vB)で表される。
コンパクトブロック(BIP-152)
2016年、BIP-152はネットワーク全体で新しいブロックを伝播するために必要な帯域幅を劇的に削減するコンパクトブロックリレーを導入した。
コンパクトブロックの動作:
- 送信ノードがブロックヘッダー、短縮トランザクションIDリスト(6バイトの切り詰めハッシュ)、コインベーストランザクションを含むコンパクトブロックメッセージを送信
- 受信ノードが短縮IDを自分のメモリプール内のトランザクションとマッチング
- 受信者が不足トランザクションの完全なトランザクションデータを要求
- 受信者がメモリプールのトランザクションと要求した不足トランザクションからフルブロックを再構築
実際には新しいブロック内のほとんどのトランザクションが受信ノードのメモリプールにすでにあるため、コンパクトブロックはブロックリレー帯域幅を約90%削減する。
経済的対象としてのブロック
技術的構造を超えて、ブロックは経済的現実を表す。ブロックを生成するマイナーは経済的決定を下す:どのトランザクションを含めるか(手数料最大化)、どれだけの計算作業を投資するか(エネルギーコスト vs 期待報酬)。
ブロックヘッダーに埋め込まれたプルーフ・オブ・ワークは単なる技術的メカニズムではない — エネルギー支出の偽造不可能な記録だ。ターゲットより低い有効なハッシュを生成するノンスは数十億回のハッシュ計算を代表し、それぞれが実際の電力を消費する。
すべてのブロックは2009年1月3日以降継続的に成長してきた追記専用台帳の一章だ。ツイートより小さい80バイトのヘッダーがチェーン全体のセキュリティの重みを支えている。その構造を理解することは、トラストレスなデジタルマネーの基盤を理解することだ。