Skip to content

Commit 9b8347d

Browse files
committed
Integrate finalize_constants in the main flow.
1 parent 4be0eba commit 9b8347d

17 files changed

Lines changed: 124 additions & 100 deletions

File tree

crates/cairo_verifier/src/statement_test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ fn test_public_logup_sum() {
261261
assert_eq!(result_value, expected);
262262

263263
// Validate the circuit
264+
circuits::finalize_constants::finalize_constants(&mut context);
264265
context.check_vars_used();
265266
context.finalize_guessed_vars();
266267
context.circuit.check_yields();

crates/cairo_verifier/src/test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ fn test_verify() {
140140

141141
let proof_vars = empty_proof.guess(&mut novalue_context);
142142
verify(&mut novalue_context, &proof_vars, &config, &statement);
143+
circuits::finalize_constants::finalize_constants(&mut novalue_context);
143144
novalue_context.finalize_guessed_vars();
144145
novalue_context.check_vars_used();
145146
novalue_context.circuit.check_yields();

crates/cairo_verifier/src/verify.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use cairo_air::air::PublicData;
77
use cairo_air::flat_claims::FlatClaim;
88
use circuits::blake::HashValue;
99
use circuits::context::{Context, TraceContext};
10+
use circuits::finalize_constants::finalize_constants;
1011
use circuits::ivalue::{IValue, NoValue};
1112
use circuits::ops::Guess;
1213
use circuits_stark_verifier::constraint_eval::CircuitEval;
@@ -124,6 +125,7 @@ pub fn build_fixed_cairo_circuit(
124125

125126
let proof_vars = proof.guess(&mut context);
126127
verify(&mut context, &proof_vars, config, &statement);
128+
finalize_constants(&mut context);
127129
context.finalize_guessed_vars();
128130

129131
context
@@ -155,6 +157,7 @@ pub fn build_cairo_verifier_circuit(verifier_config: &CairoVerifierConfig) -> Co
155157

156158
let proof_vars = empty_proof(config).guess(&mut context);
157159
verify(&mut context, &proof_vars, config, &statement);
160+
finalize_constants(&mut context);
158161
context.finalize_guessed_vars();
159162
context
160163
}

crates/circuit_common/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
pub mod finalize;
22
pub mod preprocessed;
33

4+
// Re-export finalize_constants from circuits crate.
5+
pub use circuits::finalize_constants;
6+
47
// TODO(Anat): Take from somewhere stable.
58
pub const N_LANES: usize = 16;
69

crates/circuit_prover/src/prover_test.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ fn stwo_verify(
170170
#[test]
171171
fn test_prove_and_stark_verify_blake_gate_context() {
172172
let mut blake_gate_context = build_blake_gate_context();
173+
circuits::finalize_constants::finalize_constants(&mut blake_gate_context);
173174
blake_gate_context.finalize_guessed_vars();
174175
blake_gate_context.validate_circuit();
175176

@@ -186,6 +187,7 @@ fn test_prove_and_stark_verify_blake_gate_context() {
186187
#[test]
187188
fn test_prove_and_stark_verify_permutation_context() {
188189
let mut permutation_context = build_permutation_context();
190+
circuits::finalize_constants::finalize_constants(&mut permutation_context);
189191
permutation_context.finalize_guessed_vars();
190192
permutation_context.validate_circuit();
191193

@@ -202,6 +204,7 @@ fn test_prove_and_stark_verify_permutation_context() {
202204
#[test]
203205
fn test_prove_and_stark_verify_fibonacci_context() {
204206
let mut fibonacci_context = build_fibonacci_context();
207+
circuits::finalize_constants::finalize_constants(&mut fibonacci_context);
205208
fibonacci_context.finalize_guessed_vars();
206209
fibonacci_context.validate_circuit();
207210

@@ -218,6 +221,7 @@ fn test_prove_and_stark_verify_fibonacci_context() {
218221
#[test]
219222
fn test_prove_and_stark_verify_m31_to_u32_context() {
220223
let mut m31_to_u32_context = build_m31_to_u32_context();
224+
circuits::finalize_constants::finalize_constants(&mut m31_to_u32_context);
221225
m31_to_u32_context.finalize_guessed_vars();
222226
m31_to_u32_context.validate_circuit();
223227

@@ -261,11 +265,12 @@ fn circuit_verify(
261265
}
262266

263267
const FIBONACCI_CIRCUIT_PREPROCESSED_ROOT: [u32; 8] =
264-
[579827647, 460015323, 2072233139, 709693420, 371952288, 1355707807, 1645091261, 2144587918];
268+
[609397099, 1756617193, 1941377268, 2080039112, 2095406638, 3084915, 101776927, 1547274111];
265269

266270
#[test]
267271
fn test_prove_and_circuit_verify_fibonacci_context() {
268272
let mut fibonacci_context = build_fibonacci_context();
273+
circuits::finalize_constants::finalize_constants(&mut fibonacci_context);
269274
fibonacci_context.finalize_guessed_vars();
270275
fibonacci_context.validate_circuit();
271276

@@ -280,11 +285,12 @@ fn test_prove_and_circuit_verify_fibonacci_context() {
280285
}
281286

282287
const M31_TO_U32_CIRCUIT_PREPROCESSED_ROOT: [u32; 8] =
283-
[270075619, 790063164, 183255611, 43064901, 229280056, 1717043326, 341216832, 2011011748];
288+
[2057150194, 1287539556, 348840330, 1316644708, 1932016463, 1332646262, 1451210563, 700919965];
284289

285290
#[test]
286291
fn test_prove_and_circuit_verify_m31_to_u32_context() {
287292
let mut m31_to_u32_context = build_m31_to_u32_context();
293+
circuits::finalize_constants::finalize_constants(&mut m31_to_u32_context);
288294
m31_to_u32_context.finalize_guessed_vars();
289295
m31_to_u32_context.validate_circuit();
290296

crates/circuit_verifier/src/verify.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use circuits::{blake::HashValue, context::Context, ivalue::IValue, ops::Guess};
1+
use circuits::{
2+
blake::HashValue, context::Context, finalize_constants::finalize_constants, ivalue::IValue,
3+
ops::Guess,
4+
};
25
use circuits_stark_verifier::{
36
proof::{Proof, ProofConfig},
47
statement::Statement,
@@ -46,6 +49,7 @@ pub fn build_verification_circuit<Value: IValue>(
4649
let proof_vars = proof.guess(&mut context);
4750

4851
verify(&mut context, &proof_vars, &proof_config, &statement);
52+
finalize_constants(&mut context);
4953
context.finalize_guessed_vars();
5054
#[cfg(test)]
5155
context.circuit.check_yields();

crates/circuits/src/blake_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ fn test_blake(#[case] wrong_output: bool) {
4040
eq(&mut context, output.0, out0);
4141
eq(&mut context, output.1, out1);
4242

43-
assert_eq!(context.stats, Stats { blake_updates: 2, guess: 9, equals: 2, ..Stats::default() });
43+
assert_eq!(context.stats, Stats { blake_updates: 2, guess: 7, equals: 2, ..Stats::default() });
4444

45+
crate::finalize_constants::finalize_constants(&mut context);
4546
context.finalize_guessed_vars();
46-
assert_eq!(context.circuit.compute_multiplicities().0, vec![13, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2]);
4747
context.circuit.check_yields();
4848

4949
assert_eq!(context.is_circuit_valid(), !wrong_output);

crates/circuits/src/context.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use num_traits::{One, Zero};
44
use stwo::core::fields::qm31::QM31;
55

66
use crate::circuit::{Add, Circuit};
7-
use crate::ivalue::IValue;
8-
use crate::ops::guess;
7+
use crate::ivalue::{IValue, qm31_from_u32s};
98
use crate::stats::Stats;
109

1110
#[cfg(test)]
@@ -50,7 +49,7 @@ pub struct Context<Value: IValue> {
5049
///
5150
/// `None` if the set of guessed variables has already been finalized.
5251
///
53-
/// See [guess].
52+
/// See [crate::ops::guess].
5453
pub guessed_vars: Option<Vec<usize>>,
5554
/// Debug only. If true, equality is asserted when adding the `eq` gate; if false, no
5655
/// assertion is made during construction and equality can be checked later at validation.
@@ -94,7 +93,7 @@ impl<Value: IValue> Context<Value> {
9493
if let Some(var) = self.constants.get(&value) {
9594
*var
9695
} else {
97-
let var = guess(self, Value::from_qm31(value));
96+
let var = self.new_var(Value::from_qm31(value));
9897
self.constants.insert(value, var);
9998
var
10099
}
@@ -161,9 +160,11 @@ impl<Value: IValue> Default for Context<Value> {
161160
guessed_vars: Some(vec![]),
162161
assert_eq_on_eval: false,
163162
};
164-
// Register zero and one as the first constants.
163+
// Register zero, one, and u as the first constants.
165164
res.constant(QM31::zero());
166165
res.constant(QM31::one());
166+
res.constant(qm31_from_u32s(0, 0, 1, 0)); // u at idx 2
167+
167168
res
168169
}
169170
}

crates/circuits/src/context_test.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,11 @@ fn test_constants() {
1111
let c = context.constant(x);
1212
assert_eq!(a.idx, c.idx);
1313

14-
assert_eq!(context.values(), &vec![0.into(), 1.into(), x, x + x]);
14+
let u = qm31_from_u32s(0, 0, 1, 0);
15+
assert_eq!(context.values(), &vec![0.into(), 1.into(), u, x, x + x]);
1516

17+
crate::finalize_constants::finalize_constants(&mut context);
1618
context.finalize_guessed_vars();
17-
assert_eq!(
18-
format!("{:?}", context.circuit),
19-
"[0] = [0] + [0]\n[1] = [1] + [0]\n[2] = [2] + [0]\n[3] = [3] + [0]\n"
20-
);
21-
2219
context.validate_circuit();
2320
}
2421

crates/circuits/src/finalize_constants.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ mod test;
1818

1919
/// Wraps `finalize_constants_with_min_base` and calls it with a default value. The main reason
2020
/// is to make testing easier by choosing a smaller minimum base.
21-
// TODO(Leo): remove allow once integrated in the main flow.
22-
#[allow(unused)]
23-
fn finalize_constants(context: &mut Context<impl IValue>) {
21+
pub fn finalize_constants(context: &mut Context<impl IValue>) {
2422
const DEFAULT_MIN_BASE: usize = 256;
2523
finalize_constants_with_min_base(context, DEFAULT_MIN_BASE);
2624
}
@@ -45,7 +43,10 @@ fn finalize_constants(context: &mut Context<impl IValue>) {
4543
/// rebuilding them, so each distinct M31 value gets at most one yield gate.
4644
///
4745
/// `IndexMap` is used (rather than `HashMap`) so that iteration order is deterministic.
48-
fn finalize_constants_with_min_base(context: &mut Context<impl IValue>, min_base: usize) {
46+
pub(crate) fn finalize_constants_with_min_base(
47+
context: &mut Context<impl IValue>,
48+
min_base: usize,
49+
) {
4950
assert!(min_base >= 2);
5051
let mut m31_constants = IndexMap::<M31, Var>::new();
5152
let mut qm31_constants = IndexMap::<QM31, Var>::new();

0 commit comments

Comments
 (0)