arnaucube
arnaucube/ethdos-foldPublic Self-hosted repository
ethdos-fold/src/fold_ethdos.rs
src/fold_ethdos.rsRaw
 1#[cfg(test)]
 2mod tests {
 3    use ark_bn254::{Fr, G1Projective as G1};
 4    use ark_ec::AffineRepr;
 5    use ark_grumpkin::Projective as G2;
 6    use ark_std::Zero;
 7    use rand::rngs::OsRng;
 8
 9    use arkeddsa::ed_on_bn254_twist::{constraints::EdwardsVar, EdwardsProjective};
10
11    use folding_schemes::{
12        commitment::pedersen::Pedersen,
13        folding::nova::{Nova, PreprocessorParam},
14        frontend::FCircuit,
15        transcript::poseidon::poseidon_canonical_config,
16        FoldingScheme,
17    };
18
19    use crate::{
20        fcircuit::EthDosCircuit,
21        signature::gen_signatures,
22        utils::{dbg, elapsed, get_time},
23    };
24
25    #[test]
26    fn full_flow() {
27        // set how many steps of folding we want to compute
28        const N_STEPS: usize = 10;
29        dbg(format!(
30            "running Nova folding scheme on EthDosCircuit, with N_STEPS={}",
31            N_STEPS
32        ));
33
34        let mut rng = OsRng;
35        let poseidon_config = poseidon_canonical_config::<Fr>();
36
37        let pks_sigs =
38            gen_signatures::<OsRng, EdwardsProjective>(&mut rng, &poseidon_config, N_STEPS);
39
40        // set the initial state
41        let xy = pks_sigs[0].pk.0.xy().unwrap();
42        let pk0 = vec![xy.0, xy.1];
43        let z_0: Vec<Fr> = vec![pk0.clone(), pk0, vec![Fr::zero()]].concat();
44
45        type FC = EthDosCircuit<Fr, EdwardsProjective, EdwardsVar>;
46        let f_circuit = FC::new(poseidon_config.clone()).unwrap();
47
48        // define type aliases for the FoldingScheme (FS) and Decider (D), to avoid writting the
49        // whole type each time
50        pub type FS = Nova<G1, G2, FC, Pedersen<G1>, Pedersen<G2>, false>;
51
52        // prepare the Nova prover & verifier params
53        let nova_preprocess_params =
54            PreprocessorParam::new(poseidon_config.clone(), f_circuit.clone());
55        let start = get_time();
56        let nova_params = FS::preprocess(&mut rng, &nova_preprocess_params).unwrap();
57        dbg(format!("Nova params generated: {:?}", elapsed(start)));
58
59        // initialize the folding scheme engine, in our case we use Nova
60        let mut nova = FS::init(&nova_params, f_circuit, z_0.clone()).unwrap();
61
62        // run n steps of the folding iteration
63        let start_full = get_time();
64        for i in 0..N_STEPS {
65            let start = get_time();
66            nova.prove_step(rng, pks_sigs[i].clone(), None).unwrap();
67            dbg(format!("Nova::prove_step {}: {:?}", nova.i, elapsed(start)));
68        }
69        dbg(format!(
70            "Nova's all {} steps time: {:?}",
71            N_STEPS,
72            elapsed(start_full)
73        ));
74
75        // verify the last IVC proof
76        let ivc_proof = nova.ivc_proof();
77        dbg!(&ivc_proof.z_i);
78        FS::verify(
79            nova_params.1.clone(), // Nova's verifier params
80            ivc_proof,
81        )
82        .unwrap();
83    }
84}