paint-brush
区块链❤️的 WASM:章节决策经过@glaze
1,445 讀數
1,445 讀數

区块链❤️的 WASM:章节决策

经过 Glaze8m2023/11/06
Read on Terminal Reader

太長; 讀書

Arbitrum 最近推出了 Stylus,它是基于 WebAssembly (WASM) 的智能合约虚拟机。这带来了多种好处,例如扩展的语言支持、更低的成本、可定制的预编译器以及与 EVM 的互操作性。 WASM 因其性能、紧凑的尺寸、可移植性和语言支持而越来越受欢迎。 Polkadot 和 Cosmos 等其他链也使用它。 然而,Stylus 目前存在一些局限性。它仅支持 C++ 和 Rust,缺乏 JavaScript/Python 支持。 SDK 仍处于新生阶段。目前还没有本地测试网或合约验证。 选择正确的语言至关重要 - JavaScript/Python eDSL 可以吸引更多开发人员。性能基准显示 WASM 比 EVM 快 4-8 倍。但合约大小有 128KB 限制。 EVM-WASM 互操作性相当全面。自定义预编译尚未实现。重入是可选的,但默认情况下禁用。 总体而言,WASM 相对于 zk-rollups 为 Arbitrum 提供了性能提升。但 EVM 仍然是基础,WASM 目前作为“EVM+”的补充。
featured image - 区块链❤️的 WASM:章节决策
Glaze HackerNoon profile picture
0-item

Arbitrum 最近的更新以 Stylus VM 升级为特色,并拥有多项增强功能:


  • 扩展的语言支持
  • 降低成本和内存使用
  • 可定制的预编译器
  • 评估板兼容性


这些改进源于集成 WASM,WASM 以其在云原生环境中的众多优势而闻名。有关 WASM 角色的更多详细信息将在后续章节中介绍。

先锋

Arbitrum 已将 WASM 引入其链中,但这并不是第一个这样做的平台。 Polkadot 之前允许创建 WASM 智能合约。它为此提供了两种语言:一种类似于嵌入式 DSL 的汇编脚本和一种受 Rust 启发的语言,称为 ink!


同样,Cosmos 利用 CosmWasm 来执行智能合约。开发人员可以在这里使用 Rust 编写智能合约。


在探讨区块链与 WASM 的亲和力之前,我们先回顾一下 Cosmos 和 Polkadot 选择 WASM 的理由。


Cosmos 宣扬 WASM 具有以下优势:

  • Rust 库兼容性
  • 广泛的开发者社区
  • 增强的安全性,包括防止重入攻击
  • 简化的测试程序
  • 出众的表演


Polkadot 的 WASM 运行时展示了以下功能:

  • 卓越的性能
  • EVM 互操作性
  • 硬件和软件平台独立性
  • 尺寸紧凑
  • 支持 Rust 和汇编脚本,类似于 Typescript


Polkadot、Cosmos 和 Arbitrum 共享 WASM 带来的一些好处。然而,Arbitrum 有独特的产品以及 Cosmos 的具体细节,我们将在稍后讨论。

WASM

让我们深入研究一下 WASM 是什么及其背后的动机。

什么是 WASM?

WebAssembly (WASM) 是一种二进制指令格式。它使代码能够以与本机应用程序相当的速度执行,特别是在 Web 浏览器中。作为 C 和 Rust 等语言的编译目标,它针对速度、效率和安全性进行了优化。 WASM 显着提高了 Web 性能并扩展了 Web 功能。


WASM 与 Web 紧密相连,因为它在浏览器等 JavaScript 环境中运行。在这些环境中,开发人员可以完全访问 WASM API 以及完整的 Web API 支持。该控件允许开发人员微调 Web 交互。

WASM 的演变

WASM 的概念围绕着一次编写代码即可在任何地方运行的理想。


2016 年,程序经常通过领域特定语言 (DSL) 引入新功能。创建 DSL 需要平衡维护、效率和安全性。业界寻求一种在不影响这些方面的情况下跨众多服务器部署功能的方法。


