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