Skip to content

Commit 84c7501

Browse files
shamatarrobik75
andauthored
feat: reduce number of verifier binaries (#162)
## What ❔ Define two recursive verification programs, one that verifies either base program, or recursive proofs made in unrolled circuits, and is expected to be proven in unrolled circuits, and another one that accepts recursive proofs in unrolled or unified circuits, and is expected to be proved in unified circuits ## Why ❔ Reduce number of setups/precomputations in pipelines ## Is this a breaking change? - [x] Yes - [ ] No --------- Co-authored-by: Robert Remen <[email protected]>
1 parent 361e73f commit 84c7501

26 files changed

+758
-921
lines changed

circuit_defs/prover_examples/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ precheck_satisfied = []
4343
debug_satisfiable = ["prover/debug_satisfiable"]
4444
# Print logs related to timings only.
4545
timing_logs = []
46-
46+
verifiers = ["full_statement_verifier/verifiers"]
4747

4848
default = ["timing_logs", "security_80"]
4949

circuit_defs/prover_examples/src/unrolled.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2298,6 +2298,7 @@ pub(crate) mod test {
22982298
);
22992299
}
23002300

2301+
#[cfg(feature = "verifiers")]
23012302
#[test]
23022303
fn test_verify_simple_fib() {
23032304
use setups::*;
@@ -2364,7 +2365,7 @@ pub(crate) mod test {
23642365
&families_setups,
23652366
full_statement_verifier::unrolled_proof_statement::FULL_UNSIGNED_MACHINE_UNROLLED_CIRCUITS_VERIFICATION_PARAMETERS,
23662367
(&inits_and_teardowns_setup, full_statement_verifier::unrolled_proof_statement::INITS_AND_TEARDOWNS_VERIFIER_PTR),
2367-
full_statement_verifier::BASE_LAYER_DELEGATION_CIRCUITS_VERIFICATION_PARAMETERS,
2368+
full_statement_verifier::imports::BASE_LAYER_DELEGATION_CIRCUITS_VERIFICATION_PARAMETERS,
23682369
)
23692370
};
23702371
})

execution_utils/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ clap = { workspace = true }
2020
serde = { workspace = true }
2121
sha3 = { workspace = true }
2222
serde_json = "*"
23-
full_statement_verifier = { path = "../full_statement_verifier", optional = true }
23+
full_statement_verifier = { path = "../full_statement_verifier", default-features = false }
2424
prover_examples = { path = "../circuit_defs/prover_examples", optional = true }
2525

2626
[dev-dependencies]
@@ -29,8 +29,8 @@ prover_examples = { path = "../circuit_defs/prover_examples" }
2929
full_statement_verifier = { path = "../full_statement_verifier" }
3030

3131
[features]
32-
verifier_80 = ["full_statement_verifier", "full_statement_verifier/security_80", "full_statement_verifier/replace_csr"]
33-
verifier_100 = ["full_statement_verifier", "full_statement_verifier/security_100", "full_statement_verifier/replace_csr"]
32+
verifier_80 = ["full_statement_verifier/verifiers", "full_statement_verifier/security_80", "full_statement_verifier/replace_csr"]
33+
verifier_100 = ["full_statement_verifier/verifiers", "full_statement_verifier/security_100", "full_statement_verifier/replace_csr"]
3434
prover = ["prover_examples"]
3535
verifier_binaries = []
3636
# Will evaluate quotient on main domain for debug

execution_utils/src/unified_circuit.rs

Lines changed: 35 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -60,196 +60,54 @@ pub fn compute_unified_setup_for_machine_configuration<C: MachineConfig>(
6060
)
6161
}
6262

