数字货币行情-比特币行情价格_专注数字货币行业大数据分析

理解 CKB 的 Cell 模型

更新时间:2021-07-17 23:35点击:

文章出处:NervosNetwork

大多数人说 Cell 模型容易得让人感到幸福,假如你感觉自己已经理解了 Bi总拥有成本in 和 UTXO ,那样恭喜你,你也已经理解了 CKB 和 Cell!

在本篇文章中,Nervos 构造师 Jan 深入浅出地将 CKB Cell 模型及其验证做了详细的介绍。欢迎阅读,和 Jan 一块探索 Cell Model。

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

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

对这部分问题没答案,Layer 1 就没办法长久运行,区块链给大家的种种承诺自然也是无从谈起。这三个问题根植于区块链构造和协议设计的最深处,非常难通过打补丁的方法来解决,大家需要从最基本的数据结构开始,重新审视问题的根源,探寻更适合的地基。

幸运的是,这个更适合的地基容易得让人感到幸福,而且一直就摆在大家眼前。(本文会包含一些很简单的代码,应该不会干扰非技术读者阅读……)

从 比特币 中大家学到了什么

比特币 把整个账本分割保存在了一个个 UTXO 里面,UTXO 是未花费买卖输出(Unspent Transaction Output)的简写,事实上是买卖中包含的输出(CTxOut)。CTxOut 的结构很简单,只有两个字段:

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

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

为何要给「出售」打引号?由于在出售的时候,并非容易地把硬币中的 scriptPubKey 修改或是替换掉,而是会销毁和创造新的硬币(毕竟在数字的世界中销毁和创造虚拟硬币的本钱非常低)。每个 比特币 买卖,都会销毁一批硬币,同时又创造一批硬币,新创造的硬币会有新的面值和新的所有者,但被销毁的总面值一直大于等于新创造的总面值,以保证无人可以随意增发。买卖表示的是账本状况的变化。

如此一个模型的特征是:

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

是否非常简单?假如你感觉自己已经理解了 比特币 和 UTXO ,恭喜你,你也已经理解了CKB 和 Cell!

Cell

Layer 1 的关注点在状况,以 Layer 1 为设计目的的 CKB 设计的关注点非常自然就是状况。以太币ereum 将买卖历史和状况历史分为两个维度,区块和买卖表达的是触发状况迁移的事件而不是状况本身,而 比特币 协议中的买卖和状况融合成了一个维度,买卖即状况,状况即买卖,正是一个以状况为核心的构造。

同时,CKB 想要验证和长久保存的状况,不止是容易的数字(nValue),而是其他人觉得有价值的、经过共识的数据。显然 比特币 的买卖输出结构满足不了这个需要,但它已经给了大家足够的启发:仅需将 nValue 通常化,把它从一个存放整数的空间变成一个可以存放纵意数据的空间,大家就得到了一个愈加通常化的「CTxOut」,或者叫 Cell:

pub struct CellOutput {
pub capacity: Capacity,
pub data: Vec<u8>,
pub lock: Script,
pub type_: Option<Script>,
}

在 Cell 里面,nValue 变成了 capacity 和 data 两个字段,这两个字段一同表示一块存储空间,capacity 是一个整数,表示这块空间有多大(以字节数为单位),data 则是保存状况的地方,可以写入任意的一段字节;scriptPubKey 变成了 lock,只不过换了一个名字而已,表达的是这块共识空间的所有者是哪个 - 只有能提供参数(比如签名)使得 lock 脚本成功实行的人,才能「更新」这个 Cell 中的状况。整个 CellOutput 占用的字节数需要小于等于 capacity。

CKB 中存在着许很多多的 Cells,所有这部分 Cell 的集合形成了 CKB 目前的完整状况,在 CKB 的目前状况中存储的是任意的一同常识,不再只是某一种数字虚拟货币。

