显示包…
1 个不稳定版本
0.30.0 | 2023年12月26日 |
---|
36 在 #execution-engine
992 每月下载量
在 8 个包中(通过 gear-sandbox)使用
1MB
17K SLoC
持续集成 | 测试覆盖率 | 文档 | Crates.io |
---|---|---|---|
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 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
的任何有意贡献,将按照上述方式双重许可,不附加任何额外条款或条件。
依赖关系
~1.5–8.5MB
~71K SLoC