トランザクション・インプットを構築する
UTXOを参照してトランザクション・インプットを構築する方法。各インプットは、あなたがこれから使おうとしているコインを指します。
0ステップ ·
何を学ぶか
- トランザクション・インプットの構造
- インプットが前のUTXOをどう参照するか
- ScriptSigとシーケンス番号の役割
インプットの構造
各トランザクション・インプットはネットワークにこう伝えます:「私はこの特定のUTXOを使いたい。」四つのフィールドを含みます:
| フィールド | サイズ | 説明 |
|---|---|---|
| 前TXハッシュ | 32 バイト | UTXOを作成したトランザクションのtxid |
| アウトプット・インデックス | 4 バイト | そのトランザクションの何番目のアウトプットか (vout) |
| ScriptSig | 可変 | アンロッキング・スクリプト(所有権の証明) |
| Sequence | 4 バイト | RBFとタイムロックに使用 |
単一インプットが16進でどう見えるか(注釈付き):
# Previous TX Hash (32 bytes, little-endian)
7b1eabe0209b1fe794124575ef807057c77ada2138ae4fa8d6c4de0398a14f3f
# Output Index (4 bytes, little-endian)
00000000
# ScriptSig Length
00
# ScriptSig (empty for now - filled during signing)
# Sequence
fdffffff
前TXハッシュ:コインを指す
Previous TX Hashは、使いたいアウトプットを作成したトランザクションのtxidです。一つの決定的な詳細:シリアライズされたトランザクションの中ではリトル・エンディアンのバイト順でなければなりません。
ブロック・エクスプローラーが表示するtxidが以下の場合:
3f4fa19803dec4d6a84fae3821da7ac7577080ef754512794e1f9b20e0ab1e7b
内部表現を得るためにバイトを反転します:
7b1eabe0209b1fe794124575ef807057c77ada2138ae4fa8d6c4de0398a14f3f
これは、初めてトランザクションを構築する人にとってよくあるバグの原因です。
アウトプット・インデックス
Output Indexは、参照するトランザクション内のどのアウトプットを使っているかを指定します。トランザクションは複数のアウトプットを持てるので、正確にどれかを指定する必要があります。インデックス0は最初のアウトプット、1は二番目、といった具合です。
これは4バイトのリトル・エンディアン整数としてエンコードされます:
0 → 00000000
1 → 01000000
2 → 02000000
ScriptSig:アンロッキング・スクリプト
ScriptSigは、このUTXOを使う権利があることを証明する場所です。P2PKHアウトプットの場合、ScriptSigはあなたの署名と公開鍵を含みます:
<signature> <public_key>
ノードがトランザクションを検証するとき、UTXOのScriptPubKeyに対してScriptSigを実行します。実行が成功すれば(trueを返す)、使用が承認されます。
重要:署名のためにトランザクションを構築するとき、ScriptSigは空のままです(長さバイト = 0x00)。署名ステップで埋めます。これは鶏と卵の状況を作り出します - 署名はトランザクション・データに依存しますが、トランザクションは署名を含みます。ビットコインは後で説明する特定の署名手順でこれを解決します。
SegWitインプット(P2WPKH)の場合、ScriptSigは常に空です。アンロッキング・データは代わりにウィットネス・フィールドに入ります - ステップ8でカバーします。
シーケンス番号
4バイトのシーケンス・フィールドは、元々はチャネル内トランザクション置換のために設計されました(サトシが持っていたが完全に実装しなかったアイデア)。今日では二つの目的に役立ちます:
- RBFシグナリング:
0xfffffffe未満のシーケンス値は、トランザクションがReplace-By-Fee(BIP125)で置換可能であることを示します - 相対タイムロック:
OP_CHECKSEQUENCEVERIFY(BIP112)と共に使用すると、インプットが使える前の最小経過時間を強制します
一般的な値:
ffffffff → Final (no RBF, no relative timelock)
fdffffff → RBF enabled, no relative timelock
私たちのチュートリアル・トランザクションでは、RBFを有効にするために0xfffffffd(リトル・エンディアンでfdffffff)を使います - 必要に応じて手数料を引き上げられるベスト・プラクティスです。
複数のインプット
トランザクションは任意の数のインプットを持てます。UTXOが小さい場合、送りたい金額をカバーするために複数必要になるかもしれません。各インプットはトランザクション・サイズに約41バイト(ScriptSigを除く)を追加し、それはより多くの手数料を意味します - ステップ5で扱う実用的な考慮事項です。
次のステップ
トランザクション・アウトプットを構築するに進み、ビットコインがどこへ行くかを定義する方法を学びましょう。