共计 2657 个字符,预计需要花费 7 分钟才能阅读完成。
【导读】
往期“智能合约执行引擎的前世今生”、“相熟的新敌人 – 链上 JVM”中,咱们介绍了智能合约的起源,以及自研的能够执行 Java 智能合约的执行引擎 HVM。尽管 HVM 相比于 EVM,性能曾经有了很大的晋升,然而因为其字节码数量很大,在解释执行的场景下执行性能非常受限。另一方面,合约破绽 (不思考业务逻辑破绽) 引发的平安问题,每年都在产生,所造成的经济损失都非常重大,那么有没有一种计划能让使用者抛开集体因素,尽量写出平安的合约?
为了解决这两个迫切的问题,咱们引入了 wasm 虚拟机 FVM,以及 Rust 合约编写框架。上面本文将具体介绍这两个局部在智能合约畛域的利用。
【安全性】
家喻户晓,solidity 语法在更新时出于一些考量并没有做好兼容工作,导致不同版本的语法差别很大,开发人员在不同版本的语法之间来回切换,着实节约精力。另外,因为区块链区别于传统的互联网技术有着“不可篡改”的个性,一旦产品公布,无奈以补丁的模式修复现存在的问题,也无奈在原有的根底上进行版本迭代。这就须要合约开发者能一次就写出没有任何问题的合约,否则容易造成巨额的经济损失。然而事件一旦适度依赖于 ” 人 ”,往往会带来量子学的色调,最好是有另外一套机制来确保合约的正确性。
Rust 作为高效、牢靠的通用语言毫无疑问是现有的最好解决方案。
Rust 语言的可靠性依靠于丰盛的类型零碎和所有权模型,以及弱小的编译器,在编译期就能捕捉经典谬误。这迫使开发者在编写合约过程中,思考本人所写的每行代码是否精确,并通过编译器来确认,保障通过编译器查看的合约代码肯定是平安的,极大的进步了合约的安全性以及可靠性。
此外,咱们自研的合约框架提供了一个运行时的测试框架,让开发者能模仿合约运行,无需部署就能在链下找到合约中存在的问题。这无疑是给上链的合约减少了一重保险。
另外,咱们的合约框架利用 rust 的宏开展技术,将操作放在宏注解外面。这样能让开发者在应用过程中更多的关注本人合约的业务逻辑,从某种程度上保障了合约逻辑平安,毕竟只须要专一一个局部而没有其余因素的烦扰,能让开发者更加投入的去打磨逻辑的细节。
【执行效率】
EVM 在实质上是脚本程序,是基于栈的虚拟机,须要由编译程序翻译成指令后执行,即解释执行,这导致 EVM 的执行效率非常低。与之绝对,wasm 应用了编译执行的形式,采纳了虚拟机 / 字节码技术,并定义了紧凑的二进制格局,领有更高更快的智能合约执行速度。因而咱们引入 wasm 极大的进步了整个合约的运行效率。
WASM(WebAssembly) 依照字面意思就是 web 汇编,是为 web 浏览器定制的汇编语言。这里尽管说是定制,但随着灵性的倒退,它不仅仅只实用于 web,其《外围标准》更是与平台无关。既然号称汇编,那它显然具备汇编语言的特点:
1)档次低,靠近于机器语言,进步运行效率;
2)适宜作为指标代码,由其余高级语言 (C/C++/Rust/Go 等) 编译器生成,扩充适用性;
另外模块是 wasm 程序编译、传输和加载的单位。wasm 定义了两种模块格局:
二进制格局:是 wasm 模块的次要编码格局,文件以 .wasm 为后缀。因为其格局设计的十分紧凑,能够放大二进制体积,领有更快的传输和执行效率。
文本格式:文件以.wat 为后缀,此处不具体开展。
模块的划分使得 wasm 的组织构造更加清晰,解析更为不便,极大地晋升了解析的效率。
【FVM 详解】
那么除了应用 Rust 来编写合约,以及将合约编译成 wasm 字节码,真正要将合约运行起来,仍然须要为 wasm 提供一个运行环境,也就是 FVM 做的事。
从语义上讲,一个 wasm 模块从二进制格局到最终被执行能够分为 3 个阶段:解码,验证,执行。解码阶段把二进制模块解码为内存格局;验证阶段对模块进行动态剖析,确保模块的构造满足标准要求,且函数的字节码没有不良行为;执行阶段又能够分为实例化和函数调用两个局部。
(1)FVM 组成
显然,FVM 残缺的性能该当是蕴含下面提及到的解码、验证、实例化以及函数调用等局部。咱们依照整个流程实现了 FVM,然而在理论运行中,发现执行过程会耗费大量的性能在内存的读写及调配上。为了进一步提高 FVM 的执行性能,咱们新增了一层编译模块,将 wasm 的栈式内存转为基于寄存器式内存,对内存进行标记并加以反复利用,防止了频繁的分配内存,极大的晋升了整体执行效率。
(2)FVM 与平台的账本交互
在 rust 智能合约中,咱们对数据是否上链做了明确的辨别,只有标定特定宏注解的字段数据才会上链交互。在合约部署时,对于初始化的字段写入账本;在调用合约办法时,如果应用到合约的长久化字段,合约执行引擎会调用账本读取的办法从账本中获取其数据。对于存在有数据写入操作 (即更新) 的字段,待合约执行完结后,若账本还未存在此字段则将其写入账本,若此字段已存在,则对相应的账本数据进行更新。
图片
(3)整体流程
整个介绍下来,置信大家对 Rust 智能合约的应用有了个大略的印象。这里对整个流程做个梳理:
step1: 用户通过 Rust 合约框架编写智能合约 (肯定要测试)
step2: 编译合约为 wasm 文件
step3: 将 wasm 合约文件部署到 FVM
实现以上步骤你就胜利的运行了一个合约❤。
【将来瞻望】
目前的合约都只是针对绝对简略的业务,在咱们的布局中,FVM 既能利用在现有的合约场景,又能利用在业务简单以及对合约执行速度有较高要求的场景。同时给了非区块链行业技术人员一种“零学习老本”的上链办法——应用他们相熟的编程语言来编写合约。扩充了区块链技术的利用场景以及影响范畴,以便探寻更多的区块链技术落地计划。
目前 FVM 在性能上的体现曾经很好的达到了预期,然而咱们不会满足于眼前的现状停滞不前。在后续的布局中,咱们将持续探寻一些优化计划,比方:
1) 虚拟机缓存的优化;
2) 引入 AOT(Ahead-of-Time),即事后编译的形式,替换现有的字节码解释执行,将 wasm 模块间接编译成 go 代码,利用 go 的插件机制间接加载运行,失去极致的性能体验。
技术在一直的新陈代谢,优化工作将始终继续上来,“放弃先进”是咱们的指标。
【小结】
本文从「安全性」以及「效率的晋升」两个角度,引出了对 rust 智能合约反对的 FVM,探讨了 rust 与 wasm 在智能合约上为什么会有如此体现,以及咱们应用 FVM 的意义。接下来咱们还会对反对区块链上 SQL 执行的 KVSQL 进行具体介绍,敬请期待!
作者简介
李凯
趣链科技根底平台部区块链虚拟机钻研小组
参考文献
[1] rust 程序设计语言
[2]《WebAssembly 原理与核心技术》