交易 進階
UTXO
Unspent Transaction Output
又稱:未花費交易輸出
UTXO(Unspent Transaction Output,未花費交易輸出)是比特幣交易模型的核心概念。與傳統銀行的帳戶餘額不同,比特幣沒有「餘額」這個概念——你擁有的是一組可花費的 UTXO。
基本概念
每個 UTXO 包含:
| 欄位 | 說明 |
|---|---|
| 金額 | 這個 UTXO 代表多少聰(satoshi) |
| 鎖定腳本 | scriptPubKey,定義誰可以花費 |
| 交易 ID | 創建此 UTXO 的交易 hash |
| 輸出索引 | 該交易中的第幾個輸出(從 0 開始) |
你的「餘額」實際上是你擁有的所有 UTXO 金額總和。
運作方式
收款:創建新 UTXO
當你收到比特幣時,發送方的交易會創建一個新的輸出(你的 UTXO):
發送方交易:
輸入:發送方的 UTXO(被消耗)
輸出:
- 你的地址:1.0 BTC(新 UTXO 給你)
- 找零地址:0.5 BTC(新 UTXO 還給發送方)
付款:消耗 UTXO 並創建新的
當你花費時,必須將整個 UTXO 作為輸入,多餘的部分作為找零:
你的交易:
輸入:你的 1.5 BTC UTXO(完全消耗)
輸出:
- 收款方:1.0 BTC(新 UTXO)
- 你的找零:0.4999 BTC(新 UTXO 給自己)
- 手續費:0.0001 BTC(輸入 - 輸出 = 礦工收取)
現實類比
UTXO 就像紙幣:
你有:一張 100 元紙幣
購買:70 元的商品
你不能「撕下 70 元」給商家
你必須:
1. 給出整張 100 元(輸入)
2. 收回 30 元找零(找零輸出)
3. 商家收到 70 元(支付輸出)
UTXO vs 帳戶模型
| 特性 | UTXO 模型(比特幣) | 帳戶模型(以太坊) |
|---|---|---|
| 餘額表示 | UTXO 集合總和 | 單一數字 |
| 隱私性 | 較高(可用不同地址) | 較低(地址持續使用) |
| 平行處理 | 容易(UTXO 獨立) | 困難(需處理 nonce) |
| 雙花檢測 | 簡單(UTXO 存在即可) | 需追蹤 nonce 順序 |
| 智能合約 | 受限 | 靈活 |
| 驗證方式 | 只需驗證輸入存在 | 需執行狀態轉換 |
UTXO 集(UTXO Set)
所有未花費的 UTXO 構成「UTXO 集」,這是比特幣全節點必須維護的關鍵數據:
UTXO 集大小(2024):約 5-8 GB
UTXO 數量:約 7000-8000 萬個
新增:每個區塊的交易輸出
移除:每個區塊的交易輸入
為什麼 UTXO 集很重要?
- 驗證交易:確認輸入的 UTXO 真的存在且未被花費
- 防止雙花:UTXO 被使用後立即從集合移除
- 快速查詢:節點不需遍歷整個區塊鏈
UTXO 碎片化問題
問題描述
頻繁小額收款會產生大量小 UTXO:
你的 UTXO:
- 0.001 BTC(第1次收款)
- 0.002 BTC(第2次收款)
- 0.0015 BTC(第3次收款)
- ... 100 個小額 UTXO
問題:
- 要花費全部餘額,需要 100 個輸入
- 交易大小大 = 手續費高
- 可能超過交易大小限制
解決方案:UTXO 整合
在手續費低的時候,把小 UTXO 合併成大的:
整合交易:
輸入:100 個小 UTXO(趁低費率整合)
輸出:1 個大 UTXO(所有金額減手續費)
好處:
- 未來花費只需 1 個輸入
- 大幅降低未來手續費
最佳實踐
| 建議 | 說明 |
|---|---|
| 定期整合 | 趁週末或低費時段整合小 UTXO |
| 避免粉塵 | 不要創建太小的輸出 |
| Coin Control | 使用錢包的 UTXO 選擇功能 |
| 監控費率 | 在 mempool.space 追蹤最佳時機 |
UTXO 選擇演算法
錢包在花費時需要選擇哪些 UTXO 作為輸入:
常見策略
FIFO(先進先出)
優先使用最舊的 UTXO
優點:隱私較好,舊 UTXO 已經被多次確認
最大先用
優先使用最大的 UTXO
優點:減少輸入數量,降低交易大小
最佳匹配
找到最接近支付金額的 UTXO 組合
優點:減少找零,可能避免產生粉塵
隱私優先
避免合併來自不同來源的 UTXO
優點:防止地址關聯分析
粉塵(Dust)UTXO
當 UTXO 金額太小,花費它的手續費比它的價值還高時,稱為「粉塵」:
粉塵閾值計算:
P2PKH: 148 bytes × 當前費率
P2WPKH: 68 vbytes × 當前費率
例如費率 10 sat/vB:
P2PKH 粉塵閾值:約 1480 sat
P2WPKH 粉塵閾值:約 680 sat
低於此金額的 UTXO 經濟上不值得花費。
UTXO 與隱私
地址重用風險
交易 1:A(你)→ B(對方),找零 → A'(你的找零地址)
交易 2:A'(找零)+ C(另一筆收款)→ D
問題:觀察者可以推測 A 和 A' 屬於同一人
進而推測 C 也屬於你
改善隱私
- 每次使用新地址:避免地址重用
- Coin Control:手動選擇不暴露關聯的 UTXO
- CoinJoin:與他人混合 UTXO,打破關聯
技術細節
UTXO 在交易中的引用
交易輸入:
{
"txid": "7a3b...", // 前序交易 ID
"vout": 0, // 輸出索引
"scriptSig": "...", // 解鎖腳本
"sequence": 0xffffffff // 序列號
}
UTXO 在輸出中的創建
交易輸出:
{
"value": 100000, // 金額(satoshi)
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 ... OP_CHECKSIG",
"type": "pubkeyhash",
"address": "1A1zP1..."
}
}
開發者工具
-
Bitcoin Core RPC:
listunspent:列出你的 UTXOgettxout:查詢特定 UTXOgetutxosetinfo:UTXO 集統計
-
區塊瀏覽器:查看地址的 UTXO
-
Electrum:支援 Coin Control 的錢包