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