速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

如何部署 Ewasm 智能合约?

  • 2020-05-13
  • 本文字数:2187 字

    阅读完需:约 7 分钟

如何部署Ewasm 智能合约?

ETH 2.0 在共识层之外的最大改变就是引入了 Ewasm,以太坊风味的 WebAssembly 虚拟机。以太坊基金会计划分阶段推进 ETH 2.0 的开发工作。在以太坊官方的路线图中,目前以太坊基金会的工作重点是:阶段 0 ,推出信标链,在共识层实现从 PoW 到 PoS 的转变,实现用户 stake ETH 的功能。


ETH 2.0 已在共识层取得了重大进展。Prysmatic Labs 推出首个具有完整的 Eth2.0 阶段 0 主网配置的测试网 Topaz 并成功地验证了该测试网中的第一个区块,距离阶段 0 的成功上线又进了一步。


只不过本次上线的是单客户端测试网,还不能与其他客户端进行交互。Vitalik 发推称,将在未来的数周内推出联合测试网。这是 ETH 2.0 阶段 0 正式上线的前兆。


备受开发者关注的 Ewasm 虚拟机将于 2021 年在阶段 2 上线,届时,开发者方可在以太坊上进行正常的开发工作。


相较于比特币,以太坊最大的创新在于引入了虚拟机 EVM,将普通的转账交易变成了一段代码来执行。EVM 将智能合约带入了区块链世界。以太坊的目标是世界计算机,这也决定了 EVM 是图灵完备的。


随着以太坊的发展壮大, 以太坊社区的诉求发生了改变。EVM 需要解决效率与花费的问题,这与 EVM 的设计初衷是不相符的。因此,以太坊基金会把目光投向了 WebAssembly。


WebAssembly 是更有效率的字节码格式,便携性与安全性兼备,这一点已经被 Web 社区所验证过。毕竟有了 WebAssembly,在浏览器打游戏都会变得异常流畅。


同时,WebAssembly 在前端支持多种语言编写智能合约。对于开发者而言,编写 Ewasm 智能合约的语言选择更加自由。依赖强大的编译器,开发者可以使用 Rust、Go 等新兴语言编写 Ewasm 智能合约。从理论上讲,任何可以编译成 Wasm 的语言都可以用来编写 ETH 2.0 智能合约。


这也是 Subsrate、EOS、以太坊都选择 WebAssembly 作为虚拟机的原因:WebAssembly 被区块链之外的广大世界验证过,并且有着更庞大的社区。


尽管距离以太坊规划的时间还有一段距离,但 Ewasm 的开发工作早已开始。


下面列出了一些 EVM 与 Ewasm 在规范上的不同之处,无意评价 EVM 与 Ewasm 孰优孰劣,方便大家更好的理解 Ewasm 的工作机制。


以太坊智能合约交易在执行时,例如把 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 的上线对智能合约开发工作的影响并不大。从 solidity 合约到能被 Ewasm 执行的字节码,这其中主要是编译器在发挥作用。换句话说,开发者可以像之前一样进行智能合约开发工作,这是对开发者友好的处理方式。


更重要的是,正如上文所提到的那样,Ewasm 上线后,以太坊社区有可能进一步扩大。比如,非区块链开发者可以用 Rust 编写智能合约,这为整个以太坊社区带来了新的可能性。


经过一段时间的开发,现在以太坊的 Ewasm 已经支持了 EVM 的大部分功能,并且发布了 Ewasm 测试链,供开发者使用。


但由于 Ewasm test 已经关闭了,开发者需要通过社区贡献的开源软件来测试开发 Ewasm 合约,比如 SOLL 编译器SSVM-evmc 虚拟机。


SSVM-evmc 已经通过了 stWASM 的所有测试用例,达到了以太坊基金会的要求。



以最常见的 ERC 20 合约为例,我们来看下如何在以太坊 Ewasm 虚拟机上编写、部署 Ewasm 合约。


在开始之前,请确保已经启动运行 Second State DevChain。如果没有,请点击这里查看如何安装 Second State DevChain,这个过程大约需要 10 分钟。

编译 ERC20 合约到 Ewasm 字节码

下面是一个非常常见的 ERC 20 合约代码。




使用SOLL 编译器将上面的 ERC 20 合约编译成 ewasm 字节码(SOLL 可以将 solidity 与 YUL 源码编译成 Ewasm 字节码)。


使用​xxd​工具将已编译的 ewasm 字节码转换为文本。


部署 Ewasm 合约