买卖依旧表示状况的变化 / 迁移。状况的变化,或者说 Cell 内容的「更新」事实上也是通过销毁和创建来完成的(并非真的去修改原有 Cell 中的内容)。每一笔买卖事实上都会销毁一批 Cells,同时创建一批新的 Cells;新创造的 Cells 会有新的所有者,也会存放新的数据,但被销毁的 capacity 总和一直大于等于新创建的 capacity 总和,由此保证无人可以随便增发 capacity。由于 capacity 可以出售,没办法增发,拥有 capacity 等于拥有相应数目的共识状况空间,capacity 是 CKB 互联网中的原生资产。Cell 的销毁只不过把它标记为「已销毁」,类似 比特币 的 UTXO 从未花费变为已花费,并非从区块链上删掉。每个 Cell 只能被销毁一次,就像每个 UTXO 只能被花费一次。

如此一个模型的特征是:

· 状况是第一性的;
· 所有者是状况的属性,每一份状况只有一个所有者;
· 状况持续的被销毁和创建。

所以说,Cell 是 UTXO 的通常化(generalized)版本。

Verify

仅仅有一块可以保存任意状况的空间还不够。比特币 之所以有价值,是由于互联网中的全节点会对每一笔买卖进行验证 ,使得所有用户都相信(并且知晓其他人也相信)比特币 协议中写下的规则(比如 2100 万的上限)会得到保证。

一同常识之所以能成为一同常识,是由于每一个人都了解别的人认同这部分常识 ,区块链之所以能让常识变成一同常识,是由于每一个人都了解别的人都能独立验证这部分常识并由此产生认同。任何共识的过程都包含了一系列的验证与相互之间的反复确认,这个过程正是互联网中一同常识形成的过程。(应该注意的是,验证常识是相对事先确定的验证规则来讲的,通过验证的常识不代表命题为真。)

大家怎么样验证 Cell 中保存的数据呢?这个时候就需要 Cell 中的另一个字段 type 发挥用途了。type 与 lock 一样,也是一段脚本, type 概念了 data 字段中保存的数据在状况迁移过程中需要要遵守的规则,是对状况的约束。CKB 互联网在共识的过程中,会在 CKB-VM 中实行 type 脚本,验证新生成的 Cell 中保存的状况符合 type 中预先概念好的规则。满足同一种 type 约束的所有 Cell,保存的是同一类型型的数据。

举例,假设大家想概念一个叫做 SatoshICOin 的代币(UDT,UserDefinedToken),它的状况迁移需要满足的约束是什么?只有两条:

· 用户需要证明自己是输入代币的所有者;
· 每一次转账的时候,输入的代币数目需要大于等于输出的代币数目。

第一条款束可以通过 lock 脚本来表达,假如感兴趣可以查询这里的示例代码[1],与 比特币 的 scriptPubKey 原理相同;第二条款束,在 比特币 中是在底层硬编码达成的,在 CKB 中则是通过 type 脚本来达成。每一个 Cell 代表的 SatoshiCoin 数目是一种状况,大家第一概念其状况结构,即每一个 type 等于 SatoshiCoin 的 Cell 在 data 保存的状况为一个长度为 8 的字节串,代表的是序列化过后的数目:

{
"amount": "Bytes[8]" // serialized integer
}

type 脚本在实行中,需要读入买卖中所有相同种类型的 Cells(依据 type 字段可以判断),然后检查同一种类下的输入 Cells 中保存的 amount 之和大于等于输出 Cells 中保存的 amount 之和 。于是通过 lock 和 type 两个脚本,大家就达成了一个最容易的代币。

lock 和 type 脚本不仅能够读取自己 Cell 中保存的状况,也可以引用和读取其它 Cell 中保存的状况,所以 CKB 的编程模型是一个有状况的编程模型。值得指出的是,以太坊 的编程模型之所以强大,更多是由于它有状况,而不是由于它的有限图灵完备。大家可以把 type 脚本保存在一个独立的 Cell 里面,然后在每个 SatoshiCoin Cell 的 type 字段引用它,如此做有哪些好处是相同的 type 脚本仅需一份空间保存,像如此保存数字资产概念的 Cell 大家把它叫做 ADC(Asset Definition Cell)。

