Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

Bitcoin的UTXO模型和 Ethereum的Account模型

冰川2017
60 0 0
在当前区块链世界中,主要有两种记录保存方式,UTXO模式(UnspentTransactionOutput)和Account模式。Bitcoin采用的是UTXO模型,Ethereum采用的Account模型,同样CITA也采用了Account模型。0 O. S7 j3 M) ^3 Q

% P5 ^2 w4 D3 P" v& C+ d3 R  T2 p    Bitcoin的设计初衷是点对点的电子现金系统,在比特币中,每个交易消耗之前交易生成的UTXO然后生成新的UTXO,账户的余额即所有属于该地址的未花费UTXO集合,Bitcoin的全局状态即当前所有未花费的UTXO集合。Ethereum意图创建一个更为通用的协议,该协议支持图灵完备的编程语言,在此协议上用户可以编写智能合约,创建各种去中心化的应用。由于UTXO模型在状态保存以及可编程性方面的缺陷,Ethereum引入了Account模型。下面我们对两种模型的优缺点做进一步展开。
/ K: p' F2 m1 o: e6 B2 ]" i/ @
2 u' v7 Z- o8 g3 P% @/ Q    UTXO模型?: J2 a5 |$ K0 G/ o& t
$ t% \. Q5 U2 ?& a" l* P1 u& @
    UTXO模型中,交易只是代表了UTXO集合的变更。而账户和余额的概念是在UTXO集合上更高的抽象,账号和余额的概念只存在于钱包中。
2 N( B/ A# @2 E. K. ]$ j& g
+ S( E; x9 D6 V0 s9 l6 I. D    优点:
' D: }, P0 Q1 P4 s$ a# a9 F" o0 o  p9 G4 l6 \8 u, Q* A& V
    计算是在链外的,交易本身既是结果也是证明。节点只做验证即可,不需要对交易进行额外的计算,也没有额外的状态存储。交易本身的输出UTXO的计算是在钱包完成的,这样交易的计算负担完全由钱包来承担,一定程度上减少了链的负担。5 Z) l3 N% h1 V# i5 z/ S6 u
" H# _4 ?- j* E& B. G) b
    除Coinbase交易外,交易的Input始终是链接在某个UTXO后面。交易无法被重放,并且交易的先后顺序和依赖关系容易被验证,交易是否被消费也容易被举证。- E; J+ N. w: V9 x6 C

4 F3 l& M7 L5 R1 S4 W) O    UTXO模型是无状态的,更容易并发处理。
2 @+ \' X9 R7 Q3 G1 c  k% j. G1 J' W, N
    对于P2SH类型的交易,具有更好的隐私性。交易中的Input是互不相关联的,可以使用CoinJoin这样的技术,来增加一定的隐私性。: m! t4 X; ?. l" D& H# {% g/ o, p+ B7 N
