UTXO 模型詳解

比特幣的未花費交易輸出模型與帳戶模型比較。

UTXO 模型解密:比特幣的帳本魔法

前言:你的比特幣其實不是「餘額」

說個小故事。我第一次聽到 UTXO 這個詞的時候,想說這啥鬼?一堆英文縮寫砸過來,UX...TO?後來才搞懂原來是 Unspent Transaction Output 的縮寫,中文翻成「未花費交易輸出」。名字很拗口,但概念意外地優雅——今天就來聊聊比特幣怎麼用這套奇怪的系統記帳。

很多人想像比特幣錢包就像銀行帳戶一樣,裡面有個數字代表你有多少錢。每次轉帳就是那個數字變大變小。但實際上完全不是這樣運作的。比特幣沒有「帳戶餘額」這個概念,有的只是一堆「鈔票」——對,就是實體鈔票的概念,只不過是數位的。

有點暈?別擔心,我當初也暈了好一陣子。讓我慢慢解釋給你聽。

什麼是 UTXO?

從現實生活切入

想像你口袋裡有這些鈔票:

你的「總財富」是 100 + 50 + 50 + 10 + 10 + 10 = 230 元。

比特幣的 UTXO 模型就是這個概念的數位版本。每筆比特幣交易不是從「帳戶」扣錢,而是:

就像你拿一張 100 元鈔票去買 70 元的東西,店家會找你 30 元。那張 100 元被「消耗」了,變成兩張新鈔票:70 元給店家,30 元找回給你。

比特幣轉帳也是這個道理。

正式定義

UTXO(Unspent Transaction Output)就是在區塊鏈上已被確認、但尚未被後續交易花費的輸出。你可以把它想像成一張加密貨幣鈔票——有特定的面額(以 satoshi 為單位),只能被持有對應私鑰的人使用。

當你收到比特幣時,本質上是你收到了「一張」或「多張」UTXO。這些 UTXO 會乖乖躺在區塊鏈上等你來花用。當你花的時候,這些 UTXO 就被「消耗」了,同時系統創造出新 UTXO,歸屬到收款人的地址上。

所以嚴格來說,比特幣區塊鏈上根本沒有「帳戶」或「餘額」。只有一堆 UTXO 在那邊等著被花掉。

交易的解剖課

輸入與輸出:硬幣的兩面

每筆比特幣交易都有兩個部分:輸入(Input)和輸出(Output)。

輸出是「我要發給誰多少錢」。創造新的 UTXO,指定受益人地址和金額。

輸入是「我要花掉之前收到的哪些錢」。引用先前交易的輸出,證明你有權利使用它們。

看個例子:

小明想要轉 0.5 BTC 給小美

小明的錢包之前收到了這些 UTXO:

錢包要怎麼湊出 0.5 BTC?簡單,把兩筆都花掉。

交易看起來會是這樣:

輸入:
  - UTXO-A: 引用「小明的 0.3 BTC」(附上小明的簽名)
  - UTXO-B: 引用「小明的 0.4 BTC」(附上小明的簽名)

輸出:
  - 0.5 BTC 給小美
  - 0.15 BTC 當作「找零」回到小明的新地址
  - 0.03 BTC 作為礦工費

所以總共消耗了 0.7 BTC,創造出 0.68 BTC 的新 UTXO,差額 0.02 BTC(0.15 + 0.03 = 0.18,但 0.7 - 0.5 = 0.2,所以 0.2 - 0.18 = 0.02 是礦工費)變成了礦工的收入。

找零機制:聰明的設計

你注意到上面例子裡的「找零」嗎?這是 UTXO 模型很重要的特色。

比特幣交易的輸入金額必須大於等於輸出金額,而差額會變成礦工費。為什麼需要找零?因為 UTXO 不能分割。

就像你不能把一張 100 元鈔票撕成兩半各 50 元使用(好吧物理上可以,但店家不會收),比特幣的 UTXO 也不能分割使用。你必須完整花掉一個 UTXO,如果需要的金額比較少,就把剩下的錢「找零」回來。

錢包軟體通常會自動幫你處理這個。它會:

  1. 選擇適合的 UTXO 組合
  2. 創建一個「找零地址」(通常是新生成的地址,用來收找回來的錢)
  3. 計算礦工費

這就是為什麼每次轉帳都會有一個「找零輸出」——當然,如果剛好輸入等於輸出(加上礦工費),就不需要找零了。

