frontend/hyrax_worldcoin_mpc/
test_worldcoin_mpc.rs

1use 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// TODO: Make sure the descriptions of the tests match what they actually do!!
16
17#[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] // takes a long time to run!
37    #[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] // takes a long time to run!
49    #[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] // takes a long time to run!
61    #[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    /*
73    #[ignore] // takes a long time to run!
74    #[test]
75    fn test_small_mpc_circuit_with_precommits_hyrax_layers_batched_non_power_of_2() {
76        const NUM_IRIS_4_CHUNKS: usize = 3;
77        const PARTY_IDX: usize = 0;
78        let circuit = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>();
79        let provable_circuit = circuit.finalize_hyrax::<Bn256Point>().unwrap();
80        test_mpc_circuit_with_precommits_hyrax_helper(provable_circuit);
81    }
82    */
83
84    /*
85    #[ignore] // takes a long time to run!
86    #[test]
87    fn test_small_mpc_circuit_with_precommits_hyrax_layers_batched_non_power_of_2_all_3_parties() {
88        const NUM_IRIS_4_CHUNKS: usize = 3;
89        // party 0
90        let (desc, inputs) = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, 0>();
91        test_mpc_circuit_with_precommits_hyrax_helper(desc, inputs);
92        // party 1
93        let (desc, inputs) = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, 1>();
94        test_mpc_circuit_with_precommits_hyrax_helper(desc, inputs);
95        // party 2
96        let (desc, inputs) = small_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, 2>();
97        test_mpc_circuit_with_precommits_hyrax_helper(desc, inputs);
98    }
99    */
100
101    #[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        // --- Create GKR circuit prover + verifier configs which work with Hyrax ---
112        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] // takes a long time to run!
126    #[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] // takes a long time to run!
148    #[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    // Non-powers of two currently fail.
164    /*
165    #[ignore] // takes a long time to run!
166    #[test]
167    fn test_inversed_mpc_circuit_with_hyrax_layers_batched_non_power_of_2() {
168        const TEST_IDX: usize = 2;
169        const NUM_IRIS_4_CHUNKS: usize = 3;
170        const PARTY_IDX: usize = 0;
171
172        let circuit = inversed_circuit_description_and_inputs::<NUM_IRIS_4_CHUNKS, PARTY_IDX>(
173            TEST_IDX,
174            LayerVisibility::Committed,
175        );
176        let provable_circuit = circuit.finalize_hyrax().unwrap();
177
178        test_mpc_circuit_with_hyrax_helper(provable_circuit);
179    }
180    */
181
182    #[ignore] // takes a long time to run!
183    #[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
199/// Helper function for testing an Shamir's secret sharing circuit with a public input layer.
200pub 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    // --- Compute actual Hyrax proof ---
217    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.
224    verify_hyrax_proof(
225        &proof,
226        &verifiable_circuit,
227        &committer,
228        &mut transcript,
229        &proof_config,
230    );
231}
232
233/// Helper function for testing an Shamir's secret sharing circuit with Hyrax input
234/// layers for the private data.
235pub 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    // Prove.
250    // --- Create GKR circuit prover + verifier configs which work with Hyrax ---
251    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    // --- Compute actual Hyrax proof ---
257    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    // Verify.
268    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    // Prove.
300    // --- Create GKR circuit prover + verifier configs which work with Hyrax ---
301    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    // --- Compute actual Hyrax proof ---
307    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    // Verify.
318    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
334/// Helper function for testing an Shamir's secret sharing circuit with Hyrax input
335/// layers for the private data.
336pub fn test_mpc_circuit_with_precommits_hyrax_helper(
337    mut mpc_circuit: HyraxProvableCircuit<Bn256Point>,
338    /*
339    mpc_circuit_desc: MPCCircuitDescription<Scalar>,
340    inputs: HashMap<LayerId, MultilinearExtension<Scalar>>,
341    */
342) {
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    // Prove.
357    // --- Create GKR circuit prover + verifier configs which work with Hyrax ---
358    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    // --- Compute actual Hyrax proof ---
364    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    // Verify.
375    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}