以太坊2.0新虚拟机Ewasm指南:三大优势全面吊打EVM

本文探讨的是以太坊虚拟机 (EVM) 和以太坊WebAssembly (Ewasm),Ewasm将取代EVM成为以太坊2.0网络的状态执行引擎,这种转换将为以太坊带来一系列令人兴奋的新性能升级和其他优势,这包括速度和效率上的提升、卓越的互操作性以及减少或消除预编译。

原文作者是Chainsafe项目经理Colin Schwarz。

eth

 一、什么是以太坊虚拟机(EVM)?

 为了理解Ewasm及其对以太坊网络的影响,我们必须首先熟悉其将替代的以太坊虚拟机(EVM )。EVM是一个轻量级的虚拟机,其设计是用于在以太坊网络上运行智能合约。作为虚拟机,EVM的功能与传统的操作系统(如Windows)稍有不同。一般来说,虚拟机(VM)是建立在本机操作系统上模拟物理机的高级抽象。它们允许同一平台,在许多不同的硬件体系结构和操作系统上运行,这使得虚拟机(VM)非常适合像以太坊这样的分布式网络。EVM的构建是为了模拟可由物理CPU执行的操作,其还负责以太坊的许多关键功能。

而EVM除了作为一个虚拟机,它也是一个“堆栈机”和一个“状态机”(我知道,它有很多形容词,请原谅)。状态机只是一台可以读取输入并基于这些输入转换为新状态的机器。而基于堆栈的虚拟机是将内存结构组织为堆栈并作为堆栈访问的虚拟机。这与基于寄存器的虚拟机相反,其内存结构存储在CPU的寄存器中。为了在基于堆栈的虚拟机上执行操作,称为“操作数”(operand)的数据从堆栈中“弹出”,通过接受操作进行处理,然后根据后进先出(LIFO)的原则“推送”回堆栈。使用基于堆栈的机器进行添加的工作方式如下:

  1. POP 20
  2. POP 7
  3. ADD 20, 7, result
  4. PUSH result

p1

markfaction.wordpress.com/2012/07/15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm

使用堆栈系统的一个主要优点是,EVM不需要显式地知道它正在处理的操作数的地址,因为调用堆栈指针(SP)总是会提供下一个操作数,这有助于EVM提高效率并降低存储需求。

除了堆栈之外,EVM还可以将数据存储到内存(RAM)和磁盘存储。将数据发送到磁盘存储器需要的gas最多,而发送到堆栈需要的gas最少。EVM根据其预期用途和预期的gas成本决定将某些数据发送到何处。在宏观层面上,EVM由世界状态(world state)、机器状态和虚拟ROM组成。世界状态是网络上所有帐户的存储,而机器状态包括程序计数器、可用gas、堆栈和内存。虚拟只读存储器(ROM)是不可变的“EVM字节码”,这是一种只有EVM才能理解的特殊语言。理解字节码及其与诸如solidity等高级语言的关系是非常重要的,以便充分掌握EVM的功能。从网络创世开始,以太坊开发者就用Solidity编程语言编写了代码,Solidity是一种“高级”编程语言,这意味着尽管开发者可以理解Solidity,但机器却不能理解。为了让计算机理解Solidity代码,它必须使用名为solc的solidity编译器编译。编译器会将solidity转换为字节码,字节码是solidity操作码的二进制表示形式。EVM将所有值视为二进制,而无法理解其他任何值,因此编译器的存在是非常重要的,其允许开发人员的表达能够被EVM理解。

 二、以太坊虚拟机(EVM)是做什么的?

 EVM负责促进以太坊网络上的大多数交易和操作,包括执行智能合约。它负责包含指令和操作数的各种数据结构,以及由指令处理的数据。EVM还包括一个指令调度程序或“虚拟GPU”,用于获取和执行指令并对操作数进行解码。换个说法,EVM负责跟踪网络组件,如世界状态、存储状态和区块信息。EVM还为以太坊网络上的智能合约创建Runtime环境。Runtime环境中的信息用于执行特定交易。这些信息包括:

  1. Gas价格:“交易发起人规定的当前Gas价格”;
  2. 代码大小:“交易代码库的大小”;
  3. 调用方(Caller):“正在执行交易的账户地址”;
  4. 来源方(Origin):“交易原始发送者的地址”;

