ewasm项目初探
为了改进EVM1.0,以太坊的新一代虚拟机项目ewasm (github.com/ewasm)将支持WebAssembly(wasm),wasm在性能,扩展性,开发工具,社区都更有优势。除以太坊外,一些其他项目EOS,Polkadot, Cardano已经或者计划开发支持wasm的虚拟机。
WebAssembly
什么是WebAssembly
- wasm是可以在stack-based虚拟机上运行的一种二进制指令格式,设计的首要目标是性能,很适合用在区块链项目中。
- WebAssembly二进制代码(wasm格式)可以转换成一种中间表示,一种可读的AST(抽象语法树,wast格式),这种可读的中间表示方便了编写和调试。
- 对扩展性的改进:wasm支持module import/export功能,可以将扩展部分做成module,在项目中导入。
WebAssembly的优势
- 可扩展性好
- 32/64位的操作符
- 支持更多的高级语言(C,Rust,Go等)
- 由W3C领导,Google,Apple,MicroSoft等大公司支持,更广阔的社区
- 主流浏览器支持,已有项目支持在非浏览器环境运行(wabt,wavm等)
EVM2.0对比EVM1.0的优势
- 性能更好
- 可扩展性好
- 开发合约更容易,支持更多语言和工具
ewasm 项目目标和方案
以太坊ewasm项目目标是既要完成对wasm的支持,又要兼容EVM1.0合约。要达到这个目标,ewasm目前的设计方案如下:
VM语义设计
- 执行合约前要能够判断出这个合约是wasm合约还是EVM1.0合约,并可调用对应的EVM解析执行。
- 如果客户端没有支持EVM1.0的EVM,需要将EVM1.0合约通过预编译合约(evm2wasm项目)翻译成wasm合约。
- 部署wasm合约时,要有一个预编译内置合约(合约名称Sentinel Contract)对合约进行检查,要求合约复合EVM2.0的要求,比如不能包括float类型,不能有限定外的操作。
ewasm合约语义设计(Ewasm Contract Interface - ECI)
ECI定义了ewasm合约的结构,通过wasm的module实现,实质上是wasm,可以认为ewasm是wasm的子集 。
- 合约必须符合wasm二进制格式
- 合约import module只能import EEI,不能import以太坊之外的module保证了EVM是一个沙盒程序。
- 提供debug module,但debug模式只能用于开发,在部署的时候需要去掉
- 每个合约必须提供两个export方法,一个是main,供VM执行调用,一个是memory,供EEI调用,保存结果。
- wasm module中的start function需要被disable。
Ethereum Environment Interface (EEI) 定义
EEI定义了wasm程序如何与链进行交互,通过EEI将以太坊API暴露给ewasm,使ewasm可以读写链上信息,意义是wasm指令是low level的,high level功能留给客户端实现。
数据类型
- bytes: 不确定长度的二进制数组
- bytes32: 32字节的数组
- address: 20字节的数组
- u128: 128位的无符号整数
- u256: 256位的无符号整数
API
- useGas 减掉消耗的gas
- getAddress 获得账户的地址
- getBlockHash 获得区块哈希
- call 将参数信息发送给某个地址
- storageStore 保存一个256bit的值
更多API及详细信息参考https://github.com/ewasm/design/blob/master/eth_interface.md 。
以太坊内置合约
一些功能接口可以通过内置合约的方式来完成,每个合约都会有固定地址,可以像调用其他合约一样调用内置合约。
Sentinel合约:执行ewasm检查,看合约是否符合ECI的要求;执行 metering,将结果注入到ewasm合约中。
evm2wasm : 将EVM1.0合约翻译成wasm合约。
Metering
Metering功能是计算每个指令消耗的gas,在合约执行之前,提前知道这个合约需要多少消耗gas,也就可以预计运行时间。
提前计算gas消耗还可以避免因gas不足导致操作回滚,避免了做无用功。详细可参考 https://github.com/ewasm/design/blob/master/metering.md
ewasm****子项目
根据ewasm项目设计方案,ewasm创建了多个子项目分别实现模块功能,将这些项目组合到一起,共同实现支持wasm合约并且兼容旧合约的目标。
EVM-C
https://github.com/ethereum/evmc
EVM-C的作用是分离客户端和EVM,客户端在执行合约中只负责与链上信息的交互,把对合约的解析和执行任务交给EVM,他们之间的通信接口就是EVM-C。
客户端有多个版本的实现,Go,C++,Rust等。EVM也有多种方式去解析和执行合约,比如Interprter,JIT,AOT,现在又有了执行不同指令格式的合约的需求。所以通过接口将二者分离可以更方便的配置客户端。

EVMC由C++实现,可以直接与aleth结合。EVMC通过bind的方式支持非C++版本的客户端。目前只能支持aleth和geth。
Hera
Hera是由C++实现的尊从EVMC接口的ewasm虚拟机。Hera内部包含了wasm VM,目前wasm的VM有多个实现版本,Hera计划支持Bineryen,WABT,WAVM(EOS也使用WAVM),目前可以完全支持Bineryen。
不管是哪个版本的客户端,只要是使用EVMC接口就可以与Hera进行交互。总之只要执行指令过程中有与链上的信息交互就通过接口与客户端通信,其他low level 的 wasm指令由内置的VM执行。
对于EVM1.0的合约,Hera将通过另一个项目evm2wasm提供的方法将EVM1.0合约翻译成ewasm合约。

