追求极致的设计理念!用 RISC-V 从头设计 CKB 虚拟机

Nervos 底层公链 CKB 的虚拟机(CKB-VM)是基于 RISC-V 指令集打造的区块链虚拟机。在 上一堂分享中,咱们简单介绍了区块链虚拟机,以及咱们理想中的区块链虚拟机的样子。在本篇文章中,CKB-VM 设计者将详细的介绍 CKB 虚拟机的设计理念,以及选择 RISC-V 指令集背后的思考逻辑。

秘猿科技区块链小课堂第 23 期算法


CKB-VM 的设计理念

CKB 是 Nervos Network 的基础层,其目标是 为上层应用提供足够的安全性和去中心化 。在调研 CKB-VM 选型的过程当中,咱们反复思考:CKB-VM 应该要有哪些特性?显然,对于一个在区块链上使用的虚拟机,有两个关键特性在任何状况下都必须知足:segmentfault

  1. 肯定性 :对于固定程序和输入,虚拟机必须始终返回固定的输出结果,结果不会因为时间、运行环境等其余外部条件而改变;
  2. 安全性 :执行虚拟机时不会影响到平台自己的运行。

可是这些条件仅仅是强制性条件,咱们但愿设计出一个虚拟机,可以更好地服务于 CKB 的目标。通过深思熟虑,咱们认为这样的虚拟机应该 知足以下特性:后端

  • 灵活性

咱们的目标是设计出一个足够灵活,可以长期运转的虚拟机,从而使得 CKB 可以与密码学的发展携手并进。密码学的历史是一段「执剑」和「破壁」的永恒之战:数千年的密码学发展史,加密与解密是一场没有终点的智力角逐,过往如此,将来亦然。一些适用于今天的加密算法,好比 secp256k1,未来可能会被淘汰;将来还会有更多有价值的新算法和技术(如 Schnorr 或后量子签名等)不断涌现。在区块链的虚拟机上运行的程序,应该可以更自由便捷地使用新的算法,同时那些已经被过期的算法应该可以天然地被淘汰。安全

为了方便理解,咱们用比特币来举例。目前,比特币使用的是 SIGHASH 1 来进行交易签名,而且在共识协议中使用了 SHA-256 哈希算法。那么咱们可以确保几年后比特币用的这种 SIGHASH 方式仍然是最好的选择吗?或者说,伴随着日益增加的算力,SHA-256 仍然适合做为稳定的哈希算法吗?而目前咱们研究的全部区块链协议,若须要升级加密算法,则则不可避免地须要硬分叉。 在设计 CKB 时,咱们但愿探索如何经过 VM 的设计来下降硬分叉的可能性。架构

咱们在思考,虚拟机是否能够容许升级加密算法?或者说,是否可以向 VM 添加新的交易验证逻辑?好比,在仍然使用 secp256k1 的状况下,若是有经济激励的驱动,或者出现更新算法的需求,咱们是否能够在不分叉的前提下实现更高效的签名验证算法?又或,若是有人找到了在 CKB 上实现更好算法的途径,或者须要引入一个新的加密算法,那么咱们是否可以确保他/她自由的实现?模块化

咱们但愿 CKB-VM 可以给你们提供更多的实现空间,最大限度地提供灵活性,而且可让用户无需等待硬分叉便可使用新的加密算法。性能

  • 运行透明性

在对当前这一代区块链 VM 进行研究后,咱们注意到了一个问题,仍是以比特币为例:比特币的 VM 层提供的仅仅是一个堆栈,而且执行时堆栈没法知晓能够存储在堆栈上的数据大小,或堆栈深度,其它全部以堆栈模式实现的 VM 都有一样的问题,虽然共识层能够提供堆栈深度的定义或间接提供堆栈深度(基于指令长度或 gas 限制)。这会让 VM 上的程序开发者必需要去猜想程序运行时的状态,这种类型的 VM 让程序没法充分发挥 VM 的所有潜能。区块链

基于这个问题,咱们认为应该优先定义 VM 操做期间全部资源的限制,包括 gas 限制和堆栈空间大小,并让在 VM 上运行的程序可以查询资源的使用状况, 这将使得在 VM 上运行的程序能够根据资源可用性来采用不一样的算法 。经过这种设计,程序能够充分发挥 VM 的潜能。而且在如下场景中,咱们可以看到 VM 更多的灵活性:优化

  1. 能够根据用户在 CKB 上可用的存储空间(Cell Capacity)为存储数据的智能合约选择不一样的策略。当 Cell Capacity 充足时,程序能够直接存储数据以减小使用的 CPU cycle(CPU 要执行一条机器指令通过的步骤)数量;当 Cell Capacity 受限时,程序能够压缩数据以适应较小的 Capacity,使用更多的 CPU cycle。
  2. 能够根据用户存储的数据(Cell Data)的总量和剩余内存的大小为智能合约选择不一样的处理机制。当存在少许 Cell Data 或大量剩余内存时,全部的 Cell Data 均可以被读取到内存中进行处理。当存在大量 Cell Data 或剩余内存不多时,每一个操做能够仅读取部份内存,相似于交换内存的操做。
  3. 对于一些常见的合约,好比哈希算法,能够根据用户提供的 CPU cycle 数选择不一样的处理方法。例如,SHA3-256 的安全性已经足以知足大多数场景的需求,可是,合约能够经过使用更多的 CPU cycles 来利用 SHA3-512算法以知足更高的安全要求。
  • 运行期开销

