# Idea｜以 CKB 为 Kernel 的模块化区块链网络 Nervos

By [Nervos 中文社区](https://paragraph.com/@nervos) · 2022-11-09

---

以下内容来自 Nervos Talk 论坛上的一篇帖子，作者为 **orange-xc**，原文链接：

*   [_https://talk.nervos.org/t/idea-ckb-kernel-nervos/6294_](https://talk.nervos.org/t/idea-ckb-kernel-nervos/6294)
    

1\. 概述
------

按 Nervos 白皮书的设想，Nervos 网络利用 Layer 2 来实现无限扩容，并将 CKB 作为一个单链 Layer 1 沉淀价值，同时保持资产的可组合性。

之所以在 Cell 模型上进行应用开发比较困难，也是因为其定位如此。CKB 只是分层的 Nervos 网络拼图中的一块而已，并且位于 Nervos 网络的最核心区域。此外 CKB 的状态租赁模型，也限定了 CKB 必须将应用的状态搬至链下进行模块化设计，因为主链的可用状态空间设定了软上限。

但与应用开发难相对的另一面，Cell 模型使用了简单优雅的方式解决了许多区块链最本质的问题，这些使得 CKB 更像是一个完整的区块链网络的 Kernel，即最终结算层，普通应用大部分时候无需访问结算层，只需要利用结算层的安全保证以及抽象接口。

**在区块链网络中，Kernel 层次并不是适合开发应用的地方，更好的方法是在 Kernel 之上建立好开发框架以及基础设施，从而组建一个模块化的区块链网络。**

在这个网络中，Layer 2（状态通道、Optimistic Rollup，zkRollup）、侧链以及特殊的数据可用性解决方案等模块，共同围绕结算层 CKB 向上提供完整全面且安全的开发环境，开发者可根据自己的可组合性需求以及安全需求来选择模块。

但为何是 CKB 更适合作为 Kernel 呢？相比其他的区块链，拥有哪些适合作为结算层的优势呢？分析一些它链无而 CKB 有的一些设计，可以展示 CKB 作为结算层的优势。

### **1.1 账户抽象与开放密码学原语**

在结算层不应该对账户的设计有任何预设，在一个区块链网络中，不同的应用有不同的账户设计需求，同时，在一个平台的同一个应用也可能会拥有来自不同账户体系的用户，如跨链而来的用户，Web2 用户等。

CKB 具有非常完整的账户抽象，在 Cell 模型下状态的权限由抽象的 lockscript 控制，再结合强大的 CKB-VM 所实现的开放密码学原语，开发者可以用任何方式定义账户，而且不仅是 CKB 的 Layer 1 上的 DApp 受益于此。这一优势也顺延到了 Layer 1.5 以及 Godwoken 中。

此外，由于开放密码学原语的存在，新密码学方案的部署无需像其他链一样等待硬分叉以增加预编译合约，开发者可以自行部署任意密码学算法（如新的配对友好椭圆曲线），这对于如今日新月异的密码学扩容方案非常有用。

而且，由于 CKB 上所有的签名算法都是合约，即便量子计算机出现也无需硬分叉，只需要提前部署抗量子的签名算法并将资产迁移即可。

### **1.2 状态租赁**

在结算层，状态是最重要的资源，而 CKB 主链的 1 CKB 对应 1 Byte 链上状态，再加上二级发行机制，实现了状态租赁，从而有效地控制状态增长，同时 Layer 1 还可以捕获到整个网络生态的价值。

Layer 1 的状态大小对于结算层的去中心化与安全性是极端重要的，因为所有依托于结算层之上的应用除了维持自身应用的状态外，必须同步结算层的状态以依托主链安全性，所以结算层状态的膨胀将影响整个网络所有应用的去中心化程度，同时由于其价值捕获，可以避免整体网络的价值与结算层安全成本投入失衡。

### 1.3 元交易与链下确定性

同样是由于 Cell 模型，在 CKB 上的交易天然是元交易，手续费代付甚至自带手续费都是毫无问题的，通引入 Open Transaction，在 CKB 上的交易还可以做到更多神奇的功能。

除此之外，Cell 模型的另一个性质是链下确定性，即一笔交易在链下即可验证其正确性，同时如果不存在 Cell 被消耗的情况的话，有效的交易将一直有效。

链下确定性对于应用开发来说不算什么优点，甚至可以是阻碍，它阻碍了我们在链上获得交易的当前区块高度等信息。但是作为结算层，链下确定性使得 Layer 1 网络可以保证足够的鲁棒性，因为非法交易很难广播出去，同时这也使得多个链下应用如果无牵连的话，它们的向前推进就互不相干。

除了上述的特性，CKB 还有许多特性适合作为结算层而存在，比如坚持使用 PoW 共识，比如采用硬件指令集（RISC-V）设计的 CKB-VM，因为结算层的接口应该像硬件一样稳定可靠。

**2\. 已有的模块化组件**
----------------

当然，如今不止 Nervos 致力于构造一个模块化的区块链网络，其他诸如以太坊，Polkadot，Cosmos 也在使用不同的方案，以寻求一个多层次的网络，并将自己置于核心。分析已有的路线，可以明确有哪些可以作为 Nervos 网络的模块化组件。

区块链底层最核心的资源就是状态、计算以及网络，想要同时做到这三点的安全且可扩展并不容易，Rollup 可以做到接近 L1 的安全性，但是会争抢主链的网络资源，Validium 放弃了数据可用性使得其存在资产丢失的风险，而侧链的安全性保证则更弱。

而作为一个区块链网络，可以设计一些组件，然后让开发者自己在组件中取舍，并使用类似乐高积木的模式拼凑出符合需求的 Web3 应用，如有的组件（Validium）可以把状态搬至链下，有的组件提供数据可用性保证等。

### **2.1 状态通道**

首先是状态通道网络，通过构造一个复杂的状态通道网络，可以完成许多交易，而只需要非常少的链上结算。这种模式适合设计支付类应用，或者回合制游戏之类的。

### 2.2 Rollup

基于欺诈证明的 Optimistic Rollup 与基于密码学有效性证明的 zkRollup，他们的共同特征是，将状态与计算搬到链下，而链上只做公证/验证，以及给压缩交易提供数据可用性。但是数据可用性仍然是很大的成本支出，于是出现了混合数据可用性，Volition 或者用户自托管的数据可用性。

### **2.3 混合数据可用性**

混合数据可用性，Volition 方案，即由用户去选择交易保障是由链上（交易费贵但更安全）还是由链下的委员会（更便宜但安全性降低）保障，基于 Starkware 定制的应用采用这种模式取得了不错的效果。此外，也可以采取委员会数据可用性与用户自托管可用性结合，达到较高的可用性保证。

对于严肃的金融类应用，混合数据可用性的安全保障似乎不足，但是对于游戏，Social 等场景，采取链上结算+混合数据可用性方案，似乎是一种不错的安全与成本的取舍。

### **2.4 数据可用性专用方案**

在 Rollup 已经能够做到将状态存储与交易计算从主链剥离，但是对于压缩交易占用的网络开销却很难免除，于是只为了处理交易而不需要计算能力的数据可用性方案出现了。如 Arweave，Celestia 以及 ETH 的 data shard。

#### **Arweave 与 Celestia**

Arweave（AR）是一条无计算能力的以永久存储为口号的 PoW 公链，AR 及其生态的设计者想要在其存储层之上建立链下计算应用，而把 AR 本身当做完全可信可用的存储服务，AR 只负责数据的定序和存储，但是 AR 使用的概率性存储，容易受女巫攻击影响，并且其对于大规模数据的存储还有待考验，而且其类似 BT 的概率存储似乎并不能满足交易数据归档所需的可用性级别。

Celestia，原名 Lazyledger，它使用了数据可用性采样以及欺诈证明等技术来保证数据的可用，数据上传至 Celestia 会被二维纠删码处理再分成碎片发送出去。和 Arweave 一样，它也只负责数据的定序和存储，并且只按照交易的字节数定价，在此之上的开发者可以自己设计结算协议，或者使用其他链如 ETH 作为结算层。

#### **Data availability shard**

Data availability shard（简称 data shard）是在执行分片难以设计的前提下选择的简单分片方案，由于以太坊基金会已经决定设计 zkEVM 作为链下的执行层，如果能使用 zkEVM 结合数据分片，那在功能上已经可以取得近似执行分片的扩容效果。

Data shard 会将委员会进行分组，并分成总体子网，水平子网和垂直子网，每个块会采用纠删码处理，其 header 会在总体子网中广播，数据块会被分到对应的水平子网存储，同时每个数据块将分成碎片存到对应的垂直子网。假如有 64 个分片，每个区块 256KB，同时每 12s 出一个块，那理想情况这个方案可以提供约 1.33MB/s 的数据可用性，假设压缩交易平均 128 字节，则最理想情况可以达到上万 tps。

如果上述的数据可用性层方案能实现其承诺的功能，同时提供强安全性和可用性，那么将应用链的数据可用性部分拆出来由特供的模块解决，则是一种不错的扩容方案，比如一个 Nervos 网络的游戏应用链，它在 CKB 上进行结算，在基于 Axon 开发的应用链上进行状态存储与计算，在特定数据可用性层上存储压缩交易，并且 CKB 上有该数据可用性方案的轻节点，即在执行验证时可以用过轻节点确保数据可用，这也是一种可行的开发模式。

但问题在于，可以完全相信这些方案的数据可用性么？毕竟一旦数据可用性服务不可用，那整个应用可能都会中断？另外，这些应用能保证超长期的数据可用性么？对于交易，金融类应用，可以从创世块开始检查整个历史也是很重要的特性，当然，对于某些可以用状态快照的应用，长期数据可用性的需求就没那么大。

### 2.5 波卡式分片

波卡是一种异构分片链的架构，即平行链的收集人会存储状态，收集交易，然后应用所有的交易，并为所有交易生成有效性证明，并且将区块中引用的合约码也放在里面，再将区块提交给中继链，中继链会选择一部分节点（貌似是十个）来验证这个区块，中继链本身只是平行链的轻节点，同时将区块进行纠删码处理再切片发送给所有的验证人。

这种模式能在一定程度保证数据可用性，但由于其设计，平行链区块需要挺多额外的附加数据，所有的平行链区块都会抢占中继链的网络资源，这限制了平行链数量的上限，同时由于只抽 10 个节点验证一个平行链区块，1000 个节点里就算只控制 100 个节点都有极大概率控制某个平行链区块的验证。

事实上，波卡网络更像是一个 Layer 2 网络，中继链是 Layer 1，平行链是 Layer 2，但相比 Rollup，波卡所有平行链的交易以及对应的有效性证明都需要提交给中继链，并且中继链还需要执行所有交易来验证区块的有效性。从网络、状态和计算的角度来说，波卡仅只有状态放置在链下，而网络和计算都是占用中继链资源的，这使得波卡只能挑很少一部分节点来进行验证以平衡效率，从而又降低了安全性。

**3\. Nervos 的模块化世界构想**
-----------------------

在模块化的 Nervos 网络中，应用应该根据其对于可组合性、安全性以及性能的需求去选择基础设施模块去组合。

首先，CKB 作为最终的结算层，应设计得足够抽象、安全且鲁棒以及足够去中心化，在此之上，首先是模块化的基础设施组件，如已有的 Rollup 框架 Godwoken，正在路上的侧链 Axon 等，除此之外，模块化区块链网络还需要有足够多的中间件，有的是预言机，有的是链上数据检索，以及数据可用性解决方案等。

举个例子，假设存在一条特用于数据可用性的 PoS 侧链，并在 CKB 上设计一个轻客户端，那么所有采用该方案的应用，在结算时都需要将对应的 Cell 作为 CellDeps，从而确保指定数据在侧链的数据可用性。

但目前，Nervos 网络的模块化组件尚未完备，比如目前 Nervos 网络中还很少有零知识证明类应用，这需要针对优化密码学库以支持 Nervos 网络中的应用使用零知识证明，同时对于应用链的开发，侧链框架尚未完成。

从应用层的角度来想，对于 DeFi 类应用，如 Swap、算法稳定币以及借贷等，这些应用需要较高的安全保证，同时对于可组合性的需求也很高，所以应该运行在一个共同的 Rollup 平台的，通过共享的全局状态获得可组合性。但订单簿 DEX 与 Swap 不太一样，尽管安全需求依然非常重要，但可组合性需求变弱，对性能的要求则变高了，于是可以使用特定的 zkRollup 来实现（类似 DYDX 以及 Fluidex）。

而链游或者 Social 类应用的安全需求就低于 DeFi 类，可能仅需要在链上结算，而无需将交易数据在链上备份，交易数据可以放在类似 Celestia 的某种为数据可用性设计的 PoS 侧链上。

出于对去中心化的需求，每个用户应该尽量同步与自己的资产相关的状态，所以需要降低状态同步的硬件需求。

在这样的模块化区块链网络里，对于一个游戏用户，它可能只需要同步结算层和自己的游戏侧链；对于 DeFi 用户，只需要同步结算层与 DeFi 平台链。

由此以来，每个节点每个应用都为全网提供了安全保证，同时也享用了全网的安全保证，但并不需要同步全网的状态，因为安全保证被凝结在结算层上，而这就是模块化区块链网络的共享安全性。

---

*Originally published on [Nervos 中文社区](https://paragraph.com/@nervos/idea-ckb-kernel-nervos)*
