波卡的 Wasm 和以太坊 2.0 的 eWasm 相对于 EVM 虚拟机的绝对优势
作者|Colin Schwarz,Chainsafe 项目经理。
译者|洒脱喜
原文链接|https://www.8btc.com/article/473991
本文探讨的是以太坊虚拟机 (EVM) 和以太坊 WebAssembly (eWasm),eWasm 将取代 EVM 成为以太坊 2.0 网络的状态执行引擎,这种转换将为以太坊带来一系列令人兴奋的新性能升级和其他优势,这包括速度和效率上的提升、卓越的互操作性以及减少或消除预编译。
1.什么是以太坊虚拟机(EVM)?
为了理解 eWasm 及其对以太坊网络的影响,我们必须首先熟悉其将替代的以太坊虚拟机(EVM )。EVM 是一个轻量级的虚拟机,其设计是用于在以太坊网络上运行智能合约。作为虚拟机,EVM 的功能与传统的操作系统(如 Windows)稍有不同。一般来说,虚拟机(VM)是建立在本机操作系统上模拟物理机的高级抽象。它们允许同一平台,在许多不同的硬件体系结构和操作系统上运行,这使得虚拟机(VM)非常适合像以太坊这样的分布式网络。EVM 的构建是为了模拟可由物理 CPU 执行的操作,其还负责以太坊的许多关键功能。
而 EVM 除了作为一个虚拟机,它也是一个“堆栈机”和一个“状态机”(我知道,它有很多形容词,请原谅)。状态机只是一台可以读取输入并基于这些输入转换为新状态的机器。而基于堆栈的虚拟机是将内存结构组织为堆栈并作为堆栈访问的虚拟机。这与基于寄存器的虚拟机相反,其内存结构存储在 CPU 的寄存器中。为了在基于堆栈的虚拟机上执行操作,称为“操作数”(Operand)的数据从堆栈中“弹出”,通过接受操作进行处理,然后根据后进先出(LIFO)的原则“推送”回堆栈。使用基于堆栈的机器进行添加的工作方式如下:
POP 20
POP 7
ADD 20,7, result
PUSH result
https://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 理解。
2.以太坊虚拟机(EVM)是做什么的?
EVM 负责促进以太坊网络上的大多数交易和操作,包括执行智能合约。它负责包含指令和操作数的各种数据结构,以及由指令处理的数据。EVM 还包括一个指令调度程序或“虚拟 GPU”,用于获取和执行指令并对操作数进行解码。换个说法,EVM 负责跟踪网络组件,如世界状态、存储状态和区块信息。EVM 还为以太坊网络上的智能合约创建 Runtime 环境。Runtime 环境中的信息用于执行特定交易。这些信息包括:
Gas 价格:“交易发起人规定的当前 Gas 价格”。
代码大小:“交易代码库的大小”。
调用方(Caller):“正在执行交易的账户地址”。
来源方(Origin):“交易原始发送者的地址”。
最后,除了以上这些职责外,EVM 还处理与区块编号、Gas 价格、地址和余额有关的账户信息。因为 EVM 负责以太坊网络上的很多重要功能,因此其能够处理操作及交易的速度,会影响到整个网络的整体速度和性能。同样,EVM 能够执行代码的效率会直接影响网络的效率。
因此,近年来以太坊网络负荷的增加,使得 EVM 本身成为了一个瓶颈,常常会降低网络吞吐量,增加交易时间。而效率低下问题,正是以太坊从 EVM 过渡到 eWasm 的主要原因之一。
3.什么是 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。
4. 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 的预期转换,将带来一系列令人兴奋的新性能升级和其他优势。这包括速度和效率上的提升、卓越的互操作性以及减少或消除预编译。
特别感谢 Lane Rettig 对本文进行了事实检查,并提出了一些很好的建议!
相关文章:
1.“Solidity Bytecode and Opcode Basics.”
https://medium.com/@blockchain101/solidity-bytecode-and-opcode-basics-672e9b1a88c2
2.“Stack-based vs Register based Virtual Machine Architecture, and the Dalvik VM.”
3.“Ethereum Virtual Machine Explained.”
https://www.mycryptopedia.com/ethereum-virtual-machine-explained/
4.“Ethereum EVM Illustrated: exploring some mental models and implementations.”
https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
5.“Ethereum 2.0.”
https://medium.com/rocket-pool/ethereum-2-0-76d0c8a76605
6.“eWasm Design Overview and Specification.”
https://github.com/ewasm/design.
7.“Web Assembly Concepts.”
https://developer.mozilla.org/en-US/docs/WebAssembly/Concepts
8.Lane Rettig, core contributor to Eth 2.0.
9.“eWasm Replaces the Heart of Ethereum.”
https://www.coinwire.com/ewasm-replaces-the-heart-of-ethereum
10.“Trying to understand the EVM and eWASM.”
https://www.reddit.com/r/ethdev/comments/87rrt6/trying_to_understand_the_evm_and_ewasm/
11.“Ethereum Virtual Machine (EVM) To Be Replaced By EWASM Making The Ethereum Network Smarter And Stronger.”
12.“On Adding Precompiled Contracts without Hard Forks.”
https://that.world/~classic/2017/09/14/nonfork-precompiled/
13.“A Prehistory of the Ethereum Protocol.”
https://vitalik.ca/general/2017/09/14/prehistory.html
About Patract
Patract 为波卡 Wasm 合约生态的平行链和 DApp 开发提供解决方案。我们帮助社区平行链设计和开发链上合约模块和 Runtime 支持,并且为 DApp 开发者提供覆盖开发、测试、调试、部署、监控、数据提供和前端开发等阶段的全栈工具和服务支持。
How to join Patract
1.对于合约开发者,可以访问官网 (https://patract.io),熟悉测试链和工具套件。欢迎加入官方开发群:
Element(https://app.element.io/#/room/#PatractLabsDev:matrix.org)
Discord(https://discord.gg/wJ8TnTfjcq)
搜索“Pareact 开放平台”关注 Patract 微信公众号
2.对于将要集成 Wasm 合约功能的平行链项目方,或者使用 Wasm 合约开发的 DApp 项目方,商务合作欢迎联系 santry@patract.io
3.对于用户,欢迎加入:
Telegram(https://t.me/patract)
Twitter(https://twitter.com/PatractLabs)
4.对于求职者,我们在招聘区块链开发工程师、前端/全栈开发工程师、开发者运营等岗位,可以联系 sean@patract.io
评论