UTXO 是什麼?
UTXO 的英文是 Unspent Transaction Output ,翻譯過來叫“未消費的交易輸出”。應該這麼說,比特幣的核心概念交易,交易的核心知識點就是 UTXO ,所以這篇中咱們好好聊聊這個 UTXO。
交易的組成要素
比特幣中是沒有賬戶這個概念的,所謂一個地址的餘額,其實就是統計這個地址相關的所有交易,然後運算出來的。所以我們把顯微鏡調調焦距,先看看一個交易中都包含哪些要素。
第一個要素是輸入,也就是 Input。首先,並不是所有的交易都有這一項。比如每個區塊裏面都有一個礦工自治的特殊交易,也就是所謂的 coinbase 交易,它就是一個沒有 Input 的交易。這個交易中直接把一定數量的比特幣轉出給製作這個區塊的礦工。除了這個特例之外,其他的交易都是有輸入的。比如小明想給小剛轉賬1個比特幣,這個交易的 Input 應該是啥呢?是和小明的地址相關的一些交易,更準確的說,就是這些交易中包含的屬於小明地址的未消費的交易輸出,也就是 UTXO 。
於是我們就很自然的進入了第二個要素,也就是交易中應該包含輸出。“輸出”是個術語,英文叫 Output。在小明給小剛轉賬一個比特幣的交易中,交易的 Output 就是指向小張的地址的這一個比特幣。這樣,UTXO 中的後三個字母 TXO ,其中 TX 代表交易,O 代表 Output,我們就理解了。最後一個 U 指的是 Unspent,也就是未消費。小張如果從來沒有用這個 Output 做過其他交易的輸入,那麼這個 Output 就是沒有被消費過的,就是 UTXO。
最後一個要素就是手續費,一個非 coinbase 交易中輸入要等於輸出加上手續費,手續費是要轉賬給礦工的。討論中爲了簡便,我們忽略手續費這一項。
理解的比特幣交易的基本組成其實也就理解了 UTXO。到 http://blockchain.com 點開一個具體的交易,詳情中可以看到咱們剛剛說的這幾個要素。
湊輸入和找零
UTXO 有個特點,就是跟硬幣一樣,不能掰開用,那麼交易過程中如何湊夠輸入金額,又如何找零的呢?
小明給小剛轉賬1比特幣。整個過程是這樣的,小明要收集足夠的輸入,比如小明的地址對應的以往交易中,找到了一個面值爲0.9的 UTXO,不夠1比特幣,好在交易中是允許有多個輸入的,所以小明又找到了一個面值0.2的 UTXO,這樣在這次轉賬的交易中,就會有兩個輸入。同時輸出也會有兩個,一個是指向小剛地址,面值是1比特幣。另一個指向小明的地址,面值是0.1比特幣,這個輸出就是找零了。
梳理一下,整個流程是這樣的:小明首先要湊夠足夠面額的 Input**,這裏他找到了兩個 Input,而這兩個 Input 本身都是以往交易的 Output。這兩個 Output 在未消費之前,就是 UTXO,但是當前交易一旦生效,它們兩個就會被消耗掉,而本交易中又會生成兩個新的 UTXO,一個指向小明,一個指向小剛。相當於小明和小剛各種領到手一個硬幣,未來可以在其他交易中去消費。而小明和小剛各自地址的餘額,其實就是各自對應的所有 UTXO 的總和。
這樣,交易中如何去湊夠輸入,如何生成輸出,並進行找零,我們就清楚了。
爲何使用 UTXO 模型?
到這裏我們就有一個疑問了,比特幣不就是個大賬本嗎?爲何不採用賬戶模型,而要採用 UTXO 模型呢?
賬戶模型是傳統銀行或者類似於支付寶這種服務的基本模型,這個模型下,我有一個自己對應的賬戶,上面記錄我有13塊錢,那麼13這個數字是明明白白記錄到系統中的。賬戶模型的確是非常簡單,也非常靈活,以太坊以及一些其他區塊鏈項目中採用的就是賬戶模型。再看看比特幣,小明有13個幣,其實區塊鏈上是根本沒有13這個數字的,因爲區塊鏈上只有交易。但是我們打開 http://blockchain.com 這樣的區塊鏈瀏覽器,是可以看到一個地址對應的餘額的,這是區塊鏈瀏覽器自己運算出來的,不是區塊鏈上本來就有的。
但是很多高手會說 UTXO 是一個非常棒的模型,主要是因爲 UTXO 非常適合並行運算,這個特點在分佈式的計算機網絡中顯得非常的巧妙。具體細節不是本文要關心的,推薦微信公衆號 NervosNetwork 的文章《 UTXO 和 Account 模型對比》,裏面有更詳細的論述。
總結
UTXO 咱們就聊到這裏,來總結幾句。UTXO 是理解比特幣交易的樞紐性概念,想要理解比特幣底層原理的同學,這是一個繞不過去的坑。每個交易中,可以包含多個輸入,並且通常包含兩個輸出,輸出總額加上手續費正好等於輸入總額。每個輸出都跟硬幣一樣,有自己的一個面值,而且屬於某個特定地址。還沒有被當做其他交易的輸入使用的輸出,就是“未消費交易輸出”,就是 UTXO。UTXO 模型中沒有賬戶的概念,所以對比賬戶模型顯得稍微繞一些,但是它本身其實也是有巨大優點的,例如非常有利於在分佈式系統中進行並行計算處理。