4 releases (breaking)
|0.4.0||Jan 31, 2023|
|0.3.0||Jan 16, 2023|
|0.2.0||Jan 4, 2023|
|0.1.0||Oct 13, 2022|
#108 in WebAssembly
21,112 downloads per month
Used in 9 crates (via wasmi)
|Continuous Integration||Test Coverage||Documentation||Crates.io|
wasmi- WebAssembly (Wasm) Interpreter
wasmi is an efficient WebAssembly interpreter with low-overhead and support
for embedded environment such as WebAssembly itself.
At Parity we are using
wasmi in Substrate
as the execution engine for our WebAssembly based smart contracts.
Furthermore we run
wasmi within the Substrate runtime which is a WebAssembly
environment itself and driven via Wasmtime at the time of this writing.
wasmi's implementation requires a high degree of correctness and
Wasm specification conformance.
wasmi is relatively lightweight compared to other Wasm virtual machines
such as Wasmtime it is also a decent option for initial prototyping.
The following list states some of the distinct features of
- Primarily concerned about
- correct and deterministic WebAssembly execution.
- WebAssembly specification compliance.
- Can itself be compiled to and executed via WebAssembly.
- Low-overhead and cross-platform WebAssembly runtime.
- Loosely mirrors the Wasmtime API to act as a drop-in solution.
- Supports resumable function calls.
wasmi engine supports a variety of WebAssembly proposals and will support even more of them in the future.
||❌||Unlikely to be supported.|
||⌛||Support is planned. (#363)|
|WASI||🟡||Experimental support via the
As CLI Application
Install the newest
wasmi CLI version via:
cargo install wasmi_cli
Then run arbitrary
wasm32-unknown-unknown Wasm blobs via:
wasmi_cli <WASM_FILE> <FUNC_NAME> [<FUNC_ARGS>]*
Note: As of version
wasmi_cli application does not yet support WASI out of the box.
As Rust Library
Any Rust crate can depend on the
in order to integrate a WebAssembly intepreter into their stack.
Refer to the
wasmi crate docs to learn how to use the
wasmi crate as library.
wasmi from our official repository and then build using the standard
git clone https://github.com/paritytech/wasmi.git cd wasmi cargo build
In order to test
wasmi you need to initialize and update the Git submodules using:
git submodule update --init --recursive
Alternatively you can provide
--recursive flag to
git clone command while cloning the repository:
git clone https://github.com/paritytech/wasmi.git --recursive
After Git submodules have been initialized and updated you can test using:
cargo test --workspace
In order to benchmark
wasmi use the following command:
You can filter which set of benchmarks to run:
cargo bench translate
- Only runs benchmarks concerned with WebAssembly module translation.
cargo bench instantiate
- Only runs benchmarks concerned with WebAssembly module instantiation.
cargo bench execute
- Only runs benchmarks concerned with executing WebAssembly functions.
Supported platforms are primarily Linux, MacOS, Windows and WebAssembly.
Other platforms might be working but are not guaranteed to be so by the
Use the following command in order to produce a WebAssembly build:
cargo build --no-default-features --target wasm32-unknown-unknown
In order to reap the most performance out of
wasmi we highly recommended
to compile the
wasmi crate using the following Cargo
[profile.release] lto = "fat" codegen-units = 1
When compiling for the WebAssembly target we highly recommend to post-optimize
wasmi using Binaryen's
wasm-opt tool since our experiments displayed a
80-100% performance improvements when executed under Wasmtime and also
slightly smaller Wasm binaries.
wasmi is primarily distributed under the terms of both the MIT
license and the APACHE license (Version 2.0), at your choice.
LICENSE-MIT for details.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in
wasmi by you, as defined in the APACHE 2.0 license, shall be
dual licensed as above, without any additional terms or conditions.
No runtime deps