写点什么

如何部署 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:101925

评论

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

基于鲲鹏原生安全,打造安全可信的计算平台

Geek_2d6073

得物客服热线的演进之路

得物技术

大前端 客服

关于 Web Content-Security-Policy Directive 通过 meta 元素指定的一些测试用例

汪子熙

JavaScript 前端开发 CSP meta 7月月更

决策树算法

秃头小苏

决策树 7月月更

ORACLE进阶(五)SCHEMA解惑

No Silver Bullet

oracle schema 7月月更

最佳实践 | 用腾讯云AI意愿核身为电话合规保驾护航

牵着蜗牛去散步

人工智能 腾讯云 腾讯 技术干货 电话合规

wallys/Qualcomm IPQ8072A networking SBC supports dual 10GbE, WiFi 6

wallys-wifi6

IPQ8072 IPQ9072a

系统入门-Linux系统基础命令

Albert Edison

7月月更

为租客提供帮助

源字节1号

微信小程序 软件开发 前端开发 后端开发 租房小程序

作战图鉴:12大场景详述容器安全建设要求

青藤云安全

网络安全 解决方案 容器安全

【玩转 RT-Thread】 RT-Thread Studio —— 按键控制电机正反转、蜂鸣器

攻城狮杰森

OS 7月月更 RT-Thread

Scala 基础 (六):面向对象(下篇)

百思不得小赵

scala 大数据 7月月更

2022年,作为一名Java后端开发程序员,必须掌握哪些框架

了不起的程序猿

java程序员 Java 开发 Java’

【堡垒机】云堡垒机和普通堡垒机的区别是什么?

行云管家

云计算 数据安全 堡垒机 云堡垒机 IT安全

小程序目录结构

小恺

7月月更

Linux透明大页机制在云上大规模集群实践介绍

百度Geek说

Linux 运维 linux 文件权限控制

java零基础入门-Java正则表达式

喵手

Java 7月月更

开发一个小程序商城需要多少钱?

CRMEB

如何参与开源项目 - 细说 GitHub 上的 PR 全过程

胡说云原生

GitHub 开源 pull request DevStream

低代码平台中的数据连接方式(下)

Baidu AICLOUD

前端 低代码 爱速搭

LeetCode-144. 二叉树的前序遍历(java)

bug菌

Leet Code 7月月更

重磅!海泰方圆工业强基智能网联汽车项目顺利通过验收

电子信息发烧客

2022PAGC 金帆奖 | 融云荣膺「年度杰出产品技术服务商」

融云 RongCloud

【Python技能树共建】动态渲染页面爬取

梦想橡皮擦

Python 7月月更

Python|正则表达式

AXYZdong

Python 7月月更

交付效率提升52倍,运营效率提升10倍,看《金融云原生技术实践案例汇编》(附下载)

York

云原生 金融科技 金融行业

云计算安全扩展要求关注的安全目标和实现方式区分原则有哪些?

行云管家

云计算 等保 等保2.0 云计算安全扩展

社会责任·价值共创,中关村网络安全与信息化产业联盟对话网信企业家海泰方圆董事长姜海舟先生

电子信息发烧客

Vue 灰度发布新功能的那些事

南城FE

Vue 前端 灰度发布 7月月更

作为Java程序员,阿里一面Synchronized连珠炮你是否能够顶住

了不起的程序猿

面试题 Java 开发 Java’

风靡B站的《看漫画学Python》到底是什么来头?

博文视点Broadview

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