什么是UTXO
在比特幣錢包當中诗舰,我們通常能夠看到賬戶余額,然而在中本聰設計的比特幣系統(tǒng)中蜀铲,并沒有余額這個概念〖侨埃“比特幣余額”是由比特幣錢包應用派生出來的產(chǎn)物。中本聰發(fā)明了UTXO交易模型厌丑,并將其應用到比特幣當中渔呵。
UTXO(Unspent Transaction Outputs)是未花費的交易輸出,它是比特幣交易生成及驗證的一個核心概念扩氢。交易構(gòu)成了一組鏈式結(jié)構(gòu),所有合法的比特幣交易都可以追溯到前向一個或多個交易的輸出录豺,這些鏈條的源頭都是挖礦獎勵饭弓,末尾則是當前未花費的交易輸出媒抠。
基于賬戶的交易
我們先看下傳統(tǒng)的交易是如何進行的:我們設計一個支付系統(tǒng),給張三一個賬戶领舰,里面有余額100 元迟螺,李四有一個賬戶,里面有余額50元矩父。當張三要付給李四20元時,做以下操作:
1. 檢查張三賬戶余額是否充足窍株,如果不足20元就終止交易,向張三報“余額不足”
2. 在張三賬戶里減去20元(假設零手續(xù)費)
3. 在李四賬戶里增加20元
現(xiàn)在的銀行也好后裸、信用卡也好冒滩、證券交易系統(tǒng)也好微驶,互聯(lián)網(wǎng)第三方支付系統(tǒng)也好开睡,其核心都是基于賬戶(account based)的設計,由關系數(shù)據(jù)庫支撐篇恒。
基于UTXO的交易
要理解UTXO,最簡單的辦法就是把一枚比特幣從誕生到在商海中沉浮的經(jīng)歷描述一下款筑。我們假設一個這樣的場景:張三挖到12.5 枚比特幣腾么。過了幾天醋虏,他把其中 2.5 枚支付給李四哮翘。又過了幾天,他和李四各出資 2.5 比特幣湊成 5 比特幣付給王五饭寺。
比特幣的區(qū)塊鏈賬本里記錄的是一筆又一筆的交易叫挟。
每筆交易都有若干交易輸入限煞,也就是資金來源,也都有若干筆交易輸出署驻,也就是資金去向。一般來說瓶蚂,每一筆交易都要花費(spend)一筆輸入,產(chǎn)生一筆輸出窃这,而其所產(chǎn)生的輸出征候,就是“未花費過的交易輸出”杭攻,也就是 UTXO疤坝。
比特幣交易遵守幾個規(guī)則:
第一,除了 coinbase交易之外跑揉,所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO,就像接水管一樣衣撬,一個接一個扮饶,此出彼入具练,此入彼出甜无,生生不息,錢就在交易之間流動起來了岂丘。
第二,任何一筆交易的交易輸入總量必須等于交易輸出總量铜邮,等式兩邊必須配平。
上圖第一個交易#1001 號交易是 coinbase 交易松蒜。比特幣是礦工挖出來的。當一個礦機費盡九牛二虎之力找到一個合格的區(qū)塊之后秸苗,它就獲得一個特權(quán),能夠創(chuàng)造一個 coinbase 交易玖瘸,在其中放入一筆新錢檀咙,并且在交易輸出的收款人地址一欄雅倒,堂堂正正的寫上自己的地址攀芯。假設這筆比特幣的數(shù)額為12.5 枚文虏,這個coinbase 交易隨著張三挖出來的區(qū)塊被各個節(jié)點接受,經(jīng)過六個確認以后永遠的烙印在歷史中氧秘。
過了幾天,張三打算付 2.5 個比特幣給李四丸相,張三就發(fā)起#2001號交易,這個交易的資金來源項寫著“#1001(1)”膳算,也就是 #1001 號交易——張三挖出礦的那個 coinbase 交易——的第一項 UTXO弛作。然后在本交易的交易輸出 UTXO 項中涕蜂,把2.5個比特幣的收款人地址設為李四的地址映琳。
請注意,這一筆交易必須將前面產(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绍刮。當我們說張三擁有 10 枚比特幣的時候,我實際上是說岁歉,當前區(qū)塊鏈賬本中,有若干筆交易的 UTXO 項收款人寫的是張三的地址刨裆,而這些 UTXO 項的數(shù)額總和是 10彬檀。而我們在比特幣錢包中所看到的賬戶余額,實際上是錢包通過掃描區(qū)塊鏈并聚合所有屬于該用戶的UTXO計算得來的窍帝。
兩種交易方式對比
1.UTXO只需要看最后一次交易,而賬戶系統(tǒng)要看歷史全數(shù)據(jù)后所有的增減操作全部加起來才能獲得正確的余額,兩者效率差異隨著時間推移會越來越大报慕;
2.UTXO未來可以裁剪歷史老數(shù)據(jù)压怠,而賬戶系統(tǒng)則不能丟棄老數(shù)據(jù),前者區(qū)塊鏈可以控制住整體大小菌瘫,而后者只能持續(xù)膨脹。
一點思考
比特幣規(guī)定每一筆新的交易的輸入必須是某筆交易未花費的輸出雨让,每一筆輸入同時也需要上一筆輸出所對應的私鑰進行簽名,并且每個比特幣的節(jié)點都會存儲當前整個區(qū)塊鏈上的UTXO崔挖,整個網(wǎng)絡上的節(jié)點通過UTXO及簽名算法來驗證新交易。