
はじめに
本ページは設計文書シリーズのL1 #2 — トランザクション設計である。トランザクション層を端から端まで解説する。価値がどのように表現され、転送され、ロックされ、アンロックされるかを扱う。マイニングのインセンティブ、ブロック重量、手数料市場、ウォレットの使い勝手など、ビットコインのあらゆる要素は、ここで解説する構造の上に成り立っている。
これらの概念がはじめての方は、ビットコインを持つとは、実際どういうことかがUTXO・鍵・トランザクションを事前知識ゼロで紹介している。本ページは同じトランザクション層を、そちらでは扱わないBitcoin Scriptの仕組みも含めて設計文書として扱う。このForthベースのScriptシステムが最初に実装されたv0.1ソースそのものは、Forensicxsによる2024年のコードウォークスルーがたどっている。
トランザクション層は3つの疑問に答える:
- コインとは何か? 未使用トランザクション出力 (UTXO) であり、口座残高ではない。
- 有効な支払いとはどのような形式か? 既存のUTXOを消費し、暗号署名で認可を証明し、新しいUTXOを作成するトランザクション。
- 認可はどのように表現されるか? ロック条件とアンロック条件を評価するスタックベース言語、ビットコインスクリプトによって表現される。
サトシ時代の実装(v0.1、2009年1月)と現行のBitcoin Core(v27以降基準)で挙動が異なる場合は、両方を記す。
v0.1のトランザクション経路をソースでたどる
v0.1のソースコードを読むと、UTXOモデルが具体的な処理として見えてくる。固定コミット4184ab2のsrc/main.h 193–363行にあるCTransactionは入力、出力、ロックタイムを保持し、src/main.cpp 772–854行のConnectInputsは参照された各出力をたどり、未成熟のコインベースを拒否し、署名を検証し、出力が使用済みか確認し、使用済みとして記録し、入力額から出力額を引いて手数料を計算する。スクリプト側は別の経路だが、接続している。src/script.cpp 692–901行のOP_CHECKSIGは署名対象のスクリプトから署名自体を取り除き、レガシー署名ハッシュを構成し、そのダイジェストを公開鍵に対して検証する。
これらの参照箇所が記録するのは2009年1月の実装であり、現行Bitcoin Coreが同じ内部コード経路をたどるという主張ではない。そのため、後続の節ではv0.1と現行基準を分けて記載する。
別のv0.1直列化境界分析では、トランザクション・ブロック・署名ハッシュに入るバイトと、ネットワーク・ディスク経路でオブジェクトが再利用される仕組みを対応付けている。
1. UTXOモデル
ビットコインは残高を追跡しない。代わりに、すべてのトランザクションが1つ以上の離散的な出力を作成し、各出力は特定の金額とロック条件を持つ。後のトランザクションでまだ消費されていない出力が未使用トランザクション出力 (UTXO) である。ある時点でのすべてのUTXOの集合が、誰が何を支払えるかの完全な全体像となる。
UTXOライフサイクル
「コイン」とは単にUTXOセットの1エントリーであり、ウォレットの「残高」はアンロック可能な全UTXOの合計にすぎない。
UTXOモデルとアカウントモデルの比較
| 特性 | UTXOモデル (ビットコイン) | アカウントモデル (イーサリアム) |
|---|---|---|
| 状態表現 | 離散的な未使用出力の集合 | アドレスから残高へのマッピング |
| 支払い | UTXO全体を消費し、新しいUTXOを作成(おつりを含む) | 送信者の残高を減額、受信者の残高を増額 |
| プライバシー | 各トランザクションで新しいアドレスを使用可能。出力は既定でリンク不能 | アドレスに履歴が蓄積。残高がアカウント単位で可視 |
| 並列検証 | 入力は異なるUTXOを参照 — 異なるUTXOに触れるトランザクションは独立して検証可能 | アカウントごとのナンス順序が逐次依存を生む |
| 二重支払い検出 | 参照されたUTXOが存在し未使用であることを検査 | 送信者のナンスが正しく残高が十分であることを検査 |
| 状態サイズ | 未使用出力とともに成長(2026年10月に約1億6,600万UTXO) | アカウントとコントラクトストレージとともに成長 |
| おつり出力 | 入力合計が支払額を超える場合に必要 | 不要。残高はその場で調整 |
2. トランザクション構造
トランザクションは、1つ以上の既存UTXO(入力)を消費し、1つ以上の新しいUTXO(出力)を作成する署名済みメッセージである。入力値合計と出力値合計の差がトランザクション手数料となり、そのトランザクションをブロックに含めるマイナーが徴収する。
トランザクションの構造
フィールド別の詳細
| フィールド | サイズ | 説明 |
|---|---|---|
| バージョン | 4バイト | トランザクション形式のバージョン。v1が標準。v2はBIP 68の相対的タイムロックを有効化。 |
| マーカー + フラグ | 2バイト | SegWit識別子 (0x00 0x01)。従来型トランザクションには存在しない。 |
| 入力数 | 可変長整数 | 入力の数。 |
| 入力 | 可変長 | 各入力: 前のトランザクションID (32バイト) + 出力インデックス (4バイト) + scriptSig (可変長) + シーケンス (4バイト)。 |
| 出力数 | 可変長整数 | 出力の数。 |
| 出力 | 可変長 | 各出力: サトシ単位の金額 (8バイト) + scriptPubKey (可変長)。この金額フィールドの検証漏れ (整数オーバーフロー) により、2010年8月のあるトランザクションが1,844億BTCを鋳造した。その事件を受けてv0.3.10が追加したCheckTransaction() の出力ごと・出力合計の上限規則はこの事件の構造分析を参照。 |
| 証人 | 可変長 | 入力ごとの証人スタック。SegWitトランザクションにのみ存在。 |
| ロックタイム | 4バイト | トランザクションがブロックに含まれ得る最早の時刻またはブロック高。 |
サトシ時代とv27以降基準: トランザクション形式
| 側面 | サトシ時代 (v0.1) | 現行Bitcoin Core、v27以降基準 |
|---|---|---|
| 形式 | 従来型: バージョン + 入力 + 出力 + ロックタイム | SegWit: バージョン + マーカー/フラグ + 入力 + 出力 + 証人 + ロックタイム |
| 証人データ | 存在しない。署名はscriptSigに埋め込み | 証人フィールドに分離 (BIP 141) |
| トランザクションID | トランザクション全体の直列化のSHA-256d | txidは証人データを除外。wtxidは証人データを含む |
| 展性 | あり — 第三者がscriptSigを変更してもトランザクションは無効にならない | 修正済み — 証人はtxid計算から除外 |
| バージョン | 常に1 | v1またはv2。v2は相対的タイムロック (BIP 68) を有効化 |
3. ビットコインスクリプト
ビットコインのトランザクションは公開鍵に直接ロックされるのではない。代わりに、各出力はロックスクリプト(scriptPubKey)と呼ばれる小さなプログラムを持ち、各入力はロック条件を満たすアンロックスクリプト(scriptSigまたは証人データ)を提供する。ビットコインスクリプトはこれらのプログラムが書かれるスタックベース言語である。
スクリプト評価フロー
インタープリターはオペコードを順次処理する。データ項目をスタックにプッシュし、スタック要素を消費・生成する操作を実行する。すべてのオペコード処理後にスタック最上位の要素がゼロでない(真)であれば、支払いは有効である。
一般的なスクリプトパターン
| パターン | 導入時期 | ロック機構 | 代表的な用途 |
|---|---|---|---|
| P2PKH (公開鍵ハッシュ宛支払い) | v0.1 (2009年) | 公開鍵のハッシュ。支払者は鍵 + ECDSA署名を提供 | 1で始まる従来型アドレス |
| P2SH (スクリプトハッシュ宛支払い) | BIP 16 (2012年) | 償還スクリプトのハッシュ。支払者はスクリプト + 満たすデータを提供 | マルチシグ、ラップされたSegWit。3で始まるアドレス |
| P2WPKH (証人公開鍵ハッシュ宛支払い) | BIP 141 (2017年) | 証人プログラムv0、20バイトの鍵ハッシュ。署名は証人内 | bc1qで始まるネイティブSegWitアドレス |
| P2WSH (証人スクリプトハッシュ宛支払い) | BIP 141 (2017年) | 証人プログラムv0、32バイトのスクリプトハッシュ。証人がスクリプト + データを提供 | ネイティブSegWitマルチシグおよび複雑なスクリプト |
| P2TR (Taproot宛支払い) | BIP 341 (2021年) | 証人プログラムv1、32バイトの調整済み公開鍵。鍵パスまたはスクリプトパスで支払い | bc1pで始まるTaprootアドレス |
スクリプトの進化: v0.1からv27以降へ
| 側面 | サトシ時代 (v0.1) | 現行Bitcoin Core、v27以降基準 |
|---|---|---|
| 利用可能なオペコード | OP_CAT、OP_MUL、OP_LSHIFT等を含む完全な集合 | 多数を無効化(2010年のセキュリティパッチ)。Tapscript (BIP 342) は無効化されたオペコードを、将来のソフトフォークのためのOP_SUCCESSxにした |
| スクリプト型 | P2PKとP2PKHのみ | P2PKH、P2SH、P2WPKH、P2WSH、P2TR |
| 実行モデル | scriptSig + scriptPubKeyを連結して実行 | 分離された評価。証人プログラムは独自の検証規則を持つ |
| サイズ制限 | リリース時は上限なし。10,000バイトのスクリプトサイズ上限と201オペコード上限はv0.3.7(2010年7月)で追加 | 同じ基本制限。Tapscriptでは署名操作回数の計算方法を緩和 |
4. 署名方式
暗号署名は、支払者がUTXOのロック条件に対応する秘密鍵を管理していることを証明するメカニズムである。ビットコインはその歴史を通じて2つの署名方式を使用してきた。
ECDSAとシュノアの比較
| 特性 | ECDSA (secp256k1) | シュノア (BIP 340) |
|---|---|---|
| 導入 | v0.1 (2009年) | Taproot有効化 (2021年) |
| 楕円曲線 | secp256k1 | secp256k1(同一の曲線) |
| 署名サイズ | 70〜72バイト(DER符号化) | 64バイト(固定長) |
| 検証 | 署名ごとに1つの方程式 | 署名ごとに1つの方程式。一括検証可能 |
| 鍵集約 | ネイティブ非対応 | MuSig2によりn-of-n集約で単一の鍵と署名に統合可能 |
| 線形性 | 非線形 — 集約に複雑なプロトコルが必要 | 線形 — s₁ + s₂ が結合鍵の有効な署名 |
| 証明可能な安全性 | 離散対数問題を超えた追加の仮定に依存 | ランダムオラクルモデルでの離散対数仮定の下で証明可能 |
| ライブラリ | 当初OpenSSL。libsecp256k1に移行 | libsecp256k1(同一ライブラリ、シュノアモジュール) |
署名と検証のフロー
支払者は署名する前にトランザクション(入力、出力、ロックタイム)を構築する。受信側では、検証ノードがダイジェストを再計算する前に、支払いが一致すべき公開鍵を特定する。Taprootの鍵パス支払いでは前の出力のロックスクリプトから、P2PKHやP2WPKHでは入力自身のアンロックデータから特定する。
5. SegWitとTaproot
SegWit(Segregated Witness、2017年)とTaproot(2021年)は、ビットコインのトランザクション形式に対する誕生以来最大の2つの構造的変更である。どちらも後方互換性のあるソフトフォークである。Mt. Goxは2014年2月に出金を止めたとき、以下で述べる修正が塞ぐトランザクション展性を理由に挙げた。しかし、その前の1年あまりのネットワークの調査では、閉鎖前に展性攻撃が広く使われた形跡はなかった。
構造比較
主要な革新
| 革新 | 仕組み | 利点 |
|---|---|---|
| 証人ディスカウント | 証人バイトは1/4の重量で計算 (4 WUではなく1 WU) | 署名の多いトランザクションの実効手数料を削減。データを証人に移すインセンティブ |
| トランザクション展性の修正 | 証人をtxid計算から除外 | 信頼性のあるトランザクション連鎖が可能に (Lightning Networkの前提条件) |
| スクリプトバージョニング | 証人バージョンフィールドにより新規スクリプト規則をソフトフォークで導入可能 | 将来のアップグレード(Taproot自体が証人v1を使用)が既存ノードを壊さない |
| 鍵パス支払い | 単一のシュノア署名で出力鍵を直接検証 | マルチシグ、タイムロック、複雑な条件がすべてチェーン上では単一鍵の支払いに見える — 最大限のプライバシー |
| スクリプトパス支払い (MAST) | 代替スクリプトのマークルツリー。実行された分岐のみが公開される | 複雑なコントラクトが使用したパスだけを露出。未使用の分岐はプライベートなまま |
| 一括検証の可能性 | シュノア署名は線形に集約可能 | ノードが複数の署名を個別検証より高速に検証できる |
6. コイン選択
ウォレットがトランザクションを構築する際、入力としてどのUTXOを支払うかを選択する必要がある。これがコイン選択問題である。この選択はトランザクションサイズ(したがって手数料)、プライバシー(どのUTXOがチェーン上でリンクされるか)、ウォレットのUTXOプールの将来の形状に影響する。
| 戦略 | アプローチ | トレードオフ |
|---|---|---|
| 最大額優先 | 支払いをカバーする最大のUTXOを選ぶ | 単純で統合傾向。ウォレット残高を暴露する大きなおつり出力を生む |
| 分岐限定法 (BnB) | 完全一致の組み合わせを探索(おつり出力不要) | おつり出力を排除し約34バイト節約。完全一致がなければ失敗 |
| ナップサック | 支払額 + 最小おつりを目標にランダム選択 | BnB失敗時のフォールバック。微小おつりが生じる可能性 |
| コインコントロール | ユーザーが支払うUTXOを手動選択 | 最大限のプライバシー制御。ユーザーの専門知識が必要 |
| 無駄指標 (v23以降) | 現在と長期的な手数料コストおよびおつりコストで候補を評価 | 即時の手数料と将来のおつりUTXO支払いコストのバランスを取る |
現行のBitcoin Core(v27以降基準)は複数のアルゴリズム(BnB、ナップサック、単一無作為抽出、手数料率が高いときはCoinGrinder)を走らせ、無駄が最も少ない結果を採る。サトシのv0.1のSelectCoinsはナップサックの祖先である。ちょうどの額の硬貨があればそれを使い、なければ小さい硬貨の部分和を無作為に1,000回試した最良の組み合わせと、目標額を上回る最小の硬貨1枚とを比べた。
7. 二時代比較
| 機能 | サトシ時代 (v0.1、2009年1月) | 現行Bitcoin Core、v27以降基準 |
|---|---|---|
| 価値表現 | UTXO(未使用トランザクション出力) | 同一 |
| トランザクション形式 | 従来型(バージョン + 入力 + 出力 + ロックタイム) | SegWit(+ マーカー/フラグ + 証人) |
| トランザクションID | 完全直列化トランザクションのSHA-256d | txid(証人除外)+ wtxid(証人含む) |
| スクリプト型 | P2PK、P2PKH | P2PKH、P2SH、P2WPKH、P2WSH、P2TR |
| 署名方式 | OpenSSL経由のECDSA | ECDSA + シュノア(libsecp256k1経由) |
| 署名サイズ | 70〜72バイト (DER) | ECDSA: 70〜72バイト。シュノア: 64バイト(固定長) |
| 鍵集約 | 利用不可 | MuSig2(n-of-nシュノア集約) |
| オペコードの利用可能性 | 完全な集合(後に無効化されたオペコードを含む) | 縮小された集合。Tapscriptでは無効化されたオペコードがOP_SUCCESSxになる |
| 展性 | 脆弱 — 第三者がscriptSigを変更可能 | 修正済み — 証人はtxidから除外 |
| 重量/サイズ制限 | トランザクション単位の重量なし。2010年にブロックサイズ上限を追加 | 最大400,000 WUの標準トランザクション重量 |
| タイムロック | 絶対ロックタイムのみ(ブロック高またはUnix時刻) | 絶対(ロックタイム)+ 相対 (BIP 68シーケンス) + スクリプトレベル (OP_CLTV、OP_CSV) |
| 手数料引上げによる置換 | v0.1ではnSequenceで未承認トランザクションを置き換えられた(手数料の仕組みではない)。サトシが2010年8月のコミットで無効化し(v0.3.12で公開)、理由は「攻撃対象領域を減らすためだけ」だった。以降は先着順ポリシー | オプトインRBF(BIP 125、v0.12)。-mempoolfullrbfはv24.0で追加され、完全RBFはv28.0以降の既定ポリシー |
| 手数料推定 | なし(実質的にトランザクションは無料) | estimatesmartfee — バケットベースのメモリープール手数料推定 |
| コイン選択 | ちょうどの額、なければ無作為の部分和1,000回か目標額を上回る最小の硬貨(ナップサックの祖先) | BnB、ナップサック、単一無作為抽出、CoinGrinderを無駄指標で選ぶ |
| 暗号ライブラリ | OpenSSL | libsecp256k1(定数時間、決定的ナンス) |
| UTXOストレージ | Berkeley DB | LevelDB(インメモリーキャッシュ付き、コインキャッシュ) |
8. 本ページの範囲
本ページはトランザクション層を独立して扱う。以下のトピックは本ページの範囲外であり、設計文書シリーズ内のそれぞれのドメインページで扱う:
- ブロック構造とマークルツリー: トランザクションがブロックにバッチされマークルルートでコミットされる仕組み。
- マイニングとプルーフ・オブ・ワーク: どのトランザクションがブロックチェーンに入るかを選択するインセンティブメカニズム。
- メモリープールポリシー: 中継規則、手数料率の下限、承認前のトランザクション伝播を制御するパッケージ中継。
- ネットワーク層のトランザクション中継:
inv、getdata、txメッセージがP2Pネットワーク上でトランザクションを伝播させる仕組み。 - Lightning Networkとペイメントチャネル: ここで説明したトランザクション基本要素の上に構築されるレイヤー2構成。
- ウォレットの鍵導出: ロックスクリプトで使用されるアドレスを生成するBIP 32/44/84/86のHD鍵ツリーとディスクリプターウォレット。
トランザクションは、他のすべての設計ページが触れる対象である。ブロックチェーン設計ではブロックの中身、暗号設計では署名とハッシュの消費者、貨幣設計ではコインベースと手数料の仕組み、P2Pネットワーク設計では伝播される中身、ストレージ設計ではUTXO集合を更新する単位、ウォレット設計では組み立てて署名する対象、エコシステム設計では手数料市場とライトニングが扱う単位である。
























