| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -25,7 +25,7 @@ use solidity_verifiers::{ | 
															
														
														
													
														
															
																 | 
																 | 
																    get_decider_template_for_cyclefold_decider,
 | 
																 | 
																 | 
																    get_decider_template_for_cyclefold_decider,
 | 
															
														
														
													
														
															
																 | 
																 | 
																    utils::get_function_selector_for_nova_cyclefold_verifier,
 | 
																 | 
																 | 
																    utils::get_function_selector_for_nova_cyclefold_verifier,
 | 
															
														
														
													
														
															
																 | 
																 | 
																};
 | 
																 | 
																 | 
																};
 | 
															
														
														
													
														
															
																 | 
																 | 
																use solidity_verifiers::{Groth16Data, KzgData, NovaCyclefoldData};
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																use solidity_verifiers::{Groth16Data, KzgData, NovaCycleFoldData};
 | 
															
														
														
													
														
															
																 | 
																 | 
																use std::{fs, marker::PhantomData, time::Instant};
 | 
																 | 
																 | 
																use std::{fs, marker::PhantomData, time::Instant};
 | 
															
														
														
													
														
															
																 | 
																 | 
																use utils::setup;
 | 
																 | 
																 | 
																use utils::setup;
 | 
															
														
														
													
														
															
																 | 
																 | 
																mod utils;
 | 
																 | 
																 | 
																mod utils;
 | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -129,14 +129,14 @@ fn main() { | 
															
														
														
													
														
															
																 | 
																 | 
																        NOVA,
 | 
																 | 
																 | 
																        NOVA,
 | 
															
														
														
													
														
															
																 | 
																 | 
																    >;
 | 
																 | 
																 | 
																    >;
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let n_blocks_checked = blocks_prepared.len();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let n_blocks_checked = blocks_prepared.len() / 20; // TMP rm '/20'
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let circuit = BTCBlockCheckerFCircuit::<Fr>::new(blocks_prepared.clone());
 | 
																 | 
																 | 
																    let circuit = BTCBlockCheckerFCircuit::<Fr>::new(blocks_prepared.clone());
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let (prover_params, poseidon_config, kzg_vk) = setup(circuit.clone());
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let (fs_prover_params, kzg_vk) = setup(circuit.clone());
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let z_0 = vec![Fr::from(0)];
 | 
																 | 
																 | 
																    let z_0 = vec![Fr::from(0)];
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let mut nova = NOVA::init(&prover_params, circuit, z_0.clone()).unwrap();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let mut nova = NOVA::init(&fs_prover_params, circuit, z_0.clone()).unwrap();
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    println!("Computing folds...");
 | 
																 | 
																 | 
																    println!("Computing folds...");
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let now = Instant::now();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let start = Instant::now();
 | 
															
														
														
													
														
															
																 | 
																 | 
																    for i in 0..n_blocks_checked {
 | 
																 | 
																 | 
																    for i in 0..n_blocks_checked {
 | 
															
														
														
													
														
															
																 | 
																 | 
																        let current_state = nova.z_i[0].into_bigint();
 | 
																 | 
																 | 
																        let current_state = nova.z_i[0].into_bigint();
 | 
															
														
														
													
														
															
																 | 
																 | 
																        if i % 10 == 0 {
 | 
																 | 
																 | 
																        if i % 10 == 0 {
 | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -144,13 +144,13 @@ fn main() { | 
															
														
														
													
														
															
																 | 
																 | 
																        }
 | 
																 | 
																 | 
																        }
 | 
															
														
														
													
														
															
																 | 
																 | 
																        nova.prove_step().unwrap();
 | 
																 | 
																 | 
																        nova.prove_step().unwrap();
 | 
															
														
														
													
														
															
																 | 
																 | 
																    }
 | 
																 | 
																 | 
																    }
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let elapsed = now.elapsed();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    println!(
 | 
																 | 
																 | 
																    println!(
 | 
															
														
														
													
														
															
																 | 
																 | 
																        "Done folding. Checked {} blocks in: {:.2?}",
 | 
																 | 
																 | 
																        "Done folding. Checked {} blocks in: {:.2?}",
 | 
															
														
														
													
														
															
																 | 
																 | 
																        n_blocks_checked, elapsed
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        n_blocks_checked,
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        start.elapsed()
 | 
															
														
														
													
														
															
																 | 
																 | 
																    );
 | 
																 | 
																 | 
																    );
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let circuit = DeciderEthCircuit::<
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let decider_circuit = DeciderEthCircuit::<
 | 
															
														
														
													
														
															
																 | 
																 | 
																        Projective,
 | 
																 | 
																 | 
																        Projective,
 | 
															
														
														
													
														
															
																 | 
																 | 
																        GVar,
 | 
																 | 
																 | 
																        GVar,
 | 
															
														
														
													
														
															
																 | 
																 | 
																        Projective2,
 | 
																 | 
																 | 
																        Projective2,
 | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -163,23 +163,17 @@ fn main() { | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    // decider setup
 | 
																 | 
																 | 
																    // decider setup
 | 
															
														
														
													
														
															
																 | 
																 | 
																    println!("Starting setup...");
 | 
																 | 
																 | 
																    println!("Starting setup...");
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let now = Instant::now();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let start = Instant::now();
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let (g16_pk, g16_vk) =
 | 
																 | 
																 | 
																    let (g16_pk, g16_vk) =
 | 
															
														
														
													
														
															
																 | 
																 | 
																        Groth16::<Bn254>::circuit_specific_setup(circuit.clone(), &mut rng).unwrap();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    let elapsed = now.elapsed();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    println!("Setup done in: {:.2?}", elapsed);
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        Groth16::<Bn254>::circuit_specific_setup(decider_circuit.clone(), &mut rng).unwrap();
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    println!("Setup done in: {:.2?}", start.elapsed());
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    // decider proof generation
 | 
																 | 
																 | 
																    // decider proof generation
 | 
															
														
														
													
														
															
																 | 
																 | 
																    println!("Generating proof...");
 | 
																 | 
																 | 
																    println!("Generating proof...");
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let now = Instant::now();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    let decider_pp = (
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        poseidon_config.clone(),
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        g16_pk,
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        prover_params.clone().cs_params,
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    );
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let start = Instant::now();
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let decider_pp = (g16_pk, fs_prover_params.cs_params.clone());
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let proof = DECIDER::prove(decider_pp, rng, nova.clone()).unwrap();
 | 
																 | 
																 | 
																    let proof = DECIDER::prove(decider_pp, rng, nova.clone()).unwrap();
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let elapsed = now.elapsed();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    println!("Proof generated in: {:.2?}", elapsed);
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    println!("Proof generated in: {:.2?}", start.elapsed());
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    // decider proof verification
 | 
																 | 
																 | 
																    // decider proof verification
 | 
															
														
														
													
														
															
																 | 
																 | 
																    println!("Verifying proof...");
 | 
																 | 
																 | 
																    println!("Verifying proof...");
 | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -198,9 +192,9 @@ fn main() { | 
															
														
														
													
														
															
																 | 
																 | 
																    let g16_data = Groth16Data::from(g16_vk);
 | 
																 | 
																 | 
																    let g16_data = Groth16Data::from(g16_vk);
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let kzg_data = KzgData::from((
 | 
																 | 
																 | 
																    let kzg_data = KzgData::from((
 | 
															
														
														
													
														
															
																 | 
																 | 
																        kzg_vk,
 | 
																 | 
																 | 
																        kzg_vk,
 | 
															
														
														
													
														
															
																 | 
																 | 
																        Some(prover_params.cs_params.powers_of_g[0..3].to_vec()),
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        fs_prover_params.cs_params.powers_of_g[0..3].to_vec(),
 | 
															
														
														
													
														
															
																 | 
																 | 
																    ));
 | 
																 | 
																 | 
																    ));
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let nova_cyclefold_data = NovaCyclefoldData::from((g16_data, kzg_data, nova.z_0.len()));
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let nova_cyclefold_data = NovaCycleFoldData::from((g16_data, kzg_data, nova.z_0.len()));
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let function_selector =
 | 
																 | 
																 | 
																    let function_selector =
 | 
															
														
														
													
														
															
																 | 
																 | 
																        get_function_selector_for_nova_cyclefold_verifier(nova.z_0.len() * 2 + 1);
 | 
																 | 
																 | 
																        get_function_selector_for_nova_cyclefold_verifier(nova.z_0.len() * 2 + 1);
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -216,17 +210,18 @@ fn main() { | 
															
														
														
													
														
															
																 | 
																 | 
																    .unwrap();
 | 
																 | 
																 | 
																    .unwrap();
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    let decider_template = get_decider_template_for_cyclefold_decider(nova_cyclefold_data);
 | 
																 | 
																 | 
																    let decider_template = get_decider_template_for_cyclefold_decider(nova_cyclefold_data);
 | 
															
														
														
													
														
															
																 | 
																 | 
																    save_solidity("./NovaLightBTCClientDecider.sol", &decider_template);
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    fs::write("./solidity-calldata.calldata", calldata).unwrap();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    // save smart contract
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    save_solidity("./NovaLightBTCClientDecider.sol", &decider_template.clone());
 | 
															
														
														
													
														
															
																 | 
																 | 
																    // save calldata
 | 
																 | 
																 | 
																    // save calldata
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    fs::write("./solidity-calldata.calldata", calldata.clone()).unwrap();
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let nova_cyclefold_verifier_bytecode = compile_solidity(decider_template, "NovaDecider");
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let mut evm = Evm::default();
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let verifier_address = evm.create(nova_cyclefold_verifier_bytecode);
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    // let nova_cyclefold_verifier_bytecode = compile_solidity(decider_template, "NovaDecider");
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    //
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    // let mut evm = Evm::default();
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    // let verifier_address = evm.create(nova_cyclefold_verifier_bytecode);
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    //
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    // let (_, output) = evm.call(verifier_address, calldata.clone());
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    // println!("Output: {:?}", output);
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    // assert_eq!(*output.last().unwrap(), 1);
 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    let (_, output) = evm.call(verifier_address, calldata);
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    println!("Output: {:?}", output);
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    assert_eq!(*output.last().unwrap(), 1);
 | 
															
														
														
													
														
															
																 | 
																 | 
																}
 | 
																 | 
																 | 
																}
 |