SatoshiCoin 的另一个特征是,具体的资产与所有者之间的记录,分散保存在多个独立的 Cell 里面,这部分 Cell 可以是开发者提供给用户的,也可以是用户自己拥有些,甚至是租来的。只有在共识空间所有权明确的状况下,所有者才能真的拥有共识空间里面保存的资产(任何数据都是资产)。在 CKB 上,由于用户可以真的拥有共识空间,所以用户可以真的拥有数字资产(当你能真的拥有土地的时候,才能真的拥有土地上的房屋)。

Cell 是抽象的状况验证模型,Cell 提供的存储(data)没任何内部结构,Cell 支持任意的状况验证规则(type)和所有权验证规则(lock),大家可以在 Cell 模型上模拟 UTXO 模型(就像上面的 SatoshiCoin),也可以在 Cell 模型上构建 Account 模型。lock 脚本在验证买卖输入的时候实行,确保用户对输入有所有权,有权销毁输入的 Cells;type 脚本在验证买卖输出的时候实行,确保用户生成的新状况符合种类约束,正确生成了新的 Cells。因为状况模型迥异,与计算和验证离别,CKB 的编程模型与 以太坊 的编程模型有很大的不同,啥是 CKB 编程模型上的最好实践还需要很多的探索。

通用验证互联网(General Verification Network)

比特币 是一个验证互联网(Verification Network)。在转账时,用户告诉钱包/当地推广客户端转账的数目和收款人,钱包依据用户提供的信息进行计算,在当地找出用户拥有些数目适合的硬币(UTXO),同时产生一批新的硬币,这部分硬币有的归收款人所有,有的是找零。之后钱包将这部分花费掉的硬币和新生成的硬币打包到一个买卖里面,将买卖广播,互联网对买卖验证后将买卖打包到区块里面,买卖完成。

在这个过程中,互联网中的节点并不关心老的状况(被销毁的硬币)是如何被搜索出来的,也不关心新的状况(新硬币)是如何生成出来的,只关心这部分硬币的面值总和在买卖前后没改变。在转账过程中,计算在用户端完成,因此用户在买卖发送时就能确定计算结果(新状况)是什么。

以太坊 是一个通用计算互联网(General Computation Network)。在用 DApp 的时候,用户告诉钱包/当地推广客户端想要进行的操作,钱包将用户的操作请求原样打包到买卖里面,并将买卖广播。互联网节点收到买卖之后,依据区块链的目前状况和买卖包含的操作请求进行计算,生成新的状况。在这个过程中,计算在远端完成,买卖结果(新状况)只有在买卖被打包到区块之后才能确定,用户在买卖发送的时候并不可以完全确定计算结果。

(图中,上面是 以太坊 的步骤,买卖中包含的是用户请求或者说事件/Event;下面是 比特币/CKB 的步骤,买卖中包含的是链下生成的状况/State。)

CKB 是一个通用验证互联网(General Verification Network)。在用 DApp 的时候,用户告诉钱包/当地推广客户端想要进行的操作,钱包依据目前状况和用户的操作请求进行计算,生成新的状况。在这个过程中,计算在用户端完成,计算结果(新状况)在买卖发出的时候就已经确定了。

换句话说,比特币 和 CKB 都是先计算再共识,而 以太坊 是先共识再计算。有趣的是,在许可链构造里面也有同样派别之分:Fabric 是先计算再共识,而 CITA(事实上不止是许可链)是先共识再计算。(考虑题:哪一种构造更合适许可链?)

计算与验证的离别同时也使得 Layer 2 与 Layer 1 自然分开了。Layer 1 关心的是新的状况是什么,并不关心新的状况是怎么样得到的。无论是 State channel,Plasma 还是其他 Layer 2 策略,其实质都是在链外进行计算,在特定时候将最后状况提交到 Layer 1上进行验证。

