理解UTXO賬戶模型

2022-03-26 20:19:10 字數 3919 閱讀 3738

1:什麼是utxo?

utxo的英文全稱為unspent transaction output,漢語翻譯過來則為:未消費的交易輸出。我們可以把utxo理解為交易過程中的乙個資料結構。未花費的交易輸出utxo是乙個包含交易資料和執行**的資料結構,可以通俗的理解為某倉庫(某位址)已經收到的但是尚未花費出去的加密數字貨幣。基於區塊鏈的加密數字貨幣使用utxo來驗證乙個人(其實是乙個位址)是否擁有未使用過的加密數字貨幣用於支付。

utxo模型是中本聰在bitcoin模型中初創並引用的,因為我們談到utxo總會首先聯想到位元幣,但是需要額外指出的是:utxo不是位元幣獨有的,當然 utxo跟區塊鏈也沒有必然的聯絡,比如你可以模仿位元幣但是不使用utxo模型。

ps: 有一些博文中將其解釋為未消費的事務輸出。

個人認為不合理,位元幣的流轉過程是乙個輸入與輸出的過程,我們知道位元幣只是乙個以區塊鏈為底層技術的應用之一罷了,所以位元幣本身踐行著」價值「的傳輸(」價值「的傳輸模式 是為了區分現行網際網路上的」資料「傳輸(位元組複製),比如傳輸乙個檔案),這個價值轉移的過程,其實就是交易的過程。

說道這裡,想解釋一下tx的含義,通過上面的英文全稱解析,我們知道tx代替的是transiaction。但是為什麼呢?

位元幣區塊描述

其中: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)交易的輸入使用的是上乙個交易的輸出

UTXO模型 賬戶模型 石墨烯模型

utxo模型 utxo 全稱是 unspent transaction output 這指的是 未花費的交易輸出。utxo 的核心設計思路是無狀態,它記錄的是交易事件,而不記錄最終狀態,也就是說只記錄變更事件,使用者需要根據歷史記錄自行計算餘額。某乙個賬戶中的餘額並不是由乙個數字表示的,而是由當前區...

utxo模型 UTXO模型

位元幣的區塊鏈由乙個個區塊串聯構成,而每個區塊又包含乙個或多個交易。如果我們觀察任何乙個交易,它總是由若干個輸入 input 和若干個輸出 output 構成,乙個input指向的是前面區塊的某個output,只有coinbase交易 礦工獎勵的鑄幣交易 沒有輸入,只有憑空輸出。所以,任何交易,總是...

區塊鏈 位元幣的賬戶模型 UTXO

在位元幣中,是不存在乙個中心化的機構對位元幣的交易進行結算清算的,自然也就沒有中心化的資料庫對使用者的賬戶進行管理。事實上,在位元幣系統中是沒有賬戶這個概念的,取而代之的是utxo unspent transaction output 即未消費的交易輸出。這是中本聰的乙個極其天才的設計。通過utxo...