frontend/hyrax_worldcoin_mpc/
test_worldcoin_mpc.rs1use ark_std::{end_timer, start_timer};
2use shared_types::{
3 config::{GKRCircuitProverConfig, GKRCircuitVerifierConfig},
4 pedersen::PedersenCommitter,
5 perform_function_under_prover_config, perform_function_under_verifier_config,
6 transcript::{ec_transcript::ECTranscript, poseidon_sponge::PoseidonSponge},
7 Base, Bn256Point, Scalar,
8};
9
10use hyrax::{
11 gkr::verify_hyrax_proof, provable_circuit::HyraxProvableCircuit,
12 utils::vandermonde::VandermondeInverse, verifiable_circuit::HyraxVerifiableCircuit,
13};
14
15#[cfg(test)]
18mod tests {
19
20 use crate::{
21 hyrax_worldcoin_mpc::test_worldcoin_mpc::test_mpc_circuit_with_hyrax_helper_and_verifiable_circuit,
22 layouter::builder::LayerVisibility,
23 worldcoin_mpc::test_helpers::{
24 inversed_circuit_description_and_inputs, small_circuit_description_and_inputs,
25 },
26 };
27 use shared_types::{
28 config::{GKRCircuitProverConfig, GKRCircuitVerifierConfig},
29 perform_function_under_expected_configs, Bn256Point,
30 };
31
32 use crate::hyrax_worldcoin_mpc::test_worldcoin_mpc::test_mpc_circuit_with_public_layers_helper;
33
34 use super::test_mpc_circuit_with_hyrax_helper;
35
36 #[ignore] #[test]
38 fn test_small_mpc_circuit_with_hyrax_layers() {
39 const NUM_IRIS_4_CHUNKS: usize = 1;
40 const PARTY_IDX: usize = 0;
41 let circuit = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
42 LayerVisibility::Committed,
43 );
44 let provable_circuit = circuit.gen_hyrax_provable_circuit::<Bn256Point>().unwrap();
45 test_mpc_circuit_with_hyrax_helper(provable_circuit);
46 }
47
48 #[ignore] #[test]
50 fn test_small_mpc_circuit_with_hyrax_layers_batched() {
51 const NUM_IRIS_4_CHUNKS: usize = 4;
52 const PARTY_IDX: usize = 0;
53 let circuit = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
54 LayerVisibility::Committed,
55 );
56 let provable_circuit = circuit.gen_hyrax_provable_circuit::<Bn256Point>().unwrap();
57 test_mpc_circuit_with_hyrax_helper(provable_circuit);
58 }
59
60 #[ignore] #[test]
62 fn test_small_mpc_circuit_with_hyrax_layers_batched_non_power_of_2() {
63 const NUM_IRIS_4_CHUNKS: usize = 3;
64 const PARTY_IDX: usize = 0;
65 let circuit = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
66 LayerVisibility::Committed,
67 );
68 let provable_circuit = circuit.gen_hyrax_provable_circuit::<Bn256Point>().unwrap();
69 test_mpc_circuit_with_hyrax_helper(provable_circuit);
70 }
71
72 #[test]
102 fn test_small_mpc_circuit_both_layers_public() {
103 const NUM_IRIS_4_CHUNKS: usize = 1;
104 const PARTY_IDX: usize = 0;
105
106 let circuit = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
107 LayerVisibility::Public,
108 );
109 let provable_circuit = circuit.gen_hyrax_provable_circuit().unwrap();
110
111 let gkr_circuit_prover_config =
113 GKRCircuitProverConfig::hyrax_compatible_runtime_optimized_default();
114 let gkr_circuit_verifier_config =
115 GKRCircuitVerifierConfig::new_from_prover_config(&gkr_circuit_prover_config, false);
116
117 perform_function_under_expected_configs!(
118 test_mpc_circuit_with_public_layers_helper,
119 &gkr_circuit_prover_config,
120 &gkr_circuit_verifier_config,
121 provable_circuit
122 );
123 }
124
125 #[ignore] #[test]
127 fn test_inversed_mpc_circuit_with_hyrax_layers() {
128 const TEST_IDX: usize = 2;
129 const NUM_IRIS_4_CHUNKS: usize = 1;
130 const PARTY_IDX: usize = 0;
131
132 let circuit = inversed_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
133 TEST_IDX,
134 LayerVisibility::Committed,
135 );
136 let provable_circuit = circuit.gen_hyrax_provable_circuit().unwrap();
137 let verifiable_circuit = circuit
138 .gen_hyrax_verifiable_circuit::<Bn256Point>()
139 .unwrap();
140
141 test_mpc_circuit_with_hyrax_helper_and_verifiable_circuit(
142 provable_circuit,
143 verifiable_circuit,
144 );
145 }
146
147 #[ignore] #[test]
149 fn test_inversed_mpc_circuit_with_hyrax_layers_batched() {
150 const TEST_IDX: usize = 2;
151 const NUM_IRIS_4_CHUNKS: usize = 4;
152 const PARTY_IDX: usize = 0;
153
154 let circuit = inversed_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
155 TEST_IDX,
156 LayerVisibility::Committed,
157 );
158 let provable_circuit = circuit.gen_hyrax_provable_circuit().unwrap();
159
160 test_mpc_circuit_with_hyrax_helper(provable_circuit);
161 }
162
163 #[ignore] #[test]
184 fn test_inversed_mpc_circuit_both_layers_public() {
185 const TEST_IDX: usize = 2;
186 const NUM_IRIS_4_CHUNKS: usize = 1;
187 const PARTY_IDX: usize = 0;
188
189 let circuit = inversed_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
190 TEST_IDX,
191 LayerVisibility::Public,
192 );
193 let provable_circuit = circuit.gen_hyrax_provable_circuit().unwrap();
194
195 test_mpc_circuit_with_public_layers_helper(provable_circuit);
196 }
197}
198
199pub fn test_mpc_circuit_with_public_layers_helper(
201 mut mpc_circuit: HyraxProvableCircuit<Bn256Point>,
202) {
203 let verifiable_circuit = mpc_circuit._gen_hyrax_verifiable_circuit();
204
205 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
206 ECTranscript::new("modulus modulus modulus modulus modulus");
207 let blinding_rng = &mut rand::thread_rng();
208 let converter: &mut VandermondeInverse<Scalar> = &mut VandermondeInverse::new();
209 let num_generators = 512;
210 let committer = PedersenCommitter::<Bn256Point>::new(
211 num_generators + 1,
212 "modulus modulus modulus modulus modulus",
213 None,
214 );
215
216 let (proof, proof_config) =
218 mpc_circuit.prove(&committer, blinding_rng, converter, &mut transcript);
219
220 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
221 ECTranscript::new("modulus modulus modulus modulus modulus");
222
223 verify_hyrax_proof(
225 &proof,
226 &verifiable_circuit,
227 &committer,
228 &mut transcript,
229 &proof_config,
230 );
231}
232
233pub fn test_mpc_circuit_with_hyrax_helper(mut mpc_circuit: HyraxProvableCircuit<Bn256Point>) {
236 let verifiable_circuit = mpc_circuit._gen_hyrax_verifiable_circuit();
237
238 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
239 ECTranscript::new("modulus modulus modulus modulus modulus");
240 let blinding_rng = &mut rand::thread_rng();
241 let converter: &mut VandermondeInverse<Scalar> = &mut VandermondeInverse::new();
242 let num_generators = 512;
243 let committer = PedersenCommitter::<Bn256Point>::new(
244 num_generators + 1,
245 "modulus modulus modulus modulus modulus",
246 None,
247 );
248
249 let gkr_circuit_prover_config =
252 GKRCircuitProverConfig::hyrax_compatible_memory_optimized_default();
253 let gkr_circuit_verifier_config =
254 GKRCircuitVerifierConfig::new_from_prover_config(&gkr_circuit_prover_config, false);
255
256 let (proof, proof_config) = perform_function_under_prover_config!(
258 HyraxProvableCircuit::prove,
259 &gkr_circuit_prover_config,
260 &mut mpc_circuit,
261 &committer,
262 blinding_rng,
263 converter,
264 &mut transcript
265 );
266
267 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
269 ECTranscript::new("modulus modulus modulus modulus modulus");
270
271 let verification_timer = start_timer!(|| "verification timer");
272 perform_function_under_verifier_config!(
273 verify_hyrax_proof,
274 &gkr_circuit_verifier_config,
275 &proof,
276 &verifiable_circuit,
277 &committer,
278 &mut transcript,
279 &proof_config
280 );
281 end_timer!(verification_timer);
282}
283
284pub fn test_mpc_circuit_with_hyrax_helper_and_verifiable_circuit(
285 mut mpc_circuit: HyraxProvableCircuit<Bn256Point>,
286 verifiable_circuit: HyraxVerifiableCircuit<Bn256Point>,
287) {
288 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
289 ECTranscript::new("modulus modulus modulus modulus modulus");
290 let blinding_rng = &mut rand::thread_rng();
291 let converter: &mut VandermondeInverse<Scalar> = &mut VandermondeInverse::new();
292 let num_generators = 512;
293 let committer = PedersenCommitter::<Bn256Point>::new(
294 num_generators + 1,
295 "modulus modulus modulus modulus modulus",
296 None,
297 );
298
299 let gkr_circuit_prover_config =
302 GKRCircuitProverConfig::hyrax_compatible_memory_optimized_default();
303 let gkr_circuit_verifier_config =
304 GKRCircuitVerifierConfig::new_from_prover_config(&gkr_circuit_prover_config, false);
305
306 let (proof, proof_config) = perform_function_under_prover_config!(
308 HyraxProvableCircuit::prove,
309 &gkr_circuit_prover_config,
310 &mut mpc_circuit,
311 &committer,
312 blinding_rng,
313 converter,
314 &mut transcript
315 );
316
317 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
319 ECTranscript::new("modulus modulus modulus modulus modulus");
320
321 let verification_timer = start_timer!(|| "verification timer");
322 perform_function_under_verifier_config!(
323 verify_hyrax_proof,
324 &gkr_circuit_verifier_config,
325 &proof,
326 &verifiable_circuit,
327 &committer,
328 &mut transcript,
329 &proof_config
330 );
331 end_timer!(verification_timer);
332}
333
334pub fn test_mpc_circuit_with_precommits_hyrax_helper(
337 mut mpc_circuit: HyraxProvableCircuit<Bn256Point>,
338 ) {
343 let verifiable_circuit = mpc_circuit._gen_hyrax_verifiable_circuit();
344
345 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
346 ECTranscript::new("modulus modulus modulus modulus modulus");
347 let blinding_rng = &mut rand::thread_rng();
348 let converter: &mut VandermondeInverse<Scalar> = &mut VandermondeInverse::new();
349 let num_generators = 512;
350 let committer = PedersenCommitter::<Bn256Point>::new(
351 num_generators + 1,
352 "modulus modulus modulus modulus modulus",
353 None,
354 );
355
356 let gkr_circuit_prover_config =
359 GKRCircuitProverConfig::hyrax_compatible_memory_optimized_default();
360 let gkr_circuit_verifier_config =
361 GKRCircuitVerifierConfig::new_from_prover_config(&gkr_circuit_prover_config, false);
362
363 let (proof, proof_config) = perform_function_under_prover_config!(
365 HyraxProvableCircuit::prove,
366 &gkr_circuit_prover_config,
367 &mut mpc_circuit,
368 &committer,
369 blinding_rng,
370 converter,
371 &mut transcript
372 );
373
374 let mut transcript: ECTranscript<Bn256Point, PoseidonSponge<Base>> =
376 ECTranscript::new("modulus modulus modulus modulus modulus");
377
378 let verification_timer = start_timer!(|| "verification timer");
379 perform_function_under_verifier_config!(
380 verify_hyrax_proof,
381 &gkr_circuit_verifier_config,
382 &proof,
383 &verifiable_circuit,
384 &committer,
385 &mut transcript,
386 &proof_config
387 );
388 end_timer!(verification_timer);
389}