/ tests / groth16.rs
groth16.rs
  1  use ark_circom::{CircomBuilder, CircomConfig};
  2  use ark_std::rand::thread_rng;
  3  use color_eyre::Result;
  4  
  5  use ark_bn254::Bn254;
  6  use ark_groth16::{
  7      create_random_proof as prove, generate_random_parameters, prepare_verifying_key, verify_proof,
  8  };
  9  
 10  #[test]
 11  fn groth16_proof() -> Result<()> {
 12      let cfg = CircomConfig::<Bn254>::new(
 13          "./test-vectors/mycircuit.wasm",
 14          "./test-vectors/mycircuit.r1cs",
 15      )?;
 16      let mut builder = CircomBuilder::new(cfg);
 17      builder.push_input("a", 3);
 18      builder.push_input("b", 11);
 19  
 20      // create an empty instance for setting it up
 21      let circom = builder.setup();
 22  
 23      let mut rng = thread_rng();
 24      let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?;
 25  
 26      let circom = builder.build()?;
 27  
 28      let inputs = circom.get_public_inputs().unwrap();
 29  
 30      let proof = prove(circom, &params, &mut rng)?;
 31  
 32      let pvk = prepare_verifying_key(&params.vk);
 33  
 34      let verified = verify_proof(&pvk, &proof, &inputs)?;
 35  
 36      assert!(verified);
 37  
 38      Ok(())
 39  }
 40  
 41  #[test]
 42  fn groth16_proof_wrong_input() {
 43      let cfg = CircomConfig::<Bn254>::new(
 44          "./test-vectors/mycircuit.wasm",
 45          "./test-vectors/mycircuit.r1cs",
 46      )
 47      .unwrap();
 48      let mut builder = CircomBuilder::new(cfg);
 49      builder.push_input("a", 3);
 50      // This isn't a public input to the circuit, should faild
 51      builder.push_input("foo", 11);
 52  
 53      // create an empty instance for setting it up
 54      let circom = builder.setup();
 55  
 56      let mut rng = thread_rng();
 57      let _params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng).unwrap();
 58  
 59      let _ = builder.build().unwrap_err();
 60  }
 61  
 62  #[test]
 63  #[cfg(feature = "circom-2")]
 64  fn groth16_proof_circom2() -> Result<()> {
 65      let cfg = CircomConfig::<Bn254>::new(
 66          "./test-vectors/circom2_multiplier2.wasm",
 67          "./test-vectors/circom2_multiplier2.r1cs",
 68      )?;
 69      let mut builder = CircomBuilder::new(cfg);
 70      builder.push_input("a", 3);
 71      builder.push_input("b", 11);
 72  
 73      // create an empty instance for setting it up
 74      let circom = builder.setup();
 75  
 76      let mut rng = thread_rng();
 77      let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?;
 78  
 79      let circom = builder.build()?;
 80  
 81      let inputs = circom.get_public_inputs().unwrap();
 82  
 83      let proof = prove(circom, &params, &mut rng)?;
 84  
 85      let pvk = prepare_verifying_key(&params.vk);
 86  
 87      let verified = verify_proof(&pvk, &proof, &inputs)?;
 88  
 89      assert!(verified);
 90  
 91      Ok(())
 92  }
 93  
 94  #[test]
 95  #[cfg(feature = "circom-2")]
 96  fn witness_generation_circom2() -> Result<()> {
 97      let cfg = CircomConfig::<Bn254>::new(
 98          "./test-vectors/circom2_multiplier2.wasm",
 99          "./test-vectors/circom2_multiplier2.r1cs",
100      )?;
101      let mut builder = CircomBuilder::new(cfg);
102      builder.push_input("a", 3);
103      builder.push_input("b", 0x100000000u64 - 1);
104  
105      assert!(builder.build().is_ok());
106  
107      Ok(())
108  }