以太坊虚拟机(EVM)中的 Gas 机制是一个很是天才的设计,它优雅地解决了区块链应用场景下的停机问题(由于以太坊是图灵完备的,因此容许循环语句,可是无限循环语句容易致使停机问题,Gas 机制限定了一个区块的最大计算量,从而避免了这个问题),并容许程序在彻底去中心化的虚拟机上进行计算。可是咱们发现,在 EVM 中针对不一样的 Opcode(操做符)设计一个合理的 Gas 计算方式是一件很是难的事情,EVM 几乎在每次版本更新时都要调整 Gas 计算机制(EVM 的抽象层级相对较高,一条 EVM 指令可能对应若干条底层硬件指令,在执行程序时,处理的数据量和计算复杂度都只能经过估算来订价,因此 EVM 须要不断的调整 Gas 计算机制)。加密

所以咱们设想:能不能经过 VM 的设计来确保程序运行时资源消耗的计算方式更加合理准确?

咱们但愿可以找到一个提供上述全部功能的 VM 设计,可是发现并无现成的解决方案能够实现咱们对 CKB 的愿景。因而,咱们决定从新设计一个能知足上述全部特性的 VM,以更好的实现 CKB 的愿景。

解决方案:RISC-V

图片描述

RISC-V 是由加州大学伯克利分校的教授于 2010 年设计的开源 RISC 指令集架构(ISA)。RISC-V 的目标是提供一个通用的 CPU 指令集架构,以支持下一代系统架构开发,并在将来数十年中不会产生遗留架构问题所带来的负担。

RISC-V 能够知足从低功耗小型微处理器,到高性能数据中心(DC)处理器的实现要求 。与其余 CPU 指令集相比,RISC-V 指令集具备如下优势:

  • 透明性

RISC-V 的核心设计和实现均遵守 BSD 许可协议(自由软件中使用最普遍的许可协议之一)。任何公司和机构均可以使用 RISC-V 指令集,并能够不受限制地创造新的软 / 硬件。

  • 精简性

RISC-V 的 32 位整数核心指令集只有 41 条指令,即便支持 64 位整数,也只有 50 条指令左右。在提供一样功能的前提下,RISC-V 指令集比起有上千条指令的 x86 指令集,实现起来更容易也更能避免 Bug (x86 指令集手册有 2000 余页,并会不断的增长,而 RISC-V 指令集手册仅 100 余页)。

  • 模块化

RISC-V 采用简化的内核,使用模块化机制以提供更多扩展指令集设置。例如,CKB 可能会选择实现 RISC-V 内核中定义的 V extension 来支持向量计算或为 256 位整数计算添加扩展指令集,从而为高性能加密算法提供可能性。

  • 支持的普遍性

GCC 和 LLVM 等编译器都支持 RISC-V 指令集,Go 针对 RISC-V 的后端也在开发中。CKB-VM 的实现使用的是普遍的 ELF 格式,也就是说, 任何能够编译成 RISC-V 指令集的语言都可以直接用来为 CKB 开发智能合约。

  • 成熟性

RISC-V 核心指令集已经获得了最终的确认和固定,将来全部 RISC-V 的实现都须要向后兼容。因此当更新 VM 指令时,CKB 不会所以出现硬分叉。另外,RISC-V 指令集已经有了硬件实现,并在真实的应用场景中验证过,且不会存在一些存在于其余支持较少的指令集中的潜在风险。

虽然其余指令集可能也具有上述特性中的一部分特性,但根据咱们的评估,RISC-V 指令集是 惟一一个具有全部上述特性的指令集 。所以,咱们选择使用 RISC-V 指令集来实现 CKB-VM,另外,智能合约将使用 ELF 格式以确保更普遍的语言支持。

此外,咱们将为 CKB-VM 添加动态连接以确保 Cell Sharing。尽管 CKB 的实现提供的是最流行的加密算法,但咱们鼓励社区提供更优化的加密算法实现以减小运行时开销(CPU cycles)。

相关文章
相关标签/搜索