UTXO 與私鑰:所有權的證明

密碼學的魔法

UTXO 的「所有權」是怎麼確認的?靠的是私鑰。

每個 UTXO 都鎖定在特定的地址上。地址是從公鑰衍生出來的,而公鑰又是從私鑰衍生出來的。數學單向性保證了:知道私鑰可以推導出公鑰和地址,但反過來不行。

當你要花費一個 UTXO 時,你必須提供:

  1. 簽名:用私鑰對交易進行數位簽名,證明你擁有這個 UTXO
  2. 公鑰:讓網路驗證這個公鑰確實對應到 UTXO 的地址

比特幣網路會:

  1. 從交易輸入取得公鑰
  2. 對公鑰進行 Hash 運算,確認產生的地址跟 UTXO 的地址匹配
  3. 驗證數位簽名的有效性

全部確認後,才允許這個 UTXO 被消耗。整個過程就像是用一把獨一無二的鑰匙開鎖——只有正確的私鑰才能產生有效的簽名,打開對應 UTXO 的鎖。

P2PKH 與 P2WPKH:地址格式的差異

不同類型的比特幣地址使用不同的腳本格式來鎖定 UTXO:

P2PKH(Pay to Public Key Hash):最傳統的格式,以「1」開頭

OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

這種地址的 UTXO 需要提供完整的簽名和公鑰才能解鎖。

P2WPKH(Pay to Witness Public Key Hash):隔離見證格式,以「bc1q」開頭

OP_0 <pubKeyHash>

這種格式更節省空間,見證數據(簽名和公鑰)被移到交易的其他位置,不占區塊空間的費用。

P2TR(Pay to Taproot):最新的 Taproot 格式,以「bc1p」開頭

OP_1 <x-only-pubkey>

提供了更好的隱私和更大的腳本靈活性。

UTXO 的狀態管理:錢包的視角

錢包幫你做的複雜工作

一般使用者不會想要手動管理 UTXO。錢包軟體幫你處理了所有麻煩事。

錢包內部會維護一個「UTXO 集」(UTXO Set)——這是屬於你的所有 UTXO 的本地副本。錢包會:

  1. 掃描區塊鏈,找出所有轉到你地址的輸出
  2. 追蹤哪些已被花費(透過監控區塊鏈上的交易輸入)
  3. 計算未花費輸出的總和作為「餘額」

所以從使用者的角度,比特幣錢包確實顯示「餘額」。但底層運作是:錢包告訴你「你總共有這幾張鈔票,加起來值這麼多」。

幣的年齡:Coin Selection 的學問

當你要轉帳時,錢包必須決定使用哪些 UTXO。這就是「Coin Selection」演算法。

不同的選擇策略有不同的考量:

策略一:使用最近的 UTXO

策略二:使用金額最接近目標數額的 UTXO

策略三:使用最老的 UTXO(先進先出)

一些高級錢包(如 Bitcoin Core)允許使用者選擇特定的 Coin Selection 策略。

灰塵問題:UTXO 的副作用

比特幣網路上累積了非常多的小額 UTXO,稱為「灰塵」(Dust)。這些灰塵可能是:

灰塵 UTXO 的問題是:它們的手續費可能比金額還高!想象你有一筆 100 satoshi 的 UTXO,但網路擁堵時礦工費可能達到 200 satoshi/byte,一筆交易至少要 200 vbyte,光礦工費就要 40,000 satoshi。這種 UTXO 幾乎不可能經濟地花費。

這就是為什麼比特幣社群有「不要創造灰塵」的建議——每次轉帳時選擇適當的 UTXO 組合,避免產生太小額的找零。

UTXO 的優勢:為什麼比特幣選擇這套系統

隱私加分

UTXO 模型讓比特幣有更好的隱私基礎。每筆 UTXO 都可以有不同的地址,區塊鏈分析師看到的是一堆不相關的「鈔票」,而不是一個有「餘額」的帳戶。

相較之下,帳戶模型(余額模型)就像銀行帳戶,每次轉帳都直接改變同一個帳戶的數字,更容易被追蹤。

以太坊使用的就是帳戶模型,所以隱私保護需要更多額外手段(如 Tornado Cash)。

並行處理的可能

UTXO 有趣的一點是:不同 UTXO 的交易理論上可以并行驗證。因為每個 UTXO 都是獨立的,驗證時不需要考慮「餘額是否足夠」——只要確認 UTXO 存在且未被花費、簽名有效即可。