我们仔细研究了各种解决方案,每个解决方案都有自己的挑战:

  • 系统虚拟机面临着开销、缺乏安全性代码可见性的困扰,而且对于高性能而言过于抽象。
  • 容器还缺乏代码可见性,而且同样抽象,开销很大。
  • 语言级虚拟机需要频繁修改以确保安全,会产生 V8 等嵌入式虚拟机的开销,并且采用新语言来适应安全模型的速度很慢。
  • 指令集架构 (ISA)很难修改以实现高效的沙箱,并且缺乏成熟的实现。


WASM 作为一种解决方案应运而生。 WASM 编译器的开发开始了,到 2018 年,跨各种架构和设备的通用代码兼容性的概念得到了扩展。与 Java 不同,其目标不是在安全性上妥协。


2019年引入组件模型,提升了WASM模块的跨语言互操作性。例如,这项创新使得能够创建适用于不同语言的通用 HTTP 库,以创新方式解决复杂问题。

今日 WASM

WASM 拥有一系列令人印象深刻的功能:


  • 高性能:WASM 代码运行高效、快速。
  • 紧凑的尺寸:WASM 的二进制格式确保了较小的占用空间。
  • 可移植性:它允许相同的字节码在任何 WASM 兼容的运行时上运行。
  • 语言支持:WASM 支持多种语言,从 C/C++ 和 Rust 到 Go 和 Swift 等。
  • JavaScript 引擎兼容性:WASM 在 JS 引擎中无缝工作。
  • 沙箱:强大的默认沙箱限制内存和 CPU 访问,以防止外部干扰。
  • 快速启动:WASM 模块通常在几毫秒内启动。


WASM 社区正在积极增强跨不同编程语言的集成和性能。

手写笔

探索 WASM 的潜力及其在区块链中的使用让我们回到了 Arbitrum Stylus 的局限性。

手写笔的功能

以下是 Stylus 操作方式的简化分解:


  1. 开发人员使用标准 WASM 编译器(例如 Clang 或 Rustc)将智能合约编译为 WASM。
  2. 然后,生成的 WASM 字节码以压缩状态上传到 Arbitrum 链。
  3. 通过ArbWasm预编译的compileProgram方法,字节码经过安全性、gas 计量的检测,并编译成针对验证器硬件定制的本机代码。此步骤对于增强性能和安全性至关重要。
  4. 调用时,合约在 WASM 运行时运行,例如 Wasmer,它比 EVM 速度更快、更节省 Gas 效率。


看似额外的第三步实际上至关重要。将 WASM 代码转换为本机机器代码可加快执行速度。此外,这个添加的编译阶段有助于防止“编译炸弹”。


“编译炸弹”是一种恶意代码,旨在在编译期间耗尽系统资源,从而可能导致编译器崩溃或停止运行。这是一种拒绝服务攻击,旨在阻碍软件开发过程。

关于手写笔的担忧

语言支持

Stylus 扩大了 Arbitrum 的开发者社区,将 C++ 和 Rust 纳入其中。然而,它尚未涵盖当今最流行的开发者社区。它有助于在浏览器中执行智能合约,但尚不支持 JavaScript 和 Python。


编程语言用户


有些项目处于早期阶段,试图将 Python 和 JavaScript 桥接到 WASM。但是,由于垃圾收集和性能问题的复杂性,这些还没有准备好广泛采用。

语言兼容性

Stylus 目前通过其 SDK 支持 C/C++ 和 Rust。这些 SDK 与各自语言的工具兼容。它们还允许集成第三方库,例如本机密码学。主要限制是与这些库相关的天然气成本。


Rust SDK 正处于初级阶段,缺乏一些功能。 C SDK 不支持使用 ABI 导出函数。此外,这两个 SDK 都不支持使用修饰符。


截至目前,Stylus 还没有本地测试环境。鼓励开发人员在 SDK 内进行测试。测试网是在 Stylus 上运行智能合约的唯一选择。不过,测试网尚未实现智能合约验证。


目前正在开展将各种 ERC 代币和平台(例如Uniswap V2 )移植到 Stylus 的工作。

语言选择

在特定领域语言 (DSL)、嵌入式 DSL (eDSL) 或通用编程语言之间进行选择具有挑战性。开发人员必须权衡“接近金属”进行控制的好处与更高级别抽象提供的易用性,这可能会限制灵活性。


