Skip to content

Commit cd907f6

Browse files
authored
Observe config parameters in challenger (#1678)
* Observe config in challenger * Clippy
1 parent 6a2c1b4 commit cd907f6

File tree

8 files changed

+139
-1
lines changed

8 files changed

+139
-1
lines changed

.github/workflows/continuous-integration-workflow.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,4 @@ jobs:
152152
run: cargo fmt --all --check
153153

154154
- name: Run cargo clippy
155-
run: cargo clippy --all-features --all-targets -- -D warnings -A incomplete-features
155+
run: cargo clippy --all-features --all-targets -- -D warnings -A incomplete-features -A clippy::uninlined_format_args

plonky2/src/fri/mod.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
66
#[cfg(not(feature = "std"))]
77
use alloc::vec::Vec;
88

9+
use plonky2_field::extension::Extendable;
910
use serde::Serialize;
1011

1112
use crate::fri::reduction_strategies::FriReductionStrategy;
13+
use crate::hash::hash_types::RichField;
14+
use crate::iop::challenger::{Challenger, RecursiveChallenger};
15+
use crate::plonk::circuit_builder::CircuitBuilder;
16+
use crate::plonk::config::{AlgebraicHasher, Hasher};
1217

1318
mod challenges;
1419
pub mod oracle;
@@ -63,6 +68,33 @@ impl FriConfig {
6368
pub const fn num_cap_elements(&self) -> usize {
6469
1 << self.cap_height
6570
}
71+
72+
/// Observe the FRI configuration parameters.
73+
pub fn observe<F: RichField, H: Hasher<F>>(&self, challenger: &mut Challenger<F, H>) {
74+
challenger.observe_element(F::from_canonical_usize(self.rate_bits));
75+
challenger.observe_element(F::from_canonical_usize(self.cap_height));
76+
challenger.observe_element(F::from_canonical_u32(self.proof_of_work_bits));
77+
challenger.observe_elements(&self.reduction_strategy.serialize());
78+
challenger.observe_element(F::from_canonical_usize(self.num_query_rounds));
79+
}
80+
81+
/// Observe the FRI configuration parameters for the recursive verifier.
82+
pub fn observe_target<F, H, const D: usize>(
83+
&self,
84+
builder: &mut CircuitBuilder<F, D>,
85+
challenger: &mut RecursiveChallenger<F, H, D>,
86+
) where
87+
F: RichField + Extendable<D>,
88+
H: AlgebraicHasher<F>,
89+
{
90+
challenger.observe_element(builder.constant(F::from_canonical_usize(self.rate_bits)));
91+
challenger.observe_element(builder.constant(F::from_canonical_usize(self.cap_height)));
92+
challenger
93+
.observe_element(builder.constant(F::from_canonical_u32(self.proof_of_work_bits)));
94+
challenger.observe_elements(&builder.constants(&self.reduction_strategy.serialize()));
95+
challenger
96+
.observe_element(builder.constant(F::from_canonical_usize(self.num_query_rounds)));
97+
}
6698
}
6799

68100
/// FRI parameters, including generated parameters which are specific to an instance size, in
@@ -109,4 +141,41 @@ impl FriParams {
109141
pub fn final_poly_len(&self) -> usize {
110142
1 << self.final_poly_bits()
111143
}
144+
145+
pub fn observe<F: RichField, H: Hasher<F>>(&self, challenger: &mut Challenger<F, H>) {
146+
self.config.observe(challenger);
147+
148+
challenger.observe_element(F::from_bool(self.hiding));
149+
challenger.observe_element(F::from_canonical_usize(self.degree_bits));
150+
challenger.observe_elements(
151+
&self
152+
.reduction_arity_bits
153+
.iter()
154+
.map(|&e| F::from_canonical_usize(e))
155+
.collect::<Vec<_>>(),
156+
);
157+
}
158+
159+
pub fn observe_target<F, H, const D: usize>(
160+
&self,
161+
builder: &mut CircuitBuilder<F, D>,
162+
challenger: &mut RecursiveChallenger<F, H, D>,
163+
) where
164+
F: RichField + Extendable<D>,
165+
H: AlgebraicHasher<F>,
166+
{
167+
self.config.observe_target(builder, challenger);
168+
169+
challenger.observe_element(builder.constant(F::from_bool(self.hiding)));
170+
challenger.observe_element(builder.constant(F::from_canonical_usize(self.degree_bits)));
171+
challenger.observe_elements(
172+
&builder.constants(
173+
&self
174+
.reduction_arity_bits
175+
.iter()
176+
.map(|&e| F::from_canonical_usize(e))
177+
.collect::<Vec<_>>(),
178+
),
179+
);
180+
}
112181
}

plonky2/src/fri/reduction_strategies.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use serde::Serialize;
66
#[cfg(feature = "timing")]
77
use web_time::Instant;
88

9+
use crate::hash::hash_types::RichField;
10+
911
/// A method for deciding what arity to use at each reduction layer.
1012
#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
1113
pub enum FriReductionStrategy {
@@ -53,6 +55,29 @@ impl FriReductionStrategy {
5355
}
5456
}
5557
}
58+
59+
pub fn serialize<F: RichField>(&self) -> Vec<F> {
60+
match self {
61+
FriReductionStrategy::Fixed(reduction_arity_bits) => core::iter::once(F::ZERO)
62+
.chain(
63+
reduction_arity_bits
64+
.iter()
65+
.map(|&x| F::from_canonical_usize(x)),
66+
)
67+
.collect(),
68+
FriReductionStrategy::ConstantArityBits(arity_bits, final_poly_bits) => {
69+
vec![
70+
F::ONE,
71+
F::from_canonical_usize(*arity_bits),
72+
F::from_canonical_usize(*final_poly_bits),
73+
]
74+
}
75+
FriReductionStrategy::MinSize(opt_max_arity_bits) => {
76+
let max_arity = opt_max_arity_bits.unwrap_or(0);
77+
vec![F::TWO, F::from_canonical_usize(max_arity)]
78+
}
79+
}
80+
}
5681
}
5782

