UTXO對於非區塊鏈從業人員來講可能比較陌生,UTXO的全稱是Unspent Transaction Output,這中本聰在比特幣中的一個天才設計。而Account模型就很常見,也很容易理解,你銀行帳戶裏面有多少錢,就是帳戶模型。程序員
關於UTXO的詳細探討,我比較推薦孟巖的一篇文章《其實並無什麼比特幣,只有 UTXO》,這裏比較詳細的講解了UTXO的原理,以及與Account模型的對比。總的來講UTXO和Account模型比起來有如下優點:算法
UTXO中的Unspent很重要,也就意味着若是一個UTXO被一筆交易花費掉後,那麼這條記錄就不是Unspent的,也就不必存在於UTXO數據庫中。而Account數據庫則不一樣,對於每一個使用過的帳戶,都得一直保留,無論這個帳戶還有沒有錢,會不會被再次使用。數據庫
在比特幣中,爲了提升匿名性和抗量子攻擊,咱們能夠大量生成地址,每一個地址只使用一次,一旦該地址付出過比特幣,那麼公鑰就暴露了,也就不抗量子攻擊了,因此找零不會回到付款地址,而是一個新地址。若是採用Account模型,那麼必然會在數據庫中存放大量餘額爲0的帳戶地址。緩存
在帳戶數據庫中,張三要轉20元給李四,須要進行一個數據庫事務,在張三帳戶裏減20,在李四帳戶里加20。若是與此同時,王五要轉30元給張三,那這個交易就得排隊,沒法並行。之因此這樣,歸根結底是由於這兩筆交易都須要跟「張三的帳戶餘額」這個共享狀態打交道。而在 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.net
這筆交易會花費掉100這個UTXO,因此在該交易打包後,若是咱們再次廣播該交易到網絡,會找不到Input裏面對應的UTXO,從而避免重放攻擊。
前面說的都是優勢,咱們也應該意識到UTXO的不足之處:
UTXO畢竟概念較新,對於普通用戶和剛入行的程序員來講畢竟難於理解,因此也更難於接受。相反Account模型卻很簡單,很容易理解。在代碼實現上也是,對於比特幣錢包來講,若是有多個UTXO,在支付時,還須要經過必定的算法選擇合適的多個UTXO進行組合,構建交易。而Account模型時,支付就簡單不少,因此大部分智能合約在操做時都是向開發人員提供Account模型,這也是量子鏈的一個功能亮點,在底層用UTXO模型,在合約上提供Account模型,而這中間的複雜轉換,就由量子鏈AAL抽象帳戶層來完成。
關於碎片化問題,在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數據庫膨脹很快。
既然兩種帳戶模型各有優缺點,那麼咱們在公鏈中能不能揚長避短,結合二者的優點呢?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模型中的餘額,這樣能夠保證超級節點換屆時,投票結果可以快速統計出來。