文章閱讀頁通欄

UTXO與Account模型剖析

來源: 區塊網 作者:
UTXO 模型剖析 在比特幣的網絡中,UTXO(Unspent Transaction Output 未花費交易輸出)是比特幣交易的基本單位,通過交易的輸入和輸出,比特幣網絡將金錢變化成......
UTXO 模型剖析

在比特幣的網絡中,UTXO(Unspent Transaction Output 未花費交易輸出)是比特幣交易的基本單位,通過交易的輸入和輸出,比特幣網絡將金錢變化成一段數據結構,區別于信用卡支付必須在加密安全網絡中傳輸,比特幣的數據可以在任何不一定安全的網絡中傳輸 ( W i F i 、藍牙,N F C,表格等 ) 。

UTXO可以是“一聰”(1×10-9 BTC)的任意整數倍。盡管UTXO可以是小于2100萬的任意數值,但是一旦UTXO被創造出來,只能作為一個整體被花掉。如果一筆交易需要的BTC小于某一個UTXO的值,那么該UTXO依然會被當做一個整體花費掉,并形成一個找零的UTXO。

UTXO可以看做被私鑰的擁有者鎖定的、并被整個比特幣網絡識別的比特幣貨幣單位。

在UTXO模型中,被某一個交易消耗的UTXO被稱為交易輸入,由交易創建的UTXO被稱為交易輸出。通過這種方式,一定量的比特幣在不同的私鑰所有者之間轉移,并在交易鏈條中不斷消耗和創建新的UTXO。一筆比特幣交易通過所有者
的私鑰簽名來解鎖UTXO,并通過使用新的所有者的比特幣地址來鎖定并創建 UTXO。在比特幣網絡的起 始的階段,礦工通過一種特殊的交易類型,Coinbase交易創造的交易的輸出(該交易沒有輸入),所產生的比特幣,可以用于創建其他的UTXO。

UTXO 被每一個全節點(Full Node)比特幣客戶端在一個儲存于內存中的數據庫所追蹤,該數據庫也被稱為“UTXO集”或者“UTXO池”,新的交易構建時從UTXO池中消耗一個或多個輸出,而比特幣網絡監測著以百萬為單位的所有可用的UTXO,世界上在比特幣網絡中并不存在“比特幣余額”的概念,因為比特幣網絡上只會記錄所有未花費的UTXO,比特幣的余額的概念更多是通過比特幣錢包客戶端派生出來的產物,比特幣錢包通過掃區塊鏈并聚合所有屬于該用戶的UTXO來計算該用戶的余額。

另外關于交易費用的問題,我們可以通過計算輸入和輸出的差額,來計算一筆交易的交易費用。

比特幣網絡中的交易輸入和輸出數據結構:

表1 比特幣交易輸入數據結構

表2 比特幣交易輸出數據結構

由于每一個比特幣的全客戶端都會對每一筆交易按照一系列的規則,進行獨立校驗,一筆比特幣交易所有的交易信息都包含在腳本中,如果任何一個節點按照腳本執行,并對 結果的有效性進行了校驗,那么其他所有節點必將得到一致性的校驗結果,這也意味著一筆有效的交易對所有人都是有效的。

比特幣網絡中的每一筆交易的執行依賴于解鎖腳本和鎖定腳本。解鎖腳本可以解決鎖定腳本對某一輸出值的阻礙,鎖定腳本會在某一筆輸出值上設置花費的條件。解鎖腳本通常包含私鑰的一個簽名,也被稱為ScriptSig,鎖定腳本通常會把一個交易輸出鎖定到一個比特幣地址上(公鑰的哈希Hash值)。

比特幣全節點客戶端會同時執行鎖定腳本和解鎖腳本來驗證某一筆交易的合法性。客戶端會先檢索輸入所指向的UTXO,這個UTXO包含一個定義了花費條件的鎖定腳本,然后客戶端會讀取試圖花費這UTXO的由客戶端構造的輸入中所包含的解鎖腳本,并執行這兩個腳本。 如果從解鎖腳本處復制好堆棧數據之后,再執行鎖定腳本的結果為真, 那么說明解鎖腳本有權使用該UTXO,并發起新的交易。

比特幣在交易中使用腳本系統,與FORTH(一種編譯語言)一樣,腳本是簡單的、基于堆棧的、并且從左向右處理,它特意被設計成非圖靈完備的,沒有循環(LOOP)語句的一種系統。在比特幣網絡中,腳本系統對數據的操作都通過堆棧完成(主堆棧和副堆棧),堆棧是一個常用的抽象數據類型,最主要的特點就是后進先出(LIFO:Last In First Out)。

