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_crypto_primitives::snark::SNARK;
7use ark_groth16::Groth16;
8
9type GrothBn = Groth16<Bn254>;
10
11#[test]
12fn groth16_proof() -> Result<()> {
13 let cfg = CircomConfig::<Bn254>::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(¶ms, circom, &mut rng)?;
32
33 let pvk = GrothBn::process_vk(¶ms.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::<Bn254>::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::<Bn254>::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(¶ms, circom, &mut rng)?;
85
86 let pvk = GrothBn::process_vk(¶ms.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::<Bn254>::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}