当前位置:主页 > 列表页 > 正文

RISC-V 在区块链智能及云原生中的应用、机遇与挑战

2021-09-28 04:17 | 出处: Nervos

本文转载自:斗篷客(ID:wearecloakman)

区块链如同 2000 年前后的互联网,正一步步走入我们每个人的生活中。

作为区块链整套技术中的核心之一,智能合约/虚拟机的设计在推动区块链创新的进程中,正扮演着越来越重要的角色。由此出发,虚拟机的设计也呈现着百花齐放的姿态。

秘猿科技根据对智能合约层以及区块链虚拟机的理解与反思,基于 RISC-V 硬件指令集打造了虚拟机 CKB-VM。在这次分享中,我们将会介绍我们选择 RISC-V 打造虚拟机的缘由,并展示 RISC-V 为我们的区块链落地与创新中带来的前所未有的灵活性。

迄今为止,CKB-VM 是市面上唯一一个能在智能合约中直接部署密码学算法的区块链虚拟机,其他任何区块链虚拟机层都不具备实现达到与 CKB-VM 相近的能力。

与此同时,我们认为 CKB-VM 并不仅仅在区块链领域中适用, 在芯片逐渐碎片化的今天,CKB-VM 可以为云应用开发者提供一个稳定的指令集,并通过底层优化实现,将代码运行在更多体系结构之上,实现真正意义上的 write once, run anywhere 的愿景。

分享提纲:

1、探讨区块链对智能合约的需求,以及现有设计中遇到的问题

2、介绍 CKB-VM 的核心设计,以及我们如何通过引入 RISC-V 指令集,来解 CKB-VM 遇到的实际问题

3、探讨 CKB-VM 在区块链之外的云原生领域中同样广阔的应用

4、回顾在 CKB-VM 实现过程中遇到的挑战与应对方式,展示未来的工作计划



现有区块链虚拟机困境
以及如何使用 RISC-V 解决



在一个通用计算机平台上模拟另一个计算机具有悠久的历史,我们通常将这种位于源 ISA 和目标 ISA 之间的翻译软件称为虚拟机。

自从以太坊开始,在区块链系统中加入的智能合约代表了区块链从一个单一的公共账本到金融服务应用角色转变的一个重要阶段。



为了支撑智能合约中的业务,我们希望底层虚拟机足够安全,这不仅仅意味着虚拟机本身的安全性, 还意味着虚拟机字节码本身是易审计和易静态分析的,同时除了安全性之外,性能也是一个重要的考虑目标,这要求从源 ISA 到目标 ISA 之间的翻译可以使用尽量少的代码完成。

除了安全性和性能之外,我们还希望这个虚拟机的周边生态是完善的,有多种不同的高级语言,多种不同的 IDE 和数量众多的开发者辅助工具帮助应用开发者编写出健壮的代码。

目前最广泛流行在世界上的区块链虚拟机只有两类: EVMWebAssembly

EVM 它存在诸多的问题, 例如它的动态跳转(dynamic jumps)机制导致 EVM 代码无法被静态分析,导致 EVM 上安全性漏洞频发,而它的 256 位整数又导致虚拟机性能极差,这还不是最糟糕的,最糟糕的问题是:由于区块链的性质我们无法对 EVM 做任何根本上的升级。

在 EVM 负重前行之时,一些人转而使用 WebAssembly,但是很难说 WebAssembly 是一个好的选择。



WebAssembly,顾名思义是为了 Web 而发明的,它被设计为运行在浏览器之中,但目前的现实是,区块链虚拟机对性能的要求已经超过一个浏览器客户端对性能的要求。

同时 WebAssembly 的字节码是一种 AST(抽象语法树)字节码而非传统意义上的指令, 前者是一种树形结构,而后者则是一种一维的指令流。这种区别使得在加载 WebAssembly 的过程中需要消耗许多时间用于解析二进制数据到 AST。但在区块链的世界中,由于大多数应用的计算量都不高,也不会像浏览器那样长时间运行,因此代码的加载速度和其执行速度同等重要。

如果我们可以在区块链虚拟机上采用 RISV-V 指令集,不但可以有效解决以上的问题,还有许多额外的好处:







CKB-VM 的核心设计逻辑



在一个资源受限的环境下,如何对资源进行有效的管理和使用是构建一个高性能平台的关键,区块链上的所有用户在有限的时间里共享有限的资源,这使得区块链应用程序在其分配的资源量内高效运行变得更加重要。

这里有两个关键的点,其一是高效运行,其二是限制资源的使用量。基于此,CKB-VM的核心设计逻辑:


高效运行


CKB-VM 决定引入 RISC-V 指令集的关键点之一是,绝大多数 RISC-V IMC 指令集内的指令都可以语义上等价几条 x64 指令的组合,这意味着我们只需要极少的额外消耗就能在 x64 平台上构建一个 RISC-V 虚拟机。

例如 RISC-V 中的 AND 指令与 BGE 指令都能在 x64 平台下以极其精简的方式实现,这里摘取 CKB-VM 的 ASM 解释器实现 AND 指令的代码,你可以看到我们使用了一些宏,这让整个流程变得异常清晰:

资源限制


CKB-VM 允许开发人员自定义一个函数,该函数接收一个 RISC-V 指令并返回该指令的 cycles 消耗,CKB-VM 内置的检查程序会统计已执行的 RISC-V cycles 数并在预设阈值处停止程序运行。

这将保证运行在 CKB-VM 中的所有应用都能在有限的时间内停止,它避免了在区块链下出现最糟糕的后果:一个恶意应用停止了区块链的运行。CKB-VM 在内部使用一个字节数组模拟 RISC-V 的内存,我们限制应用程序运行时所需要的内存总量。

在许多时候我们会遇到取舍问题,更大的内存代表着更高的灵活性,但是正如俗话所说任何硬币都有两面,大内存也会导致在初始化虚拟机时消耗较多的时间。CKB-VM 在灵活性与初始化速度之间找到了一个微妙的平衡,这个平衡的内存限制是四兆。我们做了许多测试,表明在四兆的内存限制下能实现绝大多数密码学算法和足够复杂的业务逻辑。



内存的延迟


初始化在中文编码界一直流传着一些意义不明的暗号,例如「烫烫烫」和「屯屯屯」。它们常常出现在 VS 的 debug 模式中,当你看到这些符号就意味着你的程序访问了未初始化的内存。这涉及到一个底层设计,那就是 x64 程序向操作系统申请到的内存是未初始化的。

但对于 RISC-V 情况则有些不同,因为其规范中规定了内存必须以零值进行初始化。由于 malloc 和 calloc 之间存在着巨大的性能差距,使用 calloc 的方式去申请四兆的内存显得十分浪费,CKB-VM 所作的决定是延迟内存的初始化,即只有使用到相关内存页时,该内存页才会被零值初始化,未被使用的内存页被保持在未初始化状态。这有效的提升了执行一些使用内存很少的程序的运行效率。


W^X 内存保护策略


CKB-VM 同样被设计在区块链中运行不受信任的应用程序代码,这些代码可能来自粗心的开发者,也有可能来自蓄意的攻击者。一种常见但有效的攻击方式是攻击者构造特定的输入数据,使得程序将 CPU 指令写入用于存储数据的内存空间,然后运行这些指令。

CKB-VM 做了内置的 W^X(write xor execute)保护。它是一种内存保护策略,应用程序的地址空间中的每个页都可以是可写的或可执行的, 但不能同时是可写的或可执行的。这种机制允许更灵活地编写应用程序,而不会过于担心一些编程错误导致意外的执行了攻击者的

您可能感兴趣的文章:

相关文章