关于区块链开发:RISCV-在区块链智能及云原生中的应用机遇与挑战

176次阅读

共计 5735 个字符,预计需要花费 15 分钟才能阅读完成。

本文转载自:斗篷客(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 指令集,岂但能够无效解决以上的问题,还有许多额定的益处:

  • RISC-V 是一个简略的硬件指令集, 通过良好的设计和宽泛的测试,不会存在像 EVM 那样过多的设计失误;
  • RISC-V 工作在更低的档次(相比 EVM 和 WebAssembly)。目前世界的一个趋势是「简略的硬件, 简单的软件」,咱们能够在如路由器、智能家居等很多畛域发现这一点,区块链也应该如此;
  • RISC-V 程序采纳 ELF 封装, 其装载速度更快;
  • RISC-V 程序能够很容易做 JIT 和 AOT 编译,其性能下限更高;
  • RISC-V 领有欠缺的工具链, 能够很不便的对程序进行剖析和调试,对于宽泛的开发者群体来说这至关重要;
  • 最初, 率先在区块链虚拟机上应用 RISC-V,对将来在 RISC-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)爱护。 它是一种内存保护策略,应用程序的地址空间中的每个页都能够是可写的或可执行的, 但不能同时是可写的或可执行的。这种机制容许更灵便地编写应用程序,而不会过于放心一些编程谬误导致意外的执行了攻击者的代码。
 
CKB-VM 通过许多底层逻辑的优化,使它成为了兼顾安全性和性能的运算平台。
 

CKB-VM 在区块链之外云原生畛域的广泛应用

 

RISC-V + CKB-VM + Cloud Native RISC-V 是一项全新的技术,它正在硬件畛域中疾速倒退,但我认为它的后劲远不止如此——在将来它可能将在云原生畛域表演更重要的角色。

目前云畛域基本上是 x86 和 AMD 的市场,我认为 RISC-V 能够以一种奇妙的形式退出。它不同于间接竞争,而是 借助 CKB-VM,将 RISC-V 程序通过 CKB-VM 运行在 x86 平台上。 在有足够的市场之后,再尝试应用实在的 RISC-V 硬件,同时对于云厂商,他们不须要去承当切换架构的危险投入, 因而推动的阻力会比间接上 RISC-V 硬件小很多。

咱们来看一下 RISC-V + CKB-VM + Cloud Native 相比传统的 Cloud Native 有什么长处。

目前 Cloud Native 的一个广泛的实际是首先启动一个 Docker 做环境和资源的隔离,而后在 Docker 外部间接运行一个二进制程序,或者间接的通过 NodeJS,Python 或是一个 JVM 来执行用户的脚本代码。

我不禁要问为什么要将事件搞得如此简单呢?

特地是随着像 Rust,Golang 等高级语言的 RISC-V 后端逐步成熟,咱们齐全能够 将 RISC-V 看作一种「跨平台的字节码」,通过 CKB-VM,它能够真正实现 write once, run anywhere 的愿景。
 

较 Docker 而言更粗疏的权限管制

 

相较于 Docker 提供的资源隔离的基本功能,采纳 RISC-V + CKB-VM 的形式能够提供更多云计算平台所须要的更加细粒度的权限管制。 RISC-V 程序采纳零碎调用(system call)的形式与操作系统通信,CKB-VM 的实现形式上能够代理应用程序的收回的全副零碎调用,之后,云计算平台便能够依据用户的相干权限与以后的资源应用状况等来决定是否响应这次零碎调用。例如:

  • 控制应用程序应用的最大文件句柄数量
  • 控制应用程序建设的 TCP 链接数量
  • 控制应用程序的 IO 使用量

以上这些细粒度的管制很难应用 Docker 实现,至多不会很直观,而采纳 RISC-V + CKB-VM 的话,因为资源的申请与开释全副通过零碎调用,云计算平台能够在应用程序的资源和权限上做到 简直有限粒度的管制
 

代理资源申请

 
当咱们在代码中应用 open 函数的时候,咱们在干什么?

咱们是真的「关上」了硬盘上的一个实在存在的文件吗?

并不是,咱们是像操作系统收回了一个申请,操作系统有时会从硬盘上读取这个文件,有时则是从缓存中给咱们返回了这个文件,这取决于操作系统的想法。这种状况下能够说 操作系统治理了硬盘资源。

