显示此包…
1 个不稳定版本
0.12.0 | 2023 年 12 月 26 日 |
---|
#65 在 #wasm-interpreter 中
612 次每月下载
在 6 个包中使用(通过 gwasmi)
120KB
2.5K SLoC
持续集成 | 测试覆盖率 | 文档 | Crates.io |
---|---|---|---|
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 crate 或 wasmi 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-APACHE
和 LICENSE-MIT
以获取详细信息。
贡献
除非您明确说明,否则根据 APACHE 2.0 许可证的定义,您提交给 wasmi
的任何有意贡献,将按照上述方式双许可,不附加任何额外条款或条件。
依赖项
~0.5–7.5MB
~51K SLoC