为何 CKB 的 Cell 模型更好?

目前大家得到了一个很不一样的基础数据结构,在这个结构之上大家设计了独特的经济模型,这个结果真的更怎么样?回顾刚开始的三个问题或许能给大家一些启示。

· capacity 是原生资产,遭到预先确定的发行规则约束,其总量有限;
· capacity 同时又是状况的度量,有多少 capacity ,CKB 上就能放多少数据,CKB 状况空间的最大值与 capacity 总量大小相等,CKB 上保存的状况不会超越 capacity 总量。

这两点决定了 CKB 不会有状况爆炸的问题。在 capacity 发行规则适合的状况下,互联网应该可以长久的维持去中心化的状况。每个 Cell 都是独立状况,有明确的所有者,原本是公共资源的状况空间被私有化,宝贵的共识空间可以被更有效的用。

CKB 是一个通用验证互联网,计算和验证得到了离别,各自的灵活性和扩展性都得到了提升。更多的计算被推到了用户端实行,计算发生在离场景和数据更近的地方,数据处置的方法更灵活,工具更多样。这也意味着,在 CKB 构造中,钱包是一个能做的事情更多,能力更大的入口。在验证端,因为计算结果已经完全确定,买卖的依靠剖析变得很轻松,买卖的并行处置也就愈加容易。

在基于 Cell 打造的经济模型中,存储的用本钱与占用空间大小和占用时间成正比,矿工可以通过提供共识空间获得相应的收益。CKB 提供的 Utility 是安全的共识空间,价值源于其安全性和可用性(accessability),并非源于买卖处置能力(TPS),与 Layer 2 负责买卖的特征相辅相成,在分层互联网和跨链互联网中具备更好的价值捕获能力。

最后,CKB 不是……

星际文件系统

CKB 是一种存储这一点可能会使人感到迷惑:「这不就是 星际文件系统/Filecoin/(任何分布式存储)吗?」

CKB 不是分布式存储,重要有什么区别在于分布式存储只有存储,没验证,也就不会对其存储的数据形成共识。分布式存储的容量可以伴随存储技术的增长而等比率的增长,而 CKB 的容量则收到形成全球共识效率的限制。

CKB 也无需担忧容量不够。在 Layer 2 与分层技术成熟的阶段,极端状况下,Layer 1 上可能仅需放一个 merkle root 就足够了。在 Layer 1 上进行验证所需要的状况,也可以通过买卖提交给节点,节点通过 merkle proof 验证状况是有效的,在此基础之上再验证状况迁移是有效的,这个方向已经有一些研究。

Qtum

Qtum 是尝试在 UTXO 模型上引入更强大的智能合约的先行者之一,具体做法是维持 比特币 原有些 UTXO 模型不变,在其上引入竞价推广账户抽象层(Account Abstraction Layer),支持 EVM 或是 x86 虚拟机。

在 Qtum 中,比特币 的验证是第一层,EVM 的计算是第二层(注意这是一个区块连协议内部的分层,不是 Layer 1 和 Layer 2)。Qtum 对 UTXO 中 scriptPubKey 的处置逻辑进行修改,以达成在买卖打包后,将 比特币 Transaction 中携带的请求传递给 EVM 进行实行的成效。

Qtum 将 比特币 和 以太坊 的实行模型桥接到了一块,互联网节点先验证买卖输入部分(同 比特币),再调用合约进行计算(同 以太坊),状况分散在 UTXO 模型和 EVM 我们的状况存储两个地方,整体构造比较复杂。

CKB 所做的是继承 比特币 的构造思路,对 UTXO 模型进行通常化(Generalization)处置得到 Cell 模型,整体构造维持了一致性与 比特币 的简单。CKB 上的所有状况都在 Cell 里面,计算在链下完成(类似 比特币),互联网节点只做验证。

上一篇:为何要关注BTC贴吧,怎么样资金投入BTC 下一篇:没有了

相关阅读

官方微信公众号