跳至主要內容
進階

交易結構

深入了解比特幣交易的內部結構,包括輸入、輸出、簽名和 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>

相關 BIP: BIP-141 (SegWit)、 BIP-143 (SegWit 簽名)、 BIP-341 (Taproot)

已複製連結
已複製到剪貼簿