Nervos 加密經濟網絡中的底層公鏈 CKB 是比比特幣更像比特幣的價值存儲平臺。(這一點將會在經濟模型設計中講到,敬請期待~)在技術實現上,咱們也充分對比了比特幣 UTXO 模型和以太坊 Account 模型的優劣,從中繼承了比特幣協議對狀態爲核心的優秀架構。咱們稱 CKB 是一個通用驗證網絡,Cell 是對 UTXO 的通常化版本。而且,發展出了 CKB 模型的優點,在 CKB 當前狀態中存儲的是任意的共同知識,而再也不僅僅是某一種單一數字貨幣。在深刻了解 CKB 公鏈中的 Cell 模型前,咱們來談一談前置概念:UTXO 和 Account 模型!
祕猿科技區塊鏈小課堂 17 期git
在當前區塊鏈世界中,主要有兩種記錄保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 採用的是 UTXO 模型,Ethereum 採用的 Account 模型,一樣 CITA 也採用了 Account 模型。github
Bitcoin 的設計初衷是點對點的電子現金系統,在比特幣中,每一個交易消耗以前交易生成的 UTXO 而後生成新的 UTXO,帳戶的餘額即全部屬於該地址的未花費 UTXO 集合,Bitcoin 的全局狀態即當前全部未花費的 UTXO 集合。Ethereum 意圖建立一個更爲通用的協議,該協議支持圖靈完備的編程語言,在此協議上用戶能夠編寫智能合約,建立各類去中心化的應用。因爲 UTXO 模型在狀態保存以及可編程性方面的缺陷,Ethereum 引入了 Account 模型。下面咱們對兩種模型的優缺點作進一步展開。編程
UTXO 模型中,交易只是表明了 UTXO 集合的變動。而帳戶和餘額的概念是在 UTXO 集合上更高的抽象,帳號和餘額的概念只存在於錢包中。安全
對於 Account 模型,Account 模型保存了世界狀態,鏈的狀態通常在區塊中以 StateRoot 和 ReceiptRoot 等形式進行共識。交易只是事件自己,不包含結果,交易的共識和狀態的共識本質上能夠隔離的。網絡
對於以上幾個優勢和缺點,咱們再作一些分析和對比。架構
UTXO 交易自己對於區塊鏈並無複雜的計算,這樣簡單的講其實並不徹底準確,緣由分有兩個,一是 Bitcoin 自己的交易多爲 P2SH,且 Witness script 是非圖靈完備的,不存在循環語句。而對於 Account 模型,例如 Ethereum,因爲計算多在鏈上,且爲圖靈完備,通常計算較爲複雜,同時合約安全性就容易成爲一個比較大的問題。固然是否圖靈完備對因而否是帳戶模型並無直接關聯。可是帳戶模型引入以後,合約能夠做爲一個不受任何人控制的獨立實體存在,這一點意義重大。併發
在 UTXO 模型中,世界狀態即爲 UTXO 的集合,節點爲了更快的驗證交易,須要在內存中存儲全部的 UTXO 的索引,所以 UTXO 是很是昂貴的。對於長期不消費的 UTXO,會一直佔用節點的內存。因此對於此種模型,理論上應該鼓勵用戶減小生產 UTXO,多消耗 UTXO。可是若是要使用 UTXO 進行並行交易則須要更多的 UTXO 做爲輸入,同時要產生更多的 UTXO 來保證併發性,這本質上是對網絡進行了粉塵攻擊。而且因爲交易是在錢包內構造,因此須要錢包更復雜的設計。反觀 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 是全集而不是部分集合。而對於 Account 模型則簡單不少,根據地址找到 State 中對應狀態,當前狀態的 State Proof 則能夠證實合約數據的真僞。固然對於 UTXO 也能夠在每一個區塊中對 UTXO 的 root 進行驗證,這一點與當前 Bitcoin 的實現有關,並不是 UTXO 的特色。
綜上來看,Account 模型在可編程性,靈活性等方面更有優點;在簡單業務和跨鏈上,UTXO 有其很是獨到和開創性的優勢。對於選擇何種模型,要從具體的業務場景進行出發。
Thoughts on UTXOs by Vitalik Buterin:
https://medium.com/@ConsenSys...
What are the pros and cons of Ethereum balances vs. UTXOs?:
https://ethereum.stackexchang...
Mastering Bitcoin 2nd Edition - Programming the Open Blockchain: https://github.com/bitcoinboo...
Accounts and not UTXOs: https://github.com/ethereum/w...
交易中的nonce的做用是什麼?: https://docs.nervos.org/cita/...
Why is EVM-on-Plasma hard?: https://medium.com/@kelvinfic...