一个关于抽象的故事:寻求更好的 CKB 开发工具
三年前,我们踏上了一段充满传奇和冒险的旅程,我们开始打造一个全新的区块链平台,一个作为开发者的我们,自身就非常喜欢并且希望可以长久依赖的区块链平台。在这个基础上,我们开始精心打造 Nervos CKB 的根基:
安全性:让 CKB 来守护人们的资产时,人们能放心吗? 稳定性:在未来几十年里,人们是否还能稳定的使用 CKB? 性能:在满足前面两个目标的前提下,人们能否相信 CKB 可以提供最佳的性能?
我们非常努力地解决所有这些问题,我们坚信 Nervos CKB 已经为这些问题提供了充分的答案。然而,这个谜题仍然没有完全解开,要想让 CKB 变得更加优秀,还缺少非常重要的一环:
与其它解决方案不同,大家可能会注意到,开发者体验并不是我们一开始就试图解决的问题。这并不意味着我们不关心开发者体验。恰恰相反,我们认为开发者是整个 Nervos 生态系统中最基础、最关键的部分。这里的矛盾点来自于我们对软件抽象的信念。我们认为 Nervos CKB 最核心的部分应该优先考虑安全性、稳定性和性能。
确实会有一些方面有助于提升开发者体验,但我们并没有优先将其纳入其中,因为我们认为加入这些额外的特性可能会伤害到我们上面提到的三个根基。为了弥补这些功能的缺失,我们正在通过构建额外的 Layer 和工具,来增添更多的 Nervos CKB 开发故事。自去年 11 月 Nervos CKB 主网上线以来,这一直是 Nervos 团队最主要的关注点。
在计算机行业中,我们并不是唯一走这条路的人。以我们最喜爱的 CPU 为例,现代的 CPU 只运行复杂的汇编代码,我们没有听到有人说渴望出现可以运行 Rust 或 JavaScript 的 CPU。相反,我们构建了编译器和虚拟机,它们将更高级的语言转换为经过精心调优的汇编代码,然后运行在我们的 CPU 上。正是有了这样的软件抽象,我们才有机会构建一个完整的计算机辅助世界。我们设想未来的区块链基础设施将使用完全相同的体系结构:核心层专注于做好基础,而周围的圈层则为开发者提供援助。
Capsule:
https://github.com/nervosnetwork/capsuleLumos:
https://github.com/nervosnetwork/lumosPolyjuice:
https://github.com/nervosnetwork/polyjuice
Capsule
我们旅程的第一步是从智能合约开始的,也就是 CKB 术语中的脚本。如果你一直在关注我们的进展,你会知道现在 CKB 上的大部分脚本都是用普通的 C 语言编写的。这并不是因为我们觉得 C 语言是一种适合于所有人的智能合约语言,而仅仅是因为我们仍然还在工具方面努力地追赶着进度。在早期,当我们需要一种方法来构建脚本时,C 语言是对于我们来说唯一切实可行的解决方案。我们在编写 C 代码时非常谨慎,尽管我们是这个平台的创建者。但是我们限制了外部库和新功能的使用。你可以从我们现在正在使用的脚本中观察到这一点,它们只是模拟了用于嵌入式设备中的 C 语言程序。
但我们明白这对很多人来说并不是一个理想的解决方案,如果我们宣传说用 C 语言来构建脚本,那么我们可能永远无法赢得智能合约开发者们的信任。现代高级智能合约的构建已经非常复杂,更何况 C 语言还自带包袱。我们希望为开发者提供所有最先进的语言特性和工具来帮助 CKB 脚本的开发。
为了解决这个问题,我们创建了 Capsule。Capsule 的核心是提供了一个使用 Rust 编程语言来构建 CKB 脚本的解决方案。Rust 是一种旨在让每个人都能构建可靠和高效软件的语言。久经考验的类型系统和所有权模型、每天发明新事物的健康社区,以及区块链行业的广泛使用,这些都使 Rust 成为在 CKB 上构建脚本的完美通用语言。Capsule 结合了 Rust 工具,为 Nervos CKB 构建基于 Rust 的脚本提供了无缝体验。
在语言方面,Capsule 还提供了抽象(以 Rust 库的形式)来帮助构建 CKB 脚本。核心 CKB 只提供与 CKB 通信绝对必要的系统调用(syscalls ),这意味着它在使用时可能会略显麻烦。除此之外,Capsule 还提供了抽象来简化与 CKB 区块链的通信。这里有一个示例,虽然 Rust 中的 File (https://doc.rust-lang.org/std/fs/struct.File.html) 使用起来非常有趣,但底层的 Linux 系统的正确调用可能会相当复杂。在我们看来,这又是一个展现抽象化力量的案例。
Capsule 也不会止步于此,它的目标是管理 CKB 脚本的整个生命周期,帮助你开发、构建、测试、调试以及部署脚本。就像它的名字所暗示的那样,Capsule 用一个极小的外壳包装了一个非常大的宇宙。我们确实设想了一个世界,在这个世界里,Capsule 是一个从零到成功运行在 CKB 主网上的脚本所需要的全部。
Lumos
智能合约只是挑战的一部分。由于某些原因,如 QoS 需求或为了更好地应对不同的用例,我们通常需要在区块链之上构建一个后端服务,并由其负责处理用户的请求。Nervos CKB 在这方面也不例外。事实上,由于我们抽象的设计理念,CKB 比其它大多数区块链更需要上层。正是有了这个上层,开发者可以更快捷更容易地构建出完美的 dApps。
Lumos 就是在这种需求下诞生的。在 CKB 之上设计的 Lumos 提供了一个基于 JavaScript/TypeScript 的框架,这可以大大地加快 dApp 的开发速度。Lumos 这个名字也揭示出了这个项目的意义:
CKB 的仙境虽然广袤而肥沃,但目前大部分地区仍然是黑暗的,Lumos 荧光闪烁,试图照亮这片土地,引导越来越多的人们走进这个美丽新世界。
在初始版本中,Lumos 包含以下组件:
一个高性能的 cell 索引器,它从 CKB 节点收集区块并进行索引,然后提供一个最佳的方式来请求访问 cell 。 一个处理所有待确认交易的交易管理器,并使其输出的 cell 在交易确认之前就可以使用,这避免了在创建下一个交易之前需要在链上接受之前的交易所造成的问题。 一个统一的配置管理器(config manager),处理框架与不同链的连接细节,如 Mainnet、Testnet、Devnet 等。它还可以跟踪链上部署的脚本,以简化交易构建工作。 一个统一的工作流程,用于构建包含许多不同交互脚本的交易。我们相信这个新设计的工作流可以完美地抓住 dApp 开发者与脚本开发者的不同需求。详细的工作流程请参阅文档网站。 内置支持目前所有常见的脚本。
这只是对 Lumos 所有可能性的一个提前速览。初始版本提供了构建的基础,但绝不是完整的。我们邀请大家加入我们的开发圈子,试用 Lumos(还有 Capsule),告诉我们你的使用体验。只有得到了反馈和批评,我们才能真正地构建出适合 Nervos CKB 世界需求的抽象和工具。
Polyjuice
Nervos CKB 建立在 cell 模型的基础上,cell 模型是 UTXO 模型的一个通用版本。区块链界似乎有一种观点,认为人们在 UTXO 模型上很难进行编程,而账户模型对于开发者来说则相对容易。虽然 cell 模型是 UTXO 模型的演变,但是完全有可能在 cell 模型之上构建一个帐户模型。这里的秘密还是在于抽象。在较低层次上,UTXO 式的设计可以帮助实现并行性,而在较高的级别上,抽象层可以向普通开发人员展示成一个帐户模型。
作为工程师,我们都知道一句名言:Talk is cheap, Show me the code。遵循这一原则,我们设计并构建了 Polyjuice,这是在 Nervos CKB 之上的一个 Ethereum 兼容层。直到今天,Ethereum 可能是最常用、最灵活的基于账户模型的区块链。通过 Polyjuice,我们想展示的是,在 Nervos CKB 上使用账户模型是完全可能的。这里的灵活性事实上可以带来无数的机会。
为了让事情更加有趣,我们并没有构建一个只为 Ethereum 量身定做的账户层,我们从 Polyjuice 中提取了核心账户层(https://github.com/nervosnetwork/ckb-simple-account-layer)。有了这个通用库,你可以自由地集成任何你想集成的账户层。我们很想见证的一个令人兴奋的未来是,Libra (https://libra.org/en-US/) 的精确编程模型也可能被移植到 CKB 上,从而实现一个非常繁荣富饶的生态系统。
全新的文档
随着所有这些激动人心的项目逐渐出现,我们的旧文档网站(https://docs.nervos.org/) 已经渐渐地显示出它的年代沧桑感。所以我们也对文档网站进行了翻新:
基础:这是一个起点,如果你只是想了解 CKB,那么它将会指导你下载和运行 CKB,如何连接到 Mainnet 或 Testnet,如何创建一个新的开发链,以及如何挖矿以进行开发。它还将告诉你如何通过众多工具与 CKB 进行交互,例如 ckb-cli。 参考:对于开发者来说,这或许可以作为一本字典。想了解一个脚本如何运行?我们会有一个参考文档。想知道一个 cell 里有哪些组件可用?我们帮你搞定了!想了解整个交易验证流程吗?你来对地方了!我们会确保这个参考文件涵盖了你想知道的关于 CKB 的所有细节。 实验室:仅依靠参考文档并不能提供太多帮助。有的时候,你会想动手开始玩东西。在本节中,我们将给你详尽的步骤,来告诉你如何用 CKB 构建一些东西。无论你是想构建一个新的 CKB 脚本,还是写一个与 CKB 交互的 dApp,我们都会有各种实际的实验室来涵盖这些操作。 整合:外部钱包或交易所在将 CKB 整合到他们的系统中时,通常会面临独特而不同的挑战。本节会提供将 CKB 集成到现有服务(如钱包或交易所)的指南和技巧。 文章:之前,我们的开发人员一直有在写一些关于 CKB 的不同文章。在这里,我们也为开发者提供了一个可以写文章的空间。无论是关于 CKB 脚本的调试,还是序列化格式,甚至是 RPC 的最佳实践,我们都希望这里可以成为一个让大家自在分享自己见解的地方。
未 来
在区块链领域,人们开始越来越多地应用 WebAssembly (https://webassembly.org/)。虽然我们认为 RISC-V 更适合 Nervos CKB,但这并不意味着我们不能提供一流的 WebAssembly 支持。我们现在正在构建一个项目,可以将任何 WASI (https://wasi.dev/) 支持的 WebAssembly 程序编译成 CKB 脚本。除了新的编程语言支持,比如 AssemblyScript (https://assemblyscript.org/),我们相信这也可以开启新的潜力,比如跨链的互操作性。
上面我们已经演示了 CKB 上的通用语言支持,但是我们的旅程并没有结束。在 CKB VM 模型的深处,还埋藏着一些只有通过定制设计的编程语言才能显现出来的潜力。本着这种精神,我们也在研究在 CKB 上创建针对特殊用途语言的脚本开发的可能性。这些尝试一旦准备就绪,就会释放出更多由 CKB 独特设计所激发出的能量。
目前发布的项目主要是为了满足后端开发者的需求。也有许多前端或应用程序开发者同样渴望加入 CKB 的仙境。我们也在努力提供 nocode (https://www.nocode.tech/) 工具,让那些有好奇心的人能够在 Nervos CKB 上构建一个完整的 dApp 体验。
我们相信,CKB 的潜力是无限的。除了上面提到的这些之外,我们还在 CKB 上尝试更多的想法,开发更多的工具,我们真诚地希望在未来与大家分享。