63-
// #[cfg(any(feature = "verifier_80", feature = "verifier_100"))]
64-
// pub fn verify_unrolled_base_layer_for_machine_configuration<C: MachineConfig>(
65-
// proof: &UnrolledProgramProof,
66-
// setup: &UnrolledProgramSetup,
67-
// ) -> Result<[u32; 16], ()> {
68-
// for (k, v) in proof.circuit_families_proofs.iter() {
69-
// println!("{} proofs for family {}", v.len(), k);
70-
// }
71-
72-
// let responses = proof.flatten_into_responses(C::ALLOWED_DELEGATION_CSRS);
73-
74-
// let params = if setups::is_default_machine_configuration::<C>() {
75-
// full_statement_verifier::unrolled_proof_statement::FULL_MACHINE_UNROLLED_CIRCUITS_VERIFICATION_PARAMETERS
76-
// } else if setups::is_machine_without_signed_mul_div_configuration::<C>() {
77-
// full_statement_verifier::unrolled_proof_statement::FULL_UNSIGNED_MACHINE_UNROLLED_CIRCUITS_VERIFICATION_PARAMETERS
78-
// } else if setups::is_reduced_machine_configuration::<C>() {
79-
// full_statement_verifier::unrolled_proof_statement::RECURSION_WORD_ONLY_UNSIGNED_MACHINE_UNROLLED_CIRCUITS_VERIFICATION_PARAMETERS
80-
// } else {
81-
// panic!("Unknown configuration {:?}", std::any::type_name::<C>());
82-
// };
83-
84-
// println!("Running the verifier");
85-
86-
// let families_setups: Vec<_> = setup
87-
// .circuit_families_setups
88-
// .iter()
89-
// .map(|el| *el.1)
90-
// .collect();
91-
// let inits_and_teardowns_setup = setup.inits_and_teardowns_setup;
92-
93-
// let result = std::thread::Builder::new()
94-
// .name("verifier thread".to_string())
95-
// .stack_size(1 << 27)
96-
// .spawn(move || {
97-
98-
// let families_setups_refs: Vec<_> = families_setups.iter().map(|el| el).collect();
99-
// let it = responses.into_iter();
100-
// prover::nd_source_std::set_iterator(it);
101-
102-
// #[allow(invalid_value)]
103-
// let regs = unsafe {
104-
// full_statement_verifier::unrolled_proof_statement::verify_full_statement_for_unrolled_circuits::<true, { setups::inits_and_teardowns::NUM_INIT_AND_TEARDOWN_SETS }>(
105-
// &families_setups_refs,
106-
// params,
107-
// (&inits_and_teardowns_setup, full_statement_verifier::unrolled_proof_statement::INITS_AND_TEARDOWNS_VERIFIER_PTR),
108-
// full_statement_verifier::BASE_LAYER_DELEGATION_CIRCUITS_VERIFICATION_PARAMETERS,
109-
// )
110-
// };
111-
112-
// regs
113-
// })
114-
// .expect("must spawn verifier thread").join();
115-
116-
// result.map_err(|_| ())
117-
// }
118-
119-
// #[cfg(any(feature = "verifier_80", feature = "verifier_100"))]
120-
// pub fn verify_unrolled_base_layer_via_full_statement_verifier(
121-
// proof: &UnrolledProgramProof,
122-
// setup: &UnrolledProgramSetup,
123-
// ) -> Result<[u32; 16], ()> {
124-
// for (k, v) in proof.circuit_families_proofs.iter() {
125-
// println!("{} proofs for family {}", v.len(), k);
126-
// }
127-
128-
// let mut responses = setup.flatten_for_recursion();
129-
// responses.extend(proof.flatten_into_responses(&[
130-
// common_constants::delegation_types::blake2s_with_control::BLAKE2S_DELEGATION_CSR_REGISTER,
131-
// common_constants::delegation_types::bigint_with_control::BIGINT_OPS_WITH_CONTROL_CSR_REGISTER,
132-
// common_constants::delegation_types::keccak_special5::KECCAK_SPECIAL5_CSR_REGISTER,
133-
// ]));
134-
135-
// println!("Running the verifier");
136-
137-
// let result = std::thread::Builder::new()
138-
// .name("verifier thread".to_string())
139-
// .stack_size(1 << 27)
140-
// .spawn(move || {
141-
// let it = responses.into_iter();
142-
// prover::nd_source_std::set_iterator(it);
143-
144-
// #[allow(invalid_value)]
145-
// let regs = unsafe {
146-
// full_statement_verifier::unrolled_proof_statement::verify_unrolled_base_layer()
147-
// };
148-
149-
// regs
150-
// })
151-
// .expect("must spawn verifier thread")
152-
// .join();
153-
154-
// result.map_err(|_| ())
155-
// }
156-
157-
#[cfg(any(feature = "verifier_80", feature = "verifier_100"))]
158-
pub fn verify_unified_recursion_layer_for_machine_configuration<C: MachineConfig>(
63+
pub fn flatten_proof_into_responses_for_unified_recursion(
15964
proof: &UnrolledProgramProof,
16065
setup: &UnrolledProgramSetup,
16166
compiled_layouts: &CompiledCircuitsSet,
162-
) -> Result<[u32; 16], ()> {
163-
use crate::unified_circuit::common_constants::REDUCED_MACHINE_CIRCUIT_FAMILY_IDX;
164-
assert_eq!(setup.circuit_families_setups.len(), 1);
165-
assert!(setup
166-
.circuit_families_setups
167-
.contains_key(&REDUCED_MACHINE_CIRCUIT_FAMILY_IDX));
168-
169-
assert_eq!(proof.circuit_families_proofs.len(), 1);
170-
assert!(proof.inits_and_teardowns_proofs.is_empty());
171-
assert!(proof.circuit_families_proofs[&REDUCED_MACHINE_CIRCUIT_FAMILY_IDX].len() > 0);
172-
173-
for (k, v) in proof.circuit_families_proofs.iter() {
174-
println!("{} proofs for family {}", v.len(), k);
175-
}
176-
177-
let responses = proof.flatten_into_responses(C::ALLOWED_DELEGATION_CSRS, compiled_layouts);
178-
179-
// let params = if setups::is_default_machine_configuration::<C>() {
180-
// panic!(
181-
// "Trying to use configuration {:?} at recursion layer",
182-
// std::any::type_name::<C>()
183-
// );
184-
// } else if setups::is_machine_without_signed_mul_div_configuration::<C>() {
185-
// panic!(
186-
// "Trying to use configuration {:?} at recursion layer",
187-
// std::any::type_name::<C>()
188-
// );
189-
// } else if setups::is_reduced_machine_configuration::<C>() {
190-
// full_statement_verifier::unrolled_proof_statement::RECURSION_WORD_ONLY_UNSIGNED_MACHINE_UNROLLED_CIRCUITS_VERIFICATION_PARAMETERS
191-
// } else {
192-
// panic!("Unknown configuration {:?}", std::any::type_name::<C>());
193-
// };
194-
195-
println!("Running the verifier");
196-
197-
let families_setups: Vec<_> = setup
198-
.circuit_families_setups
199-
.iter()
200-
.map(|el| *el.1)
201-
.collect();
202-
203-
let result = std::thread::Builder::new()
204-
.name("verifier thread".to_string())
205-
.stack_size(1 << 27)
206-
.spawn(move || {
67+
input_is_unrolled: bool,
68+
) -> Vec<u32> {
69+
let mut responses = vec![];
70+
let op = if input_is_unrolled {
71+
full_statement_verifier::definitions::OP_VERIFY_UNROLLED_RECURSION_LAYER_IN_UNIFIED_CIRCUIT
72+
} else {
73+
use crate::unified_circuit::common_constants::REDUCED_MACHINE_CIRCUIT_FAMILY_IDX;
74+
assert_eq!(setup.circuit_families_setups.len(), 1);
75+
assert!(setup
76+
.circuit_families_setups
77+
.contains_key(&REDUCED_MACHINE_CIRCUIT_FAMILY_IDX));
78+
79+
assert_eq!(proof.circuit_families_proofs.len(), 1);
80+
assert!(proof.inits_and_teardowns_proofs.is_empty());
81+
assert!(proof.circuit_families_proofs[&REDUCED_MACHINE_CIRCUIT_FAMILY_IDX].len() > 0);
82+
83+
full_statement_verifier::definitions::OP_VERIFY_UNIFIED_RECURSION_LAYER_IN_UNIFIED_CIRCUIT
84+
};
85+
responses.push(op);
86+
responses.extend(setup.flatten_for_recursion());
87+
responses.extend(proof.flatten_into_responses(&[
88+
common_constants::delegation_types::blake2s_with_control::BLAKE2S_DELEGATION_CSR_REGISTER,
89+
], compiled_layouts));
20790

208-
let families_setups_refs: Vec<_> = families_setups.iter().map(|el| el).collect();
209-
let it = responses.into_iter();
210-
prover::nd_source_std::set_iterator(it);
211-
212-
#[allow(invalid_value)]
213-
let regs = unsafe {
214-
full_statement_verifier::unified_circuit_statement::verify_unified_circuit_statement::<false>(
215-
&families_setups_refs[0],
216-
full_statement_verifier::unified_circuit_statement::REDUCED_UNIFIED_CIRCUIT_CAPACITY,
217-
full_statement_verifier::unified_circuit_statement::REDUCED_UNIFIED_CIRCUIT_VERIFIER_PTR,
218-
full_statement_verifier::BASE_LAYER_DELEGATION_CIRCUITS_VERIFICATION_PARAMETERS,
219-
)
220-
};
221-
222-
regs
223-
})
224-
.expect("must spawn verifier thread").join();
225-
226-
result.map_err(|_| ())
91+
responses
22792
}
22893

22994
#[cfg(any(feature = "verifier_80", feature = "verifier_100"))]
230-
pub fn verify_unrolled_recursion_layer_via_full_statement_verifier(
95+
pub fn verify_proof_in_unified_layer(
23196
proof: &UnrolledProgramProof,
23297
setup: &UnrolledProgramSetup,
23398
compiled_layouts: &CompiledCircuitsSet,
99+
input_is_unrolled: bool,
234100
) -> Result<[u32; 16], ()> {
235-
use crate::unified_circuit::common_constants::REDUCED_MACHINE_CIRCUIT_FAMILY_IDX;
236-
assert_eq!(setup.circuit_families_setups.len(), 1);
237-
assert!(setup
238-
.circuit_families_setups
239-
.contains_key(&REDUCED_MACHINE_CIRCUIT_FAMILY_IDX));
240-
241-
assert_eq!(proof.circuit_families_proofs.len(), 1);
242-
assert!(proof.inits_and_teardowns_proofs.is_empty());
243-
assert!(proof.circuit_families_proofs[&REDUCED_MACHINE_CIRCUIT_FAMILY_IDX].len() > 0);
244-
245101
for (k, v) in proof.circuit_families_proofs.iter() {
246102
println!("{} proofs for family {}", v.len(), k);
247103
}
248104

249-
let mut responses = setup.flatten_unified_for_recursion();
250-
responses.extend(proof.flatten_into_responses(&[
251-
common_constants::delegation_types::blake2s_with_control::BLAKE2S_DELEGATION_CSR_REGISTER,
252-
], compiled_layouts));
105+
let mut responses = flatten_proof_into_responses_for_unified_recursion(
106+
proof,
107+
setup,
108+
compiled_layouts,
109+
input_is_unrolled,
110+
);
253111

254112
println!("Running the verifier");
255113

@@ -259,10 +117,7 @@ pub fn verify_unrolled_recursion_layer_via_full_statement_verifier(
259117
let it = responses.into_iter();
260118
prover::nd_source_std::set_iterator(it);
261119

262-
#[allow(invalid_value)]
263-
let regs = unsafe {
264-
full_statement_verifier::unified_circuit_statement::verify_unified_circuit_recursion_layer()
265-
};
120+
let regs = full_statement_verifier::unified_circuit_statement::verify_unrolled_or_unified_circuit_recursion_layer();
266121

267122
regs
268123
}).map_err(|_| ());
@@ -279,7 +134,7 @@ pub fn verify_unrolled_recursion_layer_via_full_statement_verifier(
279134
let it = responses.into_iter();
280135
prover::nd_source_std::set_iterator(it);
281136

282-
let regs = full_statement_verifier::unified_circuit_statement::verify_unified_circuit_recursion_layer();
137+
let regs = full_statement_verifier::unified_circuit_statement::verify_unrolled_or_unified_circuit_recursion_layer();
283138

284139
regs
285140
})

0 commit comments

Comments
 (0)