写点什么

Substrate 合约书之合约综述

用户头像
Patract
关注
发布于: 2021 年 04 月 07 日
Substrate 合约书之合约综述

前言


「Substrate 合约书」用于介绍 Substrate 中与合约体系相关的一系列知识。本书由 Patract (https://patract.io/)主导编写,由 Aten (https://github.com/atenjin)负责。本书仓库位于 https://github.com/patractlabs/substrate-contracts-book(opens new window),欢迎有志之士一起为本书做出贡献。

本书当前主要以 Pallet-Contracts (即 Wasm 合约)作为主体进行介绍。因此本书内容包含:


  • 运行合约的合约平台(模块)

  • Pallet-Contracts

  • 编写合约的语言

    ink!

    Ask!

    Solang

  • 帮助合约开发的工具们

    Redspot

    Europa

    Elara


其中由于 Pallet-EVM(即 EVM/Solidity 体系的合约)在以太坊生态中已有比较丰富的资料,故不会在本合约书中当做重点讲解。而另外的合约体系如 Pallet-Actor,或 Libra 移植合约平台等皆处于比较早期的研究阶段,因此也不会作为本书的重点。


为了让合约开发者更好的理解 Pallet-Contracts 模块与 Wasm 合约的运行方式,本书也会涉及一些 Wasm 的介绍以及区块链合约模型的介绍。


合约综述


区块链运行合约的模型从本质上可以认为是 “区块链的环境(分布式共识系统)”+“能运行一段逻辑的平台”,例如:


  • 比特币的模型可以拆成区块模型/PoW + 比特币脚本

  • 以太坊的模型可以拆成区块,状态模型/PoW + EVM

  • Substrate 的模型可以拆成区块,状态模型/BFT 共识 + Runtime

因此一般来说,我们可以将区块链的模型拆成:

  • 运行区块链的底层系统:提供分布式可信环境

  • 链的业务逻辑:运行在这个可信环境中


而由于区块链系统的特性,要求对相同的代码,相同的状态,执行的结果一定需要一致,因此在提供“链的业务逻辑”这一层,为了保证执行结果的一致性,要求整个运行环境必须是“无副作用的”,因此不会因为运行节点的不一致(指不是同一个节点)而导致运行的结果不一致。


因此为了保证这种特性,绝大部分区块链都会采用沙盒/虚拟机的模型加上裁剪一些功能来做到。


“运行合约的平台”即是一种链的业务逻辑,且这种业务逻辑特殊在其上面可运行的代码是开放的,合约内容不受链本身控制。因此对于这种情况,更需要一种“沙盒”的环境来隔离各个合约之间的运行。

什么是沙盒(虚拟机)?


“沙盒”在计算机领域中的概念很广泛,而在区块链中,一般而言沙盒都会由一个虚拟机去运行(因为使用虚拟机最容易模拟沙盒的环境)。


因此不同的链就会采用不同的虚拟机来运行合约的沙盒:


  • Ethereum


Gavin Wood 写的黄皮书提出了 EVM 的模型,创建了 EVM 虚拟机的概念并拟定了 EVM 的 OP_CODE。之后设计了 Solidity 编译到 OP_CODE,才有了 Ethereum 的整个生态。相当于 Ethereum 处理区块链的合约沙盒模型,从零到一构建所有设施。因此 Solidity 的语法以及 EVM 能做的事对比现在的区块链显得十分简陋(例如 Solidity 的语法,EVM 的栈深限制等等),但其作为先行者开创了区块链合约虚拟机模型先河。


  • Fabric:


作为联盟链,在使用场景上与公有链存在区别。因此 Fabric 提出链码的概念,并将链码运行在了 Docker 中。Docker 就是比较重的一种虚拟机(相对于 EVM 而言),因此与 EVM 比较,Fabric 的链码可以做到比 Solidity 更多的事,当然相对的,其运行的代价与 EVM 相比就高得多。


  • EOS:


EOS 采用了 Wasm 作为合约的虚拟机,也是当时 EOS 的卖点。相比于运行 Solidity 的 EVM,EOS 的 Wasm 虚拟机的运行效率高了许多,以 C++ 作为编译到 Wasm 的语言也天然拉近了许多传统的开发者。EOS 作为 Wasm 虚拟机的先行者,在当时已经体现出 Wasm 相对于 EVM 的优势,但是由于其合约模型的设计(见下一章节)的缺陷以及当时环境的约束,再加上 EOS 并非真正的去中心化系统,导致 EOS 并没有很好的发挥出 Wasm 合约系统的能力。


  • Substrate 的 Pallet-Contracts:


Pallet-Contracts 采用了 Wasm 虚拟机来运行合约,当前出于安全考量只采用了 Wasmi 解释器来执行 Wasm。但其合约模型与 EVM 的合约模型近似(见下一章节)。Wasm 虚拟机与 EVM 同样具有启动快,随用随丢的特性,具备高性能和高扩展性的同时又不像 Docker, JVM 一样太过庞大。因此 Wasm 慢慢在除了浏览器环境以外的更多场景被采用,例如边缘计算,热更新等等。所以当前越来越多的新区块链在需要一个沙盒环境时会将 Wasm 虚拟机作为主要方案。另一方面 Wasm 也具备从不同语言编译到 Wasm 的特性,例如 Rust,AssemblyScript,C++等等,可以吸引到各类开发者加入到合约开发过程中。


  • 其他


其他区块链为了完成这个“沙盒”的目标也会有各自的方案,有的联盟链采用了裁剪过的 JVM,有的公链采用了 RISC-V 的虚拟机,有的链采用了从零设计一个虚拟机(如 Libra)。这些方案各自有各自的需求与特性,但从模型上而言,无论什么方案,最终目标都是为了提供一个虚拟机环境以运行合约沙盒。

运行合约的沙盒


上文已描述链的业务逻辑大部分会运行于沙盒的系统中,且“运行合约”这种业务逻辑更是需要沙盒隔离。而另一方面 Substrate 的 Runtime 就是一个沙盒环境(运行于 Wasm 中),因此在 Substrate 的合约模块(Pallet-EMV,Pallet-Contracts),就是需要在一个沙盒环境中运行另一个沙盒,如下图所示:

其中:


  • 左边是以太坊模型,表示每运行一个合约,需要在链的平台上启动一个 EVM 虚拟机去运行。

  • 右边是 Substrate 模型,我们当前已知 Substrate 的链的业务逻辑是运行在 Wasm 虚拟机当中的:

  • Pallet-EVM:将以太坊的 EVM 编译到了 Runtime Wasm 当中,因此每运行一个合约实际上与以太坊一致,创建了一个 EVM 虚拟机去运行。如果链是以 Wasm 形态运行,即是在 Wasm 虚拟机中生成了一个 EVM 虚拟机去运行。

  • Pallet-Contracts:Wasm 合约使用 Wasm 虚拟机运行合约,与 Pallet-EVM 不同的地方是,如果链是以 Wasm 形态运行,Wasm 合约的虚拟机是跳出当前 Runtime Wasm 虚拟机重新创建了一个新的 Wasm 虚拟机运行。

  • 当前(在 Substrate 的提交之前 0b0d124 (opens new window))Runtime 的 Wasm 虚拟机推荐采用的是 Wasmtime 而 Pallet-Contracts 合约只能采用 Wasmi。

  • Pallet-Contracts 也可以使用 Wasmtime 执行,但是当前 Parity 认为 Wasmtime 不可控性比较大,因此暂时还未采用 Wasmtime。当前他们有相关计划,也有原型代码来使用 Wasmtime 运行 Pallet-Contracts 的合约。(注 1)

  • 总之运行合约的过程中,大部分链都采用了一种沙盒的模型去运行合约。而对于 EVM,Pallet-Contracts 模型而言,是每运行一个合约就会创建一个虚拟机。

注解

1.Wasmtime 是实现了 JIT 的 Wasm 虚拟机,而 Wasmi 是纯解释器型的 Wasm 虚拟机。

2.Wasmtime 的执行效率比 Wasmi 高很多。

About Patract 


Patract 为波卡 Wasm 合约生态的平行链和 DApp 开发提供解决方案。我们帮助社区平行链设计和开发链上合约模块和 Runtime 支持,并且为 DApp 开发者提供覆盖开发、测试、调试、部署、监控、数据提供和前端开发等阶段的全栈工具和服务支持。

How to join Patract


1.对于合约开发者,可以访问官网 (https://patract.io),熟悉测试链和工具套件。欢迎加入官方开发群:

Elementhttps://app.element.io/#/room/#PatractLabsDev:matrix.org

Discordhttps://discord.gg/wJ8TnTfjcq

搜索“Patract 开放平台”关注 Patract 微信公众号 


2.对于将要集成 Wasm 合约功能的平行链项目方,或者使用 Wasm 合约开发的 DApp 项目方,商务合作欢迎联系 santry@patract.io

 

3.对于用户,欢迎加入:

Telegramhttps://t.me/patract

Twitterhttps://twitter.com/PatractLabs

 

4.对于求职者,我们在招聘区块链开发工程师、前端/全栈开发工程师、开发者运营等岗位,可以联系 sean@patract.io

用户头像

Patract

关注

还未添加个人签名 2021.03.12 加入

Patract的使命是加速智能合约行业向Wasm技术栈的转变。

评论

发布
暂无评论
Substrate 合约书之合约综述