什么是UTXO?淺談比特幣賬戶模型
1:什么是UTXO?
UTXO的英文全稱為Unspent Transaction Output,漢語翻譯過來則為:未消費的交易輸出。我們可以把UTXO理解為交易過程中的一個數據結構。未花費的交易輸出UTXO是一個包含交易數據和執行代碼的數據結構,可以通俗的理解為某倉庫(某地址)已經收到的但是尚未花費出去的加密數字貨幣。基於區塊鏈的加密數字貨幣使用UTXO來驗證一個人(其實是一個地址)是否擁有未使用過的加密數字貨幣用於支付。
UTXO模型是中本聰在bitcoin模型中初創並引用的,因為我們談到UTXO總會首先聯想到比特幣,但是需要額外指出的是:UTXO不是比特幣獨有的,當然 UTXO跟區塊鏈也沒有必然的聯系,比如你可以模仿比特幣但是不使用UTXO模型。
PS: 有一些博文中將其解釋為未消費的事務輸出。
個人認為不合理,比特幣的流轉過程是一個輸入與輸出的過程,我們知道比特幣只是一個以區塊鏈為底層技術的應用之一罷了,所以比特幣本身踐行着”價值“的傳輸(”價值“的傳輸模式 是為了區分現行互聯網上的”數據“傳輸(字節復制),比如傳輸一個文件),這個價值轉移的過程,其實就是交易的過程。
說道這里,想解釋一下TX的含義,通過上面的英文全稱解析,我們知道TX代替的是Transiaction。但是為什么呢?
原因1:在比特幣社區里,大家習慣性的用TX來代替交易Transaction。
比特幣區塊描述
其中:TX代表的是Transaction,其中數字“44”代表的是本區塊打包的交易筆數。
PS1:關於區塊結構及解析,將會在本專欄系列文章中進行詳細解讀,敬請期待。
PS2:至於什么是加密數字貨幣瀏覽器? 什么是加密數字貨幣(什么是比特幣)?將會在本專欄系列文章中進行詳細解讀,敬請期待。
2:常規的賬戶余額系統與比特幣的賬戶模型是什么?
我們常規理解的賬戶余額系統是什么樣子的?下面舉一個轉賬的例子
Case背景: TT 在某第三方中心化支付系統賬戶(比如招商銀行的賬戶)上有存款1000元,ZY有2000元,TXT有3000元。
操作如下:
操作1:TT某天向ZY轉賬800元;操作2:ZY然后向TXT轉賬500元。
假設平台手續費為0,那么在每一步操作,第三方支付賬戶系統需要做如下邏輯(以操作1舉例說明):
(1)判斷TT賬戶余額是否足夠800元,如果不夠 ,操作失敗,取消交易。如果足夠則轉向(2);
(2)TT賬戶余額減少800,同時ZY賬戶余額增加500;這一步操作是事務性操作,可以理解為同成功,同失敗。
其中第(2)步,如果間隔有時差(現實中會有這種情況),那么就會出現常見的“雙花問題”(也叫雙重支付攻擊,double spent attack)
操作1結束,操作2類似,不詳細描述,如下圖所示
轉賬操作前初始狀態
操作1轉賬之后余額狀態
操作2轉賬之后余額狀態
(1)現在的銀行支付系統、證券交易系統,包括互聯網第三方支付系統(比如支付寶等),其核心都是基於賬戶(account based)的設計,底層數據都是由關系型數據庫(RMDB:Relation Manage DataBase)支撐。
(2)RMDB的好處是可以支持事務性操作,RMDB所具有的ACID特性(原子性,一致性,隔離性,持久性)。
比特幣的賬戶模型就是基於UTXO數據結構
業內流行一句話:”其實並沒有什么比特幣,有的只是UTXO“---孟岩;個人表示贊同。
在比特幣交易中,每一筆交易都會有”交易輸入”(即資產來源)和“交易輸出”(即資產去向,當然比特幣模型里叫做未花費的交易輸出)。
可以通俗的理解為:別人付給你的錢是“交易輸入”,你收到的錢是“交易輸出”。
每一筆交易當中有可能有多個“交易輸入”和多個“交易輸出”。每一筆交易都是按照時間戳發生的順序,使用固定編碼編排的。
而且,任何一筆“交易輸入”都是前序某個交易當中產生的“未花費交易輸出”,就像接鏈條一樣,前后互相鏈接,前一個鏈條塊的輸出就是后一個鏈條塊的輸入。
一筆UTXO交易的組成
一筆比特幣交易的流程是什么樣子呢?下面舉一個例子來解釋下:
Case背景:TT的錢包(對應公鑰地址A)里有12.5個比特幣(其實就是UTXO),ZY錢包(對應公鑰地址B)里擁有5個比特幣,TXT錢包(對應公鑰地址C)里有0個比特幣。
操作(1)TT給TXT支付一筆5個比特幣;
操作(2)TT又給TXT支付一筆2個比特幣;
操作(3)ZY給TXT支付一筆1個比特幣;
操作(4)TXT給其他某個人轉出支付一筆3.5個比特幣。
那么,TXT的錢包里的比特幣(UTXO)變化是什么樣子呢?
比特幣變化結果如下:
操作(1)之后,TXT錢包里有一筆大小為5的UTXO收入交易記錄,共一筆,凈UTXO:5;
操作(2)之后,TXT錢包里有一筆大小為5的和一筆大小為2的UTXO收入交易記錄,共兩筆,凈UTXO:7;
操作(3)之后,TXT錢包里有一筆大小為5的,一筆大小為2的和一筆大小為1的UTXO收入交易記錄,共三筆,凈UTXO:8;
Caution:
操作(4)之后,TXT的錢包里基於(3)的基礎上,新增一筆支出大小為5個UTXO,然后新增一筆大小為1.5的收入交易記錄。凈UTXO:3-->4.5(終態);
為什么呢?
原因是:UTXO模型中,交易處理的基本單位是一個交易記錄,任何一個交易的輸入都是某一個交易的輸出。可以淺顯的理解為:上述的三筆收入分別為1,2,5個大小的UTXO為三個面額為1,2,5的硬幣,硬幣的消費是不會掰開花的,只能拿出合適的一個全花出去,然后接受對方找零(其實不是對方找零,而且比特幣交易系統自動為我們做的找零操作,UTXO接收方(目標地址)是感知不到的);
總結一下,UTXO的三個原則
1)所有交易始於coinbase(即始於挖礦獎勵所得);
2)除了coinbase交易之外,所有的交易輸入都必須來自於前面一個或者幾個交易的UTXO輸出。
3)每一筆的交易支出總額等於交易收入總額;
UTXO與支付系統賬戶模型的區別是什么?
1)在比特幣系統中,沒有賬戶的概念,所以也就沒有余額的概念,有的只是UTXO,比特幣交易系統中,用一連串的關聯交易來計算,某地址(類比於賬戶系統中的賬戶概念)下究竟有多少UTXO,通過這個UTXO計算值來確定,一個地址是否具有轉移出一筆交易的能力。
2)區別
在支付系統賬戶模型中,一個賬戶具有賬戶名(賬戶唯一ID)和密碼,通過賬戶ID和密碼認證,即獲得了對該賬戶的使用權和支配權。也就是說,該賬戶內的所有資產歸經過密碼安全認證的人所有。
在比特幣交易系統中,沒有賬戶iD和賬戶密碼一說,也沒有賬戶余額計算一說。但是 有公鑰(錢包地址)和秘鑰,可以淺顯的類比理解為:公鑰就是賬戶ID,私鑰就是賬戶密碼。在比特幣交易系統中,知道對方公鑰,就可以給對方轉賬進行交易。擁有了私鑰,就代表着擁有了該地址下所有UTXO的使用權和控制權。
個人理解:UTXO賬戶模型中沒有賬戶余額的概念,只有一條條的輸入/輸出記錄,都是交易的記錄,A給B轉了5個比特幣,就意味着本交易的輸入是5,且來自A的賬戶地址,交易輸出也是五,輸出的交易地址B的賬戶地址
1)001號交易為Coinbase交易,也就是挖礦交易,在這個交易中,“輸入”部分沒有對應的“輸出”,而是由系統直接獎勵發行比特幣,礦工Alice得到了12.5個比特幣的獎勵,放在001號交易的“輸出”部分。此時,對於Alice來說,擁有了這12.5個比特幣的支配權,這12.5個比特幣的輸出可以作為下一筆交易的“輸入”,顧名思義,這筆“輸出”就稱之為是Alice的未花費輸出,也就是Alice的UTXO的意思。
2)002號交易中,Alice轉賬6比特幣到Bob的地址,Alice找到了自己的UTXO(如果Alice不止一筆UTXO,可以根據一定的規則去選用,比如將小金額的先花費掉)。由於只需要轉賬6比特幣,可是UTXO中卻有12.5個,因此需要找零6.5個到自己的地址中,由此產生了002號中的交易輸出,注意,在002號交易輸出中的Alice地址是可以和001號中的Alice地址不一樣的,只要都是屬於Alice自己的錢包地址就可以。
3)003號交易中,Bob轉賬了2比特幣到Lily的地址,過程與002號交易相同,就不再贅述了。
4)交易的輸入使用的是上一個交易的輸出