跳至主要內容
進階

UTXO 模型

了解比特幣的未花費交易輸出模型,以及它如何追蹤所有權和防止雙重支付。

15 分鐘

什麼是 UTXO?

UTXO(Unspent Transaction Output,未花費交易輸出)是比特幣追蹤所有權的基本單位。 不同於銀行帳戶餘額,比特幣沒有「餘額」概念,只有一堆可花費的 UTXO。

類比: 把 UTXO 想像成硬幣或紙幣。你的「餘額」是你錢包裡所有硬幣的總和, 花費時必須整張/整個使用,多餘的找零會變成新的 UTXO。

UTXO vs 帳戶模型

以太坊等區塊鏈使用帳戶模型,比特幣使用 UTXO 模型。兩者各有優缺點:

特性 UTXO 模型 帳戶模型
狀態表示 UTXO 集合 帳戶餘額
並行處理 容易(不同 UTXO) 需要 nonce 排序
隱私性 每筆交易可用新地址 地址重複使用
餘額查詢 需要掃描 UTXO 直接讀取
智能合約 有限(無狀態) 強大(有狀態)
雙重支付檢測 簡單(UTXO 存在檢查) 需要 nonce 檢查

UTXO 生命週期

1

創建

交易輸出被創建,成為新的 UTXO

2

存在

UTXO 存在於 UTXO 集合中,可被花費

3

花費

被新交易引用為輸入

4

銷毀

從 UTXO 集合中移除

UTXO 集合

Bitcoin Core 維護一個 UTXO 集合(也稱為 chainstate),存儲所有未花費的輸出。 這是驗證新交易所需的關鍵數據結構。

UTXO 集合統計

  • • 約 8000 萬個 UTXO(2024)
  • • 數據庫大小約 8-10 GB
  • • 使用 LevelDB 存儲
  • • 存放在 chainstate/ 目錄

為什麼重要?

  • • 快速驗證交易有效性
  • • 無需掃描整個區塊鏈
  • • 記憶體和磁碟效率
  • • 啟用修剪模式

UTXO 數據結構

每個 UTXO 由以下信息唯一標識:

UTXO = {
  txid:         // 創建此輸出的交易 ID (32 bytes)
  vout:         // 輸出索引 (4 bytes)

  // 存儲的數據
  value:        // 金額 (satoshis)
  scriptPubKey: // 鎖定腳本
  height:       // 創建區塊高度
  coinbase:     // 是否為 coinbase 輸出
}

Coin Selection(選幣)

當發送比特幣時,錢包需要選擇哪些 UTXO 作為輸入。這稱為 Coin Selection, 會影響手續費和隱私:

常見策略

Branch and Bound

尋找精確匹配的 UTXO 組合,避免找零輸出。Bitcoin Core 優先使用此策略。

Knapsack

隨機選擇 UTXO,嘗試找到接近目標金額的組合。較舊的回退策略。

Largest First

優先使用最大的 UTXO。簡單但可能不是最優的費用效率。

UTXO 膨脹與粉塵

UTXO 膨脹問題

每創建一個 UTXO,全網所有節點都需要存儲它直到被花費。 過多的小額 UTXO 會增加節點的存儲負擔。

粉塵輸出 (Dust)

粉塵是指金額太小,以至於花費它的手續費超過其價值的 UTXO。 Bitcoin Core 有粉塵限制防止創建這類輸出:

# 粉塵閾值計算
粉塵閾值 = 花費此輸出的最小交易大小 × 粉塵費率

# 不同輸出類型的粉塵閾值(以 3 sat/vB 計算)
P2PKH:  546 satoshis
P2SH:   540 satoshis
P2WPKH: 294 satoshis
P2WSH:  330 satoshis
P2TR:   330 satoshis

UTXO 管理建議

良好實踐

  • • 低費率時合併小 UTXO
  • • 使用 SegWit 地址
  • • 避免地址重複使用
  • • 定期整理錢包

避免

  • • 創建大量小額 UTXO
  • • 在高費率時合併
  • • 持有粉塵輸出
  • • 忽略 UTXO 管理

查看 UTXO

# 查看特定 UTXO
bitcoin-cli gettxout <txid> <vout>

# 查看 UTXO 集合統計
bitcoin-cli gettxoutsetinfo

# 列出錢包的 UTXO
bitcoin-cli listunspent

# 掃描 UTXO 集合
bitcoin-cli scantxoutset "start" '["addr(<address>)"]'

延伸閱讀: 學習中心的 UTXO 模型 有更詳細的概念說明和圖解。

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