# snarkVM, a Rust zkVM split across a dozen crates

> snarkVM is the Rust zero knowledge virtual machine behind the Aleo blockchain, published as a family of crates rather than one application. The architecture is clean, the published meta package is unusually thin, and the build guide is three commands long.

**aleo-labs-protocol/snarkVM** — A zkVM for Decentralized Private Computations (DPC)

- Repository: https://github.com/aleo-labs-protocol/snarkVM
- Website: https://snarkvm.org
- Stars: 1,164 · Forks: 1,567
- Language: Rust
- License: Apache-2.0
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/aleo-labs-protocol-snarkvm

## A virtual machine meant to be linked, not run

snarkVM is described as a zkVM for decentralized private computations, and the README is explicit about how it is meant to be consumed: it is primarily designed to be used as a library in Rust projects. That is the whole pitch. There is no node to start, no wallet to import, and no client to point at a network. What you get instead is a set of crates that a Rust program links against in order to reason about programs, prove their execution, and keep the state of a blockchain. The intended audience is therefore a compiler or application team that already lives in Rust and already has a design for zero knowledge execution, not an operator who wants a working system this weekend. The Cargo.toml description is blunter still, calling the package a decentralized virtual machine, and the crate categories list compilers, cryptography, mathematics, wasm and web programming.

## Eleven crates, each with a narrow job

The README's crate table is the most useful thing the project publishes, because it maps the whole system onto named pieces. The snarkvm meta package contains all other crates, snarkvm-circuit holds the arithmetic circuits, snarkvm-console holds the console layer, snarkvm-curves and snarkvm-fields carry the cryptographic curves and arithmetic fields, snarkvm-ledger is the ledger implementation for the Aleo blockchain, snarkvm-synthesizer is the program synthesizer, snarkvm-parameters is separate, and snarkvm-wasm provides WASM bindings. Every row is marked as supporting both std and wasm builds. The top level directory listing backs this up with algorithms/, circuit/, console/, curves/, fields/, ledger/, parameters/, synthesizer/, utilities/, vm/ and wasm/, so the workspace members in Cargo.toml are not a marketing list. The ledger subtree is the largest piece, with authority, block, committee, narwhal, puzzle and epoch subdirectories, which is a sign of how much of the work is consensus side rather than proving side.

## The published meta package is smaller than the workspace

One line in the root Cargo.toml deserves attention before anyone writes a dependency. The include array is set to Cargo.toml, vm, README.md and LICENSE.md. So the crate that the README calls a meta package containing all other crates does not itself ship the circuit, ledger, synthesizer or parameters code in its tarball. What actually gets published to crates.io for the snarkvm package is the vm directory plus metadata, and the heavy components arrive as their own dependencies. This is a common workspace pattern and it is not a defect, but it changes how you should read a Cargo.lock entry. It also means a project that only needs proofs or only needs a ledger can depend on snarkvm-circuit or snarkvm-ledger directly and skip the meta package, which is the difference between the two ways of consuming this project described later.

## Building it takes three commands on the staging branch

The build guide is short and does not include a runnable example program, so the first real use is a compile rather than an execution. Rust is installed with rustup, and on macOS two extra packages are required afterwards.

