在當前區塊鏈世界中,主要有兩種記錄保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 采用的是 UTXO 模型,Ethereum 采用的 Account 模型。
Bitcoin 的設計初衷是點對點的電子現金系統,在位元幣中,每個交易消耗之前交易生成的 UTXO 然后生成新的 UTXO,賬戶的余額即所有屬于該地址的未花費 UTXO 集合,Bitcoin 的全域狀態即當前所有未花費的 UTXO 集合。Ethereum 意圖創建一個更為通用的協議,該協議支持圖靈完備的編程語言,在此協議上用戶可以撰寫智能合約,創建各種去中心化的應用。由于 UTXO 模型在狀態保存以及可編程性方面的缺陷,Ethereum 引入了 Account 模型。
1.什么是 UTXO
在位元幣中,一筆交易“在黑盒子里”實際運作的方式是:花費一種東西的集合,這種東西被稱為 “未被花費的交易輸出”(即 “UTXO” ),這些輸出由一個或多個之前的交易所創造,并在其后制造出一筆或多筆新的 UTXO ,可以在未來的交易中花費。每一筆 UTXO 可以被理解為一個 “coin(幣)”:它有面額、有一個所有者。
一筆交易若要有效,必須滿足的兩個規則是:
1)該交易必須包含一個有效的簽名,來自它所花費的 UTXO 的擁有者;
2)被花費的 UTXO 的總面額必須等于或者大于該交易產生的 UTXO 的總面額。
一個用戶的余額因此并不是作為一個數字儲存起來的;而是用他占有的 UTXO 的總和計算出來的。
如果一個用戶想要發送一筆交易,發送 X 個幣到一個特定的地址,有時候,他們擁有的 UTXO 的一些子集組合起來面值恰好是 X,在這種情況下,他們可以創造一個交易:花費他們的 UTXO 并創造出一筆新的、價值 X 的 UTXO ,由目標地址占有。當這種完美的配對不可能的時候,用戶就必須打包其和值大于X 的 UTXO 輸入集合,并添加一筆擁有第二個目標地址的 UTXO ,稱為“零錢輸出”,分配剩下的幣到一個由他們自己控制的地址。
除了"位元幣的網路效應",我們可以為 UTXO 模型提出一些技術上的主張;一個特別的主張是:它允許交易的并行化處理,正如一個交易發送者發送兩筆獨立的交易時,他們可以小心地花費獨立的 UTXO ,因此這些交易也可以用任意次序來處理。這種順序不變性與可并行化屬性也許可以帶來可擴展性的好處。使一個人的幣可以分離開來,同樣有一些隱私保護上的好處,尤其是,當一個用戶接到的每一筆 UTXO 都使用了一個不同的地址的時候,因為這些地址的私鑰可以確切地被所有者通過一個 master seed 生成出來;雖然這種隱私所得很容易被打破,如果該用戶并沒有仔細地保證他的資金相互分離的話。
如果隱私是被強烈偏好的,那么由 UTXO 提供的資金分離對于這個任務來說是遠遠不夠的;這將需要更復雜的建構如環簽名(Ring Signatures),額外的同態加密(Homomorphic Value Encryption)以及 ZK-SNARKs。
2.UTXO 的優缺點
UTXO 模型中,交易只是代表了 UTXO 集合的變更。而賬戶和余額的概念是在 UTXO 集合上更高的抽象,賬號和余額的概念只存在于錢包中。
優點:
計算是在鏈外的,交易本身既是結果也是證明。節點只做驗證即可,不需要對交易進行額外的計算,也沒有額外的狀態存盤。交易本身的輸出 UTXO 的計算是在錢包完成的,這樣交易的計算負擔完全由錢包來承擔,一定程度上減少了鏈的負擔。
除 Coinbase 交易外,交易的 Input 始終是鏈接在某個 UTXO 后面。交易無法被重放,并且交易的先后順序和依賴關系容易被驗證,交易是否被消費也容易被舉證。
UTXO 模型是無狀態的,更容易并發處理。
對于 P2SH 型別的交易,具有更好的隱私性。交易中的 Input 是互不相關聯的,可以使用 CoinJoin 這樣的技術,來增加一定的隱私性。
缺點:
無法實作一些比較復雜的邏輯,可編程性差。對于復雜邏輯,或者需要狀態保存的合約,實作難度大,且狀態空間利用率比較低。
當 Input 較多時,見證腳本也會增多。而簽名本身是比較消耗 CPU 和存盤空間的。
3.ACCOUNT 模型的優缺點
對于 Account 模型,Account 模型保存了世界狀態,鏈的狀態一般在區塊中以 StateRoot 和 ReceiptRoot 等形式進行共識。交易只是事件本身,不包含結果,交易的共識和狀態的共識本質上可以隔離的。

