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

ビットコインの​トランザクション設計 — UTXOモデル、​スクリプト、​署名方​式

暗い紺色の技術図解で、金色のコインアイコンから帳簿状の枠、小窓、バツ印の枠へと矢印でつながる4段階のUTXO推移、入力枠と出力枠を並べたトランザクションの枠組み、南京錠アイコンから積み重なったバーへ向かう矢印、そしてギザギザの線と丸い弧を持つ2つの円形アイコンが収束する様子を描いている。

はじめに

本ページは設計文書シリーズのL1 #2 — トランザクション設計である。トランザクション層を端から端まで解説する。価値がどのように表現され、転送され、ロックされ、アンロックされるかを扱う。マイニングのインセンティブ、ブロック重量、手数料市場、ウォレットの使い勝手など、ビットコインのあらゆる要素は、ここで解説する構造の上に成り立っている。

これらの概念がはじめての方は、ビットコインを持つとは、実際どういうことかがUTXO・鍵・トランザクションを事前知識ゼロで紹介している。本ページは同じトランザクション層を、そちらでは扱わないBitcoin Scriptの仕組みも含めて設計文書として扱う。このForthベースのScriptシステムが最初に実装されたv0.1ソースそのものは、Forensicxsによる2024年のコードウォークスルーがたどっている。

トランザクション層は3つの疑問に答える:

  1. コインとは何か? 未使用トランザクション出力 (UTXO) であり、口座残高ではない。
  2. 有効な支払いとはどのような形式か? 既存のUTXOを消費し、暗号署名で認可を証明し、新しいUTXOを作成するトランザクション。
  3. 認可はどのように表現されるか? ロック条件とアンロック条件を評価するスタックベース言語、ビットコインスクリプトによって表現される。

サトシ時代の実装(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(出力)を作成する署名済みメッセージである。入力値合計と出力値合計の差がトランザクション手数料となり、そのトランザクションをブロックに含めるマイナーが徴収する。

トランザクションの構造

トランザクション

入力

入力 0 が

この出力を参照

前のトランザクション

出力 0

0.7 BTC

アリスにロック

出力

出力 0

額面(サトシ)

scriptPubKey

(ロックスクリプト)

出力 1

(送信者へのおつり)

額面

scriptPubKey

バージョン (4 バイト)

入力 0

前 txid + 出力インデックス

scriptSig または witness

シーケンス

入力 1

...

ロックタイム (4 バイト)

フィールド別の詳細

フィールドサイズ説明
バージョン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-256dtxidは証人データを除外。wtxidは証人データを含む
展性あり — 第三者がscriptSigを変更してもトランザクションは無効にならない修正済み — 証人はtxid計算から除外
バージョン常に1v1または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年)
楕円曲線secp256k1secp256k1(同一の曲線)
署名サイズ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年あまりのネットワークの調査では、閉鎖前に展性攻撃が広く使われた形跡はなかった。

構造比較

Taproot トランザクション (2021)

バージョン

マーカー + フラグ

入力

出力

(witness プログラム v1)

Witness

(鍵パス: 単一シュノア署名

スクリプトパス: 制御ブロック + スクリプト)

ロックタイム

SegWit トランザクション (2017)

バージョン

マーカー + フラグ

入力

(ネイティブでは scriptSig 空)

出力

(scriptPubKey)

Witness

(署名はここへ移動)

ロックタイム

レガシートランザクション (2009)

バージョン

入力

(scriptSig に署名)

出力

(scriptPubKey)

ロックタイム

主要な革新

革新仕組み利点
証人ディスカウント証人バイトは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-256dtxid(証人除外)+ wtxid(証人含む)
スクリプト型P2PK、P2PKHP2PKH、P2SH、P2WPKH、P2WSH、P2TR
署名方式OpenSSL経由のECDSAECDSA + シュノア(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を無駄指標で選ぶ
暗号ライブラリOpenSSLlibsecp256k1(定数時間、決定的ナンス)
UTXOストレージBerkeley DBLevelDB(インメモリーキャッシュ付き、コインキャッシュ)

8. 本ページの範囲

本ページはトランザクション層を独立して扱う。以下のトピックは本ページの範囲外であり、設計文書シリーズ内のそれぞれのドメインページで扱う:

  • ブロック構造とマークルツリー: トランザクションがブロックにバッチされマークルルートでコミットされる仕組み。
  • マイニングとプルーフ・オブ・ワーク: どのトランザクションがブロックチェーンに入るかを選択するインセンティブメカニズム。
  • メモリープールポリシー: 中継規則、手数料率の下限、承認前のトランザクション伝播を制御するパッケージ中継。
  • ネットワーク層のトランザクション中継: inv、getdata、txメッセージがP2Pネットワーク上でトランザクションを伝播させる仕組み。
  • Lightning Networkとペイメントチャネル: ここで説明したトランザクション基本要素の上に構築されるレイヤー2構成。
  • ウォレットの鍵導出: ロックスクリプトで使用されるアドレスを生成するBIP 32/44/84/86のHD鍵ツリーとディスクリプターウォレット。

トランザクションは、他のすべての設計ページが触れる対象である。ブロックチェーン設計ではブロックの中身、暗号設計では署名とハッシュの消費者、貨幣設計ではコインベースと手数料の仕組み、P2Pネットワーク設計では伝播される中身、ストレージ設計ではUTXO集合を更新する単位、ウォレット設計では組み立てて署名する対象、エコシステム設計では手数料市場とライトニングが扱う単位である。

参照元の外部ソース

https://bitcoin.org/bitcoin.pdf

その他の外部ソース