创建新的 DSL 需要时间来开发其工具链和生态系统。 eDSL 作为通用编程语言的子集,保持相同的语义和语法。它允许开发人员使用现有的语言和工具,这可以简化学习过程。 eDSL 还提供与通用代码更好的互操作性。例如,适用于 JavaScript 或 Python 的 eDSL 对于吸引最大的开发者社区具有战略意义。


一般的编程语言都需要使用SDK来进行开发。这增加了工具的层次,增加了冗长,并降低了表达能力。它还可能导致冗长的 API 调用和复杂的对象操作。


选择正确的语言并制作 eDSL 可能是一个理想的折衷方案。它可以吸引来自流行社区的开发人员并提供用户友好的工具。目前的数据显示,以太坊社区仍然是加密货币开发商中最大的。然而,像 Polkadot、Cosmos 和 Solana 这样使用 Rust 进行智能合约的生态系统也吸引了大量开发者,并且正在经历快速增长。 全职开发人员



开发者总数


表现

WASM 有潜力显着提高执行速度并减少包大小。尽管 Stylus 尚未部署到主网,但其他网络的基准测试可以作为有用的参考。


这些基准测试表明,执行时间可以减少 4 到 8 倍,编译大小可能减半。

WASM 执行时间


WASM 合约大小


Stylus 对合约大小有限制,未压缩时约为 128KB。这种限制使得将非常大的智能合约从 Solidity 等语言迁移到 Stylus 具有挑战性。这种限制在 Stylus 代码库中很明显:


 // arbos/programs/programs.go const MaxWasmSize = 128 * 1024 // Maximum WASM size allowed const initialFreePages = 2 // Number of initial free pages const initialPageGas = 1000 // Gas cost for an initial page const initialPageRamp = 620674314 // Adjusts for a target size cost const initialPageLimit = 128 // Maximum number of pages allowed const initialInkPrice = 10000 // Ink price per EVM gas const initialCallScalar = 8 // Scalar for call cost


值得注意的是,WASM 在启动和关闭时会产生一些开销。对于非常轻量级的操作,EVM 可能比 WASM 更具成本效益。

EVM-WASM 互操作性

EVM 和 WASM 使用相同的存储槽和状态树。 Stylus 通过在 WASM 中实现 EVM API 来实现与 EVM 的互操作性。这种集成利用了 WASM 中广泛采用的主机 I/O 模式。下面是 WASM 支持的 EVM API 的完整列表,表明了全面的互操作性支持。


 read_args write_result storage_load_bytes32 storage_store_bytes32 call_contract delegate_call_contract static_call_contract do_call create1 create2 do_create read_return_data return_data_size emit_log account_balance account_codehash evm_gas_left evm_ink_left block_basefee block_coinbase block_gas_limit block_number block_timestamp chainid contract_address msg_reentrant msg_sender msg_value native_keccak256 tx_gas_price tx_ink_price tx_prigin memoery_grow console_log_text console_log console_tee

自定义预编译

自定义预编译是一个创新概念。他们有潜力以降低的执行成本在链上集成先进的加密原语。例如,可以预编译张量计算以降低链上机器学习的成本。但是,当前代码库中没有证据表明自定义预编译功能。虽然 EVM 存在预编译,但它们并非设计为可交换的。


这些功能很可能仍在开发中,利用 WASM 的功能。这将使 EVM 能够调用 WASM 编写的函数,然后将其编译为机器代码。

可重入性

与不支持重入的 CosmWasm Actor 模型相比,Stylus 的 Rust SDK 将重入作为可选功能。默认情况下,此功能处于关闭状态。开发人员可以选择在其合约中启用可重入。


激活重入会影响 API,因为开发人员必须确保在调用期间清除存储缓存并考虑其他安全措施。此预防措施对于防止与可重入调用相关的潜在漏洞至关重要。


可重入性

结论

WASM 在云原生领域越来越受欢迎,许多区块链采用它来执行智能合约。尽管 Arbitrum 不是这种集成的先驱,但其实施可能会产生巨大影响。 WASM 并不适合彻底改变区块链格局或取代 EVM。然而,它可以增强 Arbitrum 对抗新兴 zk-rollups 的优势。 Arbitrum 的术语“EVM+”恰当地描述了这种情况。 EVM 为智能合约平台奠定了基础,而 WASM 可以为 Arbitrum 提供额外的性能提升。