最后,除了以上这些职责外,EVM还处理与区块编号、Gas价格、地址和余额有关的账户信息。因为EVM负责以太坊网络上的很多重要功能,因此其能够处理操作及交易的速度,会影响到整个网络的整体速度和性能。同样,EVM能够执行代码的效率会直接影响网络的效率。因此,近年来以太坊网络负荷的增加,使得EVM本身成为了一个瓶颈,常常会降低网络吞吐量,增加交易时间。而效率低下问题,正是以太坊从EVM过渡到Ewasm的主要原因之一

 三、什么是Ewasm?

 以太坊2.0更新的一个重要核心,就是从EVM过渡到Ewasm。

WASM代表Webassembly,这是一个由W3C社区小组开发的开放标准指令集。WASM是为Web而构建的,包括Mozilla、Google、Microsoft和Apple的工程师都在积极开发它,而Ewasm(以太坊版WebAssembly),是专门为以太坊网络而修改的“受限WASM子集”,WASM的设计考虑到了一系列特定的目标。基本上,WASM的设计目的是快速、高效和便携。这意味着它可以利用常见的硬件功能以“接近本机速度”执行。该软件还设计为易于阅读和调试,这是通过一种可以被人阅读的文本格式来实现的,允许开发者手工查看、编写和调试代码。最后,通过强制主机浏览器的权限策略,通过保持向后兼容性,WASM被设计为安全,且是高度兼容的。而创建Ewasm的团队,还制定了几个更具体的项目目标,其中一个主要目标是提供一个EVM转译器和一个计量注入器(metering injector),最好是作为一个Ewasm合约。另一个目标是以太坊接口和Ewasm合约语义的明确规范。最后,该团队的目标是为solidity编译器实现一个Ewasm后端,并提供用C和Rust语言编写合约的指令和库。而Ewasm和wasm之间的区别,可通过以下方式来考虑:

Ewasm = Wasm — 不确定性(浮点)+计量+EEI方法(用于与以太坊交互)。

以太坊将加入诸如波卡(Polkadot)、Cardano、EOS、Tron、Spacemesh和NEAR协议等项目的队列,而这些项目已经或正在采用Wasm。

 四、Ewasm vs EVM

 从一开始,EVM就是为了强调正确性而非效率而设计的。这反映在网络上的所有节点必须完全准确地运行EVM这一事实上。Wasm虽然与EVM相似,但它是为web而发明的。与正确性不同的是,Wasm强调的是效率快速加载。以太坊开发者Lane Rettig表示,EVM的创建不具备“大量的设计思想”,他认为EVM是从理论角度上而非实际角度设计的,因此,虽然它内部健全,但在现实世界中无法发挥最佳的作用。Nick Johnson同意这种看法,相比之下,Wasm的编写更接近于实际的硬件指令,这使得它在翻译实际的编码逻辑时更加有效。事实上,Wasm指令可直接将一对一映射到机器使用的指令,这将使性能大大提高。

 4、1速度和效率上的大幅提升

从EVM到Ewasm的过渡,最为重要的结果之一就是速度和效率上的大幅提高。Ewasm将通过显著增加每秒可处理和添加到每个区块的交易数来增加交易吞吐量。目前尚不清楚Ewasm将为以太坊带来多大速度提升,但执行与交易吞吐量之间将存在直接的相关性:如果Ewasm的执行速度是 EVM的两倍,那么它将允许向每个区块添加两倍多的交易。这并不意味着实际的区块大小将增加,而是指向每个区块添加数据的过程将变得更为有效。随着分片和第二层(layer 2)解决方案的推出,Ewasm将有助于提高以太坊网络的可扩展性。

Lane Rettig将EVM比作一把瑞士军刀:“…它做了很多事情,但效果并不好。” 相比之下,Wasm的设计是将实用化作为首要任务,并且专门针对像以太坊这样的Web应用程序。EVM不能总是有效地编译大量代码,浏览器的javascript引擎通常需要做大量的猜测来为某些操作找出优化的“热路径”(hot path),这些操作可降低EVM的速度并降低吞吐量。相比之下,Wasm可直接从其公共表示转换为编译代码,而无需做任何猜测工作。这是允许Ewasm加载和运行速度超过EVM的许多特征之一。另一个例子与EVM使用的字节码类型有关,因为EVM使用256位字节码,所以小于256位的计算必须转换为256位格式,然后EVM才能处理它们。许多开发人员认为,这个功能现在是多余的,这将是另一个使Ewasm比EVM更快的特性。Rettig在接受Coinwire采访时,其隐喻性地总结道:

