#wasm-interpreter #interpreter #vm #virtualization

no-std radix-wasmi-arena

为wasmi提供的实体区域数据结构

1个稳定版本

1.0.0 2024年3月19日

167WebAssembly 中排名

Download history 1010/week @ 2024-04-14 1320/week @ 2024-04-21 1351/week @ 2024-04-28 658/week @ 2024-05-05 1380/week @ 2024-05-12 884/week @ 2024-05-19 837/week @ 2024-05-26 690/week @ 2024-06-02 951/week @ 2024-06-09 542/week @ 2024-06-16 765/week @ 2024-06-23 503/week @ 2024-06-30 207/week @ 2024-07-07 511/week @ 2024-07-14 357/week @ 2024-07-21 264/week @ 2024-07-28

1,346 每月下载量
7 个crate中使用(通过 radix-wasmi

MIT/Apache

32KB
715

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 中。此外,我们当时在 Substrate 运行时中运行 wasmi,这是一个 WebAssembly 环境,并通过 Wasmtime 驱动。因此,wasmi 的实现需要高度的准确性和符合 Wasm 规范。

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

独特功能

以下列表说明了 wasmi 的某些独特功能。

  • 主要关注
    • 正确且确定的 WebAssembly 执行。
    • 符合 WebAssembly 规范。
  • 可以自身编译并通过 WebAssembly 执行。
  • 低开销和跨平台的 WebAssembly 运行时。
  • Wasmtime API 稍有相似之处,可作为直接替换方案。
  • 支持可恢复的函数调用。

WebAssembly 提案

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

WebAssembly 提案 状态 评论
可变全局变量
饱和浮点转整数
符号扩展
多值
引用类型 计划中但尚未实现。优先级低。
批量内存 计划中但尚未实现。优先级低。
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 bench 提供的 compile_and_validateinstantiateexecute 标志来过滤基准测试。例如,cargo bench execute 将仅执行测试 WebAssembly 执行性能的基准测试。

许可

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

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

贡献

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

无运行时依赖

特性