在比特幣的客戶端中,開發者把比特幣客戶端支持的腳本類型通過Standard()函數做了一個總結,在Standard()函數中包含5種類型的腳本:

這5種標準的腳本類型實現了,通過公鑰哈希支付、通過公鑰支付、多重簽名、通過腳本哈希支付、以及數據輸出的功能。通過這5種標準的腳本類型,比特幣客戶端可以實現較復雜的支付邏輯。另外,一個非標準化的腳本類型也有可能被創建,但是必須找到一個愿意打包該非標準化的交易的礦工,該非標準化的 腳本才會被執行。

我們以P2PKH(Pay to publickey hash)為例,來說明腳本的產生和執行過程。假設我們需要向某一個面包店支付0.01BTC 來購買面包,面包店的地址為:Bread Address。

則該交易的輸出為:
OP_DUP OP_HASH160OP_EQUAL OP_CHECKSIG

鎖定腳本對應的解鎖腳本為:
<Bread Signature> <Bread Public Key>

將兩個腳本結合起來可以形成如下組合腳本:
OP_DUP OP_HASH160
Hash> OP_EQUAL OP_CHECKSIG

只有當解鎖版腳本與鎖定版腳本的設定條件相符合的時候,執行組合腳本時才會顯示結 果為真(Ture)。要想執行組合腳本的結果為真,也就意味著,Bread Signature的簽名是有Bread Address對應的私鑰所簽名,是一個Bread Address的有效簽名,只有這 樣交易執行結果才會通過(結果為真)。

雖然比特幣的腳本語言包含很多的操作符,但是需要注意的是比特幣腳本語言是非圖靈完備的。在該腳本語言中,是沒有循環功能的,這也意味著交易的復雜性有限,交易的可執行次數有限。腳本并不是一種通用的編程語言,這些限制也避免了潛在創造無限循 環或者其他復雜邏輯漏洞的支付條件,從而對比特幣網絡的安全性留下隱患。

在UTXO模型中,我們可以通過公開的賬本清晰的追溯每一筆交易的歷史記錄,并且可以做到完全透明,另外UTXO模型也帶來了一定的并行處理能力,可以發起多地址到多地址的交易,為可拓展性帶來一定借鑒。除此之外UTXO模型也帶來了一定的隱私性,用戶可以通過Change address,來作為UTXO的輸出地址。但是UTXO本身是無狀態的,我們將通過一系列的創新的設計,實現基于UTXO類型的智能合約。

Account模型剖析

與UTXO模型不同的是,以太坊是有賬戶體系的,在以太坊的白皮書中,我們可以看到以太坊的賬戶體系:在以太坊系統中,狀態是由被稱為“賬戶”(每個賬戶由一個20字節的地址)的對象和在兩個賬戶之間轉移價值和信息的狀態轉換構成的。

以太坊的賬戶包含四個部分:隨機數,用于確定每筆交易只能被處理一次的計數器、賬戶目前的、以太幣余額、賬戶的合約代碼,如果有的話、賬戶的存儲(默認為空)

以太幣(Ether)是以太坊內部的主要加密燃料,用于支付交易費用。一般而言,以太坊有兩種類型的賬戶:外部所有的賬戶(由私鑰控制的)和合約賬戶(由合約代碼控制)。外部所有的賬戶沒有代碼,人們可以通過創建和簽名一筆交易從一個外部賬戶發送消息。每當合約賬戶收到一條消息,合約內部的代碼就會被激活,允許它對內部存儲進行讀取和寫入,和發送其它消息或者創建合約。

在以太坊系統中,通過一個有狀態的賬戶系統來記錄賬戶余額,每個賬戶余額的增加/減少更像現實世界中的銀行記賬方式,每產生一個新的區塊,都會可能對全局狀態造成 影響。每個賬戶都有自己的余額、存儲和代碼區域。這樣合約就可以調用賬戶或者地址, 并且把相應的執行結果在存儲區域進行存儲。

在目前以太坊的賬戶系統中,通過 client 可以進行一對一的轉賬,也就意味著每次只能從一個賬戶轉移到另外一個賬戶。盡管通過智能合約可以發送到更多的賬戶,但是這些內部交易只能在用戶的賬戶余額上顯示,卻很難在以太坊的公開賬本上追蹤。


更多數字貨幣信息:www.guwutu.icu/news

關鍵詞: UTXO  Account  
0/300
? 时时彩龙虎和计划app