進階
交易結構
深入了解比特幣交易的內部結構,包括輸入、輸出、簽名和 SegWit 格式。
22 分鐘
交易概覽
比特幣交易是價值轉移的基本單位。每筆交易消費之前的輸出(UTXO), 並創建新的輸出供未來花費。這種「輸入-輸出」模型是比特幣的核心設計。
┌─────────────────────────────────────────────────┐ │ Transaction │ ├─────────────────────────────────────────────────┤ │ version │ 4 bytes │ ├─────────────────────────────────────────────────┤ │ marker │ 1 byte (0x00, SegWit only) │ │ flag │ 1 byte (0x01, SegWit only) │ ├─────────────────────────────────────────────────┤ │ input_count │ VarInt │ │ inputs[] │ Variable │ ├─────────────────────────────────────────────────┤ │ output_count │ VarInt │ │ outputs[] │ Variable │ ├─────────────────────────────────────────────────┤ │ witness[] │ Variable (SegWit only) │ ├─────────────────────────────────────────────────┤ │ locktime │ 4 bytes │ └─────────────────────────────────────────────────┘
交易欄位詳解
版本號 (Version)
4 bytes 的版本號表示交易格式。目前主要使用:
- •
1:傳統交易格式 - •
2:支持 BIP-68 相對時間鎖
鎖定時間 (Locktime)
4 bytes 的鎖定時間定義交易最早可被打包的時間:
- •
0:無鎖定,立即有效 - •
< 500,000,000:區塊高度 - •
≥ 500,000,000:Unix 時間戳
輸入 (Inputs)
每個輸入引用一個之前的未花費輸出(UTXO),並提供解鎖腳本:
| 欄位 | 大小 | 說明 |
|---|---|---|
| txid | 32 bytes | 引用的交易雜湊(小端序) |
| vout | 4 bytes | 輸出索引(從 0 開始) |
| scriptSig_len | VarInt | 解鎖腳本長度 |
| scriptSig | Variable | 解鎖腳本(簽名 + 公鑰) |
| sequence | 4 bytes | 序列號(RBF、時間鎖) |
序列號 (Sequence)
序列號有多種用途:
- •
0xFFFFFFFF:禁用 RBF 和相對時間鎖 - •
0xFFFFFFFE:禁用 RBF,啟用絕對時間鎖 - •
< 0xFFFFFFFE:啟用 RBF(可替換) - • 低位用於相對時間鎖(BIP-68)
輸出 (Outputs)
每個輸出定義一定數量的比特幣和花費條件:
| 欄位 | 大小 | 說明 |
|---|---|---|
| value | 8 bytes | 金額(聰,satoshis) |
| scriptPubKey_len | VarInt | 鎖定腳本長度 |
| scriptPubKey | Variable | 鎖定腳本(定義花費條件) |
單位說明: 1 BTC = 100,000,000 聰 (satoshis)。金額以 int64 存儲, 最小單位是 1 聰,最大供應量約 2,100 萬 BTC。
常見腳本類型
P2PKH (Pay to Public Key Hash)
最傳統的地址類型,以 1 開頭:
# 鎖定腳本 (scriptPubKey) OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG # 解鎖腳本 (scriptSig) <signature> <publicKey>
P2SH (Pay to Script Hash)
支持複雜腳本,以 3 開頭:
# 鎖定腳本 OP_HASH160 <scriptHash> OP_EQUAL # 解鎖腳本 <...data...> <redeemScript>
P2WPKH (Native SegWit)
原生 SegWit 地址,以 bc1q 開頭:
# 鎖定腳本 OP_0 <20-byte-pubKeyHash> # 見證數據 (witness) <signature> <publicKey>
P2TR (Taproot)
最新的地址類型,以 bc1p 開頭:
# 鎖定腳本 OP_1 <32-byte-pubKey> # 見證數據 (key path spend) <schnorr-signature>
地址類型比較
| 類型 | 前綴 | 大小 | 費用 |
|---|---|---|---|
| P2PKH | 1... | ~148 vB/input | 最高 |
| P2SH-P2WPKH | 3... | ~91 vB/input | 中等 |
| P2WPKH | bc1q... | ~68 vB/input | 較低 |
| P2TR | bc1p... | ~57 vB/input | 最低 |
簽名類型 (SIGHASH)
簽名類型決定簽名涵蓋交易的哪些部分:
| 類型 | 值 | 涵蓋範圍 |
|---|---|---|
| SIGHASH_ALL | 0x01 | 所有輸入和輸出(最常用) |
| SIGHASH_NONE | 0x02 | 所有輸入,無輸出 |
| SIGHASH_SINGLE | 0x03 | 所有輸入,對應索引的輸出 |
| ANYONECANPAY | 0x80 | 只簽名當前輸入(可組合) |
SegWit 交易
SegWit (Segregated Witness) 將簽名數據從交易主體中分離出來:
SegWit 優點
- • 修復交易延展性問題
- • 增加有效區塊容量
- • 降低交易手續費
- • 啟用閃電網路
識別 SegWit 交易
- • marker = 0x00
- • flag = 0x01
- • 有 witness 欄位
- • txid 不含見證數據
手續費計算
手續費 = 輸入總額 - 輸出總額
# 手續費率計算 手續費率 = 手續費 (satoshis) / 交易大小 (vBytes) # 範例 輸入: 0.001 BTC (100,000 sat) 輸出: 0.0009 BTC (90,000 sat) 手續費: 10,000 sat 交易大小: 250 vB 手續費率: 10,000 / 250 = 40 sat/vB
查看交易
# 解碼原始交易 bitcoin-cli decoderawtransaction <hex> # 獲取交易詳情(需要 txindex) bitcoin-cli getrawtransaction <txid> true # 查看 mempool 中的交易 bitcoin-cli getmempoolentry <txid>
已複製連結