项目现状
Parity对ewasm合约的支持是最好的,但是它的实现方式是内置在客户端中,并没有使用EVMC和Hera,aleth和geth正在开发中。
目前的测试网络已经上线,但缺少工具支持,没有生成ABI文件的工具,也没有任何hello world教程或文档。
关于上线时间,根据DevCon4上的信息,以太坊会先发布Casper和Sharding,然后发布EVM2.0,至少要一年左右甚至更久。
ewasm项目初探的更多相关文章
- GOICE项目初探
GOICE项目初探 在图像拼接方面,市面上能够找到的软件中,要数MS的ICE效果.鲁棒性最好,而且界面也很美观.应该说有很多值得学习的地方,虽然这个项目不开源,但是利用现有的资料,也可 ...
- 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造
第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造 MVC默认模板的视觉设计从MVC1到MVC3都没有改变,比较陈旧了:在MVC4中做了升级,好看些,在不同的分辨率下,也能工作得 ...
- 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第二节:MVC5项目结构
第一境 ASP.Net MVC5项目初探 — 第二节:MVC5项目结构 接下来,我们来看看,VS为我们自动创建的项目,是什么样子的? 可以通过菜单中[View]->[Solution Explo ...
- 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目
第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目 创建一个MVC项目,是很容易的,大部分工作,VS都帮我们完成了.只需要按照如下步骤按部就班就可以了. 打开VS2017,选 ...
- 【Magenta 项目初探】手把手教你用Tensorflow神经网络创造音乐
原文链接:http://www.cnblogs.com/learn-to-rock/p/5677458.html 偶然在网上看到了一个让我很感兴趣的项目 Magenta,用Tensorflow让神经网 ...
- django项目初探
一:创建django项目 设置数据库(默认sqlit3) mysql: setting:中设置 DATABASES = { 'default': { 'ENGINE': 'django.db.back ...
- 云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇
项目初探 项目地址: 原项目:https://github.com/lonng/nanoserver 调过的:https://github.com/Kirk-Wang/nanoserver 这将是一个 ...
- 第01讲 Android开发系列---Activity
一. Android系统版本及详细信息 最新数据 https://developer.android.com/about/dashboards/ 二. Android项目初探 1. 使用a ...
- 壹佰文章最全总结| 《关于ASP.NETCore的分享之路》
学习路线图 (关于学习ASP.NET Core需要了解和掌握的知识点图) 一言不合就来图,各位博客园小伙伴大家好,感觉好久没有写文章了,自从春节开始,中间经历种种,慢慢的就开始微信公众号发文了,原因有 ...
随机推荐
- Log4j2同步异步性能比较以及教程和问题(坑)汇总
线程数:500个 每个线程日志输出次数: 500次 log4j2其实有两个输出异步日志的方式:AsyncLogger和AsyncAppend 他两的区别在于: AsyncLogger使用的是无锁高 ...
- Lumia 1020 诞生:诺基亚拍照技术的一次狂欢
它在手机发展史上留下一长串坚实的脚印,拥趸遍及世界.它从巅峰滑落,但从未放弃向过去致敬的机会. 2002 年,作为世界上第一款内置摄像头拍照手机,诺基亚 7650 的横空出世将手机行业硬生生推上一个新 ...
- msp430项目编程54
msp430综合项目---扩展项目四54 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结
- SGU103+POJ 1158 最短路/dp
题意:一个无向图,求起点到终点最少时间,限制:每个路口有灯,要灯颜色一样才能过去,灯之有俩种颜色,周期 变化,给定每个灯初态,时间. 思路:开始就想到直接DP,方程dp[k]=dp[i]+distan ...
- SGU 106 在区间范围内的线性方程解个数
题意:求解方程ax+by+c=0,在区间x1->x2和y1->y2的解的个数. 看似简单,真心a的不容易啊! 开始跪于第8组数据,原因是没用long long !后来改了,跪于12组,超时 ...
- css,世界上没有绝对简单的事情
引文 自从学了前端的基础,自认为是没什么css是能难倒我的,可是事实是,世界上没有绝对简单的事情,实际上还有好多的东西等待我们去发掘. 详解 1.有些浏览器不完全支持css3,现在可以用 modern ...
- Python中%r与%s的区别
%r是rper()方法处理的对象 %s是str()方法处理的对象 其实有些情况下,两者处理的结果是一样的,比如说处理数据类型为int型对象: 例如1: print ('I am %d year old ...
- FastDFS介绍和搭建(转载)
FastDFS介绍和配置过程--http://blog.51cto.com/ylw6006/948729 FastDFS的五篇文章--http://www.cnblogs.com/smartycity ...
- luogu P1476 休息中的小呆
题目描述 当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫“最初梦想”的游戏.游戏描述的是一个叫pass的有志少年在不同的时空穿越对抗传说中的大魔王chinesesonic的故事 ...
- luogu P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...