```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

```bash
brew install pkgconf
brew install openssl
```

For library use, the dependency is added to an existing Cargo.toml, and the version is left as a placeholder for the reader to fill in with a published version.

```toml
[dependencies]
snarkvm = "<major>.<minor>.<patch>"
```

To build from source, the guide clones the development branch, which the command itself labels as staging, and builds the library in release mode.

```bash
git clone --branch staging --single-branch https://github.com/ProvableHQ/snarkVM.git 
cd snarkVM
cargo build --release
```

The clone URL points at ProvableHQ/snarkVM while the repository being described sits under aleo-labs-protocol, so the two names are worth reconciling before you type either one.

## A pinned toolchain and a strict repository surface

The root Cargo.toml asks for edition 2024 and rust-version 1.96.0, with a comment reminding maintainers to change the MSRV in rust-toolchain and in .circleci/config.yml as well. The same duplication is visible in the file listing, where rust-toolchain.toml pins the compiler next to the Cargo.toml that declares the same minimum. That is a real constraint for adopters: a team on an older stable Rust cannot consume the crate as published. Around it sit the usual guard rails. .rustfmt.toml holds formatting rules, .rusty-hook.toml holds a commit hook, .cargo/ holds cargo configuration, deny.toml is the manifest for cargo-deny, which is how licence and advisory checks are run for a dependency tree this size, and .codecov.yml with a codecov badge in the README shows coverage is measured. The presence of CI.md, CONTRIBUTING.md, SECURITY.md and AGENTS.md at the root says the project is organised for outside contributions rather than for a single internal team.

## Two ways to depend on the same code

The alternative to adding the snarkvm meta package is to depend on one of the individual crates listed in the table. If your code needs arithmetic circuits and nothing else, snarkvm-circuit is the dependency, and you avoid pulling in the ledger and the synthesizer. If you are reproducing or verifying ledger state, snarkvm-ledger is the one, and its description names the Aleo blockchain explicitly. If your target is a browser or a non Rust runtime, snarkvm-wasm exists for that. The difference in approach is real rather than cosmetic: the meta package gives you a consistent version across the whole stack, while the individual crates let you pin only what you use, at the cost of managing version compatibility between several separate crates yourself. For a team shipping a proof system, that trade-off between a single version number and a smaller dependency graph is the central decision, and the README does not offer guidance on it.

## Recent tags, an active branch, and one naming wrinkle

The repository is not archived and the last push was on 2026-10-19, so the code is moving. Three recent tags show the shape of that movement: v4.11.0 on 2026-10-01, testnet-v4.12.0 on 2026-10-07, and v4.12.0 on 2026-10-13, six days before the last push. The pairing of a testnet tag and a mainnet tag for the same version number tells you the project tags testnet builds separately, so the tag you pick determines which network a build points at. The version in the root Cargo.toml reads 4.12.0, matching the newest release. The default branch is staging, and the build guide clones that branch rather than a release tag, which means a build taken today is a build of unreleased work. The naming wrinkle is that the repository path differs from the Cargo.toml repository field, the clone URL and the CI badge, which all say ProvableHQ/snarkVM, with the badge pointing at a mainnet tree while the default branch is staging. The licence is Apache-2.0, recorded in the root Cargo.toml and in LICENSE.md, with the copyright and attribution obligations that come with it and no additional licensing terms stated.

## Conclusion

snarkVM fits a Rust team building Aleo programs or a zero knowledge stack that wants circuit, ledger and synthesizer primitives as library code, and the crate split lets you take snarkvm-circuit or snarkvm-ledger without the rest. It does not fit a team that wants a running node, a wallet or a deployment target, because the README documents none of those and the workspace root holds no binary crate. Verify three things before committing: that the crate version you depend on matches the release you intend to run, that edition 2024 and rust-version 1.96.0 match your toolchain, and which of the listed crates your application actually needs, because the snarkvm meta package only ships vm.

## FAQ

### How do I add snarkVM to a Rust project?

The README shows adding it to Cargo.toml as a dependency with a published version, for example snarkvm = "<major>.<minor>.<patch>", and states that snarkVM is primarily designed to be used as a library in Rust projects.

### How do I build snarkVM from source?

The build guide clones the development branch with git clone --branch staging --single-branch and then runs cargo build --release inside the cloned snarkVM directory. Rust is installed first with rustup, and macOS users also need pkgconf and openssl.

### Which crates does the snarkVM project publish?

The README table lists snarkvm, snarkvm-algorithms, snarkvm-circuit, snarkvm-console, snarkvm-curves, snarkvm-fields, snarkvm-ledger, snarkvm-parameters, snarkvm-synthesizer, snarkvm-utilities and snarkvm-wasm. Each is on crates.io and docs.rs, and each supports both std and wasm builds.

### What Rust version does snarkVM require?

The root Cargo.toml declares edition 2024 and rust-version 1.96.0, and the file listing includes rust-toolchain.toml, which pins the compiler for the workspace.

## Sources

- [aleo-labs-protocol/snarkVM on GitHub](https://github.com/aleo-labs-protocol/snarkVM)
- [License: Apache-2.0](https://github.com/aleo-labs-protocol/snarkVM/blob/staging/LICENSE)
- [Project website](https://snarkvm.org)
- [README](https://github.com/aleo-labs-protocol/snarkVM/blob/staging/README.md)
- [Releases](https://github.com/aleo-labs-protocol/snarkVM/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/aleo-labs-protocol-snarkvm