$ q. i& R2 @) k7 B5 |5 t+ @3 `9 X+ x
    缺点:
  v6 {$ V. `- V0 {" i! q3 A% f! c
7 m& H0 M- ~3 P! |/ n    无法实现一些比较复杂的逻辑,可编程性差。对于复杂逻辑,或者需要状态保存的合约,实现难度大,且状态空间利用率比较低。
0 ]4 [2 l0 I3 M; v1 [0 D
7 J5 ^4 {- _6 z2 v    当Input较多时,见证脚本也会增多。而签名本身是比较消耗CPU和存储空间的。' l% I8 d4 s- a$ u: _9 s

3 _) z  x' Q5 A! m3 A    ACCOUNT模型1 a0 k4 Q7 T1 I

* n0 `+ G7 [5 j* b5 ~1 x) I" E3 E    对于Account模型,Account模型保存了世界状态,链的状态一般在区块中以StateRoot和ReceiptRoot等形式进行共识。交易只是事件本身,不包含结果,交易的共识和状态的共识本质上可以隔离的。
& n2 A& f+ l# @, {0 M. t3 ?1 M) E% A- N9 s) v3 t
    优点:
5 C) {/ R- [( u; x* X, @) F; j8 k8 M, j& U
    合约以代码形式保存在Account中,并且Account拥有自身状态。这种模型具有更好的可编程性,容易开发人员理解,场景更广泛。
6 b7 f: _3 {  H5 q
& [! w7 g! X0 ~$ |8 ^! ~. q& ~    批量交易的成本较低。设想矿池向矿工支付手续费,UTXO中因为每个Input和Out都需要单独Witnessscript或者Lockingscript,交易本身会非常大,签名验证和交易存储都需要消耗链上宝贵的资源。而Account模型可以通过合约的方式极大的降低成本。
$ B2 d* H# W9 t1 d4 g! ?( ]: V2 m  a7 d* V- y5 X
    缺点:
1 C* \/ }- h& f6 Q! H5 @$ g: D" p% n! ]1 k7 C+ R
    Account模型交易之间没有依赖性,需要解决重放问题。. z2 f; [1 U% w. m$ T

1 y( Z4 X9 h$ K  F9 L  C! w+ r0 ~    对于实现闪电网络/雷电网络,Plasma等,用户举证需要更复杂的Proof证明机制,子链向主链进行状态迁移需要更复杂的协议。, c- i" q3 ]0 ]
& K7 O  j) I/ O2 N2 K! |
    UTXOVSACCOUNT
9 D0 V* O& @( }1 c/ }0 B$ p- Y* x
7 Y. ?3 F4 a; k6 @" R    对于以上几个优点和缺点,我们再做一些分析和对比。
: E, F" G+ J3 G+ {& [/ e
. o# `: ?2 X9 Q2 @" P    第一,关于计算的问题。- f. l5 m+ c1 t( j  V2 C
( p) y! L" K6 ~+ v2 z8 Q: B
    UTXO交易本身对于区块链并没有复杂的计算,这样简单的讲其实并不完全准确,原因分有两个,一是Bitcoin本身的交易多为P2SH,且Witnessscript是非图灵完备的,不存在循环语句。而对于Account模型,例如Ethereum,由于计算多在链上,且为图灵完备,一般计算较为复杂,同时合约安全性就容易成为一个比较大的问题。当然是否图灵完备对于是否是账户模型并没有直接关联。但是账户模型引入之后,合约可以作为一个不受任何人控制的独立实体存在,这一点意义重大。
% U. E7 v. p$ u$ Q% L' I; p, ]: T* ]  ^$ i! K5 c  D
    第二,关于UTXO更易并发的问题。+ a0 P9 |! P% G  C7 [" @8 q2 W1 c
8 Q; s8 `! M6 |5 C5 R
    在UTXO模型中,世界状态即为UTXO的集合,节点为了更快的验证交易,需要在内存中存储所有的UTXO的索引,因此UTXO是非常昂贵的。对于长期不消费的UTXO,会一直占用节点的内存。所以对于此种模型,理论上应该鼓励用户减少生产UTXO,多消耗UTXO。但是如果要使用UTXO进行并行交易则需要更多的UTXO作为输入,同时要产生更多的UTXO来保证并发性,这本质上是对网络进行了粉尘攻击。并且由于交易是在钱包内构造,所以需要钱包更复杂的设计。反观Account模型,每个账户可以看成是单独的互不影响的状态机,账户之间通过消息进行通信。所以理论上用户发起多笔交易时,当这些交易之间不会互相调用同一Account时,交易是完全可以并发执行的。: n5 V$ w; z8 Q$ e& t6 ~; p8 g9 I. q
3 d! K* e) J; p* R6 B4 _
    第三,关于Account模型的交易重放问题。
  N% W, J+ H3 t" W& o* T8 [' {0 A3 i% x: C2 p
    Ethereum使用了在Account中增加nonce的方式,每笔交易对应一个nonce,nonce每次递增。这种方式虽然意在解决重放的问题,但是同时引入了顺序性问题,同时使得交易无法并行。例如在Ethereum中,用户发送多笔交易,如果第一笔交易打包失败,将引起后续多笔交易都打包不成功。在CITA中我们使用了随机nonce的方案,这样用户的交易之间没有顺序性依赖,不会引起串联性失败,同时使得交易有并行处理的可能。7 F5 }# m4 _5 b  K; {% ?

/ l; y8 s9 {7 o7 Q3 D    第四,存储问题。  Q- K6 ~2 ]# ]. }) b7 z( e

- N+ B( h. i$ S) O2 B    因为UTXO模型中,只能在交易中保存状态。而Account模型的状态是在节点保存,在Ethereum中使用MPT的方式存储,Block中只需要共识StateRoot等即可。这样对于链上数据,Account模型实际更小,网络传输的量更小,同时状态在节点本地使用MPT方式保存,在空间使用上也更有效率。例如A向B转账,如果在UTXO中假设存在2个Input和2个Output,则需要2个Witnessscript和2个Lockingscript;在Account模型中则只需要一个签名,交易内容只包含金额即可。在最新的隔离见证实现后,Bitcoin的交易数据量也大大减少,但是实际上对于验证节点和全节点仍然需要针对Witnessscript进行传输和验证。
  _! d: M0 Y; m8 f3 {6 l9 c% K
( b' R: t7 U( ]    第五,对于轻节点获取某一地址状态,UTXO更复杂。$ P, \3 q) L: ~' c  X" g! s
# O8 r0 `% ]+ G) }) @" }
    例如钱包中,需要向全节点请求所有关于某个地址的所有UTXO,全节点可以发送部分UTXO,钱包要验证该笔UTXO是否已经被消费,有一定的难度,而且钱包很难去证明UTXO是全集而不是部分集合。而对于Account模型则简单很多,根据地址找到State中对应状态,当前状态的StateProof则可以证明合约数据的真伪。当然对于UTXO也可以在每个区块中对UTXO的root进行验证,这一点与当前Bitcoin的实现有关,并非UTXO的特点。0 y! o1 B$ \+ N  ?" a5 |3 |

& o7 X: {4 h7 }: ?  g9 b) S/ e    结论. ^) _7 h, o. {0 V" M8 q$ ^
6 |+ S: n1 e1 R9 q+ G2 }1 x/ J
    综上来看,Account模型在可编程性,灵活性等方面更有优势;在简单业务和跨链上,UTXO有其非常独到和开创性的优点。对于选择何种模型,要从具体的业务场景进行出发。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

冰川2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1