Ewasm Vs EVM:Ewasm 带来了什么改变?

20191106-Ewasm-01.png

这篇文章是 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 。git

EVM bytecode 及Webassembly(WASM)

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

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

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

  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 定义的函数列表。架构

20191106-Ewasm-02.png

如何移除非法的指令?

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

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

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

20191106-Ewasm-03.png

效能问题

使用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 不同的有下列几点post

  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 互动。

20191106-Ewasm-04.png

Phase One and Done

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

20191106-Ewasm-05.png

上图是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给你们分享的研究及贡献的方向。

image

参考

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