Skip to content

Commit ed0371f

Browse files
committed
verify outer proof
1 parent 61a9cbb commit ed0371f

File tree

4 files changed

+43
-21
lines changed

4 files changed

+43
-21
lines changed

how-to/recursive-proofs/circuits/recurse/Nargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "recurse"
3-
type = "lib"
3+
type = "bin"
44
authors = [""]
55
compiler_version = ">=0.26.0"
66

how-to/recursive-proofs/circuits/recurse/src/lib.nr renamed to how-to/recursive-proofs/circuits/recurse/src/main.nr

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
use dep::std;
22

3-
#[export]
4-
fn main(verification_key: [Field; 114], proof: [Field; 93], public_inputs: [Field; 1], key_hash: Field) {
3+
fn main(
4+
verification_key: [Field; 114],
5+
proof: [Field; 93],
6+
public_inputs: [Field; 1],
7+
key_hash: Field
8+
) {
59
std::verify_proof(
610
verification_key.as_slice(),
711
proof.as_slice(),

how-to/recursive-proofs/main.ts

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CompiledCircuit } from '@noir-lang/types';
2-
import { main } from './codegen';
2+
// import { main } from './codegen';
33
import { setTimeout } from "timers/promises";
44

55
import { Noir } from '@noir-lang/noir_js';
@@ -19,11 +19,8 @@ async function getCircuit(name: string) {
1919
return compiled.program;
2020
}
2121

22-
const input1 = { n: 2 };
23-
const input2 = { n: 4 };
24-
2522
async function fullNoirFromCircuit(circuitName: string): Promise<FullNoir> {
26-
const circuit: CompiledCircuit = await getCircuit('not_odd');
23+
const circuit: CompiledCircuit = await getCircuit(circuitName);
2724
const backend: BarretenbergBackend = new BarretenbergBackend(circuit, { threads: 8 });
2825
const noir: Noir = new Noir(circuit, backend);
2926
return { circuit, backend, noir };
@@ -36,30 +33,51 @@ type FullNoir = {
3633
}
3734

3835
async function start() {
36+
// Generate inner proof artifacts
3937
console.log("Creating Noir from circuit...");
4038
const simple: FullNoir = await fullNoirFromCircuit('not_odd');
4139

4240
console.log("Executing binary circuit for witness...");
43-
const witness1 = (await simple.noir.execute(input1)).witness;
41+
const innerInput = { n: 2 };
42+
const innerWitness = (await simple.noir.execute(innerInput)).witness;
4443
console.log("Generating intermediate proof...");
45-
const proof1: ProofData = await simple.backend.generateProof(witness1);
44+
const innerProof: ProofData = await simple.backend.generateProof(innerWitness);
4645

47-
if (1) { // mess up proof
48-
console.log("Generating intermediate proof...");
49-
proof1.proof[0] += 1;
46+
if (false) { // mess up proof
47+
console.log("Messing intermediate proof...");
48+
innerProof.proof[0] += 1;
5049
}
5150

52-
// const witness2 = (await simple.noir.execute(input2)).witness;
53-
// const proof2: ProofData = await simple.backend.generateProof(witness2);
5451
console.log("Generating recursive proof artifacts...");
55-
const { proofAsFields, vkAsFields, vkHash } = await simple.backend.generateRecursiveProofArtifacts(proof1, 1);
52+
const { proofAsFields, vkAsFields, vkHash } = await simple.backend.generateRecursiveProofArtifacts(innerProof, 1);
5653
// console.log({ proofAsFields, vkAsFields, vkHash });
54+
simple.backend.destroy();
55+
56+
// Generate and verify outer proof
57+
console.log("Creating Noir from circuit...");
58+
const outer: FullNoir = await fullNoirFromCircuit('recurse');
59+
console.log("Executing binary circuit for witness...");
60+
const outerInput = {
61+
verification_key: vkAsFields,
62+
proof: proofAsFields,
63+
public_inputs: ["0"],
64+
key_hash: vkHash
65+
};
66+
const outerWitness = (await outer.noir.execute(
67+
outerInput
68+
)).witness;
5769

58-
console.log("Executing lib circuit function to verify inner proof");
59-
let res = await main(vkAsFields, proofAsFields, ["7"], vkHash);
60-
console.log(res);
70+
console.log("Generating outer proof...");
71+
const outerProof: ProofData = await outer.backend.generateProof(outerWitness);
6172

62-
simple.backend.destroy();
73+
console.log("Verifying outer proof...");
74+
console.log(await outer.backend.verifyProof(outerProof));
75+
76+
// console.log("Executing lib circuit function to verify inner proof");
77+
// let res = await main(vkAsFields, proofAsFields, ["7"], vkHash);
78+
// console.log(res);
79+
80+
outer.backend.destroy();
6381
}
6482

6583
start();

how-to/recursive-proofs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"export:simple": "nargo export --program-dir=./circuits/not_odd",
99
"export:recurse": "nargo export --program-dir=./circuits/recurse",
1010
"export:all": "yarn clean:codegen && yarn export:simple && yarn export:recurse",
11-
"codegen": "yarn noir-codegen ./circuits/**/export/*.json",
11+
"codegen": "echo 'skipping' || yarn noir-codegen ./circuits/**/export/*.json",
1212
"compile:all": "yarn export:all && yarn codegen && yarn compile"
1313
},
1414
"devDependencies": {

0 commit comments

Comments
 (0)