在當(dāng)前區(qū)塊鏈?zhǔn)澜缰行渍龋饕袃煞N記錄保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 采用的是 UTXO 模型盆耽,Ethereum 采用的 Account 模型,同樣 CITA 也采用了 Account 模型扼菠。
Bitcoin 的設(shè)計(jì)初衷是點(diǎn)對點(diǎn)的電子現(xiàn)金系統(tǒng)摄杂,在比特幣中,每個(gè)交易消耗之前交易生成的 UTXO 然后生成新的 UTXO循榆,賬戶的余額即所有屬于該地址的未花費(fèi) UTXO 集合析恢,Bitcoin 的全局狀態(tài)即當(dāng)前所有未花費(fèi)的 UTXO 集合。Ethereum 意圖創(chuàng)建一個(gè)更為通用的協(xié)議秧饮,該協(xié)議支持圖靈完備的編程語言映挂,在此協(xié)議上用戶可以編寫智能合約,創(chuàng)建各種去中心化的應(yīng)用盗尸。由于 UTXO 模型在狀態(tài)保存以及可編程性方面的缺陷柑船,Ethereum 引入了 Account 模型。下面我們對兩種模型的優(yōu)缺點(diǎn)做進(jìn)一步展開泼各。
UTXO 模型
UTXO 模型中鞍时,交易只是代表了 UTXO 集合的變更。而賬戶和余額的概念是在 UTXO 集合上更高的抽象,賬號和余額的概念只存在于錢包中逆巍。
優(yōu)點(diǎn):
計(jì)算是在鏈外的及塘,交易本身既是結(jié)果也是證明。節(jié)點(diǎn)只做驗(yàn)證即可蒸苇,不需要對交易進(jìn)行額外的計(jì)算磷蛹,也沒有額外的狀態(tài)存儲(chǔ)。交易本身的輸出 UTXO 的計(jì)算是在錢包完成的溪烤,這樣交易的計(jì)算負(fù)擔(dān)完全由錢包來承擔(dān)味咳,一定程度上減少了鏈的負(fù)擔(dān)。
除 Coinbase 交易外檬嘀,交易的 Input 始終是鏈接在某個(gè) UTXO 后面槽驶。交易無法被重放,并且交易的先后順序和依賴關(guān)系容易被驗(yàn)證鸳兽,交易是否被消費(fèi)也容易被舉證掂铐。
UTXO 模型是無狀態(tài)的,更容易并發(fā)處理揍异。
對于 P2SH 類型的交易全陨,具有更好的隱私性。交易中的 Input 是互不相關(guān)聯(lián)的衷掷,可以使用 CoinJoin 這樣的技術(shù)辱姨,來增加一定的隱私性。
缺點(diǎn):
無法實(shí)現(xiàn)一些比較復(fù)雜的邏輯戚嗅,可編程性差雨涛。對于復(fù)雜邏輯,或者需要狀態(tài)保存的合約懦胞,實(shí)現(xiàn)難度大替久,且狀態(tài)空間利用率比較低。
當(dāng) Input 較多時(shí)躏尉,見證腳本也會(huì)增多蚯根。而簽名本身是比較消耗 CPU 和存儲(chǔ)空間的。
ACCOUNT 模型
對于 Account 模型胀糜,Account 模型保存了世界狀態(tài)稼锅,鏈的狀態(tài)一般在區(qū)塊中以 StateRoot 和 ReceiptRoot 等形式進(jìn)行共識。交易只是事件本身僚纷,不包含結(jié)果,交易的共識和狀態(tài)的共識本質(zhì)上可以隔離的拗盒。
優(yōu)點(diǎn):
合約以代碼形式保存在 Account 中怖竭,并且 Account 擁有自身狀態(tài)。這種模型具有更好的可編程性陡蝇,容易開發(fā)人員理解痊臭,場景更廣泛哮肚。
批量交易的成本較低。設(shè)想礦池向礦工支付手續(xù)費(fèi)广匙,UTXO 中因?yàn)槊總€(gè) Input 和 Out 都需要單獨(dú) Witness script 或者 Locking script允趟,交易本身會(huì)非常大,簽名驗(yàn)證和交易存儲(chǔ)都需要消耗鏈上寶貴的資源鸦致。而 Account 模型可以通過合約的方式極大的降低成本潮剪。
缺點(diǎn):
Account 模型交易之間沒有依賴性,需要解決重放問題分唾。
對于實(shí)現(xiàn)閃電網(wǎng)絡(luò)/雷電網(wǎng)絡(luò)抗碰,Plasma 等,用戶舉證需要更復(fù)雜的 Proof 證明機(jī)制绽乔,子鏈向主鏈進(jìn)行狀態(tài)遷移需要更復(fù)雜的協(xié)議弧蝇。
UTXO VS ACCOUNT
對于以上幾個(gè)優(yōu)點(diǎn)和缺點(diǎn),我們再做一些分析和對比折砸。
第一看疗,關(guān)于計(jì)算的問題的。
UTXO 交易本身對于區(qū)塊鏈并沒有復(fù)雜的計(jì)算睦授,這樣簡單的講其實(shí)并不完全準(zhǔn)確两芳,原因分有兩個(gè),一是 Bitcoin 本身的交易多為 P2SH睹逃,且 Witness script 是非圖靈完備的盗扇,不存在循環(huán)語句。而對于 Account 模型沉填,例如 Ethereum疗隶,由于計(jì)算多在鏈上,且為圖靈完備翼闹,一般計(jì)算較為復(fù)雜斑鼻,同時(shí)合約安全性就容易成為一個(gè)比較大的問題。當(dāng)然是否圖靈完備對于是否是賬戶模型并沒有直接關(guān)聯(lián)猎荠。但是賬戶模型引入之后坚弱,合約可以作為一個(gè)不受任何人控制的獨(dú)立實(shí)體存在,這一點(diǎn)意義重大关摇。
第二荒叶,關(guān)于 UTXO 更易并發(fā)的問題。
在 UTXO 模型中输虱,世界狀態(tài)即為 UTXO 的集合些楣,節(jié)點(diǎn)為了更快的驗(yàn)證交易,需要在內(nèi)存中存儲(chǔ)所有的 UTXO 的索引,因此 UTXO 是非常昂貴的愁茁。對于長期不消費(fèi)的 UTXO蚕钦,會(huì)一直占用節(jié)點(diǎn)的內(nèi)存。所以對于此種模型鹅很,理論上應(yīng)該鼓勵(lì)用戶減少生產(chǎn) UTXO嘶居,多消耗 UTXO。但是如果要使用 UTXO 進(jìn)行并行交易則需要更多的 UTXO 作為輸入促煮,同時(shí)要產(chǎn)生更多的 UTXO 來保證并發(fā)性邮屁,這本質(zhì)上是對網(wǎng)絡(luò)進(jìn)行了粉塵攻擊。并且由于交易是在錢包內(nèi)構(gòu)造污茵,所以需要錢包更復(fù)雜的設(shè)計(jì)樱报。反觀 Account 模型,每個(gè)賬戶可以看成是單獨(dú)的互不影響的狀態(tài)機(jī)泞当,賬戶之間通過消息進(jìn)行通信迹蛤。所以理論上用戶發(fā)起多筆交易時(shí),當(dāng)這些交易之間不會(huì)互相調(diào)用同一 Account 時(shí)襟士,交易是完全可以并發(fā)執(zhí)行的盗飒。
第三,關(guān)于 Account 模型的交易重放問題陋桂。
Ethereum 使用了在 Account 中增加 nonce 的方式逆趣,每筆交易對應(yīng)一個(gè) nonce,nonce 每次遞增嗜历。這種方式雖然意在解決重放的問題宣渗,但是同時(shí)引入了順序性問題,同時(shí)使得交易無法并行梨州。例如在 Ethereum中痕囱,用戶發(fā)送多筆交易,如果第一筆交易打包失敗暴匠,將引起后續(xù)多筆交易都打包不成功鞍恢。在 CITA 中我們使用了隨機(jī) nonce 的方案,這樣用戶的交易之間沒有順序性依賴每窖,不會(huì)引起串聯(lián)性失敗帮掉,同時(shí)使得交易有并行處理的可能。
第四窒典,存儲(chǔ)問題蟆炊。
因?yàn)?UTXO 模型中,只能在交易中保存狀態(tài)瀑志。而 Account 模型的狀態(tài)是在節(jié)點(diǎn)保存盅称,在 Ethereum 中使用MPT 的方式存儲(chǔ)肩祥,Block 中只需要共識 StateRoot 等即可。這樣對于鏈上數(shù)據(jù)缩膝,Account 模型實(shí)際更小,網(wǎng)絡(luò)傳輸?shù)牧扛“杜瑫r(shí)狀態(tài)在節(jié)點(diǎn)本地使用 MPT 方式保存疾层,在空間使用上也更有效率。例如 A 向 B 轉(zhuǎn)賬贡避,如果在 UTXO 中假設(shè)存在 2 個(gè) Input 和2個(gè) Output痛黎,則需要 2 個(gè) Witness script 和 2 個(gè)Locking script;在 Account 模型中則只需要一個(gè)簽名刮吧,交易內(nèi)容只包含金額即可湖饱。在最新的隔離見證實(shí)現(xiàn)后,Bitcoin的交易數(shù)據(jù)量也大大減少杀捻,但是實(shí)際上對于驗(yàn)證節(jié)點(diǎn)和全節(jié)點(diǎn)仍然需要針對 Witness script 進(jìn)行傳輸和驗(yàn)證井厌。
第五,對于輕節(jié)點(diǎn)獲取某一地址狀態(tài)致讥,UTXO 更復(fù)雜仅仆。
例如錢包中,需要向全節(jié)點(diǎn)請求所有關(guān)于某個(gè)地址的所有 UTXO垢袱,全節(jié)點(diǎn)可以發(fā)送部分 UTXO墓拜,錢包要驗(yàn)證該筆 UTXO 是否已經(jīng)被消費(fèi),有一定的難度请契,而且錢包很難去證明 UTXO 是全集而不是部分集合咳榜。而對于 Account 模型則簡單很多,根據(jù)地址找到 State 中對應(yīng)狀態(tài)爽锥,當(dāng)前狀態(tài)的 State Proof 則可以證明合約數(shù)據(jù)的真?zhèn)斡亢.?dāng)然對于 UTXO 也可以在每個(gè)區(qū)塊中對 UTXO 的 root 進(jìn)行驗(yàn)證,這一點(diǎn)與當(dāng)前 Bitcoin 的實(shí)現(xiàn)有關(guān)救恨,并非 UTXO 的特點(diǎn)贸辈。
結(jié)論
綜上來看,Account 模型在可編程性肠槽,靈活性等方面更有優(yōu)勢擎淤;在簡單業(yè)務(wù)和跨鏈上,UTXO 有其非常獨(dú)到和開創(chuàng)性的優(yōu)點(diǎn)秸仙。對于選擇何種模型嘴拢,要從具體的業(yè)務(wù)場景進(jìn)行出發(fā)。
本文轉(zhuǎn)載自《UTXO 和 Account 模型對比》寂纪,作者:Nervos [NervosNetwork]席吴,版權(quán)歸原作者