作者: Mike@Foresight Ventures
TL;DR WebAssembly(简称Wasm)是一种可移植、高性能的二进制指令格式,可以在Web浏览器中运行。它被设计为一种通用的编译目标,可以用于多种编程语言,并且可以在不同的平台上运行。
区块链是一种去中心化的分布式账本技术,它通过使用密码学和共识算法来确保数据的安全性和可信度。区块链可以用于记录交易、存储数据和执行智能合约等应用。
Wasm和区块链之间存在一些关系和应用场景:
智能合约: Wasm可以作为智能合约的执行环境,使得合约可以在不同的区块链平台上运行。Wasm的高性能和可移植性使得智能合约可以更加高效地执行,并且可以跨平台使用。
跨链交互: Wasm可以用于实现跨链交互的功能。通过将不同区块链的逻辑编译为Wasm代码,可以在不同的区块链上执行相同的逻辑,实现跨链的数据传输和交互。
链下计算: Wasm可以用于在区块链之外进行计算,并将计算结果提交到区块链上。这样可以在保持数据的安全性和可信度的同时,提高计算的效率和灵活性。
数据隐私: Wasm可以用于实现区块链上的数据隐私保护。通过将敏感数据的处理逻辑编译为Wasm代码,并在区块链上执行,可以保护数据的隐私性,同时确保计算的可验证性。
总之,Wasm和区块链可以相互结合,提供更加高效、安全和灵活的区块链应用和服务。Wasm的可移植性和高性能使得它成为区块链领域的重要技术之一。
一、什么是Web Assembly WebAssembly是由W3C(万维网联盟)开发的一个高效轻量级指令集标准,被誉为网络和高性能的颠覆者,支持跨浏览器执行。这意味着我们可以把包括C/C++, Go, Rust等在内的不同编程语言编译成统一的标准二进制格式,并将其作为JavaScript的替代品以近乎原生代码的效率在浏览器中运行。
WebAssembly,或者简称为WASM,是内存安全、平台独立的,可以完美高效地映射到所有类型的CPU架构上,有着以下主要优势:
高效:WASM 有一套完整的语言特性,实际上 WASM 是体积小且加载快的二进制格式, 其目标就是充分发挥硬件的能力以达到原生语言的执行效率。
安全:WASM 运行在一个内存安全,沙箱化的执行环境中,甚至可以在现有的 JavaScript 虚拟机中实现。在 Web 环境中 ,WASM 将会严格遵守同源策略以及浏览器安全策略。WASM在编译的时候,interface是比较少的,但大部分wasm application是不能联网的(因为不支持socket),现在只能支持local database。很多安全问题的时候来源于执行时候的内存的访问,wasm在编译的时候,可以避免非法的内存访问。
兼容性:WASM 在 Web 中被设计成无版本、特性可测试、向后兼容的。WASM 可以被 JavaScript 调用,进入 JavaScript 上下文,也可以像 Web API 一样调用浏览器的功能。WASM 不仅可以运行在浏览器上,也可以运行在非 Web 环境下(如 Node.js、Deno、物联网设备等执行)。传统的方式可能需要多次compile,而WASM只需一次便可运行,即插即用。
此外:Web 是唯一真正的通用平台,可以在任何设备上访问你的应用程序。这还允许你维护单个代码库,简化更新并确保所有用户都可以访问你的应用程序。WASM支持 64 位和 32 位整数操作,与 CPU 指令一一对应。通过移除浮点运算,可轻松实现确定性,这对共识算法来说是必要的。由 LLVM编译器基础架构项目提供支持,这意味着 Wasm 可以从 LLVM 十多年的编译器优化中获益。WASM由谷歌、苹果、微软、Mozilla 和 Facebook 等大公司持续开发,在这几个大公司开发的浏览器的后端都支持wasm编译。
WASM 的美妙之处在于它就像一个魔法引擎,它可以在任何地方运行,不需要下载也不需要安装,因为是二进制格式。只需一次点击,即可在需要时立即运行 Web 应用。它比直接在下载和运行二进制文件更安全,因为浏览器已内建安全机制,使其中运行的代码不会危害你的系统。而且分享 Web 应用同样简单 - 链接是可以放在任何地方的可点击字符串。
二、为什么我们需要Web Assembly 2.1 Web2 由于浏览器内置的功能和 Web 提供的交互性,Web从超文本静态内容和小型脚本语言发展成了一个非常强大和流行的平台,充满了惊人的应用程序和功能。但到目前为止,Web应用依旧基本上由相同的脚本语言(JavaScript)驱动,然而JavaScript设计的首要目标从来就不是为了实现这些。
JavaScript 最初是一种简单的脚本语言,旨在为充满轻量级超文本文档的 Web 应用带来一些交互性。它的设计易于学习和编写,并不追求运行速度。多年来,浏览器在 JavaScript 解析上的重大性能改进的,带来了显著的性能提升。
随着 JavaScript 运行速度的加快,能浏览器中执行的东西大大扩展。新的 API 带来了诸如交互式图形,视频流,离线浏览以及更多的功能。同时越来越多的应用程序(过去仅限本地应用程序)开始进入 Web 。现在你可以轻易的在浏览器中编辑文档并发送电子邮件,但在有些领域中,JavaScript 的性能依旧是一个难题。想一想除了浏览器之外你所使用软件:游戏,视频编辑,3D渲染或音乐制作。这些应用程序需要执行大量计算,并且需要很高的性能。JavaScript 很难满足这种高性能的要求。
不过替换掉 JavaScript 不太现实,甚至可能要花几十年时间都搞不定,因为整个互联网都离不开它。而且,还有一大帮人在不停地改进 JavaScript。确实,和其他语言比起来,JavaScript 在某些方面比如 null 和 == 这些地方是有点不够好,但这些问题还不至于让人把整个技术都换掉。
所以,WebAssembly 不会取代 JavaScript,但这并不意味着将来没人用 WASM。实际上,WASM 的使用还会越来越广泛。因为 WASM 能给网页带来强大的计算能力,比如做图像处理或者游戏之类的。用 WASM,可以做出一个网页版的 Photoshop并运行得很好,或者是一个在浏览器里能以 60 帧每秒甚至更高帧率运行的 3D 游戏。游戏尤其具有挑战性,因为游戏不仅需要同时执行音频和视频处理,还需要协调物理特效和AI。WASM拥有在浏览器上高效的运行游戏的能力,将打开把许多其他应用程序带到浏览器上的大门的可能性。
上图展示了javascript和wasm工作流的对比,可以看出wasm相比JavaScript要简洁许多。
2.2 Web3 WASM VM
在2018年的时候,以太坊生态内部开始讨论用WASM VM做智能合约虚拟机,因为觉得它性能比EVM好。EVM的发明者Gavin Wood曾表示过WASM取代EVM的可行性,Vitalik也表示过以太坊2.0将会升级为Wasm合约(eWASM),以满足更多开发需求。而如今,Wasm合约的发展已经有了一定雏形。
2.3 EVM是如何设计的?为什么它是低效的? 架构尺寸过大
传统计算机包含的指令集只接受32位或者64位的输入。EVM与此不同并且很特殊,它是一台256位的计算机,故意设计成这样是为了更易于处理以太坊的哈希算法,它会明确产生256位的输出。
然而,实际运行EVM程序的计算机则需要把256位的字拆分成它们的本地架构来执行智能合约,从而使得整个系统变得非常低效和不实用。
另外,如果你想在以太坊上用它的基本OPCODES实现一个类似于SHA256的复杂算法,那你就自祈多福吧!为了解决通过指令集运行复杂程序产生的高额gas问题,以太坊引入了预编译的概念,把程序编译进EVM并且消耗固定的gas。一个值得关注的预编译是以太坊哈希算法,因为如果在虚拟机中实现该算法,合约在调用时将会产生极其昂贵的费用。
臃肿的预编译
预编译带来的问题是它会不断增加虚拟机的臃肿度和复杂度,而不能解决核心问题:当前指令集和规范的低效而粗劣的设计。
如果我们能够定义一种新的规范和指令集,不需要预编译这些复杂程序,而只需要通过基本指令就可以高效实现呢?这时候WASM就派上用场了。
2.4 EVM 与 WASM VM的比较 速度: WASM 旨在提供比 EVM 更快的执行速度。EVM 在处理编译和执行智能合约时可能存在效率问题,而 WASM 通过直接转换为编译后的代码来提高加载速度和处理能力。
预编译: EVM 依赖于预编译合约来高效执行加密计算,但这可能导致硬分叉的风险。WASM 则消除了对预编译合约的依赖,允许开发人员创建高效、快速的智能合约。
交易费用: 更快的Wasm虚拟机,致使交易吞吐量大幅提升,那么合约部署和交易成本也能大幅降低。可以说Wasm合约很好的解决了现在以太坊上交易费用高和交易拥堵的问题。
灵活性和互操作性: Wasm扩展了智能合同开发者可用的语言系列,支持使用任何Wasm的高级语言(如Rust、C++、JavaScript等)开发编写复杂业务逻辑,这意味着你可以用你熟悉的任何语言编写智能合约,包括最成熟的基于Rust的ink!,或基于AssemblyScript的Ask!等。
EWASM团队正在在以太坊上集成WebAssembly,从而保证以太坊的执行层更加高效、简单,适合作为完全的去中心化计算平台。WASM已经被许多其他项目接纳为标准,包括Dfinity和EOS都使用它来强化它们的执行层。
2.5 Stylus(Arbitrum) Stylus项目是以太坊二层网络Arbitrum上通过引入WebAssembly(WASM)虚拟机来提高智能合约的执行性能。合约可以以比Solidity更快的速度执行,同时减少了燃气成本。这使得在Arbitrum网络上构建高性能的智能合约变得更加容易,目前支持C,C++和Rust的编译。
自定义预编译支持: Stylus还支持自定义预编译(precompiles),这允许开发者将自己的Rust或C++预编译部署到Arbitrum网络上。这可以帮助在链上引入新的加密算法或其他特定功能,而无需等待链上升级。比如说可以把tensor computation预编译,降低inference成本,对链上机器学习可能有帮助。
与EVM的互操作性: Stylus通过与以太坊虚拟机(EVM)的互操作性来实现与现有以太坊生态系统的集成。这意味着Stylus合约可以与现有的EVM合约互操作,并与EVM共享相同的全局状态。
重入功能(Reentrancy): 与Cosmos wasm不同,Stylus Rust SDK引入了重入功能,并允许开发者手动启用它。这使得合约可以更加灵活地进行互操作,但需要开发者谨慎管理状态以确保安全性。
基于arbitrum生态的火爆,stylus可能是最有意义的一次wasm集成,同时也利好arbitrum在zkrollup中的竞争力。
2.6 Gear(Polkadot) Gear 协议正在创建一种可作为 Polkadot parachain 部署的技术,它将成为托管智能合约的工具。与 Polkadot 一样,Gear 也使用 Substrate 框架。这简化了为特定应用创建不同区块链的过程。Substrate 提供了开箱即用的广泛功能,让人们可以专注于在协议之上创建自定义引擎。
以前,启动区块链的成本很高,但Gear可以让dApp开发者专注于自己的项目,而不是从头开始构建和运营整个区块链。
Gear 协议的主要引擎是智能合约模块。在 Gear 的情况下,任何智能合约都是用不同语言(如 Rust、C、C++ 等)编译的 WebAssembly 程序。对于来自加密世界之外的开发者来说,它的入门门槛很低,因为他们可以在熟悉的环境中构建智能合约。开发者更容易尝试智能合约编程语言。
Gear 的智能合约架构在引擎盖下使用演员模型,并提供以下功能:
每个程序都有固定数量的内存,Gear 允许对其进行控制。程序只能在自己的内存中读写,不能访问其他程序的内存空间。每个程序都有独立的内存空间,可以并行处理 Gear 节点上的信息。
2.7 CosmWasm(Cosmos) CosmWasm 是一个现代的、功能强大的基于 Wasm 的智能合约平台,它可以轻松地插入 Cosmos-SDK。这展现了 CosmWasm 的主要优势之一:用 CosmWasm 编写的合约与 IBC(区块链间通信)原生紧密结合,让开发者和用户可以进入多链未来,目前仅支持Rust。
CosmWasm的优势
安全性: 使用Rust语言提高智能合约的安全性。
跨链兼容性: Cosmos生态中的IBC(Inter-Blockchain Communication)协议支持。
性能: 与传统EVM(以太坊虚拟机)相比,CosmWasm在一些案例中展示了更高的效率和较低的交易费用。
开发者友好: Rust语言的类型安全和内存安全特性可降低智能合约中的某些类型的错误。
挑战和限制
学习曲线: Rust相较于Solidity等更常用的智能合约语言,对于初学者来说学习曲线可能更陡峭。CosmWASM需要支持更多语言编译来获得大规模采用的可能性。
生态系统和工具支持: 虽然在成长中,但与成熟的智能合约平台(如Ethereum)相比,CosmWasm的开发工具和生态圈可能仍较为有限。
市场占有率和知名度: 在智能合约平台中,CosmWasm相对于Ethereum、Binance Smart Chain等可能知名度不高,影响了它吸引开发者和用户的能力。
维护和升级的挑战: 尽管CosmWasm提供合约升级功能,但智能合约的维护和升级管理仍是一个复杂任务,需要小心处理以避免安全漏洞。
兼容性问题: 对于那些习惯于EVM或其他智能合约环境的项目来说,迁移到CosmWasm可能会面临兼容性挑战。
2.8 ZK-WASM 除了wasm虚拟机之外,还有最近一项新兴的技术ZKWASM,发明者Delphinus Labs已经在github上开源了ZK-WASM的代码。ZKWASM 使开发者无需重新执行便能验证已执行计算的正确性。通过利用 ZKWASM,开发者可以灵活地使用各种编程语言构建 ZKP 应用程序。这些应用程序可以无缝地在 Web 浏览器中执行。
ZKWASM的概念来源于ZKSNARK,它是SNARG和零知识证明的混合体。咱们来解释一下,通常情况下,要用ZKSNARK,你需要用一种算术电路语言或者电路友好型语言,比如Pinocchio、TinyRAM、Buffet/Pequin、Geppetto、xJsnark框架、ZoKrates等,写个程序。这在某种程度上对已有的程序构成了一种障碍,让它们难以发挥ZKSNARK的威力。但还有另一种方式,不是在源代码级别上用ZKSNARK,而是在虚拟机的字节码级别上使用它,然后实现一个支持ZKSNARK的虚拟机。Delphinus Labs采用了后者的方式,把整个WASM虚拟机都写入了ZKSNARK电路中,这样一来,现有的WASM应用程序就能直接在ZKWASM上运行,无需做任何修改。因此,云服务提供商可以向任何用户证明计算结果是按诚实计算的,不会泄露任何私人信息。
ZKWASM 提供了各种用例,比如可以让浏览器内的一些操作的ZK证明上链。做到网页操作区块链可验证。再比如预言机、链下计算、自动化、连接 Web2 和 Web3,以及为机器学习和数据处理生成证明,乃至游戏及社交应用。随着采用率的提高,zkWASM 将扩展 Web3 的可能性,并将 Web2 开发者纳入这个变革性的格局。
通过 Delphinus Lab 的 ZKWASM 实现,开发者可以利用零知识证明的力量来增强其应用程序的安全性和隐私性,为更值得信赖和去中心化的数字格局铺平道路。
三、结论 Web的性能和智能合约平台执行层的未来一片光明。不仅dApp会具有更高的性能,集成WASM也可以让那些熟悉Rust和Go之类的主流语言的鲁棒性的人更容易进行智能合约的开发,而不是需要学习solidity或者其他区块链开发语言的各种细节才能在以太坊上开发有用的应用程序。根据埃文斯数据公司(Evans Data Corporation)的数据,全球有近 2700 万开发人员。这一数字正在稳步增长--去年增长了约 3%,预计到 2024 年将超过 2870 万。而在区块链上的开发人员而不超过3万名,占开发者总人数的大约千分之一左右,虽然这个数字一直在稳步提升,但学习新的智能合约语言可能依然是开发者们进入区块链的门槛。
但越来越多的区块链开始支持Web Assembly作为编译后智能合约的字节码。WASM带给区块链的不仅仅是高效,互操性和广泛的应用场景,更是解放开发者的钥匙,将开发者进入区块链的准入门槛变低。区块链的想象一下,在不久的未来,当Web2开发者想尝试做区块链开发的时候,可以用他们熟悉的Python,C++,Javascript在区块链上开发大型应用,最大限度地释放区块链去中心化网络的价值,先降低创建者(开发者)的门槛,再降低用户的门槛,迈向Mass Adoption。
四、索引 https://blog.scottlogic.com/2022/06/20/state-of-wasm-2022.html
https://www.notion.so/18f67cee15c147dfae68b06269a455c0?pvs=21
https://wiki.polkadot.network/docs/learn-wasm
https://docs.arbitrum.io/stylus/stylus-gentle-introduction
https://medium.com/@gear_techs/introducing-gear-easy-to-use-polkadot-parachain-9ccd05437a9c
https://medium.com/cosmwasm/cosmwasm-for-ctos-f1ffa19cccb8
https://www.cncf.io/wp-content/uploads/2023/09/The-State-of-WebAssembly-2023.pdf
https://github.com/DelphinusLab/zkWasm