arnaucube
arnaucube/sonobe-playgroundPublic Self-hosted repository
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(&params, 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}