对比特币的继承与创新!深入理解公链 CKB 的 Cell 模型

为了理解底层公链 CKB 的 Cell 模型,我们前置了几篇概念性文章,讲述了我们应该 以状态为中心设计区块链系统的,以及这么做带来的好处。并且在上一篇文章中,详细分析了 比特币 UTXO 模型和以太坊的 Account 模型,以及进行了对比分析。终于,我们要来了解集大成者 Cell 模型了。(前排提示:一遍看不懂没关系,多看几遍就懂了)

秘猿科技区块链小课堂第 18 期


在设计 CKB 的时候,我们想要解决三个方面的问题:

  • 状态爆炸引起的公地悲剧及去中心化的丧失;
  • 计算和验证耦合在了一起使得无论是计算还是验证都失去了灵活性,难以扩展;
  • 交易与价值存储这两个目标的内在矛盾,Layer 2 和跨链的出现将放大这种矛盾,并对 Layer 1 的经济产生非常负面的影响。

对这些问题没有答案,Layer 1 就无法长久运行,区块链给我们的种种承诺自然也是无从谈起。这三个问题根植于区块链架构和协议设计的最深处,很难通过打补丁的方式来解决,我们必须从最基本的数据结构开始,重新审视问题的根源,寻找更合适的地基。

幸运的是,这个更合适的地基简单得令人感到幸福,而且一直就摆在我们眼前。(本文会包含一些非常简单的代码,应该不会影响非技术读者阅读……)

从 Bitcoin 中我们学到了什么

Bitcoin 把整个账本分割保存在了一个个 UTXO 里面,UTXO 是未花费交易输出(Unspent Transaction Output)的简写,实际上是交易中包含的输出(CTxOut)。CTxOut 的结构非常简单,只有两个字段:

class CTxOut
{
public:
    CAmount nValue;
    CScript scriptPubKey;
...
}

每一个 CTxOut 代表了一个面值不同的硬币(Yay bit-“Coin”),其中 nValue代表这个硬币的面值是多少,scriptPubKey 是一段表示这个硬币所有者是谁的脚本(通常包含了所有者的公钥),只有能提供正确参数使这个脚本运行成功的人才能把这个硬币「转让」给另外一个人。

为什么要给「转让」打引号?因为在转让的时候,并不是简单地把硬币中的 scriptPubKey 修改或是替换掉,而是会销毁和创造新的硬币(毕竟在数字的世界中销毁和创造虚拟硬币的成本很低)。每一个 Bitcoin 交易,都会销毁一批硬币,同时又创造一批硬币,新创造的硬币会有新的面值和新的所有者,但是被销毁的总面值总是大于等于新创造的总面值,以保证没有人可以随意增发。交易表示的是账本状态的变化。

这样一个模型的特点是:

  • 硬币(资产)是第一性的;
  • 所有者是硬币的属性,每一枚硬币有且仅有一个所有者;
  • 硬币不断的被销毁和创建。

是不是很简单?如果你觉得自己已经理解了 Bitcoin 和 UTXO ,恭喜你,你也已经理解了CKB 和 Cell!

Cell

Layer 1 的关注点在状态,以 Layer 1 为设计目标的 CKB 设计的关注点很自然就是状态。Ethereum 将交易历史和状态历史分为两个维度,区块和交易表达的是触发状态迁移的事件而不是状态本身,而 Bitcoin 协议中的交易和状态融合成了一个维度,交易即状态,状态即交易,正是一个以状态为核心的架构。

同时,CKB 想要验证和长久保存的状态,不仅仅是简单的数字(nValue),而是任何人认为有价值的、经过共识的数据。显然 Bitcoin 的交易输出结构满足不了这个需求,但是它已经给了我们足够的启发:只需要将 nValue 一般化,把它从一个存放整数的空间变成一个可以存放任意数据的空间,我们就得到了一个更加一般化的「CTxOut」,或者叫 Cell:

pub struct CellOutput {
    pub capacity: Capacity,
    pub data: Vec,
    pub lock: Script,
    pub type_: Option
                    
                    

你可能感兴趣的:(区块链)