Rust compiles easily to
WebAssembly but creating the glue code necessary to use compiled WebAssembly binaries
wasm-bindgen is a tool that simplifies this process by
This crate uses
knowledge proofs directly within
web browsers and
Functionality exposed by this crate includes:
- Aleo account management objects
- Aleo primitives such as
Transactionsand their associated helper methods
ProgramManagerobject that contains methods for authoring, deploying, and interacting with Aleo programs
More information on these concepts can be found at the Aleo Developer Hub.
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
wasm-pack build --target <target> --out-dir <out-dir> -- --features <crate-features>
pkg (which can
be changed as necessary using the
when run within this crate:
- NodeJS module: Used to build NodeJS applications.
- Single-Threaded browser module: Used to build browser-based web applications.
- Multi-Threaded browser module: Used to build browser-based web applications which use web-worker based multi-threading to achieve significant performance increases.
These 3 modules and how to build them are explained in more detail below.
1. NodeJS Module
This module has the features of the NodeJS environment built-in. It is single-threaded and unfortunately cannot yet be used to generate Aleo program executions or deployments due to current Aleo protocol limitations. It can however still be used to perform Aleo account, record, and program management tasks.
wasm-pack build --release --target nodejs -- --features "serial" --no-default-features
2. Single-Threaded browser module
If used for program execution or deployment, it is suggested to do so on a web-worker as these operations are long-running and will cause a browser window to hang if run in the main thread.
wasm-pack build --release --target web
If you are intending to use this for program execution or deployment, it is recommended to build with maximum or close to maximum memory allocation (which is 4 gigabytes for wasm).
RUSTFLAGS='-C link-arg=--max-memory=4294967296' wasm-pack build --release --target web
3. Multi-Threaded browser module
threading via web-workers (using the approach outlined in the
rayon-wasm-bindgen crate). It is the most complex to use,
but it will run significantly faster when performing Aleo program executions and deployments and should be the choice for
To build with threading enabled, it is necessary to use
nightly Rust and set certain
RUSTFLAGS to enable the
necessary threading features. The
wasm-pack build command is shown below.
# Set rustflags to enable atomics,
# bulk-memory, and mutable-globals.
# Also, set the maximum memory to
# 4294967296 bytes (4GB).
export RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -C link-arg=--max-memory=4294967296'
# Use rustup to run the following commands
# with the nightly version of Rust.
rustup run nightly \
# Use wasm-pack to build the project.
# Specify the 'parallel' feature for
# multi-threading and the 'browser'
# feature to enable program execution
# and include necessary unstable options
# using -Z
wasm-pack build --release --target web --out-dir pkg-parallel \
-- --features "parallel, browser" --no-default-features -Z build-std=panic_abort,std
Run tests in NodeJS
wasm-pack test --node
Run tests in a browser
wasm-pack test --[firefox/chrome/safari]
Building Web Apps
Further documentation and tutorials as to how to use the modules built from this crate to build web apps will be built
in the future. However - in the meantime, the aleo.tools website is a good
example of how to use these modules to build a web app. Its source code can be found in the
Aleo SDK repo in the