UTXO和Account模型一個都不能少

UTXO對於非區塊鏈從業人員來說可能比較陌生,UTXO的全稱是Unspent Transaction Output,這中本聰在比特幣中的一個天才設計。而Account模型就很常見,也很容易理解,你銀行賬戶裏面有多少錢,就是賬戶模型。

關於UTXO的詳細探討,我比較推薦孟巖的一篇文章《其實並沒有什麼比特幣,只有 UTXO》,這裏比較詳細的講解了UTXO的原理,以及與Account模型的對比。總的來說UTXO和Account模型比起來有以下優勢:

1.UTXO數據庫只保留有用數據。

UTXO中的Unspent很重要,也就意味着如果一個UTXO被一筆交易花費掉後,那麼這條記錄就不是Unspent的,也就沒必要存在於UTXO數據庫中。而Account數據庫則不同,對於每個使用過的賬戶,都得一直保留,不管這個賬戶還有沒有錢,會不會被再次使用。

在比特幣中,爲了提高匿名性和抗量子攻擊,我們可以大量生成地址,每個地址只使用一次,一旦該地址付出過比特幣,那麼公鑰就暴露了,也就不抗量子攻擊了,所以找零不會回到付款地址,而是一個新地址。如果採用Account模型,那麼必然會在數據庫中存放大量餘額爲0的賬戶地址。

2.UTXO支持並行的記賬操作。

在賬戶數據庫中,張三要轉20元給李四,需要進行一個數據庫事務,在張三賬戶裏減20,在李四賬戶里加20。如果與此同時,王五要轉30元給張三,那這個交易就得排隊,無法並行。之所以這樣,歸根結底是因爲這兩筆交易都需要跟“張三的賬戶餘額”這個共享狀態打交道。而在 UTXO 中,數據庫跟蹤的是比特幣的所有權轉移,而不是賬戶的狀態。不管張三本人正在發生多少收支交易,這些收支交易都是發生在不同的比特幣上的,更重要的是這些交易之間並不共享任何狀態,因此不會相互干擾,所有這些交易可以併發執行。這帶來好處不光是快,更重要的是可擴展,可分佈。

3.UTXO模型天然就能夠抵禦重放攻擊。

比如A用戶有100,現在給B用戶轉10,如果是Account模型,那麼操作就是:

Tx: A.Balance-=10; B.Balance+=10;

如果我們將這個交易在打包到區塊鏈後又再廣播到網絡中,A用戶又會再次向B轉10,這就是重放攻擊。Account模型要解決重放攻擊,以太坊採用的是唯一的Nonce值的方法,每個交易Tx中有一個Nonce字段,對於每個用戶來說,這個Nonce都不能重複,從而避免了重放攻擊。

如果是UTXO模型,同樣是A轉賬10給B,那麼A的操作就是:

Tx:Input A.UTXO 100  ->  Output[0] B.UTXO 10; Output[1] A.UTXO 90

這筆交易會花費掉100這個UTXO,所以在該交易打包後,如果我們再次廣播該交易到網絡,會找不到Input裏面對應的UTXO,從而避免重放攻擊。

前面說的都是優點,我們也應該意識到UTXO的不足之處:

4.UTXO比Account難於理解和操作

UTXO畢竟概念較新,對於普通用戶和剛入行的程序員來說畢竟難於理解,所以也更難於接受。相反Account模型卻很簡單,很容易理解。在代碼實現上也是,對於比特幣錢包來說,如果有多個UTXO,在支付時,還需要通過一定的算法選擇合適的多個UTXO進行組合,構建交易。而Account模型時,支付就簡單很多,所以大部分智能合約在操作時都是向開發人員提供Account模型,這也是量子鏈的一個功能亮點,在底層用UTXO模型,在合約上提供Account模型,而這中間的複雜轉換,就由量子鏈AAL抽象賬戶層來完成。

5.UTXO碎片化問題

關於碎片化問題,在Account模型中根本不存在,因爲只需要一個Balance字段即可,沒有碎片一說。而UTXO不同,比如有個慈善組織,有一個小額募捐地址,大家捐款數額不大,基本都是0.1個,0.05個比特幣,慈善組織看到錢包裏有10個比特幣,但是這背後其實是有幾百個UTXO組成的。當這個慈善組織要發起一筆10比特幣的轉賬交易時,Input方放入幾百條UTXO,並逐一進行簽名,最終使得這個交易體積舉到,交易手續費及高。

另外一種UTXO碎片化的場景就是挖礦獎勵。在比特幣的設計中,區塊的第一筆交易叫Coinbase交易,是礦工的挖礦獎勵,在每10分鐘出一個塊的情況下,UTXO碎片化問題還不容易暴露。我們如果發行自己的公鏈,出塊速度調整爲1秒,那麼一天就會產生24*60*60=86400個塊,對應的UTXO也會有86400個,如果挖礦的賬戶有20個,那麼一個礦工一天就會收到4320個UTXO,每個UTXO的金額很小,但是數量特別多,使用起來很麻煩,而且也讓UTXO數據庫膨脹很快。

如何結合UTXO和Account模型的優點?

既然兩種賬戶模型各有優缺點,那麼我們在公鏈中能不能揚長避短,結合兩者的優勢呢?PalletOne就是結合了兩者的有點,在不同的情況使用不同的模型。

普通Token的流轉採用UTXO模型,這樣可以充分利用UTXO的並行能力提高性能,抵禦重放攻擊的特性提升安全性。由於PalletOne採用的是DPOS共識機制,出塊時間短,每一塊的獎勵額度小,所以如果在Coinbase採用UTXO模型必然會導致碎片化。所以PalletOne在Coinbase交易上採用了UTXO和Account相結合的模式。在一般情況下,我們採用Account模型,在狀態數據庫中記錄下每一個礦工應該得到的獎勵,在滿足某一結算條件時(比如到了某一時間點、到了某區塊高度,或者到了換屆時刻)就將Account模型中每個礦工應該得到的獎勵變成UTXO,同時將Account的賬戶餘額清零。這樣做的優勢就是避免了UTXO碎片化。由於UTXO難於操作,所以在對智能合約提供操作接口時,PalletOne也採用了類似量子鏈AAL的設計,對合約來說,只提供Account模型的操作,在執行時,會由中間層實現UTXO和Account的互換,從而降低了合約開發人員的開發難度。

其實除了Coinbase和智能合約支持外,PalletOne還在Token發行和投票選舉中結合了兩者的優勢。

在Token發行(也就是以太坊上的ERC20)時,PalletOne上所有發行的Token都是和平臺幣PTN同等地位的使用UTXO模型,只是發行的Token和PTN的AssetID不一樣罷了。而現在大部分其他鏈發行Token都是基於合約,基於賬戶模型來實現。使用UTXO模型發行Token的優點除了前面提到的幾點外,還有就是更高的安全性,使用合約和賬戶模型發行的Token,如果一時疏忽就很容易造成大數溢出之類的漏洞,而採用UTXO模型後檢查變得更簡單,要求SUM(Input)>=SUM(Output)即可。

在投票選舉上,因爲PalletOne採用的是DPOS共識,所以需要社區對節點進行投票。而如果基於UTXO來進行唱票會導致效率低下,所以針對每個賬戶持有的PTN數量,PalletOne在狀態數據庫中緩存了其餘額,當用戶進行收付款時,同步更新Account模型中的餘額,這樣可以保證超級節點換屆時,投票結果能夠快速統計出來。

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