这篇文章是 Crosslink 2019 Taiwan 的一个议程纪录:The next generation Ethereum Virtual Machine,由来自Second State 的工程VP Hung-Ying Tai(hydai) 分享 Ewasm VM 目前研究内容及未来的方向,内容非常精彩,包含了 EVM bytecode 、Webassembly、Ewasm1.0 以及 Ewasm2.0 。

EVM bytecode 及Webassembly(WASM)

以太坊的智能合约交易在执行时,例如:把Token 转到别的地址,是将EVM bytecode 读进以太坊的虚拟机执行,而 EVM bytecode 有以下几点特色:

  1. 256 位元且堆叠式(staked-based)的虚拟机
  2. 很多高阶的指令,例如:SSTORE, SLOAD, SHA3, EC, Call/Create contract
  3. 与实体系统架构(通常是 32/64 位)有差异,而 256 位则需要靠模拟来完成
  4. 较少程序语言(Vyper, Solidity, …)

Webassembly(WASM)是为了让不同程序语言开发的套件都能在浏览器使用的一种二进制程序语言,WASM 有以下几点特色:

  1. 堆叠式(staked-based)的虚拟机:有独立的区域空间(暂存器或是内存),存取堆叠前3 个物件(EVM 存取 16 个)
  2. 支持32 / 64 位的操作
  3. 没有高阶的指令
  4. RISC 指令集也可以对应到CPU ISA
  5. 较大的社群:主流的浏览器都支持,也有较多的程序语言(C++, Rust, GO, …)

Ewasm 1.0

接下来看看以太坊Ewasm 的特性:

  1. Ewasm 是wasm 的子集合
  2. 因为不能有误差,所以不支持浮点数运算
  3. 只能import 以太坊的函式库,避免 importㄒ系统函式库
  4. 在每段指令之前插入useGAS 来计算 GAS 的花费

以太坊环境接口(EEI)

EVM 里有很多像是SSLOAD, SHA3 的高阶指令,这些指令在Ewasm 1.0 里,因为 WASM 可以动态读取函式库(模组),以太坊定义了以太坊环境接口(EEI),让客户端可以用不同的语言实现相对应的函式库,而且也更容易完成 prototype 跟升级。

下图是 Ethereum Environment Interface 定义的函数列表。

如何移除非法的指令?

Ewasm 使用 system contract 移除非法指令以及加入 useGas 的 bytecode,像是浮点数或是非法的 import,有以下两种做法:

  1. 使用 system contract 检查合约的 bytecode
  2. 像目前的 precompiles 运行在客户端上,在部署前先检查合约

下图是 Ewasm 1.0 的 stack,在部署合约前 Ewasm bytecode 会先经过 Sentinal 的检查,成功部署后客户端如果要执行合约会通过 EVM-C 与 Heru(Wasm Engine)沟通。

效能问题

使用Ewasm 效能真的会比较快吗?Second State 的Hydai 分享了各个EVM 执行 Sha1 以及 BN128mul 的结果,发现EVM 在运行 BN128mul 时会是最快,主要是因为WASM 支持 32 / 64 位的操作,256 位则需要另外模拟(1 个 256 位元的运算可以换成 25 个 64 位元的运算),所以WASM 在跑 BN128mul 时会比较慢。

Ewasm 2.0

Ewasm 2.0 的智能合约改叫 Execution Environments(EE),与 Ewasm 1.0 不一样的有下列几点

  1. EE 全部都是 WASM 写的
  2. 因为支持 cross shard,每个 EE 都是在一个 shard 上执行
  3. EE 只能拿到 state root,而在合约的执行写法也跟原来不一样
  4. EE 是 stateless

下图可以看到ERC20 Token 在Ewasm 2.0 跟Ewasm 1.0 storage 的比较,Ewasm 1.0 每个数据都会有相对应的 key,而Ewasm 2.0 只有存 state root,所以只能跟 state root 互动。

Phase One and Done

目前 Ewasm 2.0 到 phase one and done 的阶段,也有测试的网络可以在 shard block 执行 EE,以太坊也有开源 Ewasm 2.0 的测试工具 Scout

上图是Eth 2 的 Hello World EE,可以看到main 函数里第一行读取pre state root,接下来验证block data size 是不是为 0,最后再将state root 存回去,Eth 2 的智能合约写起来都会像这样。

结论

Ewasm 1.0 目前已经支持 EVM 1 大部分的功能,Ewasm 也有测试链了,Second State 开发了一个编译器SOLL,能将 Solidity 编译成 Ewasm,对Ewasm 感兴趣的人可以参考一下

Ewasm 2.0 目前还在研究中,下图是Hydai给大家分享的研究及贡献的方向。

参考

Crosslink 简报

webassembly.org (http://webassembly.org/)

Scout

Second State’s Soll Compiler

Compiling and deploying an ERC20 contract onto the eWASM testnet— YouTube

Ewasm overview and the precompile problem: Alex Beregszaszi and Casey Detrio @ Ethereum \\ Part 1 — YouTube

Ewasm overview and the precompile problem: Alex Beregszaszi and Casey Detrio @ Ethereum \\ Part 2 — YouTube

Wasm for blockchain&Eth2 execution: Paul Dworzanski,Alex Beregszaszi,Casey Detrio@Ethereum \\ Part 2 — YouTube

Ewasm for sharding

Ewasm updates

Ewasm design

wasm-intro