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