现在,让 ewasm 代码使用​0x​作为前缀,然后将其从默认 coinbase 地址部署到区块链。Coinbase 的默认密码是​1234​。




请注意,​sendTransaction​的返回值是交易哈希。我们可以使用哈希来查找新创建的合约地址。



接下来,在上述地址上创建一个合约实例。我们需要合约 ABI(基于 Solidity 源代码)才能正常工作。然后,我们可以查询这个 ERC20 合约中的帐户余额。合约创建者的地址可以查看到 token 的所有初始供应量,而其他人的地址则为零。

转账 ERC20 token

最后,我们调用 ​transfer​ ,在不同的账户之间转账 ERC20 Token。




就这样,我们已经实现了在一个真实的区块链上部署并执行了 Ewasm 智能合约。


欢迎来到 ETH 2.0 的世界!


SOLL 编译器与 SSVM-evmc 由 Second State 开发。


参考资源:


  1. https://medium.com/wasm/diving-into-ethereums-virtual-machine-evm-the-future-of-ewasm-722239bf5b18

  2. https://drive.google.com/file/d/1ufvspealOGje6GPp-yJnCeO73bch1wRe/edit


2020-05-13 17:101939

评论

发布
暂无评论
发现更多内容

使用Kong作为微服务网关

行者AI

kong

DCache 分布式存储系统|K-K-Row 缓存模块的创建与使用

TARS基金会

MySQL 数据库 nosql 分布式存储 TARS

日记 2021年2月25日(周四)

Changing Lin

2月春节不断更

2021金三银四涨薪季,这些面试题都掌握了嘛?

ios 面试

国产芯片WiFi物联网智能插座—电源功能设计

不脱发的程序猿

28天写作 二月春节不断更 智能插座 WiFi物联网智能插座 电源设计

研发效能的历史和未来

李小腾

研发效能 数据驱动

【文末彩蛋】数据仓库服务 GaussDB(DWS)单点性能案例集锦

华为云开发者联盟

sql 数据仓库 数据

Centos7配置librdkafka运行时

happlyfox

Centos 7 28天写作 2月春节不断更

华为云“网红”语言Python课程来啦!

华为云开发者联盟

Python

技术干货 | 中间件技术在百度云原生测试中的应用实践

百度开发者中心

底层技术 #技术干货#

2021版面试必问178条性能优化建议!(Java+JVM+Redis+MySQL等)

Java架构追梦

Java 架构 面试 性能优化 金三银四跳槽

到底什么是敏捷

Teobler

敏捷 敏捷开发 敏捷精髓 敏捷书籍

安卓软件开发教程!全世界都在问Android开发凉了吗?offer拿到手软

欢喜学安卓

android 程序员 面试 移动开发

简述:一款优秀的缺陷管理系统有哪些功能特点!

优秀

缺陷管理系统

3分钟学会如何上手supervisor看门狗

happlyfox

Linux centos7 28天写作 2月春节不断更

添加小助理vx:mxzFAFAFA即可!!

比伯

Java 编程 架构 面试 计算机

Git教程--git merge命令

生之欢愉,时间同行

git 程序员 git merge

技术干货 | 趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突

百度开发者中心

算法 数据结构和算法

话题讨论 | 在中国程序员工作是青春饭吗?

happlyfox

话题讨论 2月春节不断更 话题王者

Oracle sqlldr快速导入和sqluldr2快速导出

阳光下、慵懒的熊

数据库

LeetCode题解:718. 最长重复子数组,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

开工来面试了几十个人,一言难尽

yes

面试

诊所数字化:连锁型诊所应用远程会诊做分级诊疗

boshi

数字化医疗 七日更 28天写作

可能是Java Stream的最佳实践(二)

ES_her0

28天写作

第一篇文章

棉花糖

魔改出一个 Encoder | Rust 学习笔记(一)

李大狗

区块链 rust 入门

国产芯片WiFi物联网智能插座—项目简介

不脱发的程序猿

物联网 28天写作 二月春节不断更 WiFi物联网插座 智能插座

安卓天气app开发!2021年Android开发者跳槽指南,社招面试心得

欢喜学安卓

android 程序员 面试 移动开发

话题讨论 | 英语对IT从业人员重要吗?

happlyfox

IT 话题讨论 28天写作 2月春节不断更 话题王者

教你如何在Python中读,写和解析CSV文

华为云开发者联盟

Python csv

常见的初级排序算法,这次全搞懂

Silently9527

Java 排序算法

如何部署Ewasm 智能合约?_区块链_Second State_InfoQ精选文章