Nervos 加密经济网络中的底层公链 CKB 是比比特币更像比特币的价值存储平台。(这一点将会在经济模型设计中讲到,敬请期待~)在技术实现上,咱们也充分对比了比特币 UTXO 模型和以太坊 Account 模型的优劣,从中继承了比特币协议对状态为核心的优秀架构。咱们称 CKB 是一个通用验证网络,Cell 是对 UTXO 的通常化版本。而且,发展出了 CKB 模型的优点,在 CKB 当前状态中存储的是任意的共同知识,而再也不仅仅是某一种单一数字货币。在深刻了解 CKB 公链中的 Cell 模型前,咱们来谈一谈前置概念:UTXO 和 Account 模型!
秘猿科技区块链小课堂 17 期git
在当前区块链世界中,主要有两种记录保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 采用的是 UTXO 模型,Ethereum 采用的 Account 模型,一样 CITA 也采用了 Account 模型。github
Bitcoin 的设计初衷是点对点的电子现金系统,在比特币中,每一个交易消耗以前交易生成的 UTXO 而后生成新的 UTXO,帐户的余额即全部属于该地址的未花费 UTXO 集合,Bitcoin 的全局状态即当前全部未花费的 UTXO 集合。Ethereum 意图建立一个更为通用的协议,该协议支持图灵完备的编程语言,在此协议上用户能够编写智能合约,建立各类去中心化的应用。因为 UTXO 模型在状态保存以及可编程性方面的缺陷,Ethereum 引入了 Account 模型。下面咱们对两种模型的优缺点作进一步展开。编程
UTXO 模型中,交易只是表明了 UTXO 集合的变动。而帐户和余额的概念是在 UTXO 集合上更高的抽象,帐号和余额的概念只存在于钱包中。安全
对于 Account 模型,Account 模型保存了世界状态,链的状态通常在区块中以 StateRoot 和 ReceiptRoot 等形式进行共识。交易只是事件自己,不包含结果,交易的共识和状态的共识本质上能够隔离的。网络
对于以上几个优势和缺点,咱们再作一些分析和对比。架构
UTXO 交易自己对于区块链并无复杂的计算,这样简单的讲其实并不彻底准确,缘由分有两个,一是 Bitcoin 自己的交易多为 P2SH,且 Witness script 是非图灵完备的,不存在循环语句。而对于 Account 模型,例如 Ethereum,因为计算多在链上,且为图灵完备,通常计算较为复杂,同时合约安全性就容易成为一个比较大的问题。固然是否图灵完备对因而否是帐户模型并无直接关联。可是帐户模型引入以后,合约能够做为一个不受任何人控制的独立实体存在,这一点意义重大。并发
在 UTXO 模型中,世界状态即为 UTXO 的集合,节点为了更快的验证交易,须要在内存中存储全部的 UTXO 的索引,所以 UTXO 是很是昂贵的。对于长期不消费的 UTXO,会一直占用节点的内存。因此对于此种模型,理论上应该鼓励用户减小生产 UTXO,多消耗 UTXO。可是若是要使用 UTXO 进行并行交易则须要更多的 UTXO 做为输入,同时要产生更多的 UTXO 来保证并发性,这本质上是对网络进行了粉尘攻击。而且因为交易是在钱包内构造,因此须要钱包更复杂的设计。反观 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 是全集而不是部分集合。而对于 Account 模型则简单不少,根据地址找到 State 中对应状态,当前状态的 State Proof 则能够证实合约数据的真伪。固然对于 UTXO 也能够在每一个区块中对 UTXO 的 root 进行验证,这一点与当前 Bitcoin 的实现有关,并不是 UTXO 的特色。
综上来看,Account 模型在可编程性,灵活性等方面更有优点;在简单业务和跨链上,UTXO 有其很是独到和开创性的优势。对于选择何种模型,要从具体的业务场景进行出发。
Thoughts on UTXOs by Vitalik Buterin:
https://medium.com/@ConsenSys...
What are the pros and cons of Ethereum balances vs. UTXOs?:
https://ethereum.stackexchang...
Mastering Bitcoin 2nd Edition - Programming the Open Blockchain: https://github.com/bitcoinboo...
Accounts and not UTXOs: https://github.com/ethereum/w...
交易中的nonce的做用是什么?: https://docs.nervos.org/cita/...
Why is EVM-on-Plasma hard?: https://medium.com/@kelvinfic...