淺談區塊鏈世界UTXO 和 Account 模型優缺點

Hyperledger Fabric 2.0 Alpha發佈了,令人興奮的是Fabric 2.0 Alpha還爲用戶提供了在Fabric通道上輕鬆將資產轉化爲token的功能。FabToken是一種token管理系統,它使用Unspent Transaction Output(UTXO)模型,利用Hyperledger Fabric提供的身份和成員服務基礎設施來發布傳輸和兌換token。
我們今天就簡單分析一下UTXO 和 Account 模型優缺點。
在當前區塊鏈領域裏,主要有兩種記錄保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。早期Bitcoin 採用的是 UTXO 模型,Ethereum 和EOS採用的 Account 模型,同樣 CITA 也採用了 Account 模型。現在Fabric採用了Bitcoin的模型。
我們都清楚中本聰在設計Bitcoin的時候提出建立一套“基於互聯網的點對點的電子現金系統”,在比特幣中,每個交易消耗之前交易生成一個UTXO, 交易之後生成新的 UTXO,賬戶的餘額即所有屬於該地址的未花費 UTXO 集合。Bitcoin 的全局狀態即當前所有未花費的 UTXO 集合。Ethereum 、EOS意圖創建一個更爲通用的協議,該協議支持圖靈完備的編程語言,在此協議上用戶可以編寫智能合約,創建各種去中心化的應用。由於 UTXO 模型在狀態保存以及可編程性方面的缺陷,Ethereum、EOS 引入了 Account 模型。下面我們對兩種模型的優缺點做進一步展開。
1、UTXO 模型
UTXO數據庫只保留有用數據。UTXO中的Unspent很重要,也就意味着如果一個UTXO被一筆交易花費掉後,那麼這條記錄就不是Unspent的,也就沒必要存在於UTXO數據庫中。在比特幣中,爲了提高匿名性和抗量子攻擊,我們可以大量生成地址,每個地址只使用一次,一旦該地址付出過比特幣,那麼公鑰就暴露了,也就不抗量子攻擊了,所以找零不會回到付款地址,而是一個新地址。可以看出UTXO模型天然就能夠抵禦重放攻擊。

UTXO 模型中,交易只是代表了 UTXO 集合的變更。而賬戶和餘額的概念是在 UTXO 集合上更高的抽象,賬號和餘額的概念只存在於錢包中。
優點:

  • 計算是在鏈外的,交易本身既是結果也是證明。節點只做驗證即可,不需要對交易進行額外的計算,也沒有額外的狀態存儲。交易本身的輸出 UTXO 的計算是在錢包完成的,這樣交易的計算負擔完全由錢包來承擔,一定程度上減少了鏈的負擔。
  • 除 Coinbase 交易外,交易的 Input 始終是鏈接在某個 UTXO 後面。交易無法被重放,並且交易的先後順序和依賴關係容易被驗證,交易是否被消費也容易被舉證。
  • UTXO 模型是無狀態的,更容易併發處理。
  • 對於 P2SH 類型的交易,具有更好的隱私性。交易中的 Input 是互不相關聯的,可以使用 CoinJoin 這樣的技術,來增加一定的隱私性。

缺點:

  • 無法實現一些比較複雜的邏輯,可編程性差。對於複雜邏輯,或者需要狀態保存的合約,實現難度大,且狀態空間利用率比較低。
  • 當 Input 較多時,見證腳本也會增多。而簽名本身是比較消耗 CPU 和存儲空間的。

2、ACCOUNT 模型
對於 Account 模型,Account 模型保存了世界狀態,也就是我們常說的狀態機,鏈的狀態一般在區塊中以 StateRoot 和 ReceiptRoot 等形式進行共識。交易只是事件本身,不包含結果,交易的共識和狀態的共識本質上可以隔離的。
交易狀態,完全保存在狀態機裏。在網絡廣播的時候,每個節點收到block後,按照共識機制,改寫自己的狀態機來完成賬戶餘額的處理。
優點:

  • 合約以代碼形式保存在 Account 中,並且 Account 擁有自身狀態。這種模型具有更好的可編程性,容易開發人員理解,場景更廣泛。
  • 批量交易的成本較低。設想礦池向礦工支付手續費,UTXO 中因爲每個 Input 和 Out 都需要單獨 Witness script 或者 Locking script,交易本身會非常大,簽名驗證和交易存儲都需要消耗鏈上寶貴的資源。而 Account 模型可以通過合約的方式極大的降低成本。

缺點:

  • Account 模型交易之間沒有依賴性,需要解決重放問題。Ethereum是怎麼解決的,我們清楚Ethereum是採用的是唯一的Nonce值的方法,每個交易Tx中有一個Nonce字段,對於每個用戶來說,這個Nonce都不能重複,從而避免了重放攻擊。
  • 對於實現閃電網絡/雷電網絡,Plasma 等,用戶舉證需要更復雜的 Proof 證明機制,子鏈向主鏈進行狀態遷移需要更復雜的協議。

我們很對UTXO模型和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 的特點。

結論
綜上來看,Account 模型在可編程性,靈活性等方面更有優勢;在簡單業務和跨鏈上,UTXO 有其非常獨到和開創性的優點。對於選擇何種模型,要從具體的業務場景進行出發。

2019年6月28日整理於深圳

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章