Zero-knowledge proofs of ML inference on ONNX models
Project description
888888 .d8888b. 88888888888
"88b d88P Y88b 888
888 Y88b. 888
888 "Y888b. 888 88888b. 888d888 .d88b. 888 888 .d88b.
888 "Y88b. 888 888 "88b 888P" d88""88b 888 888 d8P Y8b
888 "888 888 888 888 888 888 888 Y88 88P 88888888
88P Y88b d88P 888 888 d88P 888 Y88..88P Y8bd8P Y8b.
888 "Y8888P" 888 88888P" 888 "Y88P" Y88P "Y8888
.d88P 888
.d88P" 888
888P" 888
JSTprove
Zero-knowledge proofs of ML inference on ONNX models — powered by Polyhedra Network’s Expander (GKR/sum-check prover) and Expander Compiler Collection (ECC).
Supported ops (current): Add, BatchNormalization, Clip, Constant, Conv, Div, Flatten, Gemm, Max, MaxPool, Min, Mul, ReLU, Reshape, Squeeze, Sub, Unsqueeze. CLI details: see docs/cli.md.
Just want to see it in action? Jump to Quickstart (LeNet demo). Curious about how it works under the hood? Check out the white paper.
Table of Contents
Click to expand
What is JSTprove?
JSTprove is a zkML toolkit/CLI that produces zero-knowledge proofs of AI inference. You provide an ONNX model and inputs; JSTprove handles quantization, circuit generation (via ECC), witness creation, proving (via Expander), and verification — with explicit, user-controlled file paths.
High-level architecture
- Python package: Thin PyO3 bindings exposing
Circuit,WitnessResult, andBatchResultfrom Rust. - Rust workspace: Four crates (
jstprove_circuits,jstprove_io,jstprove_onnx,jstprove_remainder) plusjstprove_pyo3(excluded from workspace). Two CLI binaries:jstprove(Expander backend) andjstprove-remainder(Remainder backend). - Circuit frontend: ECC Rust API for arithmetic circuits.
- Prover backend: Expander (GKR/sum-check prover/verification).
ONNX model ─► Circuit via ECC (Rust) ─► Witness (Rust) ─► Proof (Rust) ─► Verify (Rust)
Design principles
- User-friendly frontend to Expander: A thin, practical, circuit-based layer that makes Expander/ECC easy to use from a simple CLI — no circuit classes, no path inference, predictable artifacts.
- Explicit & reproducible: You pass exact paths; we emit concrete artifacts (compiled circuit, witness, proof). No hidden discovery or heuristics.
- Quantization that's simple & faithful: We scale tensors, round to integers, run the model, and (where needed) rescale outputs back. Scaling keeps arithmetic cheap while remaining close to the original FP behavior.
- Small, fast circuits when possible: Where safe, we fuse common patterns (e.g., Linear + ReLU, Conv + ReLU) into streamlined circuit fragments to reduce constraints.
Installation
Installing from PyPI (Recommended)
Prerequisites
- UV: Fast Python package manager (install UV)
Install JSTprove
uv tool install JSTprove
Verify installation
jstprove --help
Installing from GitHub Release
Download the appropriate wheel for your platform from the latest release:
- Linux:
JSTprove-*-manylinux_*.whl - macOS (Apple Silicon):
JSTprove-*-macosx_11_0_arm64.whl
Then install:
uv tool install /path/to/JSTprove-*.whl
Development Installation
Click to expand for development setup instructions
0) Requirements
- Python: >=3.9
- UV: Fast Python package manager (install UV)
Note: UV will automatically install and manage the correct Python version for you.
Heads-up: If you just installed
uvand the command isn't found, close and reopen your terminal (or re-source your shell init file) so theuvshim is picked up onPATH.
1) System packages
Run commands from the repo root so the runner binary path (e.g.,
./target/release/jstprove) resolves.
Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y \
pkg-config libclang-dev clang
macOS
brew install llvm
2) Rust toolchain
Install Rust via rustup (if you don't have it):
# macOS/Linux:
curl https://sh.rustup.rs -sSf | sh
# then restart your shell
Verify your install:
rustup --version
rustc --version
cargo --version
This repo includes a
rust-toolchain.tomlthat pins the required nightly. When you runcargoin this directory, rustup will automatically download/use the correct toolchain. You do not need to runrustup override set nightly.
(Optional) If you want to prefetch nightly ahead of time:
rustup toolchain install nightly
3) Clone JSTprove
git clone https://github.com/inference-labs-inc/JSTprove.git
cd JSTprove
The Python package has no pip-installable dependencies. It is built with maturin from the PyO3 crate (
maturin develop --release).
4) Build the JSTprove binaries
cargo build --release
Cargo will automatically fetch the ECC dependency from
https://github.com/inference-labs-inc/ecc. No local clone of Expander or ECC is needed.
5) Verify the build
./target/release/jstprove --help
./target/release/jstprove-remainder --help
You can now follow the Quickstart commands (compile -> witness -> prove -> verify).
Quickstart (LeNet demo)
Demo paths:
- ONNX model:
rust/jstprove_remainder/models/lenet.onnx - Artifacts:
artifacts/lenet/*
- Compile (using the Expander backend) -- produces a
CompiledCircuitmsgpack bundle
jstprove msgpack_compile \
--onnx rust/jstprove_remainder/models/lenet.onnx \
-c artifacts/lenet/circuit.msgpack
- Witness -- generate witness from compiled circuit + inputs/outputs
jstprove run_gen_witness \
-c artifacts/lenet/circuit.msgpack \
-i artifacts/lenet/input.json \
-o artifacts/lenet/output.json \
-w artifacts/lenet/witness.msgpack
- Prove -- witness -> proof
jstprove run_prove_witness \
-c artifacts/lenet/circuit.msgpack \
-w artifacts/lenet/witness.msgpack \
-p artifacts/lenet/proof.msgpack
- Verify -- check the proof
jstprove run_gen_verify \
-c artifacts/lenet/circuit.msgpack \
-i artifacts/lenet/input.json \
-o artifacts/lenet/output.json \
-w artifacts/lenet/witness.msgpack \
-p artifacts/lenet/proof.msgpack
If it prints Verified, you're done.
CLI reference
The CLI is intentionally minimal and doesn't infer paths. See docs/cli.md for subcommands, flags, and examples.
Troubleshooting
Contributing
See docs/CONTRIBUTING.md for dev setup, pre-commit hooks, and PR guidelines.
Disclaimer
JSTProve is experimental and unaudited. It is provided on an open-source, “as-is” basis, without any warranties or guarantees of fitness for a particular purpose.
Use of JSTProve in production environments is strongly discouraged. The codebase may contain bugs, vulnerabilities, or incomplete features that could lead to unexpected results, failures, or security risks.
By using, modifying, or distributing this software, you acknowledge that:
- It has not undergone a formal security review or audit.
- It may change substantially over time, including breaking changes.
- You assume full responsibility for any outcomes resulting from its use.
JSTProve is made available in the spirit of research, experimentation, and community collaboration. Contributions are welcome, but please proceed with caution and do not rely on this software for systems where correctness, reliability, or security are critical.
Acknowledgments
We gratefully acknowledge Polyhedra Network for:
-
Expander — the GKR/sumcheck proving system we build on.
-
Expander Compiler Collection (ECC) — the circuit frontend used to construct arithmetic circuits for ML layers.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jstprove-2.12.1-cp312-cp312-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: jstprove-2.12.1-cp312-cp312-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.2 MB
- Tags: CPython 3.12, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2bcde33329ab6037b901122386a57a674ce692f230bfd2bd21c48a3c15c6c407
|
|
| MD5 |
3171457817b4368734871945d01fe8e5
|
|
| BLAKE2b-256 |
6f9cc09ecc97753e69ec1488ee4da5b189bf9faf2d730e3a004aa78d7ef97560
|
File details
Details for the file jstprove-2.12.1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: jstprove-2.12.1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26a61e6aed477b5fb0ad2494f60f375a66473378b327841fc29d1e469dcfbfcd
|
|
| MD5 |
eaf73bad8a1de32f185606f031c4730c
|
|
| BLAKE2b-256 |
f5bba3d823f0d793e92ecde8f97081f00cf5e9a1be3f364a625fa97984924e41
|