sonobe-playground/src/folding.rs
src/folding.rsRaw
1use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as G1};
2use ark_crypto_primitives::sponge::poseidon::PoseidonConfig;
3use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2};
4use rand::rngs::OsRng;
5use sonobe::{
6 commitment::{kzg::KZG, pedersen::Pedersen},
7 folding::{hypernova::HyperNova, nova::Nova},
8 frontend::circom::CircomFCircuit,
9 transcript::poseidon::poseidon_canonical_config,
10 FoldingScheme,
11};
12
13pub type NovaFolding =
14 Nova<G1, GVar, G2, GVar2, CircomFCircuit<Fr>, KZG<'static, Bn254>, Pedersen<G2>, false>;
15pub type HyperNovaFolding = HyperNova<
16 G1,
17 GVar,
18 G2,
19 GVar2,
20 CircomFCircuit<Fr>,
21 KZG<'static, Bn254>,
22 Pedersen<G2>,
23 1,
24 1,
25 false,
26>;
27
28pub type VerifierParam<FS> = <FS as FoldingScheme<G1, G2, CircomFCircuit<Fr>>>::VerifierParam;
29
30pub trait FoldingSchemeExt: FoldingScheme<G1, G2, CircomFCircuit<Fr>> {
31 fn prepreprocess(
32 poseidon_config: PoseidonConfig<Fr>,
33 circuit: CircomFCircuit<Fr>,
34 ) -> Self::PreprocessorParam;
35}
36
37impl FoldingSchemeExt for NovaFolding {
38 fn prepreprocess(
39 poseidon_config: PoseidonConfig<Fr>,
40 circuit: CircomFCircuit<Fr>,
41 ) -> Self::PreprocessorParam {
42 Self::PreprocessorParam::new(poseidon_config, circuit)
43 }
44}
45
46impl FoldingSchemeExt for HyperNovaFolding {
47 fn prepreprocess(
48 poseidon_config: PoseidonConfig<Fr>,
49 circuit: CircomFCircuit<Fr>,
50 ) -> Self::PreprocessorParam {
51 Self::PreprocessorParam::new(poseidon_config, circuit)
52 }
53}
54
55pub fn prepare_folding<FS: FoldingSchemeExt>(
56 circuit: &CircomFCircuit<Fr>,
57 start_ivc_state: Vec<Fr>,
58 rng: &mut OsRng,
59) -> (FS, FS::VerifierParam) {
60 let preprocess_params = FS::prepreprocess(poseidon_canonical_config::<Fr>(), circuit.clone());
61 let params =
62 FS::preprocess(&mut *rng, &preprocess_params).expect("Failed to preprocess folding scheme");
63 let folding =
64 FS::init(¶ms, circuit.clone(), start_ivc_state).expect("Failed to init folding scheme");
65
66 (folding, params.1)
67}
68
69pub fn verify_folding(
70 folding: &NovaFolding,
71 folding_vp: VerifierParam<NovaFolding>,
72 start_ivc_state: Vec<Fr>,
73 num_steps: u32,
74) {
75 let (running_instance, incoming_instance, cyclefold_instance) = folding.instances();
76 NovaFolding::verify(
77 folding_vp,
78 start_ivc_state,
79 folding.state(),
80 Fr::from(num_steps),
81 running_instance,
82 incoming_instance,
83 cyclefold_instance,
84 )
85 .expect("Failed to verify folded proof");
86}