Recursive proofs let you verify the proof of one Noir program inside another Noir program. This is the foundation for circuit aggregation: rather than proving a single monolithic computation, you can split it into stages, prove each stage independently, and then produce a succinct proof that all the stage proofs are valid.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/noir-lang/noir/llms.txt
Use this file to discover all available pages before exploring further.
What recursive proofs enable
A standard Noir circuit has a fixed structure and a fixed proof size. Recursion breaks that constraint:- Incremental computation — prove step
Nand carry a proof of steps0..N-1forward. - Proof composition — combine proofs from different circuits into one.
- Compression — repeatedly fold many proofs into a single constant-size proof, regardless of how many steps are involved.
How it works in Noir
Noir exposes one entry point for recursive verification:verify_proof is invalid. The backend (Barretenberg) enforces correctness when generating the outer proof. An invalid inner proof will cause the backend to fail when it tries to generate a valid outer proof.
Using bb_proof_verification
The Aztec team publishes a higher-level library — bb_proof_verification — that wraps verify_proof with the correct plumbing for Barretenberg proofs. This is the recommended starting point.
Add the dependency
Add
bb_proof_verification to your Nargo.toml. Check the library’s published version tag.Declare the inner program's inputs
Your outer program receives the inner proof, the verification key, and the inner program’s public inputs as private witnesses.
Generate the inner proof
Use
nargo prove (or the Barretenberg CLI bb prove) to generate the proof for the inner program and export the verification key.verify_proof parameters
| Parameter | Type | Description |
|---|---|---|
verification_key | [Field] | The verification key of the inner circuit |
proof | [Field] | The serialised proof bytes from the inner circuit |
public_inputs | [Field] | Public inputs that were used when generating the inner proof |
key_hash | Field | A hash of the verification key, used by Barretenberg to prevent key substitution |