帳戶模型則需要維護全局狀態,確保帳戶餘額不會變成負數。這雖然可以用狀態樹等結構優化,但並行性天然受限。

簡化的驗證邏輯

比特幣節點驗證交易時,只需要檢查:

  1. 引用的 UTXO 是否存在
  2. UTXO 是否尚未被花費
  3. 簽名是否有效

不需要追蹤帳戶狀態,不需要處理並發修改,不需要應對負餘額的情況。邏輯相對簡單,減少了漏洞的可能性。

可證明的稀缺性

UTXO 模型讓比特幣的 2100 萬上限更容易驗證。網路可以簡單地加總所有 UTXO 的總額,確認沒有超過 21,000,000 BTC。

帳戶模型要做到同樣的事,需要確保每筆交易都不會讓任何帳戶的餘額超過上限——複雜度更高。

UTXO 的挑戰:這套系統的缺點

狀態膨脹

比特幣網路運行越久,累積的 UTXO 數量就越多。截至 2024 年,比特幣區塊鏈上有超過 1 億個 UTXO。每個全節點必須儲存所有這些 UTXO 的狀態,這增加了運行節點的硬體要求。

對比帳戶模型:帳戶模型只需要儲存「帳戶」和「餘額」,狀態總量通常比 UTXO 數量少。

效能瓶頸

驗證交易時,節點需要快速查找 UTXO 是否存在。這需要有效的索引結構。比特幣使用 LevelDB 資料庫來儲存 UTXO 集,查詢效率取決於資料庫設計。

帳戶模型的狀態查詢通常使用 Merkle Patricia Trie(以太坊使用),查詢效率可能更高,但狀態更新更複雜。

使用者體驗的複雜性

對於一般使用者來說,UTXO 模型確實比較難理解。「為什麼我的手續費這麼高?」「為什麼我的轉帳失敗了?」——這些問題往往源於 UTXO 的管理不善。

帳戶模型的「轉帳就像銀行轉帳」直覺對新用戶更友善。當然,比特幣錢包軟體已經做得足夠好,把這些複雜性都藏起來了。

進階主題:隔離見證與 UTXO 的演變

隔離見證如何改變 UTXO

2017 年的隔離見證(SegWit)升級帶來了重要的改變。

傳統的比特幣交易結構中,簽名資料和轉帳金額資料放在一起。隔離見證把簽名「隔離」出來,放在交易的 witness 區段。

對 UTXO 的影響:

費用節省:見證數據現在有 75% 的折扣。1000 vbyte 的交易如果放在隔離見證格式,可能只需要 250 vbyte 的費用計算。

更大的區塊容量:實際上等效於把區塊大小從 1MB 提升到約 4MB(考慮最佳情況)。

UTXO 集合增長率改變:隔離見證交易產生的 UTXO 通常更「高效」——相同的金額可能用更少的 UTXO 表示。

P2SH 與嵌套隔離見證

P2SH(Pay to Script Hash)是一種把複雜解鎖條件封裝成哈希的機制。

傳統 P2PKH:

地址 = RIPEMD160(SHA256(公鑰))
鎖定腳本 = OP_DUP + OP_HASH160 + <地址> + OP_EQUALVERIFY + OP_CHECKSIG

P2SH:

地址 = RIPEMD160(SHA256(腳本))
鎖定腳本 = OP_HASH160 + <地址> + OP_EQUAL

這有什麼好處?假設你想要一個「2 of 3 多簽」錢包。傳統方式下,地址會很長,而且發送方需要知道完整的腳本。P2SH 模式下,地址只是一個哈希,發送方不需要知道腳本內容。

隔離見證地址可以用 P2SH 包裹(稱為 P2SH-P2WPKH),這就是為什麼有些隔離見證地址以「3」開頭而非「bc1q」——它們是「嵌套」格式。

Taproot 與 MAST

Taproot(2021 年升級)帶來了更多改變。

Merkleized Abstract Syntax Trees (MAST):這個技術讓腳本可以有很多不同的分支條件,但區塊鏈上只會暴露實際使用的那個分支。

舉個例子:假設你設計了一個腳本,有三種解鎖方式:

  1. 你自己的簽名
  2. 3 of 5 多簽
  3. 等待 1 年後的單簽

傳統上,這三個條件都需要寫在區塊鏈上。MAST 讓區塊鏈只看到你實際使用的那個,其他條件被哈希藏起來。

