显示包…

1 个不稳定版本

0.30.0 2023年12月26日

36#execution-engine

Download history 121/week @ 2024-04-03 88/week @ 2024-04-10 207/week @ 2024-04-17 144/week @ 2024-04-24 136/week @ 2024-05-01 241/week @ 2024-05-08 194/week @ 2024-05-15 163/week @ 2024-05-22 107/week @ 2024-05-29 143/week @ 2024-06-05 139/week @ 2024-06-12 161/week @ 2024-06-19 157/week @ 2024-06-26 272/week @ 2024-07-03 288/week @ 2024-07-10 232/week @ 2024-07-17

992 每月下载量
8 个包中(通过 gear-sandbox)使用

MIT/Apache

1MB
17K SLoC

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

wasmi- WebAssembly (Wasm) 解释器

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

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

由于与 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 目标编译时,我们强烈建议使用 Binaryenwasm-opt 工具后优化 wasmi,因为我们的实验表明,在 Wasmtime 下执行时,性能提高了 80-100%,并且 Wasm 二进制文件也稍微小一些。

许可证

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

请参阅 LICENSE-APACHELICENSE-MIT 了解详细信息。

贡献

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

依赖关系

~1.5–8.5MB
~71K SLoC