前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Rust编写EWasm合约

用Rust编写EWasm合约

作者头像
开源社
发布2022-02-25 16:05:50
8010
发布2022-02-25 16:05:50
举报
文章被收录于专栏:开源社开源社

| 作者:Antonio

| 编辑:钱奕

| 设计:马丽娜

| 责编:王玥敏

大家好我是Second State 工程师 Antonio ,很高兴能参与CosCon年会,然后在线上跟大家分享用Rust编写ewasm合约。

关于ewasm合约

那首先要谈ewasm合约是什么呢,还有我们如何使用 。

那ewasm 其实是ethereum web assembly 这样子的简写,而ethereum是一个去中心化open source的区块链,它的特色是有智能合约(smart contract)的运算功能,也因此我们有时会称blockchain为web 3 ,是下一个时代的web 。

Web assembly 是一个技术,是一个开放的标准,它定义了一个二进制的格式,可以在跨平台的浏览器中执行。

什么是Ewasm

Ewasm其实是是一个web assembly的subset(子集),仔细来看一下用ewasm写的合约其实是格式都是符合web assembly而会有一些ethereum 特有的function,像ethereum finish,因此可以理解Ewasm是一个符合web assembly 规范的程序,但是它运行的runtime要能提供ethereum专有function,而成为web assembly的子集。

使用ewasm的目的

在web 2.0中 ,一般的web server 会有API,然后我们可以用任何的语言,比如说像Rust或者是go,或者是c# .Net,或者是java、python、ruby,任何语言都可以跟server进行沟通,而沟通时使用的是HTTP protocol。

Blockchain 也是类似的方式,只不过是链上EVM跟外界沟通,但EVM相对之下,沟通的方式反而没有像传统web 2.0 API这么弹性方便的,语言也很受限。

Ewasm其实是提供了一个格式,可以传进链上执行,所以任何语言,只要能编译成ewasm这格式,就可以在链上面执行。

Blockchain 的适配性

  • 为什么Blockchain 跟Rust 相合

首先先帮大家理解一下什么是Rust 。Rust 是一种多种典范,然后是高阶、通用(各种用途都可以使用)的编程语言。

Rust的设计注重效率、安全,还有特别是能安全的并发,然后这几个特征就就刚好是区块链特别需要的。

因为区块链要做事情非常多,所以重视效率,而且跟财务、金融有关系,所以安全也首选需要考虑的,基于这样的特性Rust在Blockchain的发展就很好。

  • 为什么跟Web assembly也很合

Rust可以精确控制lifetime,也提供很好的效能,加上不需要GC,不会有额外的开销。在执行格式上是比较小的二进制的档案,因为web assembly着眼于比较小的二进制档案跟效率啊,而也跟Rust很合。

传统上web server有很多API来跟外界沟通,而沟通是用HTTP。

HTTP是hypertext markup language的简称,其实是一种text ,是一种文字的格式,透过网际网络然后来沟通。

而blockchain被称为web 3 其实是通过binary 的格式,然后在blockchain网络上跟链上节点沟通,差别就是一个是文字形式,一个是二进制的形式来沟通,所以他们本质上是一样的。

Blockchain具有比较先进的功能,比较好的加密,比较好的安全性。在从代码层面来理解,当我们用web来理解blockchain的时候,就会发现他们有很很多很相像的特征。

比如说像都有个进入点,像rocky的代码中,这有个#[launch] ,就是进入点。如果用rust的sewup来写blockchain的应用 ,它也会有一个进入点,就是#[ewasm_main]。透过主程序,然后再决定要交给哪一个handler,所以不管是web 2.0、web 3.0都会做路由。

在Web 2.0时,路由是用URI(unifrom resource identifier) 来做路由,也就是我们常见由斜线组成的字串。而在blockchain上面的路由是二进制的格式的,四个bytes ,这个叫functional signature。

它是一般是经过一个hash function 去算这个原本function 的名称跟它传进来的参数而得到的。在这框架内,大部分情况是不需要填入的会自动计算,但也可以填入强迫指定。Blockchain中,链上节点会读前面这些四个bytes,对应到哪个handler,进行路由。

因此整体上来看,Blockchain跟传统的web 都是一样的概念。

现阶段技术水平

那我们来看一下先前技术,用rust 来写这个合约的技术水平在什么样状况?

在2019年11月,就有ewasm-rust-api,也已经有出0.11的版本,也可以写一个rust的程序,再编译编出wasm。然后送到有的执行wasm的blockchain就可以运行了。

但我们就会发现这个合约是很不Rust风格的,比方如说function都没有return,更不用提result跟option,然后很多操作都过于底层,感觉就不是很有点落差,可以说确实可以拿Rust来写blockchain合约,但很难实用。

现阶段困难及解决方法

  • 哪些地方让困难

因为这些ABI都不是Rust的 ,都没有Result、Option,这种基本的约定,很多操作都还是对Bytes32进行操作。

同时在开发Web的时候,其实不会太去关心说存在web server 上面的档案所使用的格式。

故而在blockchain上,如果要同时考虑储存的bytes,还是要以32 bytes为单位的储存的话,会有点太低阶。

而且今天这个些Rust的API,其实没有做一些辅助的功能,也因此难去做路由,此外也缺少原始的rust开发者最习惯的用cargo test 来进行测试

所以整体而言,面对了这么多的困难,所以用ewasm-rust-api来写一个智能合约其实是不大合宜的。

  • 解决问题--Sewup

Sewup把很多blockchain的细节都封装起来,让开发传统Web的开发者能更好进入Blockchain的领域开发。

用Sewup来写合约,除了语法上的问题得到了解决,在这个框架中,会自动把constructor跟contract runtime都编译成wasm,再组合起来,同时还包含了上链的工具,在开发的体验上,尽可能做到与传统web开发一致。

我是Antonio,很高兴能有这个机会,在网络上跟大家分享,也期待大家的使用。

开源社简介

开源社成立于 2014 年,是由志愿贡献于开源事业的个人成员,依 “贡献、共识、共治” 原则所组成,始终维持厂商中立、公益、非营利的特点,是最早以 “开源治理、国际接轨、社区发展、开源项目” 为使命的开源社区联合体。开源社积极与支持开源的社区、企业以及政府相关单位紧密合作,以 “立足中国、贡献全球” 为愿景,旨在共创健康可持续发展的开源生态,推动中国开源社区成为全球开源体系的积极参与及贡献者。

2017 年,开源社转型为完全由个人成员组成,参照 ASF 等国际顶级开源基金会的治理模式运作。近七年来,链接了数万名开源人,集聚了上千名社区成员及志愿者、海内外数百位讲师,合作了近百家赞助、媒体、社区伙伴。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档