frontend/zk_iriscode_ss/
test_helpers.rs

1#![allow(clippy::type_complexity)]
2use crate::layouter::builder::{Circuit, LayerVisibility};
3use crate::zk_iriscode_ss::circuits::build_iriscode_circuit_description;
4use crate::zk_iriscode_ss::data::{
5    build_iriscode_circuit_auxiliary_data, build_iriscode_circuit_data, wirings_to_reroutings,
6    IriscodeCircuitAuxData, IriscodeCircuitInputData,
7};
8use hyrax::provable_circuit::HyraxProvableCircuit;
9use ligero::ligero_structs::LigeroAuxInfo;
10use ndarray::Array2;
11use remainder::input_layer::{
12    ligero_input_layer::LigeroInputLayerDescription, InputLayerDescription,
13};
14use remainder::provable_circuit::ProvableCircuit;
15use shared_types::{Bn256Point, Field, Fr};
16
17use super::circuits::iriscode_ss_attach_input_data;
18
19use anyhow::Result;
20
21/// Helper function for `test_small_circuit_with_hyrax_layer`.
22pub fn build_ligero_layer_spec(
23    input_layer_desc: &InputLayerDescription,
24) -> LigeroInputLayerDescription<Fr> {
25    let aux = LigeroAuxInfo::<Fr>::new(
26        1 << input_layer_desc.num_vars,
27        4,       // rho_inv
28        1.0,     // ratio
29        Some(1), // maybe_num_col_opens
30    );
31    LigeroInputLayerDescription {
32        layer_id: input_layer_desc.layer_id,
33        num_vars: input_layer_desc.num_vars,
34        aux,
35    }
36}
37
38pub fn build_small_circuit_and_data<F: Field, const BASE: u64>(
39    use_committed_layers: bool,
40) -> Result<(
41    Circuit<F>,
42    IriscodeCircuitAuxData<F>,
43    IriscodeCircuitInputData<F>,
44)> {
45    // rewirings for the 2x2 identity matrix
46    let wirings = &[(0, 0, 0, 0), (0, 1, 0, 1), (1, 0, 1, 0), (1, 1, 1, 1)];
47    let reroutings = wirings_to_reroutings(wirings, 2, 2);
48    let circuit = build_iriscode_circuit_description::<F, 2, 2, 2, 1, 1, 1, BASE, 2>(
49        if use_committed_layers {
50            LayerVisibility::Committed
51        } else {
52            LayerVisibility::Public
53        },
54        vec![reroutings.clone().to_vec()],
55        reroutings,
56    )?;
57
58    let rh_multiplicand = [1, 0, 6, -1];
59    let thresholds_matrix = [1, 0, 1, 0];
60
61    let aux_data = build_iriscode_circuit_auxiliary_data::<F, 1, 1, 1, 2>(
62        &rh_multiplicand,
63        &thresholds_matrix,
64    );
65    let input_data = build_iriscode_circuit_data::<F, 2, 2, 1, 1, 1, BASE, 2>(
66        Array2::from_shape_vec((2, 2), vec![1, 2, 3, 4]).unwrap(),
67        &rh_multiplicand,
68        &thresholds_matrix,
69        vec![wirings.clone().to_vec()],
70        wirings,
71    );
72
73    Ok((circuit, aux_data, input_data))
74}
75
76fn small_circuit_with_inputs<F: Field>(use_committed_layers: bool) -> Result<Circuit<F>> {
77    const BASE: u64 = 16;
78
79    let (circuit, aux_data, input_data) =
80        build_small_circuit_and_data::<_, BASE>(use_committed_layers)?;
81
82    iriscode_ss_attach_input_data::<_, BASE>(circuit, input_data, aux_data)
83}
84
85/// Return a provable circuit description with public inputs for a trivial 2x2 identity matrix
86/// circuit.
87pub fn small_circuit_with_public_inputs() -> Result<ProvableCircuit<Fr>> {
88    let circuit = small_circuit_with_inputs(false)?;
89    circuit.gen_provable_circuit()
90}
91
92/// Return a provable circuit description with committed inputs for a trivial 2x2 identity matrix
93/// circuit.
94pub fn small_circuit_with_committed_inputs() -> Result<ProvableCircuit<Fr>> {
95    let circuit = small_circuit_with_inputs(true)?;
96    circuit.gen_provable_circuit()
97}
98
99/// Return a hyrax provable circuit description with public inputs for a trivial 2x2 identity matrix
100/// circuit.
101pub fn small_hyrax_circuit_with_public_inputs() -> Result<HyraxProvableCircuit<Bn256Point>> {
102    let circuit = small_circuit_with_inputs(false)?;
103    circuit.gen_hyrax_provable_circuit()
104}
105
106/// Return a hyrax provable circuit description with hyrax private inputs for a trivial 2x2 identity
107/// matrix circuit.
108pub fn small_hyrax_circuit_with_private_inputs() -> Result<HyraxProvableCircuit<Bn256Point>> {
109    let circuit = small_circuit_with_inputs(true)?;
110    circuit.gen_hyrax_provable_circuit()
111}