5883
fn min_size_arity_bits(

plonky2/src/plonk/get_challenges.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ fn get_challenges<F: RichField + Extendable<D>, C: GenericConfig<D, F = F>, cons
4141
let mut challenger = Challenger::<F, C::Hasher>::new();
4242
let has_lookup = common_data.num_lookup_polys != 0;
4343

44+
// Observe the FRI config
45+
common_data.fri_params.observe(&mut challenger);
46+
4447
// Observe the instance.
4548
challenger.observe_hash::<C::Hasher>(*circuit_digest);
4649
challenger.observe_hash::<C::InnerHasher>(public_inputs_hash);
@@ -278,6 +281,11 @@ impl<F: RichField + Extendable<D>, const D: usize> CircuitBuilder<F, D> {
278281
let mut challenger = RecursiveChallenger::<F, C::Hasher, D>::new(self);
279282
let has_lookup = inner_common_data.num_lookup_polys != 0;
280283

284+
// Observe the FRI config
285+
inner_common_data
286+
.fri_params
287+
.observe_target(self, &mut challenger);
288+
281289
// Observe the instance.
282290
challenger.observe_hash(&inner_circuit_digest);
283291
challenger.observe_hash(&public_inputs_hash);

plonky2/src/plonk/prover.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ where
185185

186186
let mut challenger = Challenger::<F, C::Hasher>::new();
187187

188+
// Observe the FRI config
189+
common_data.fri_params.observe(&mut challenger);
190+
188191
// Observe the instance.
189192
challenger.observe_hash::<C::Hasher>(prover_data.circuit_digest);
190193
challenger.observe_hash::<C::InnerHasher>(public_inputs_hash);

starky/src/config.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ use plonky2::field::types::Field;
1313
use plonky2::fri::reduction_strategies::FriReductionStrategy;
1414
use plonky2::fri::{FriConfig, FriParams};
1515
use plonky2::hash::hash_types::RichField;
16+
use plonky2::iop::challenger::{Challenger, RecursiveChallenger};
17+
use plonky2::plonk::circuit_builder::CircuitBuilder;
18+
use plonky2::plonk::config::{AlgebraicHasher, Hasher};
1619

1720
/// A configuration containing the different parameters used by the STARK prover.
1821
#[derive(Clone, Debug)]
@@ -94,6 +97,29 @@ impl StarkConfig {
9497
Ok(())
9598
}
9699
}
100+
101+
/// Observes this [`StarkConfig`] for the given [`Challenger`].
102+
pub(crate) fn observe<F: RichField, H: Hasher<F>>(&self, challenger: &mut Challenger<F, H>) {
103+
challenger.observe_element(F::from_canonical_usize(self.security_bits));
104+
challenger.observe_element(F::from_canonical_usize(self.num_challenges));
105+
106+
self.fri_config.observe(challenger);
107+
}
108+
109+
/// Observes this [`StarkConfig`] for the given [`RecursiveChallenger`].
110+
pub(crate) fn observe_target<F, H, const D: usize>(
111+
&self,
112+
builder: &mut CircuitBuilder<F, D>,
113+
challenger: &mut RecursiveChallenger<F, H, D>,
114+
) where
115+
F: RichField + Extendable<D>,
116+
H: AlgebraicHasher<F>,
117+
{
118+
challenger.observe_element(builder.constant(F::from_canonical_usize(self.security_bits)));
119+
challenger.observe_element(builder.constant(F::from_canonical_usize(self.num_challenges)));
120+
121+
self.fri_config.observe_target(builder, challenger);
122+
}
97123
}
98124

99125
#[cfg(test)]

starky/src/get_challenges.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ where
4545
{
4646
let num_challenges = config.num_challenges;
4747

48+
// Observe the config
49+
config.observe(challenger);
50+
4851
if let Some(cap) = &trace_cap {
4952
challenger.observe_cap(cap);
5053
}
@@ -211,6 +214,9 @@ where
211214
{
212215
let num_challenges = config.num_challenges;
213216

217+
// Observe the config
218+
config.observe_target(builder, challenger);
219+
214220
if let Some(trace_cap) = trace_cap {
215221
challenger.observe_cap(trace_cap);
216222
}

starky/src/prover.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ where
9696
let trace_cap = trace_commitment.merkle_tree.cap.clone();
9797
let mut challenger = Challenger::new();
9898
challenger.observe_elements(public_inputs);
99+
config.observe(&mut challenger);
99100
challenger.observe_cap(&trace_cap);
100101
prove_with_commitment(
101102
&stark,

0 commit comments

Comments
 (0)