1个稳定版本

1.0.0 2024年3月19日

WebAssembly 类别中排名 475

Download history 1008/week @ 2024-04-14 1320/week @ 2024-04-21 1351/week @ 2024-04-28 659/week @ 2024-05-05 1383/week @ 2024-05-12 880/week @ 2024-05-19 834/week @ 2024-05-26 683/week @ 2024-06-02 952/week @ 2024-06-09 537/week @ 2024-06-16 762/week @ 2024-06-23 509/week @ 2024-06-30 196/week @ 2024-07-07 511/week @ 2024-07-14 354/week @ 2024-07-21 266/week @ 2024-07-28

每月下载量 1,334
6 个crate中使用(通过 radix-engine

MIT/Apache

690KB
14K SLoC

radix-wasmi

radix-wasmiwasmi-labs/wasmi 的分支,以下是一些更改:

  • Store 添加了 Clone derive。

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

wasmi - WebAssembly (Wasm) 解释器

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

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

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

独特功能

以下列出了一些 wasmi 的独特功能。

  • 主要关注
    • 正确且确定性的 WebAssembly 执行。
    • 与 WebAssembly 规范的一致性。
  • 可以将其编译为并执行通过 WebAssembly。
  • 低开销和跨平台的 WebAssembly 运行时。
  • 大致反映了 Wasmtime API,作为即插即用解决方案。
  • 支持可恢复的函数调用。

WebAssembly 建议提案

新的 wasmi 引擎支持多种 WebAssembly 建议提案,并将支持更多提案。

WebAssembly 建议提案 状态 评论
mutable-global
saturating-float-to-int
sign-extension
multi-value
reference-types 计划实施,但尚未实施。优先级较低。
bulk-memory 计划实施,但尚未实施。优先级较低。
simd 不支持 wasmi
尾调用 尚未成为Wasm标准的一部分,但 wasmi 中计划提供支持。优先级低。

构建

从我们的官方仓库克隆 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

开发

在将PR推送到我们的仓库之前,我们希望您执行仓库根目录中可找到的 scripts/run-local-ci.sh 脚本。

支持的平台

支持的平台主要是 Linux、MacOS、Windows 和 WebAssembly。

使用以下命令以生成 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,请使用以下命令

cargo bench

注意:可以使用提供给 cargo benchcompile_and_validateinstantiateexecute 标志来筛选基准测试。例如,cargo bench execute 将仅执行测试 WebAssembly 执行性能的基准测试。

许可证

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

有关详细信息,请参阅 LICENSE-APACHELICENSE-MIT

贡献

除非您明确声明,否则您提交给 wasmi 的任何贡献,根据 APACHE 2.0 许可证定义,都应作为上述双许可,没有其他条款或条件。

依赖关系

~1.5MB
~29K SLoC