#wasm-interpreter #interpreter #wasm-bytecode #bytecode #virtual-memory

无std casper-wasmi-core

wasmi WebAssembly解释器的核心抽象和原语

1个不稳定版本

0.2.1 2023年10月18日

#1335WebAssembly

Download history 203/week @ 2024-03-14 159/week @ 2024-03-21 153/week @ 2024-03-28 251/week @ 2024-04-04 129/week @ 2024-04-11 163/week @ 2024-04-18 208/week @ 2024-04-25 180/week @ 2024-05-02 356/week @ 2024-05-09 283/week @ 2024-05-16 294/week @ 2024-05-23 236/week @ 2024-05-30 281/week @ 2024-06-06 209/week @ 2024-06-13 285/week @ 2024-06-20 357/week @ 2024-06-27

1,195 每月下载量
10 个crate中使用(通过 casper-wasmi

MIT/Apache

93KB
2K SLoC

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

casper-wasmi- WebAssembly (Wasm) 解释器

wasmi最初是作为parity-ethereum(在wasm中的类似以太坊的合约)和substrate的一个组件构思的。这些项目与区块链相关,需要高度的正确性。项目并不试图参与任何正在进行中的Wasm提议的实现。相反,项目试图尽可能接近规范,因此避免实现规范不支持的功能。

综上所述,wasmi应该是一个良好的初始原型设计选项,并且在将来从wasmi迁移到另一个规范兼容的执行引擎时不应有问题。

casper-wasmi crate是包含额外修复和安全加固的wasmi项目的分支。

独特功能

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

  • 主要关注
    • 正确且确定的WebAssembly执行。
    • WebAssembly规范兼容性。
  • 本身可以编译为WebAssembly。
  • 低开销和跨平台的WebAssembly运行时。
  • 新的实验性v1引擎允许作为Wasmtime的即插即用解决方案。

Wasm提议

新的wasmi_v1引擎支持多种WebAssembly提议,并将在未来支持更多。

Wasm提议 状态 评论
mutable-global
saturating-float-to-int
sign-extension
multi-value
reference-types 没有计划支持wasmi
bulk-memory 计划中,但尚未实现。优先级低。
simd 没有计划支持wasmi
tail-calls 尚未成为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

工作区

如果您想使用所有功能测试整个 wasmi 工作区,我们推荐这样做:

cargo test --all-features --workspace

此测试使用所有可用功能测试了 wasmi 引擎。

注意

建议使用 --release 进行测试,因为与优化编译和测试相比,不进行优化的编译和测试通常要慢得多。

平台

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

使用以下命令生成 WebAssembly 构建:

cargo build --no-default-features --target wasm32-unknown-unknown

功能

虚拟内存

在 64 位平台上,我们进一步提供跨平台的虚拟内存使用支持。对于此构建,使用 wasmi

cargo build --features virtual_memory

新引擎

我们目前正在构建一个实验性的新 wasmi 引擎,它反映了 Wasmtime API,与旧 wasmi 引擎相比,性能更好,开销更低。

您可以通过使用 wasmi_v1 工作区包来启用并开始使用它

cargo build --package wasmi_v1

注意

  • 新的 v1 实现是实验性的,因此不建议用于生产环境。

  • 请确保使用以下 Cargo 配置文件,以使用 v1 引擎获得最大性能

    [profile.release]
    lto = "fat"
    codegen-units = 1
    

基准测试

要基准测试 wasmi,请使用以下命令:

cargo bench

注意:基准测试可以通过传递给 cargo benchcompile_and_validateinstantiateexecute 标志进行筛选。例如,cargo bench execute 将仅执行测试 WebAssembly 执行性能的基准测试。

许可证

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

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

贡献

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

依赖关系

~1–8.5MB
~64K SLoC