#wasm-interpreter #interpreter #vm #virtualization

无 std gwasmi_core

wasmi WebAssembly 解释器的核心原语

显示此包…

1 个不稳定版本

0.12.0 2023 年 12 月 26 日

#65#wasm-interpreter

Download history 55/week @ 2024-03-13 80/week @ 2024-03-20 58/week @ 2024-03-27 120/week @ 2024-04-03 90/week @ 2024-04-10 212/week @ 2024-04-17 148/week @ 2024-04-24 136/week @ 2024-05-01 239/week @ 2024-05-08 197/week @ 2024-05-15 163/week @ 2024-05-22 110/week @ 2024-05-29 144/week @ 2024-06-05 144/week @ 2024-06-12 165/week @ 2024-06-19 142/week @ 2024-06-26

612 次每月下载
6 个包中使用(通过 gwasmi

MIT/Apache

120KB
2.5K SLoC

持续集成 测试覆盖率 文档 Crates.io
ci codecov docs crates

wasmi- WebAssembly (Wasm) 解释器

wasmi 是一个高效且开销低的 WebAssembly 解释器,支持嵌入式环境,如 WebAssembly 本身。

在 Parity,我们使用 wasmi 作为基于 WebAssembly 的智能合约的执行引擎,在 Substrate 中。此外,我们在此写作时在 Substrate 运行时中运行 wasmi,该运行时本身是一个 WebAssembly 环境,并通过 Wasmtime 驱动。因此,wasmi 的实现需要高度的准确性和对 Wasm 规范的符合性。

由于与 Wasmtime 等其他 Wasm 虚拟机相比,wasmi 相对较轻量,因此它也是一个不错的初始原型设计选项。

独特特性

以下列表说明了 wasmi 的一些独特特性。

  • 专注于简单、正确且确定的 WebAssembly 执行。
  • 可以自身在 WebAssembly 中运行。
  • 低开销且跨平台的 WebAssembly 运行时。
  • 松散地映射 Wasmtime API
  • 可恢复的函数调用。
  • 内置燃料计量支持。
  • 100% 官方 WebAssembly 规范测试套件符合性。

WebAssembly 提案

新的 wasmi 引擎支持各种 WebAssembly 提案,并且在未来还将支持更多。

WebAssembly 提案 状态 评论
mutable-global 自版本 0.14.0
saturating-float-to-int 自版本 0.14.0
sign-extension 自版本 0.14.0
multi-value 自版本 0.14.0
bulk-memory 自版本 0.24.0(#628)
reference-types 自版本 0.24.0 开始。 (#635)
simd 不太可能得到支持。
tail-calls 自版本 0.28.0 开始。 (#683)
extended-const 自版本 0.29.0 开始。 (#707)
WASI 🟡 通过 wasmi_wasi cratewasmi CLI 应用程序提供实验性支持。

使用方法

作为 CLI 应用程序

通过以下方式安装最新的 wasmi CLI 版本:

cargo install wasmi_cli

然后运行任意的 wasm32-unknown-unknown Wasm blob:

wasmi_cli <WASM_FILE> <FUNC_NAME> [<FUNC_ARGS>]*

作为 Rust 库

任何 Rust crate 都可以通过依赖 wasmi crate 来集成 WebAssembly 解释器到他们的堆栈。

参考 wasmi crate 文档以了解如何将 wasmi crate 作为库使用。

开发

构建

从我们的官方仓库克隆 wasmi,然后使用标准的 cargo 程序构建。

git clone https://github.com/paritytech/wasmi.git
cd wasmi
cargo build

测试

为了测试 wasmi,您需要使用以下命令初始化和更新 Git 子模块:

git submodule update --init --recursive

或者,您可以在克隆仓库时使用 --recursive 标志向 git clone 命令提供。

git clone https://github.com/paritytech/wasmi.git --recursive

初始化和更新 Git 子模块后,您可以使用以下命令进行测试:

cargo test --workspace

基准测试

为了基准测试 wasmi,请使用以下命令:

cargo bench

您可以选择要运行哪些基准测试集。

  • cargobench translate

    • 只运行与 WebAssembly 模块转换相关的基准测试。
  • cargobench instantiate

    • 只运行与 WebAssembly 模块实例化相关的基准测试。
  • cargobench execute

    • 只运行与执行 WebAssembly 函数相关的基准测试。

支持的平台

主要支持的平台是 Linux、MacOS、Windows 和 WebAssembly。
其他平台可能也可以工作,但 wasmi 维护者不保证这一点。

要生成 WebAssembly 构建,请使用以下命令:

cargo build --no-default-features --target wasm32-unknown-unknown

生产构建

为了从 wasmi 获取最佳性能,我们强烈建议使用以下 Cargo profile 编译 wasmi crate。

[profile.release]
lto = "fat"
codegen-units = 1

在为 WebAssembly 目标编译时,我们强烈建议使用 Binaryen 的 wasm-opt 工具后优化 wasmi,因为我们的实验显示,在 Wasmtime 下执行时,性能提高了 80-100%,并且 Wasm 二进制文件也略小。

许可

wasmi 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发,任选其一。

请参阅 LICENSE-APACHELICENSE-MIT 以获取详细信息。

贡献

除非您明确说明,否则根据 APACHE 2.0 许可证的定义,您提交给 wasmi 的任何有意贡献,将按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~0.5–7.5MB
~51K SLoC