ビットコイン・インスティテュート

ビットコインの​アーキテクチャー進化 — サトシ時代v0.1と​現行v27以降​基準の​比較

単一のモノリシックなブロックが、光る分岐点を経て6つの相互接続されたモジュールへ枝分かれし、下部に年表のドットが並ぶ技術図。

本ページの位置付け

本ページは設計文書シリーズのL2 #9「アーキテクチャー進化(サトシ時代vs v27+)」である。3つの横断的深掘りの最初。各L1ページが1つのサブシステムを末尾に簡潔な「二時代比較」節を添えて端から端まで検証するのに対して、本ページはそれらの比較を8つのドメインすべてにわたって並置し、単一のドメインページでは提供できない分割アーキテクチャー図を追加する。

範囲。すべての比較は2つの固定参照点を使用する: サトシのv0.1リリース(2009年1月8日)と現行のBitcoin Core v27以降基準。中間バージョンは構造的変更を導入した場合にのみ言及する。

本ページは社会的・経済的層での設計のずれは扱わない。それらは設計意図と現実の分析で分析される。以下の各節には分割図(左がv0.1、右がv27以降)と比較表があり、L1の番号付けに対応する。

1. システム全体のアーキテクチャー

v0.1とv27以降の間で最も目に見える変化はアーキテクチャーの分解である。サトシはウォレット、マイナー、GUI、検証エンジン、ネットワーク層を1つのプロセスに融合した単一バイナリーをリリースした。その足元を支えていたのはBerkeley DBの索引とフラットブロックファイルである。現行のBitcoin Coreはこれらの関心事を異なるモジュール、プロセス、ストレージバックエンドに分離している。

v27 以降 — モジュール構成

bitcoind

(ノード)

P2P ネットワーク層

検証エンジン

メモリープール

ストレージ層

LevelDB

(UTXO セット + ブロックインデックス)

フラットファイル

(blk*.dat / rev*.dat)

bitcoin-wallet

(論理的に分離;

マルチプロセスは実験的)

SQLite

(記述子ウォレット)

bitcoin-qt

(任意の GUI)

外部マイナー

(getblocktemplate /

Stratum v2 経由)

v0.1 — モノリシック (2009 年 1 月)

単一バイナリ

(bitcoin.exe)

内蔵 GUI

(wxWidgets)

内蔵 CPU マイナー

検証 + 中継

ウォレット(ランダム鍵)

Berkeley DB

(索引 + ウォレット)

側面v0.1(2009年1月)v27以降基準
バイナリー単一実行ファイル: ウォレット + マイナー + GUI + ノードbitcoind(ノード)、bitcoin-wallet(ウォレット)、bitcoin-qt(GUI)— 別々のバイナリー
プロセスモデル1プロセス、1アドレス空間論理的に分離; マルチプロセスは実験的で既定ではない
データベースBerkeley DBが索引とウォレットを管理; ブロックデータはフラットファイルLevelDB(UTXOセット、ブロックインデックス)+ フラットファイル(ブロック)+ SQLite(ウォレット)
マイニング内部CPUマイナー、同一プロセスgetblocktemplate(BIP 22/23)経由の外部化; エコシステムではStratum v2
インターフェースリリース時はなし; JSON-RPCはv0.2.6(2010年2月)で追加JSON-RPC(完全な読み書き)、REST(読み取り専用)、ZMQ(プッシュ通知)
暗号ライブラリーOpenSSL(ECDSA/secp256k1); Crypto++(SHA-256)libsecp256k1(ECDSA/シュノア署名)、ハードウェアアクセラレーション付き内部SHA-256

2. ネットワーク層

v27 以降 — ネットワーク

DNS シードブートストラップ

addr / addrv2

(IPv4, IPv6, Tor,

I2P, CJDNS)

コンパクトブロック中継

(BIP 152、約 20 kB)

暗号化トランスポート

(BIP 324, ChaCha20)

全中継 8 +

ブロック中継専用 2 +

フィーラー + アンカー

v0.1 — ネットワーク

IRC ブートストラップ

