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, ¶ms, &mut rng)?;
31
32 let pvk = prepare_verifying_key(¶ms.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, ¶ms, &mut rng)?;
84
85 let pvk = prepare_verifying_key(¶ms.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}