You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.6 KiB

  1. #![allow(non_snake_case)]
  2. #![allow(non_upper_case_globals)]
  3. #![allow(non_camel_case_types)]
  4. #![allow(clippy::upper_case_acronyms)]
  5. #![allow(dead_code)]
  6. use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as G1};
  7. use ark_crypto_primitives::snark::SNARK;
  8. use ark_groth16::{Groth16, ProvingKey, VerifyingKey as G16VerifierKey};
  9. use ark_grumpkin::{constraints::GVar as GVar2, Projective as G2};
  10. use ark_poly_commit::kzg10::VerifierKey as KZGVerifierKey;
  11. use ark_std::Zero;
  12. use std::time::Instant;
  13. use folding_schemes::{
  14. commitment::{
  15. kzg::{ProverKey as KZGProverKey, KZG},
  16. pedersen::Pedersen,
  17. CommitmentScheme,
  18. },
  19. folding::nova::{
  20. decider_eth_circuit::DeciderEthCircuit, get_r1cs, Nova, ProverParams, VerifierParams,
  21. },
  22. frontend::FCircuit,
  23. transcript::poseidon::poseidon_test_config,
  24. FoldingScheme,
  25. };
  26. // This method computes the Nova's Prover & Verifier parameters for the example.
  27. // Warning: this method is only for testing purposes. For a real world use case those parameters
  28. // should be generated carefully (both the PoseidonConfig and the PedersenParams).
  29. #[allow(clippy::type_complexity)]
  30. pub(crate) fn init_nova_ivc_params<FC: FCircuit<Fr>>(
  31. F_circuit: FC,
  32. ) -> (
  33. ProverParams<G1, G2, KZG<'static, Bn254>, Pedersen<G2>>,
  34. VerifierParams<G1, G2>,
  35. KZGVerifierKey<Bn254>,
  36. ) {
  37. let mut rng = ark_std::test_rng();
  38. let poseidon_config = poseidon_test_config::<Fr>();
  39. // get the CM & CF_CM len
  40. let (r1cs, cf_r1cs) = get_r1cs::<G1, GVar, G2, GVar2, FC>(&poseidon_config, F_circuit).unwrap();
  41. let cs_len = r1cs.A.n_rows;
  42. let cf_cs_len = cf_r1cs.A.n_rows;
  43. // let (pedersen_params, _) = Pedersen::<G1>::setup(&mut rng, cf_len).unwrap();
  44. let (kzg_pk, kzg_vk): (KZGProverKey<G1>, KZGVerifierKey<Bn254>) =
  45. KZG::<Bn254>::setup(&mut rng, cs_len).unwrap();
  46. let (cf_pedersen_params, _) = Pedersen::<G2>::setup(&mut rng, cf_cs_len).unwrap();
  47. let fs_prover_params = ProverParams::<G1, G2, KZG<Bn254>, Pedersen<G2>> {
  48. poseidon_config: poseidon_config.clone(),
  49. cs_params: kzg_pk.clone(),
  50. cf_cs_params: cf_pedersen_params,
  51. };
  52. let fs_verifier_params = VerifierParams::<G1, G2> {
  53. poseidon_config: poseidon_config.clone(),
  54. r1cs,
  55. cf_r1cs,
  56. };
  57. (fs_prover_params, fs_verifier_params, kzg_vk)
  58. }
  59. /// Initializes Nova parameters and DeciderEth parameters. Only for test purposes.
  60. #[allow(clippy::type_complexity)]
  61. pub(crate) fn init_ivc_and_decider_params<FC: FCircuit<Fr>>(
  62. f_circuit: FC,
  63. ) -> (
  64. ProverParams<G1, G2, KZG<'static, Bn254>, Pedersen<G2>>,
  65. KZGVerifierKey<Bn254>,
  66. ProvingKey<Bn254>,
  67. G16VerifierKey<Bn254>,
  68. ) {
  69. let mut rng = rand::rngs::OsRng;
  70. let start = Instant::now();
  71. let (fs_prover_params, _, kzg_vk) = init_nova_ivc_params::<FC>(f_circuit.clone());
  72. println!("generated Nova folding params: {:?}", start.elapsed());
  73. pub type NOVA<FC> = Nova<G1, GVar, G2, GVar2, FC, KZG<'static, Bn254>, Pedersen<G2>>;
  74. let z_0 = vec![Fr::zero(); f_circuit.state_len()];
  75. let nova = NOVA::init(&fs_prover_params, f_circuit, z_0.clone()).unwrap();
  76. let decider_circuit =
  77. DeciderEthCircuit::<G1, GVar, G2, GVar2, KZG<Bn254>, Pedersen<G2>>::from_nova::<FC>(
  78. nova.clone(),
  79. )
  80. .unwrap();
  81. let start = Instant::now();
  82. let (g16_pk, g16_vk) =
  83. Groth16::<Bn254>::circuit_specific_setup(decider_circuit.clone(), &mut rng).unwrap();
  84. println!(
  85. "generated G16 (Decider circuit) params: {:?}",
  86. start.elapsed()
  87. );
  88. (fs_prover_params, kzg_vk, g16_pk, g16_vk)
  89. }
  90. fn main() {}