(Freenode の #bitcoin)

addr メッセージ

(IPv4 のみ)

完全ブロック中継

(各ピアに ブロック全体)

平文 TCP

入方向も含め 15本に

なるまで 出方向を開く

機能v0.1v27以降基準主要なBIP / バージョン
ピア発見IRCチャネル + addrDNSシード + addrv2 + peers.datキャッシュBIP 155(addrv2、v0.21)
アドレス種別IPv4のみIPv4、IPv6、Tor v3、I2P、CJDNSBIP 155
アウトバウンドピア入方向も含めた接続が15本になるまで、出方向の接続を開く。出方向8本の固定は2010年8月から8フルリレー + 2ブロックリレー専用 + フィーラー + アンカーv19以降(ブロックリレー専用)
ブロック中継ブロック全体を、大きさにかかわらず各ピアに送信コンパクトブロック: ヘッダー + 短縮ID(約20 kB)BIP 152(v0.13)
トランスポート平文TCP日和見暗号化トランスポート(ChaCha20-Poly1305)BIP 324(v26、v27でデフォルト)
初期同期逐次: ブロックを1つずつヘッダー優先: 並列ブロックダウンロードv0.10
エクリプス攻撃耐性最小限アウトバウンドローテーション、多様な追い出し、アンカーピア、ブロックリレー専用ピアv19以降

詳細はL1 #1「P2Pネットワーク設計」 を参照。

3. トランザクション層

v27 以降 — トランザクション

SegWit 形式

(+ marker/flag +

witness フィールド)

ECDSA + Schnorr

(libsecp256k1)

P2PKH, P2SH, P2WPKH,

P2WSH, P2TR

署名は witness 内

(Schnorr: 64 バイト固定)

非展性 txid

(witness を除外)

v0.1 — トランザクション

レガシー形式

(バージョン + 入力 +

出力 + ロックタイム)

ECDSA のみ

(OpenSSL)

P2PK、P2PKH

署名は

scriptSig 内

(70–72 バイト DER)

展性のある txid

機能v0.1v27以降基準主要なBIP / バージョン
形式レガシー: バージョン + 入力 + 出力 + ロックタイムSegWit: + マーカー/フラグ + WitnessBIP 141(2017)
トランザクションID完全なシリアライズ済みトランザクションのSHA-256dtxidはWitnessを除外; wtxidは含むBIP 141
展性あり — 第三者がscriptSigを変更可能修正済み — Witnessがtxidから除外BIP 141
スクリプト種別P2PK、P2PKHP2PKH、P2SH、P2WPKH、P2WSH、P2TRBIP 16、141、341
署名方式ECDSA(OpenSSL経由)ECDSA + シュノア署名(libsecp256k1経由)BIP 340(2021)
オペコード完全セット(後に無効化されたものを含む)縮小セット; Tapscriptでは無効化されたオペコードがOP_SUCCESSxになるBIP 342
タイムロック絶対ロックタイムのみ絶対 + 相対(BIP 68)+ スクリプトレベル(OP_CLTV、OP_CSV)BIP 65、68、112、113
手数料置換nSequenceによる置き換え(手数料の仕組みではない)、2010年8月に無効化; 以降は先着順完全RBFがデフォルトBIP 125(v0.12任意選択; v24オプション追加; v28デフォルト)
コイン選択ちょうどの額、なければ無作為の部分和1,000回か目標額を上回る最小の硬貨(ナップサックの祖先)BnB + ナップサック + 単一ランダム抽選 + CoinGrinder; 無駄指標BnBはv0.17、単一ランダム抽選と無駄指標はv23、CoinGrinderはv27

詳細はL1 #2「トランザクション設計」 を参照。

4. ブロックとチェーン層

v27 以降 — ブロック構造

80 バイトヘッダー

(BIP 9 versionbits)

主マークルツリー +

witness コミットメント

(コインベース OP_RETURN 内)

4 MWU ウェイト上限

(バイトでは 最大 約4 MB)

80,000 sigops/ブロック

(ウェイト調整)

v0.1 — ブロック構造

80 バイトヘッダー

(バージョン 1)

単一マークルツリー

(完全直列化 tx)

明示的サイズ上限なし

(2010 年半ばに 1 MB 追加)

明示的な署名操作上限なし

(2010 年 9 月に 20,000 追加)

機能v0.1v27以降基準主要なBIP / バージョン
ヘッダー形式80バイト、バージョン180バイト、同一構造; BIP 9シグナリングビットBIP 9
ブロックバージョン常に1バージョンビット(0x20000000ベース + シグナルビット)BIP 9(2016)
マークルツリー完全なシリアライズ済みトランザクション上の単一ツリープライマリーツリー(ストリップ済みトランザクション)+ コインベース内のWitnessコミットメントBIP 141
サイズ制限v0.1では制限なし; 2010年に1 MB追加4 MWUウェイト制限BIP 141(2017)
Witnessディスカウント存在しないWitnessバイトは1/4ウェイト(1 WU対4 WU)BIP 141
コインベースデータ最大100バイトの任意データBIP 34: ブロック高の接頭辞が必須BIP 34(2013)
署名操作制限v0.1では制限なし; 2010年に20,000追加ブロックあたり80,000(ウェイト調整済み); Tapscriptのカウント方法は異なるBIP 141、342

詳細はL1 #3「ブロック・チェーン設計」 を参照。

5. コンセンサス層

v27 以降 — コンセンサス

SHA-256d プルーフオブワーク

(変更なし)

同一アルゴリズム

(off-by-one は合意規則

として保持)

最多ワークチェーン

(強化された nChainWork)

BIP 9 versionbits;

Speedy Trial(BIP 9 の変形)

assumevalid

(信頼ハッシュ以下では

スクリプト検証を

スキップ)

v0.1 — コンセンサス

SHA-256d プルーフオブワーク

難易度調整

(2,016 ブロックごと、

off-by-one バグ)

最長チェーン

(nBestHeight)

フラグデー有効化

(コード直接変更)

チェックポイントなし

(初のハードコードは

2010 年 7 月、v0.3.2)

機能v0.1v27以降基準主要なBIP / バージョン
ハッシュ関数SHA-256d(二重SHA-256)同一—
チェーン選択最長チェーン(ブロック高の比較、nBestHeight)最多ワークチェーン(nChainWork、v0.3.3以降)—
難易度調整2,016ブロックごと; オフバイワンバグ同一アルゴリズム; バグは保存(修正 = ハードフォーク)—
ソフトフォーク有効化直接コード変更(フラグデイ)BIP 9バージョンビット; TaprootはSpeedy Trial(BIP 9の変形)BIP 9
スクリプト検証scriptSig + scriptPubKeyの結合実行分離評価; SegWit Witnessプログラム; TapscriptBIP 141、342
タイムスタンプルール直前11ブロックの中央値(median-time-past)より大きい(v0.1から存在)同一の受理ルール; BIP 113がMTPをロックタイム評価にも拡張BIP 113
チェックポイントv0.1にはなし; 2010年7月(v0.3.2)にハードコードされたチェックポイントを追加assumevalidがチェックポイント機能の大部分を置換v0.14以降

詳細はL1 #4「コンセンサス設計」 を参照。

6. 貨幣・インセンティブ層

v27 以降 — 貨幣

3.125 BTC 新規発行分

(期 4、2024 年半減後)

手数料率オークション

(sat/vB)

外部マイナー

(getblocktemplate / Stratum v2)

手数料率で並べた

テンプレート

(SegWit ウェイト計算付き)

v0.1 — 貨幣

50 BTC 新規発行分

(期 0)

大半の

トランザクションが無料

(コイン年齢

による優先度)

内部 CPU マイナー

単純な

ブロックテンプレート

機能v0.1v27以降基準主要なBIP / バージョン
総供給量上限20,999,999.9769 BTC同一 — コンセンサスで凍結された定数—
新規発行分の計算nSubsidy >>= (nHeight / 210000)同一の演算; シフト64以上のゼロガード—
手数料の挙動大半のトランザクションは無料; コイン年齢による優先度手数料率オークション(sat/vB); コイン年齢優先度は廃止—
CPFP未実装祖先認識メモリープール; パッケージ評価v0.13以降
ブロックテンプレート内部マイナー; 素朴な順序getblocktemplate(BIP 22/23); 手数料率順ソートBIP 22、23
Witnessディスカウント存在しないWitnessバイトは1/4ウェイトBIP 141

詳細はL1 #5「貨幣設計」 を参照。

7. 暗号層

v27 以降 — 暗号

libsecp256k1

(定時間)

ECDSA + Schnorr

圧縮鍵

(33 バイト);

x-only (32 バイト、Taproot)

DER (ECDSA) +

固定 64 バイト (Schnorr)

RFC 6979 決定性

(ECDSA); BIP 340 合成

(Schnorr)

Base58Check + Bech32

(bc1q...) + Bech32m

(bc1p...)

HD 導出

(BIP 32/44/84/86);

記述子ウォレット

v0.1 — 暗号

OpenSSL

(ECDSA、ハッシュ)

+ Crypto++(採掘 SHA-256)

ECDSA のみ

非圧縮公開鍵

(65 バイト)

DER エンコード

(可変、70〜72 バイト)

OpenSSL PRNG による

ナンス生成

Base58Check

(P2PKH: 1...)

独立したランダム鍵

(非決定性)

機能v0.1v27以降基準主要なBIP / バージョン
暗号ライブラリーOpenSSLlibsecp256k1(定時間演算)v0.10(2015年、署名); v0.12(2016年、検証)
署名方式ECDSAのみECDSA(レガシー/SegWit v0)+ シュノア署名(Taproot)BIP 340(2021)
鍵形式非圧縮公開鍵(65バイト)圧縮(33バイト); x-only(32バイト、Taproot)BIP 340
署名展性あり — s値を変更可能Low-Sルール(BIP 146)でECDSAを制限; シュノア署名は展性なしBIP 146
ナンス生成OpenSSL擬似乱数生成器RFC 6979決定性(ECDSA); BIP 340合成(シュノア署名)RFC 6979
ハッシュ関数SHA-256d、RIPEMD-160はOpenSSL経由; 採掘SHA-256は同梱Crypto++同一アルゴリズム; ハードウェアアクセラレーション付き内部実装(SHA-NI、ARMv8-A)—
署名ハッシュアルゴリズムレガシー署名ハッシュ(入力数に対して二次的)BIP 143(SegWit v0、線形)+ BIP 341(Taproot、エポックタグ付き)BIP 143、341

詳細はL1 #6「暗号設計」 を参照。

8. ストレージ層

v27 以降 — ストレージ

LevelDB(UTXO セット +

ブロックインデックス)+ フラットファイル

(ブロック + undo データ)

未使用出力のみ

(outpoint インデックス)

専用 undo ファイル

(rev*.dat、

高速ロールバック用)

剪定(最小 550 MiB)+

assumeUTXO ブートストラップ

v0.1 — ストレージ

Berkeley DB

(索引 + ウォレット;

ブロックは

フラットファイル)

完全トランザクションを

保存

(使用済み + 未使用)

undo データなし

(使用済みも BDB に残し、

再編成で

使用済みの印を外す)

剪定なし

(全件保存)

機能v0.1v27以降基準主要バージョン
主要データベースBerkeley DB(索引 + ウォレット)LevelDB(UTXOセット + ブロックインデックス); フラットファイル(ブロック)v0.8(2013)
UTXOストレージ使用済みフラグベクトル付きの完全なトランザクション未使用出力のみ; アウトポイント索引、コンパクトシリアライズv0.8
コインキャッシュ分離キャッシュなし; BDBが読み書きを処理専用メモリー上ライトバックキャッシュ(デフォルト450 MiB)v0.15以降
ブロック保存フラットファイル(blk*.dat)、約2 GBでローテーション順次フラットファイル(blk*.dat、各約128 MiB)v0.8
アンドゥデータ不要; 使用済みのトランザクションもBDBの索引に残り、再編成では使用済みの印を外すだけ専用rev*.datファイルで高速ロールバックv0.8
剪定不可利用可能; 最低保持量550 MiBv0.11(2015)
assumeUTXOなしスナップショットベースのブートストラップ、バックグラウンド検証付きv26(loadtxoutset); v28(本番のスナップショット)
ディスクサイズ無視できる程度(チェーンが極めて小さかった)アーカイブでブロックだけ約774 GB(2026年10月); 剪定で約10 GB—

詳細はL1 #7「ストレージ設計」 を参照。

9. ウォレットとインターフェース層

v27 以降 — ウォレット

論理的に分離

(マルチプロセスは

実験的)

記述子ウォレット

(決定論的導出)

SQLite

(wallet.dat、

新形式)

一度のシードバックアップ

(全導出鍵をカバー)

手数料推定 +

RBF + PSBT ワークフロー

v0.1 — ウォレット

ノードバイナリ内に埋込み

(インターフェース

境界なし)

独立したランダム鍵

(100 鍵の予備は

v0.3.14、2010 年 10 月から)

Berkeley DB

(wallet.dat)

バックアップ = ファイルエクスポート

(バックアップ後の新鍵は

復元不可)

手数料推定なし

(大半のトランザクション

は無料)

機能v0.1v27以降基準主要なBIP / バージョン
アーキテクチャー単一バイナリーに組み込み論理的に分離; マルチプロセスは実験的で既定ではないv27以降
鍵生成独立したランダム鍵; 100鍵の予備はv0.3.14(2010年10月)から記述子ウォレット: マスターシードからの決定性導出BIP 380以降(v23でデフォルト)
鍵ストレージBerkeley DB(wallet.dat)SQLite(新形式のwallet.dat)v26(新規ウォレットでBDB非推奨)
バックアップモデル新しい鍵の生成後に毎回ファイルをエクスポート記述子バックアップがすべての導出鍵をカバー(生のBIP 32シード、BIP 39ではない)BIP 32 + 記述子
署名内部、同一プロセス内部、PSBT(BIP 174/370)、またはハードウェアウォレット(HWI経由)BIP 174(2018)
マルチデバイス署名サポートなしPSBTワークフロー: 作成 → 更新 → 署名 → 結合 → 完成BIP 174、370
手数料引き上げ不可手数料置換(bumpfee)、CPFPBIP 125
インターフェースリリース時はなし; JSON-RPCはv0.2.6(2010年2月)で追加JSON-RPC(完全)、REST(読み取り専用)、ZMQ(プッシュ通知)—
プロセスモデルモノリシック(ウォレット + ノード + マイナー + GUI)モジュラー: bitcoind、bitcoin-wallet、bitcoin-qtv27以降

詳細はL1 #8「ウォレット設計」 を参照。

10. 構造的移行タイムライン

2009–2010v0.1 (2009 年 1 月)モノリシックバイナリ、BDB、IRC、CPUマイナー、OpenSSL1 MB 上限の適用 (2010年 9 月)ブロックサイズ上限、オペコード無効化2012–2013v0.8 (2013 年 3 月)BDB → LevelDB、フラットブロックファイル、 undoデータ2015–2017v0.10 (2015)ヘッダー先行同期、libsecp256k1SegWit — BIP 141(2017 年 8 月)Witness フィールド、4MWU、非展性 txid2018–2021BIP 174 (2018)PSBT ワークフローTaproot — BIP 341(2021 年 11 月)Schnorr、tapscript、鍵/スクリプトパス2023–2025v26 (2023)BIP 324暗号化トランスポート、BDB 非推奨v27 基準 (2024)v2 暗号化トランスポートが既定v28 (2024)完全 RBF が既定、本番の assumeUTXOスナップショットv30 (2025)BDB のレガシーウォレットを撤去アーキテクチャー上のマイルストーン: v0.1 → v27 以降

11. 変わったものと変わらなかったもの

17年にわたる開発が実装を一変させたが、コンセンサスの核心はサトシがリリースした当時のまま正確に残っている。

v0.1以来不変のもの:

  • SHA-256dプルーフオブワーク
  • 2,016ブロック難易度調整(オリジナルのオフバイワンバグを含む)
  • UTXOモデル
  • 2,100万枚の供給上限
  • 210,000ブロック半減期
  • コインベース成熟期間(100ブロック)
  • secp256k1曲線
  • 10分のターゲットブロック間隔
  • 許可不要の参加

v0.1以来変革されたもの:

  • ストレージエンジン(BDB索引 + フラットブロックファイル → LevelDB索引 + フラットファイル + SQLiteウォレット)
  • 暗号ライブラリー(OpenSSL → libsecp256k1)
  • 署名方式(ECDSAのみ → ECDSA + シュノア署名)
  • ブロック容量(制限なし → 1 MB → 4 MWU)
  • トランザクション形式(レガシー → SegWit)
  • スクリプトシステム(全オペコード + 結合実行 → 縮小セット + 分離評価 + Tapscript)
  • 鍵管理(独立したランダム鍵 → HD導出 + 記述子)
  • ピアトランスポート(平文 → 暗号化)
  • ピア発見(IRC → DNSシード + addrv2)
  • マイニングインターフェース(内部CPU → getblocktemplate経由の外部化)
  • 初期同期(逐次 → ヘッダー優先 + assumeUTXO)
  • 手数料市場(無料 → RBF/CPFP付き手数料率オークション)
  • プロセスアーキテクチャー(モノリシック → モジュラー)
  • ソフトフォーク有効化(フラグデイ → BIP 9バージョンビット)
  • チェーン選択ルール(ブロック高のみの比較、nBestHeight → 最多ワークチェーン、nChainWork)

このうちHD鍵導出、SegWit、ECDSAからシュノア署名への移行、そしてlibsecp256k1自体の4項目は、一人の人物にたどり着く。ピーター・ウィーユはBIP 32、BIP 141、BIP 340/341を単独または共同で執筆し、2013年にlibsecp256k1を立ち上げた。

12. 本ページの範囲

本ページはすべてのドメインにわたって2つの参照点を比較するが、ドメインページの代替にはならない。各サブシステムの完全な解説は、上記各節の末尾にリンクしたL1ページを参照。

範囲外:

Windowsの開発環境の分析は、同じずれをツールチェーンから読んでいる。

参照元の外部ソース

https://bitcoin.org/bitcoin.pdf