什么是UTXO
在比特幣錢包當(dāng)中,我們通常能夠看到賬戶余額,然而在中本聰設(shè)計的比特幣系統(tǒng)中,并沒有余額這個概念。“比特幣余額”是由比特幣錢包應(yīng)用派生出來的產(chǎn)物。中本聰發(fā)明了UTXO交易模型,并將其應(yīng)用到比特幣當(dāng)中。
UTXO(Unspent Transaction Outputs)是未花費(fèi)的交易輸出,它是比特幣交易生成及驗證的一個核心概念。交易構(gòu)成了一組鏈?zhǔn)浇Y(jié)構(gòu),所有合法的比特幣交易都可以追溯到前向一個或多個交易的輸出,這些鏈條的源頭都是挖礦獎勵,末尾則是當(dāng)前未花費(fèi)的交易輸出。
基于賬戶的交易
我們先看下傳統(tǒng)的交易是如何進(jìn)行的:我們設(shè)計一個支付系統(tǒng),給張三一個賬戶,里面有余額100 元,李四有一個賬戶,里面有余額50元。當(dāng)張三要付給李四20元時,做以下操作:
1. 檢查張三賬戶余額是否充足,如果不足20元就終止交易,向張三報“余額不足”
2. 在張三賬戶里減去20元(假設(shè)零手續(xù)費(fèi))
3. 在李四賬戶里增加20元
現(xiàn)在的銀行也好、信用卡也好、證券交易系統(tǒng)也好,互聯(lián)網(wǎng)第三方支付系統(tǒng)也好,其核心都是基于賬戶(account based)的設(shè)計,由關(guān)系數(shù)據(jù)庫支撐。
基于UTXO的交易
要理解UTXO,最簡單的辦法就是把一枚比特幣從誕生到在商海中沉浮的經(jīng)歷描述一下。我們假設(shè)一個這樣的場景:張三挖到12.5 枚比特幣。過了幾天,他把其中 2.5 枚支付給李四。又過了幾天,他和李四各出資 2.5 比特幣湊成 5 比特幣付給王五。
比特幣的區(qū)塊鏈賬本里記錄的是一筆又一筆的交易。
每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(fèi)(spend)一筆輸入,產(chǎn)生一筆輸出,而其所產(chǎn)生的輸出,就是“未花費(fèi)過的交易輸出”,也就是 UTXO。
比特幣交易遵守幾個規(guī)則:
第一,除了 coinbase交易之外,所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO,就像接水管一樣,一個接一個,此出彼入,此入彼出,生生不息,錢就在交易之間流動起來了。
第二,任何一筆交易的交易輸入總量必須等于交易輸出總量,等式兩邊必須配平。
上圖第一個交易#1001 號交易是 coinbase 交易。比特幣是礦工挖出來的。當(dāng)一個礦機(jī)費(fèi)盡九牛二虎之力找到一個合格的區(qū)塊之后,它就獲得一個特權(quán),能夠創(chuàng)造一個 coinbase 交易,在其中放入一筆新錢,并且在交易輸出的收款人地址一欄,堂堂正正的寫上自己的地址。假設(shè)這筆比特幣的數(shù)額為12.5 枚,這個coinbase 交易隨著張三挖出來的區(qū)塊被各個節(jié)點(diǎn)接受,經(jīng)過六個確認(rèn)以后永遠(yuǎn)的烙印在歷史中。
過了幾天,張三打算付 2.5 個比特幣給李四,張三就發(fā)起#2001號交易,這個交易的資金來源項寫著“#1001(1)”,也就是 #1001 號交易——張三挖出礦的那個 coinbase 交易——的第一項 UTXO。然后在本交易的交易輸出 UTXO 項中,把2.5個比特幣的收款人地址設(shè)為李四的地址。
請注意,這一筆交易必須將前面產(chǎn)生那一項 12.5 個比特幣的輸出項全部消耗,而由于張三只打算付給李四 2.5 個比特幣,為了要消耗剩下的10比特幣,他只好把剩余的那 10 個比特幣支付給自己,這樣才能符合輸入與輸出配平的規(guī)則。
再過幾天,張三和李四打算AA制合起來給王五付 5 枚比特幣。那么張三或李四發(fā)起 #3001 號交易,在交易輸入部分,有兩個資金來源,分別是#2001(1) 和 #2001(2),代表第 #2001 號交易的第 (1) 和第 (2) 項 UTXO。然后在這個交易的輸出部分里如法炮制,給王五5比特幣,把張三剩下的 7.5 比特幣發(fā)還給自己。以后王五若要再花他這5比特幣,就必須在他的交易里注明資金的來源是 #3001(1)。
所以,其實并沒有什么比特幣,只有UTXO。當(dāng)我們說張三擁有 10 枚比特幣的時候,我實際上是說,當(dāng)前區(qū)塊鏈賬本中,有若干筆交易的 UTXO 項收款人寫的是張三的地址,而這些 UTXO 項的數(shù)額總和是 10。而我們在比特幣錢包中所看到的賬戶余額,實際上是錢包通過掃描區(qū)塊鏈并聚合所有屬于該用戶的UTXO計算得來的。
兩種交易方式對比
1.UTXO只需要看最后一次交易,而賬戶系統(tǒng)要看歷史全數(shù)據(jù)后所有的增減操作全部加起來才能獲得正確的余額,兩者效率差異隨著時間推移會越來越大;
2.UTXO未來可以裁剪歷史老數(shù)據(jù),而賬戶系統(tǒng)則不能丟棄老數(shù)據(jù),前者區(qū)塊鏈可以控制住整體大小,而后者只能持續(xù)膨脹。
一點(diǎn)思考
比特幣規(guī)定每一筆新的交易的輸入必須是某筆交易未花費(fèi)的輸出,每一筆輸入同時也需要上一筆輸出所對應(yīng)的私鑰進(jìn)行簽名,并且每個比特幣的節(jié)點(diǎn)都會存儲當(dāng)前整個區(qū)塊鏈上的UTXO,整個網(wǎng)絡(luò)上的節(jié)點(diǎn)通過UTXO及簽名算法來驗證新交易。