“以太坊正从我们在农场周围骑行的笨重自制工具,过渡到一辆真正的赛车,我们将可以在公路上行驶…”

而Mozilla发表的一篇文章,也认同了这种看法,即以太坊这样的框架将能使用Wasm来提供巨大的性能优势和新功能,同时仍然使Web开发人员能够轻松地使用功能。

 4、2 减少甚至消除预编译

而Ewasm的另一个主要好处是,它可以减少甚至消除对预编译的需求。所谓预编译(预编译合约)是EVM字节码的特殊位。如果对预编译合约发出调用,EVM将执行预先定义的本机代码并返回结果。预编译是特定于某些协议的通用操作(如签名方案和哈希),并帮助用户节省gas成本,如果没有这些协议,成本会更高。与常规code不同,EVM只需评估预编译,而不是合约地址处的整个代码。由于以太坊网络上的各种复杂密码学计算在没有它们的情况下会导致无偿的高gas成本,因此需要预编译。在某些情况下,这种gas成本甚至可能超过区块限制,这意味着在不使用预编译的情况下,某些操作无法通过EVM进行处理。预编译的一个严重缺点是,在网络中引入新的预编译,通常需要一个协商一致的硬分叉,而硬分叉通常是有争议的,因此较难实现。Nick Johnson认为,Ewasm在计算方面的效率足够高,可以消除大多数当前的预编译,并用Ewasm合约替换。这些智能合约可简单地重写和重新部署,而无需使用硬分叉,这使Ewasm比EVM更具优势。这意味着开发人员可以利用Ewasm提高的效率来简化网络、简化开发过程,并在新的合作模式下避免硬分叉。

但和任何新的系统一样,Ewasm并非没有批评者,以太坊开发者Greg Colvin就对Ewasm智能合约消除预编译的能力持怀疑态度。他还警告说,Ewasm依赖编译器来支持多种语言可能会成为单一失败点。然而,我所接触过的绝大多数专家和开发人员并不认为这些是主要关注点,他们对Ewasm将为以太坊网络带来的显著性能改进感到兴奋。

 4、3 卓越的互操作性

Ewasm在性能上超过EVM的第三个领域是互操作性,Ewasm将支持更多的语言,并将受益于比EVM更广泛的工具集。一些Ewasm支持的附加语言的突出例子包括C、 C++ 和Rust。Ewasm还将获得许多著名的JavaScript引擎的本地支持,包括但不限于:微软的Chakra引擎(Microsoft Edge)、谷歌的V8引擎(node.js和基于Chromium的浏览器)以及Mozilla的Spidermonkey引擎(Firefox和Thunderbird)。Ewasm还将得到多个非浏览器实现的支持,如ml-proto(OCaml引用解释器)、wasm-jit-prototype(使用LLVM后端的独立虚拟机)或wabt(基于堆栈的解释器)。尽管Wasm有自己的独立于JavaScript的本地语言,但它并不是用于替代目的。相反,它的目的是与JavaScript一起工作,允许开发人员利用两种语言的优势,并避免它们的弱点。除了兼容更多的语言和引擎外,Ewasm是根据万维网标准构建的,这意味着它很容易在浏览器中支持以太坊轻客户端。与EVM相比, Ewasm还将受益于更广泛的工具和编译器。由于Wasm已经被以太坊以外的大量项目使用,因此它拥有比EVM更大、更活跃的开发者社区,这就会带来更好的工具选择。因此,Wasm包含各种工具链,可以从几个不同的编译器发出操作码。他们可以编译C代码和Rust代码等。来自 ethdev红迪子板论坛的贡献者认为,转换为Ewasm的主要目标之一是“利用现有的工具,而不是试图说服人们建立针对EVM的工具。”因此,工具是以太坊向更成熟和广泛使用的Wasm的过渡中获益的另一种方式。

总的来说,以太坊从EVM到Ewasm的预期转换,将带来一系列令人兴奋的新性能升级和其他优势。这包括速度和效率上的提升、卓越的互操作性以及减少或消除预编译。