云原生编程该当与本机编程具备类似的编程体验, 但目前这方面行业内做的远远不够。许多云厂商都有提供云存储的性能, 然而在大多数状况下,仍须要后行装置这些厂商的 SDK,而后通过相干 API 进行拜访。这种体验造成了一种云利用与原生利用的割裂感觉。

正如下面所说的,CKB-VM 代理了应用程序收回的全副零碎调用,在采纳 RISC-V + CKB-VM 的计划时,能够做到云代码与原生代码完全一致:

例如当开发者写下 open("/foo/bar") 时,如果其代码是在本机运行,那么程序会关上本机文件系统下的 /foo/bar 文件;而如果将此代码运行在云计算平台上,它将会关上你以后账号下相干云存储桶里的 /foo/bar 文件。

最重要的一点是 这一切都是主动的,无需开发者对代码做任何批改, 甚至不须要从新编译!
 

毫秒级的冷启动,极低的资源耗费,极快的运行速度

 
CKB-VM 的这些个性,使得它 非常适合作为 Lambda 函数执行 。这所有个性使之全面优于传统的基于 Docker 的 Lambda 函数。并且能够为云厂商 节俭一大笔机器费用
 

多语言反对

 
仅仅就目前而言,C/C++, Golang 和 Rust 等通用语言均能够生成较为优质的 RISC-V 代码,它们能够 间接运行在 CKB-VM 中。更进一步的话,甚至能够通过将 JavaScript,Lua 和 Ruby 等解释器编译为 RISC-V,而反对在 CKB-VM。
 

CKB-VM 的过来与将来

 

秘猿科技在 CKB-VM 开发过程中,遇到过许多富裕挑战性的难题,在解决这些问题的过程中积攒了大量的开发教训。
 

如何高效的对指令集进行模仿?

 
CKB-VM 最后应用 Rust 实现了一个解释器,然而 Rust 解释器编译后的代码品质个别,其性能远不如手工编写的汇编代码。CKB-VM 做了另外两个尝试, 其一是 AOT 编译器 ,它会在执行前首先将 RISC-V 程序编译为 x64 程序。其二是 手工编写的 ASM 解释器 ,相比起 AOT 编译器,这能够 在寄存器调配层面上做到更加粗疏的管制。

例如执行环境的上下文信息,或是指令中的源操作数,目标操作数和立刻数,这些数据在整个执行阶段都被固定调配在某几个寄存器中。这所有都工作的十分好,但在尝试将 B extension 退出 CKB-VM 的时候遇到了一点问题,例如,B extension 中的 bfp 指令的实现对于手工编写的 ASM 代码来说就过于简单了(无论对于逻辑的实现还是寄存器调配来说):

为此,在 ASM 的解释器循环中,当指令被解码之后,将依据指令的类型决定指令的执行门路: 在 CKB-VM 中成为 疾速门路 慢速门路。在疾速门路下,指令的执行过程将在汇编代码外部处理完毕;在慢速门路下,指令的执行会被交由 Rust 解释器来做。

思考到这些简单指令呈现在程序中的频次很低,同时能够在利用程序代码中无意的防止应用这种简单指令,因而 疾速门路 + 慢速门路联合应用的形式简直能够在不影响次要性能指标的前提下防止在汇编实现的解释器循环中增加过重的计算过程。
 

如何对虚拟机进行测试?

 
首先,保障虚拟机实现能通过官网的测试集,这能提供最低限度的正确性保障。

其次,应用含糊测试(fuzzing test)能够对代码进行更好的笼罩,利用程序生成大量随机的有意义或无意义的代码,别离应用 CKB-VM 与其它现有的 RISC-V 模拟器例如 riscvOVPsim, spike 等执行并比对它们的最终后果。
 

CKB-VM 的将来开发计划

 
咱们打算 为 CKB-VM 提供 V extension(向量指令)的反对,这将容许咱们以一种新的思路去进一步优化区块链中的密码学算法。

算法的向量化是一个乏味的挑战,绝大多数算法或多或少都是能够在肯定水平上并行的,换句话说,咱们总能找到一种能够用向量化思维示意的算法来齐全或局部解决问题。对于 CKB-VM 来说,向量指令的底层能够通过 SIMD 或者多线程来解决。

正文完
 0