sonobe-docs/src/usage/decider-prove.md
src/usage/decider-prove.mdRaw
1# Decider prove
2
3Two options:
4
5- onchain (Ethereum's EVM) mode
6- offchain mode
7
8Once we have been folding our circuit instances, we can generate the *"final proof"*, the Decider proof.
9
10
11#### Onchain Decider
12
13
14
15Generating the final proof (decider), to be able to verify it in Ethereum's EVM:
16
17```rust
18type DECIDER = Decider<
19 Projective,
20 GVar,
21 Projective2,
22 GVar2,
23 CubicFCircuit<Fr>,
24 KZG<'static, Bn254>,
25 Pedersen<Projective2>,
26 Groth16<Bn254>, // here we define the Snark to use in the decider
27 NOVA, // here we define the FoldingScheme to use
28>;
29
30// generate Groth16 setup
31let circuit = DeciderEthCircuit::<
32 Projective,
33 GVar,
34 Projective2,
35 GVar2,
36 Pedersen<Projective>,
37 Pedersen<Projective2>,
38>::from_nova::<CubicFCircuit<Fr>>(nova.clone());
39let mut rng = rand::rngs::OsRng;
40
41let start = Instant::now();
42let (pk, vk) =
43 Groth16::<Bn254>::circuit_specific_setup(circuit.clone(), &mut rng).unwrap();
44println!("Groth16 setup, {:?}", start.elapsed());
45
46// decider proof generation
47let decider_pp = (poseidon_config.clone(), g16_pk, kzg_pk);
48let proof = DECIDER::prove(decider_pp, rng, nova.clone()).unwrap();
49
50// decider proof verification
51let decider_vp = (poseidon_config, g16_vk, kzg_vk);
52let verified = DECIDER::verify(decider_vp, nova.i, nova.z_0, nova.z_i, &nova.U_i, &nova.u_i, proof).unwrap();
53assert!(verified);
54```
55
56As mentioned above, complete examples can be found at [sonobe/folding-schemes/examples](https://github.com/privacy-scaling-explorations/sonobe/tree/main/folding-schemes/examples)
57