说到“猿”起,这些心里的想法能追溯到 2016 年,甚至更早。2017 年,包括分层的网络以及一个作为共同知识库(Common Knowledge Base)的区块链,都已经成熟。因此 2018 年元旦一过秘猿科技的技术团队就迫不及待的行动了起来,聚集在一间小小的办公室,进行了 CKB 想法的第一次分享,第一次整理了开发计划,在 1 月 23 日写下了第一行代码。
从那时起到现在已经过去了 300 多个日日夜夜,经历了多个迭代和冲刺,CKB 的版本终于来到了 0.1.0。设计框架基本成型,包括共识、Cell 模型、虚拟机以及网络协议在内的组件都已经实现,开源的准备都已经完成。现在,我们终于可以说一句,Hello CKB!
我们朝着心中的加密经济网络迈进了历史性的一步!
秘猿科技区块链小课堂第 15 期
CKB 开源仓库
Nervos 网络是一个分层架构的分布式应用网络。CKB 是一个在设计上非常不同的公有链协议,也是 Nervos 网络中的基础层,是整个加密经济网络的信任引擎。CKB 从分层架构的角度出发,目标是成为资产存储层和上层协议的仲裁层。
CKB 的开源仓库如下:
https://github.com/nervosnetw… – CKB 主仓库
https://github.com/nervosnetw… – CKB 虚拟机仓库。CKB 虚拟机是我们专门为区块链设计的,使用 RISC-V 指令集[1],用来执行 CKB 上智能合约的虚拟机。
CKB 的编程模型由 Cell 模型和 CKB-VM 组成,在 CKB 上运行的 DApp 都有计算和验证两个部分[2],计算在链外运行,验证在链上由 CKB-VM 执行。由于这是一种新的编程模型,我们通过如下三个仓库提供了合约代码及 SDK 示例:
https://github.com/nervosnetw…
https://github.com/nervosnetw…
https://github.com/nervosnetw…
请注意,CKB 还在快速开发迭代中,这里只是提供简单的示例参考,CKB 的 API、编程模型和其它设计在未来都有可能发生变化。
作为一个开放的网络,Nervos 通过 RFC (Request for Comments) 流程来定义规范和改进协议。我们欢迎社区通过 RFC 流程来和我们一起推动 Nervos 网络的发展。Nervos RFCs 仓库位于:
https://github.com/nervosnetw…
CKB 特点
- 使用 Rust 作为主要开发语言 通过不同的功能模块实现一个紧凑,完整的区块链底层系统 基于 Cell 模型来扩展 UTXO
- 模型并支持存储通用状态 基于 Cell 模型和 CKB-VM 实现智能合约,合约计算验证分离,计算发生在链下,验证则在链上
- 支持智能合约的代码逻辑和状态分离 CKB-VM 使用 RISC-V 指令集,支持使用如 Ruby,Python 等高级语言来编写智能合约
- 使用 Flatbuffer 实现数据结构的序列化,无需解析直接访问序列化数据以及基于 Zero-copy 的高效内存使用效率
- 系统内部基于消息和 Channel 实现模块通讯机制,在高性能,以及底层存储访问和索引访问使用共享内存加锁实现 安全的 P2P
- 网络实现,具有更好的网络安全性,对 DoS 和日蚀攻击等有更好的抵抗性 更高效的节点间发现,同步协议
CKB P2P Network 示意图
CKB 主要模块
SRC 模块
存储了 Main 函数,是整个项目的编译入口模块。
CORE 模块
用于保存 CKB 的核心数据结构的定义,包括 Block,Cell,Transaction 等核心数据结构。
SPEC 模块
链的共识配置,该配置会写入创世块。不同配置的节点直接无法通信。
SHARED 模块
用于保存各个模块公用的逻辑和代码。
DB 模块
封装了底层的数据持久化层,CKB 底层存储使用的是 KV 数据存储,对应的实现有两种,一种是基于 RocksDB 的实现,利用 RocksDB 将数据持久化到磁盘。另外一种实现是基于内存的模拟持久化实现,主要用于测试和开发等场景。
CHAIN 模块
实现了区块链数据结构。使用 DB 模块进行持久化。Chain 主要指责是记录和更新本地累计工作量最高的链,并维护链上数据的索引。在更新链时需要进行验证,并同时更新索引。
POOL 模块
Pool 模块的主要功能是实现交易池,CKB 的 Pool 的特点是根据网络状况动态调整出块时间,这样会更合理的利用网络资源和带宽。交易池的设计和实现的最大挑战是要同时兼顾多个目标并取得平衡。包括考虑交易的排序,依赖关系,以及整体性能,尤其是降低节点之间需要同步的数据并且合理的使用缓存。
PROTOCOL 模块
用于存放节点间消息的结构定义,以及消息体的 Builder。消息使用 Flatbuffers 序列化。
NETWORK 模块
点对的通讯的底层实现相关代码,对 Rust-libp2p 进行了封装,并将一些基础协议通过服务的方式暴露出来。通过对 Libp2p 的抽象实现未来可定制的 Libp2p 更加方便。
SYNC 模块
实现了 CKB 的网络同步协议,包括两个协议,分别是 Synchronizer 协议和 Relayer 协议。Synchronizer 协议的工作方式是 Head-first,更高效的利用网络带宽提升区块下载效率,用于节点之间高速下载区块数据。Relayer 协议是节点之间用来处理广播和转发新的交易。Sync 模块在 Bitcoin 的 Head-first 同步,Compact Block 等协议的基础上,结合了交易提交区,叔伯快统计等功能。
CKB-VM 模块
CKB-VM 是一个独立的实现。从实现角度,CKB-VM 是 RISC-V 的硬件 CPU 指令集的实现,所有的实现完全遵循 RISC-V 的标准。所以可以将 CKB-VM 当作一个 General Sandbox Runtime Module,CKB-VM 在项目中的作用是验证状态和执行智能合约,让整个系统的计算层保持了最大限度的灵活性,如通过更新 Cell 中存储的系统合约可以实现添加新的加密算法或其他功能等,并且 CKB-VM 的 Sandbox 的隔离性设计为执行合约提供了强大的运行安全保障。
MINER 模块
通过可插拔实现了不同的共识算法替换,目前为了开发方便,实现了 CPU 和 Cuckoo 两套内置共识算法,并且可方便增加外部实现的共识算法,如 ProgPow 算法。
NOTIFY 模块
是一套用于内部模块之间消息通讯的 Pub/Sub 模块。
DEVTOOLS 模块
包含用 Ruby 实现的脚本,用于开发过程中方便向区块链发送测试数据。
代码阅读建议
阅读代码需要具备一些基础知识,比如对 Rust 语言和生态,以及一些基础的数据结构和算法熟悉,对区块链的基础概念如共识协议,智能合约等概念有一定的理解。
建议可以通过三条路径来阅读代码:
数据同步,这部分的逻辑跟网络相关,会涉及到网络协议,协议的实现等,主要看 Protocol,Network,Sync 三个模块。
数据存储,可以了解数据结构设计和数据持久化实现,主要看 Core,DB,Chain,Pool 等模块。
共识协议,需要对共识算法有一定的概念理解,主要看 Spec,PoW,Sync,Chain 等模块。
Nervos CKB 仍然处于非常活跃的开发阶段,代码还没有经过生产环境验证,功能,模块可能在未来还有较大调整,所以项目状态和说明请以 GitHub 上最新源码为准。
开发者链接
开发者论坛:talk.nervos.org
Nervos RFC 入口:t.me/nervos_rfcs
Nervos CKB Dev Telegram:t.me/nervos_ckb_dev