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;
  6use ark_groth16::{
  7    create_random_proof as prove, generate_random_parameters, prepare_verifying_key, verify_proof,
  8};
  9
 10#[test]
 11fn 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]
 42fn 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    builder.build().unwrap_err();
 60}
 61
 62#[test]
 63#[cfg(feature = "circom-2")]
 64fn 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")]
 96fn 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}