優點:
合約以代碼形式保存在 Account 中,并且 Account 擁有自身狀態。這種模型具有更好的可編程性,容易開發人員理解,場景更廣泛。
批量交易的成本較低。設想礦池向礦工支付手續費,UTXO 中因為每個 Input 和 Out 都需要單獨 Witness script 或者 Locking script,交易本身會非常大,簽名驗證和交易存盤都需要消耗鏈上寶貴的資源。而 Account 模型可以通過合約的方式極大的降低成本。
缺點:
Account 模型交易之間沒有依賴性,需要解決重放問題。
對于實作閃電網路/雷電網路,Plasma 等,用戶舉證需要更復雜的 Proof 證明機制,子鏈向主鏈進行狀態遷移需要更復雜的協議。
4.UTXO VS ACCOUNT
對于以上幾個優點和缺點,我們再做一些分析和對比。
第一,關于計算的問題。
UTXO 交易本身對于區塊鏈并沒有復雜的計算,這樣簡單的講其實并不完全準確,原因分有兩個,一是 Bitcoin 本身的交易多為 P2SH,且 Witness script 是非圖靈完備的,不存在回圈陳述句。而對于 Account 模型,例如 Ethereum,由于計算多在鏈上,且為圖靈完備,一般計算較為復雜,同時合約安全性就容易成為一個比較大的問題。當然是否圖靈完備對于是否是賬戶模型并沒有直接關聯。但是賬戶模型引入之后,合約可以作為一個不受任何人控制的獨立物體存在,這一點意義重大。
第二,關于 UTXO 更易并發的問題。
在 UTXO 模型中,世界狀態即為 UTXO 的集合,節點為了更快的驗證交易,需要在記憶體中存盤所有的 UTXO 的索引,因此 UTXO 是非常昂貴的。對于長期不消費的 UTXO,會一直占用節點的記憶體。所以對于此種模型,理論上應該鼓勵用戶減少生產 UTXO,多消耗 UTXO。但是如果要使用 UTXO 進行并行交易則需要更多的 UTXO 作為輸入,同時要產生更多的 UTXO 來保證并發性,這本質上是對網路進行了粉塵攻擊。并且由于交易是在錢包內構造,所以需要錢包更復雜的設計。反觀 Account 模型,每個賬戶可以看成是單獨的互不影響的狀態機,賬戶之間通過訊息進行通信。所以理論上用戶發起多筆交易時,當這些交易之間不會互相呼叫同一 Account 時,交易是完全可以并發執行的。
第三,關于 Account 模型的交易重放問題。
Ethereum 使用了在 Account 中增加 nonce 的方式,每筆交易對應一個 nonce,nonce 每次遞增。這種方式雖然意在解決重放的問題,但是同時引入了順序性問題,同時使得交易無法并行。例如在 Ethereum中,用戶發送多筆交易,如果第一筆交易打包失敗,將引起后續多筆交易都打包不成功。在 CITA 中我們使用了隨機 nonce 的方案,這樣用戶的交易之間沒有順序性依賴,不會引起串聯性失敗,同時使得交易有并行處理的可能。
第四,存盤問題。
因為 UTXO 模型中,只能在交易中保存狀態。而 Account 模型的狀態是在節點保存,在 Ethereum 中使用 MPT 的方式存盤,Block 中只需要共識 StateRoot 等即可。這樣對于鏈上資料,Account 模型實際更小,網路傳輸的量更小,同時狀態在節點本地使用 MPT 方式保存,在空間使用上也更有效率。例如 A 向 B 轉賬,如果在 UTXO 中假設存在 2 個 Input 和2個 Output,則需要 2 個 Witness script 和 2 個 Locking script;在 Account 模型中則只需要一個簽名,交易內容只包含金額即可。在最新的隔離見證實作后,Bitcoin 的交易資料量也大大減少,但是實際上對于驗證節點和全節點仍然需要針對 Witness script 進行傳輸和驗證。
第五,對于輕節點獲取某一地址狀態,UTXO 更復雜。
例如錢包中,需要向全節點請求所有關于某個地址的所有 UTXO,全節點可以發送部分 UTXO,錢包要驗證該筆 UTXO 是否已經被消費,有一定的難度,而且錢包很難去證明 UTXO 是全集而不是部分集合。而對于 Account 模型則簡單很多,根據地址找到 State 中對應狀態,當前狀態的 State Proof 則可以證明合約資料的真偽。當然對于 UTXO 也可以在每個區塊中對 UTXO 的 root 進行驗證,這一點與當前 Bitcoin 的實作有關,并非 UTXO 的特點。
5.不使用 UTXO的理由
反對 UTXO 的核心主張有下面兩部分:
1)UTXO 的復雜性是沒有必要的,而其復雜性在實際運行中會比在理論上還要大。
2)UTXO 是無狀態的(stateless),因此并不能很好的適用于比資產的發行和保存更加復雜的應用,復雜應用一般來說是有狀態的,比如不同型別的智能合約。
來考察第一種主張。考慮一下你會如何實作一個 UTXO 模式下的錢包——尤其是,生成一個發出交易的函式。這一函式不僅要求一個賬戶的私鑰作為輸入,還有一些瑣碎的資料,比如一個有序的數字,而不是屬于該賬戶的 UTXO 的全集。這一函式還必須接受集合,并確定一個價值大于需要的輸出數額的子集作為輸入。某些時候,如果存在多個最小的子集,又會產生一些決定要花費哪個子集的復雜任務。
此外,如果一個錢包真的想要從上面提到的, UTXO 的并行化交易處理屬性中獲益,該錢包必須仔細地分切“變更輸出”以至于該錢包總是有多個變更輸出可以用作資金的來源;如果一個錢包只控制一個大的變更輸出、總是從中抽取出一個小的數額來做下一筆支出,整個事情又變成連續的了。這不是純粹理論上的問題;大部分的位元幣錢包仍然不能使其最優化,與賬戶和連續數字模型相比,這在本質上使其 UTXO 的可并行化收益作廢。
在位元幣的例子(現實一點來說,任何一個公有鏈都是)中,交易費用以每千位元組計,而 UTXO 選擇演算法必須額外地小心以最優化每一筆 UTXO 的長期平均交易消耗;這甚至引發了一個拒絕服務漏洞,攻擊者可以使用小額的 UTXO(其價值比花費它們需要的邊際手續費還要小) 來堵塞一個錢包。撇開這些,每千位元組的手續費的存在在 UTXO 選擇演算法中引入了一些摩擦:可能有這樣一種情況, UTXO 的子集 S 足以支付需要的數額 X,但大小為 S 的交易要求一筆交易手續費 F, 而 S 并不足以支付 X+F,那么 S 就需要增加到 S’ ,但然后 S' 大小的交易又要求交易手續費 F' ,要求有 UTXO 的子集 S'',等等。 簡而言之,使用賬戶和連續數字,創造一個錢包只是一個高中級別的問題;然而,使用 UTXO 它就變得很接近于一個本科生研究級別的挑戰了。
UTXO 是如何地不契合于有狀態的智能合約,也是清楚的:如果需要創建一個擁有多個階段的合約,比如,必須由多方提供一些形式的輸入,一段時間以后這些參與者又必須執行一些額外的操作,最后,作為他們操作的一個函式,該合約支出資金;很難看出如何拿這個模型去適應基本上無狀態而只有花費和未花費的物件。然而,在一個基于賬戶的模型中,事情就簡單了:一個人可以確認一個合約具有他所希望的代碼,然后,這個合約就可以被其靜態地址呼叫。
結論
綜上來看,Account 模型在可編程性,靈活性等方面更有優勢;在簡單業務和跨鏈上,UTXO 有其非常獨到和開創性的優點。對于選擇何種模型,要從具體的業務場景進行出發。
主要參考資料:
https://ethfans.org/posts/compare-with-utxo-and-account-mode
————————————————
著作權宣告:本文為CSDN博主「Li_Yu_Qing」的原創文章
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/28604.html
標籤:區塊鏈技術
上一篇:dapp投票系統