好處:

實務應用:從比特幣區塊鏈讀取 UTXO 資料

使用 Bitcoin Core RPC

如果你運行全節點,可以使用 gettxout 指令查詢特定 UTXO:

bitcoin-cli gettxout "txid" 0

返回結果:

{
  "bestblock": "0000000000000000000...",
  "confirmations": 100,
  "value": 0.5,
  "scriptPubKey": {
    "asm": "OP_DUP OP_HASH160 abcdef123456...",
    "hex": "76a914...",
    "address": "1A2B3C...",
    "type": "pubkeyhash"
  }
}

gettxoutsetinfo 可以查看整個 UTXO 集合的狀態:

bitcoin-cli gettxoutsetinfo

輸出:

{
  "height": 830000,
  "bestblock": "...",
  "transactions": 85000000,
  "txouts": 105000000,
  "bogosip": 4294967296,
  "hash_serialized_2": "...",
  "disk_size": 5000000000,
  "total_amount": 19500000.00000000
}

使用區塊鏈瀏覽器

常見的比特幣區塊鏈瀏覽器如 Blockstream、Mempool、Blockchain.com 都提供 UTXO 查詢功能。輸入交易 ID 和輸出的索引,就能看到該 UTXO 的狀態。

比特幣腳本的 UTXO 綁定

每個 UTXO 都綁定一個「鎖定腳本」(ScriptPubKey)。這個腳本定義了「誰可以花費這個 UTXO」。

常見的腳本類型:

P2PK(H):支付到公鑰(或公鑰哈希)

P2PKH:支付到公鑰哈希

P2SH:支付到腳本哈希

P2WPKH:支付到隔離見證公鑰哈希

P2TR:支付到 Taproot

UTXO 模型與未來的比特幣

比特幣的 UXTO 集合大小

截至 2024 年初,比特幣 UTXO 集合包含約 1 億個 UTXO。這個數字從比特幣早期到現在經歷了巨大的變化:

年份UTXO 數量總供應量 (BTC)平均 UTXO 大小
2010~1,000~1,000,0001,000 BTC
2013~500,000~12,000,00024 BTC
2017~40,000,000~16,500,0000.4 BTC
2020~60,000,000~18,300,0000.3 BTC
2024~100,000,000~19,500,0000.2 BTC

UTXO 數量持續成長,但平均大小持續下降,反映了比特幣從早期的大額轉帳到現在的小額多筆交易的使用模式變化。

比特幣的 UTXO 集合大小與效能

UTXO 集合的磁碟空間約 5-6 GB(2024 年),這是全節點必須維護的狀態。相較於整個區塊鏈(約 600 GB),這個大小是可控的。

但未來如果比特幣被大規模採用,UTXO 集合可能會繼續成長。需要更多的優化技術來控制狀態大小。

客戶端驗證的新方向

比特幣開發社群持續討論如何改進 UTXO 集合的管理:

UTXO 壓縮:把多個相關 UTXO 合併,減少儲存需求

UTXO 承諾(UTXO Commitment):用 Merkle 樹承諾 UTXO 集合的狀態,允許輕客戶端驗證

修剪模式的改進:讓節點可以在不儲存完整 UTXO 集的情況下運行

結語:UTXO 的美學

說了這麼多,UTXO 模型到底是好是壞?

我個人的看法是:UTXO 模型是比特幣最優雅的設計之一。它用簡單的概念(未花費的輸出)取代了複雜的帳戶系統,讓比特幣得以保持極簡的設計哲學。

當然,它也有缺點。狀態膨脹、複雜的使用者體驗、較高的技術理解門檻。但這些缺點在比特幣社群看來,都是可以接受或正在被解決的工程問題。

下次你使用比特幣錢包轉帳的時候,不妨想想背後正在發生的 UTXO 魔法:舊的「鈔票」被銷毀,新的「鈔票」被創造,而你對自己財產的控制權,在這個過程中完好無損地轉移到了新的 UTXO 上。

加密貨幣的未來或許會有其他模型出現,但 UTXO 這種「硬幣」式的帳本概念,絕對會在區塊鏈技術的歷史上留下濃墨重彩的一筆。


標籤:比特幣、UTXO、區塊鏈、比特幣技術、帳本模型、密碼學、比特幣錢包

難度等級:中級

預估閱讀時間:25 分鐘

前置知識:比特幣基本概念、公開金鑰密碼學基礎

本文包含

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!