在当前区块链世界中,主要有两种记录保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 采用的是 UTXO 模型,Ethereum 采用的 Account 模型,一样 CITA 也采用了 Account 模型。
Bitcoin 的设计初衷是点对点的电子现金系统,在比特币中,每一个交易消耗以前交易生成的 UTXO 而后生成新的 UTXO,帐户的余额即全部属于该地址的未花费 UTXO 集合,Bitcoin 的全局状态即当前全部未花费的 UTXO 集合。Ethereum 意图建立一个更为通用的协议,该协议支持图灵完备的编程语言,在此协议上用户能够编写智能合约,建立各类去中心化的应用。因为 UTXO 模型在状态保存以及可编程性方面的缺陷,Ethereum 引入了 Account 模型。下面咱们对两种模型的优缺点作进一步展开。git
UTXO 模型中,交易只是表明了 UTXO 集合的变动。而帐户和余额的概念是在 UTXO 集合上更高的抽象,帐号和余额的概念只存在于钱包中。github
对于 Account 模型,Account 模型保存了世界状态,链的状态通常在区块中以 StateRoot 和 ReceiptRoot 等形式进行共识。交易只是事件自己,不包含结果,交易的共识和状态的共识本质上能够隔离的。编程
对于以上几个优势和缺点,咱们再作一些分析和对比。
第一,关于计算的问题的。UTXO 交易自己对于区块链并无复杂的计算,这样简单的讲其实并不彻底准确,缘由分有两个,一是 Bitcoin 自己的交易多为 P2SH,且 Witness script 是非图灵完备的,不存在循环语句。而对于 Account 模型,例如 Ethereum,因为计算多在链上,且为图灵完备,通常计算较为复杂,同时合约安全性就容易成为一个比较大的问题。固然是否图灵完备对因而否是帐户模型并无直接关联。可是帐户模型引入以后,合约能够做为一个不受任何人控制的独立实体存在,这一点意义重大。
第二,关于 UTXO 更易并发的问题。在 UTXO 模型中,世界状态即为 UTXO 的集合,节点为了更快的验证交易,须要在内存中存储全部的 UTXO 的索引,所以 UTXO 是很是昂贵的。对于长期不消费的 UTXO,会一直占用节点的内存。因此对于此种模型,理论上应该鼓励用户减小生产 UTXO,多消耗 UTXO。可是若是要使用 UTXO 进行并行交易则须要更多的 UTXO 做为输入,同时要产生更多的 UTXO 来保证并发性,这本质上是对网络进行了粉尘攻击。而且因为交易是在钱包内构造,因此须要钱包更复杂的设计。反观 Account 模型,每一个帐户能够当作是单独的互不影响的状态机,帐户之间经过消息进行通讯。因此理论上用户发起多笔交易时,当这些交易之间不会互相调用同一 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 是否已经被消费,有必定的难度,并且钱包很难去证实 UTXO 是全集而不是部分集合。而对于 Account 模型则简单不少,根据地址找到 State 中对应状态,当前状态的 State Proof 则能够证实合约数据的真伪。固然对于 UTXO 也能够在每一个区块中对 UTXO 的 root 进行验证,这一点与当前 Bitcoin 的实现有关,并不是 UTXO 的特色。浏览器
综上来看,Account 模型在可编程性,灵活性等方面更有优点;在简单业务和跨链上,UTXO 有其很是独到和开创性的优势。对于选择何种模型,要从具体的业务场景进行出发。安全
《Thoughts on UTXOs》 by Vitalik Buterin网络
《What are the pros and cons of Ethereum balances vs. UTXOs?》架构
《Mastering Bitcoin 2nd Edition - Programming the Open Blockchain》并发
NingNing,Architect at Cryptape, former core developer at EthFans.org.
Github:u2 (zhangyaning)
------------------------- End --------------------
若是你对创造将来的加密经济感兴趣,对本身的能力有自信,欢迎投简历到 join@cryptape.com 加入咱们:
Appchain Team - Appchain 是 Nervos Network 的 Layer 2 方案之一,以 CITA 为核心,包含 Neuron 钱包和 Microscope 浏览器。不管你是移动应用高手,Web 应用高手,仍是有特殊技能的产品小王子,Appchain Team 都欢迎!
CITA Core Team - CITA 是世界上第一个使用微服务架构的许可链项目,用 Rust 实现,追求高性能与高稳定性。CITA 与大多数许可链不一样,不是 Ethereum 或者 Fabric 的 fork,而是一个从零开始设计的项目,这给咱们带来了许多挑战,也带来了许多乐趣。这里隐藏大佬不少哦~
CKB Core Team - CKB 是 Nervos Network 的 Layer 1, 是一条公有链,用 Rust 实现,追求安全性与稳定性。这里隐藏大佬也不少哦~
Cryptape Research