ビットコイントランザクションの読み方
ビットコイントランザクションの内部構造を分解して読む方法を学びます。version、inputs、outputs、locktimeフィールドを1つずつ解釈し、手数料の計算方法と承認の意味を理解した上で、txid.ukで実際のトランザクションを直接検索して実習します。
ビットコインブロックチェーンはトランザクションの連続です。ブロックはトランザクションを入れる容器であり、アドレスはトランザクションの入出力に登場する識別子に過ぎません。トランザクション1つを読めれば、ビットコインの動作原理のほとんどを理解したことになります。この記事ではトランザクションの内部構造を分解し、各フィールドの意味を1つずつ確認していきます。
トランザクションの全体構造
ビットコイントランザクションは4つの核心フィールドで構成されます。
| フィールド | 説明 |
|---|---|
| version | トランザクション形式のバージョン。現在はほとんどが1または2 |
| inputs | 消費する以前の出力(UTXO)のリスト |
| outputs | 新たに生成する出力(ロックスクリプト + 金額)のリスト |
| locktime | トランザクションが有効になる最小ブロック高または時刻 |
Rawトランザクションデータを簡略化して表現すると以下のとおりです。
{
"version": 2,
"inputs": [ ... ],
"outputs": [ ... ],
"locktime": 0
}
versionはトランザクションが従うルールセットを示します。version 2はBIP 68(相対的タイムロック)をサポートします。locktimeが0であれば即座に有効であり、特定のブロック高を指定するとそのブロック以降にのみ含めることができます。核心はinputsとoutputsです。この2つのフィールドが「誰が誰にいくら送ったか」を記録しています。
入力(Input)を読む
入力は「どこからビットコインを取得するか」を明示します。各入力は以前のトランザクションの特定の出力を参照して消費します。
入力1つの構造は以下のとおりです。
{
"txid": "a1b2c3d4...以前のトランザクションID",
"vout": 0,
"scriptSig": "署名データ(レガシー)",
"witness": ["署名データ(SegWit)"],
"sequence": 4294967295
}
各フィールドの意味を整理します。
| フィールド | 説明 |
|---|---|
| txid | 消費するUTXOが生成された以前のトランザクションのID(ハッシュ) |
| vout | 以前のトランザクションで何番目の出力かを示すインデックス。0から開始 |
| scriptSig | レガシートランザクションで署名と公開鍵を格納するアンロックスクリプト |
| witness | SegWitトランザクションで署名データを格納する領域。scriptSigの代わりに使用 |
| sequence | デフォルト値0xFFFFFFFF。RBF(Replace-By-Fee)または相対的タイムロックに活用 |
核心的な原理はシンプルです。「以前のトランザクションtxidのvout番目の出力を消費する」という宣言です。そしてscriptSigまたはwitnessで「自分がこの出力を消費する権限を持っている」ことを証明します。
sequence値が0xFFFFFFFE以下であればRBFが有効化された状態であり、より高い手数料を提示して未確認トランザクションを置き換えることができます。
出力(Output)を読む
出力は「ビットコインをどこに送るか」を定義します。各出力は金額とロックスクリプトで構成されます。
{
"value": 0.01500000,
"scriptPubKey": {
"type": "witness_v0_keyhash",
"address": "bc1q..."
}
}
| フィールド | 説明 |
|---|---|
| value | ビットコインの金額(BTC単位、内部的にはsatoshi整数) |
| scriptPubKey | ロックスクリプト。特定の条件を満たした場合のみ、この出力を消費できる |
scriptPubKeyの種類はアドレス形式によって異なります。
| アドレス種類 | プレフィックス | スクリプト種類 | 説明 |
|---|---|---|---|
| P2PKH | 1… | pubkeyhash | レガシー。公開鍵ハッシュにロック |
| P2SH | 3… | scripthash | スクリプトハッシュにロック。マルチシグなどに使用 |
| P2WPKH | bc1q… | witness_v0_keyhash | SegWit。サイズ効率が高い |
| P2TR | bc1p… | witness_v1_taproot | Taproot。プライバシーと効率の改善 |
一般的な送金トランザクションでは出力が2つ以上あります。1つは受取人のアドレス、残りは送信者のお釣り(change)アドレスです。入力のUTXOは部分的に消費できないため、余った金額を自分自身に送り返す必要があります。
graph LR
subgraph 入力
I1["UTXO #1
0.5 BTC
(署名付き)"]
I2["UTXO #2
0.3 BTC
(署名付き)"]
end
subgraph トランザクション
TX["ビットコイン
トランザクション"]
end
subgraph 出力
O1["受取アドレス
0.7 BTC"]
O2["お釣りアドレス
0.0999 BTC"]
end
I1 --> TX
I2 --> TX
TX --> O1
TX --> O2
FEE["手数料: 0.0001 BTC
(入力合計 - 出力合計)"]
TX -.-> FEE
style TX fill:#f7931a,stroke:#f7931a,color:#000
style FEE fill:none,stroke:none,color:#8b949e 手数料の計算方法
ビットコイントランザクションには手数料を明示するフィールドがありません。手数料は暗黙的に計算されます。
手数料 = 入力の合計 - 出力の合計
例えば入力が0.05 BTCで、出力の合計が0.0499 BTCであれば、手数料は0.0001 BTC(10,000 sat)です。差額が0でない限り、その差額はすべてマイナーの収入になります。
この構造はミスに対して脆弱です。お釣りの出力を作り忘れると、差額全額が手数料として支払われます。2016年には、あるユーザーが291 BTC(当時約1億円以上)を手数料として誤って支払った事例があります。現代のウォレットソフトウェアはこのようなミスを防止する警告機能を備えています。
手数料率(sat/vbyte)とトランザクションサイズの関係は手数料計算実践ガイドで詳しく解説しています。
承認(Confirmation)
トランザクションがネットワークに伝播されるとメモリプール(mempool)に入ります。マイナーが当該トランザクションをブロックに含めると1承認です。その後、新しいブロックが追加されるたびに承認数が1ずつ増えていきます。
| 承認数 | 状態 | 所要時間(平均) |
|---|---|---|
| 0 | 未確認(mempool待機中) | - |
| 1 | ブロックに含まれた | 約10分 |
| 3 | 少額取引に一般的に十分 | 約30分 |
| 6 | 慣行的に「最終確定」と見なされる | 約1時間 |
6承認の慣行はサトシ・ナカモトのホワイトペーパーに由来します。攻撃者がブロックを覆す確率は承認数が増えるにつれ指数関数的に減少し、6承認の時点で事実上0に収束します。ほとんどの取引所が入金時に6承認を要求する理由です。高額取引ではより多くの承認を待つこともあります。
実習:txid.ukでトランザクションを読む
実際のトランザクションを直接検索し、上で学んだ内容を適用してみます。ビットコイン史上有名な「ピザトランザクション」のTXIDを使用します。
a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d
このトランザクションは2010年5月22日、プログラマーのLaszlo Hanyeczがピザ2枚の代金として10,000 BTCを送ったもので、ビットコインが実物と交換された最初の事例です。
検索手順:
- txid.ukの検索欄に上記のTXIDを貼り付けます。
- 入力を確認 — このトランザクションが消費した以前のUTXOリスト、各入力の以前のTXIDとvoutインデックスを確認します。
- 出力を確認 — 受取人のアドレスと金額、お釣りの出力を確認します。10,000 BTCが受取人に送られたことが確認できます。
- 手数料を確認 — 入力の合計から出力の合計を引くと手数料が算出されます。この初期トランザクションでは手数料が極めて低額でした。
- 承認数を確認 — 2010年のブロックに含まれたトランザクションなので、現在では数十万の承認が蓄積されています。これを覆すことは物理的に不可能な状態です。
- 視覚化 — viz.txid.ukで同じTXIDを入力すると、入出力関係をネットワークグラフで確認できます。資金の流れを直感的に把握できます。
- Raw TXデコード — tx.txid.ukでRawトランザクションデータをデコードすると、version、inputs、outputs、locktimeなどすべてのフィールドをバイト単位で確認できます。
特殊なトランザクション
すべてのトランザクションが一般的な送金というわけではありません。いくつかの特殊な種類を把握しておきましょう。
コインベーストランザクション
各ブロックの最初のトランザクションは**コインベーストランザクション(coinbase transaction)**です。以前のUTXOを参照せず、ブロック報酬(新規発行 + 手数料)をマイナーのアドレスに生成します。
コインベーストランザクションの特徴:
- 入力のtxidがすべて0で埋められている(
0000...0000) - voutは0xFFFFFFFF
- scriptSig領域にマイナーが任意のデータを入れることができる(サトシのジェネシスブロックのメッセージがここに入っている)
- 出力として生成されたビットコインは100ブロック後にのみ消費可能(コインベース成熟度ルール)
マルチシグトランザクション
複数の秘密鍵のうち一定数以上の署名がなければ消費できない出力です。「2-of-3マルチシグ」であれば3つの鍵のうち2つの署名が必要です。企業の資金管理や共同口座に使用されます。P2SH(3で始まるアドレス)で実装されることが多いです。
OP_RETURNトランザクション
出力のスクリプトにOP_RETURNが含まれている場合、その出力は消費不可能です。代わりに最大80バイトの任意データをブロックチェーンに永続的に記録できます。
OP_RETURN 48656c6c6f20426974636f696e
上記の例は「Hello Bitcoin」という文字列を16進数でエンコードしたものです。タイムスタンプ証明、デジタルアセット発行プロトコル(Omni Layerなど)などに活用されます。OP_RETURN出力のvalueは常に0です。
まとめ
ビットコイントランザクションはversion、inputs、outputs、locktimeの4つの核心フィールドで構成されます。入力は以前のUTXOを参照して消費し、出力は新しいUTXOを生成します。手数料は入力の合計から出力の合計を引いた差額であり、別途のフィールドはありません。承認はトランザクションが含まれたブロック以降に追加されたブロック数で、6承認であれば事実上最終確定と見なされます。この構造を理解すれば、ブロックチェーンエクスプローラーでどんなトランザクションでも読んで解釈できるようになります。
関連記事: