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}