|
6 | 6 | #[cfg(not(feature = "std"))] |
7 | 7 | use alloc::vec::Vec; |
8 | 8 |
|
| 9 | +use plonky2_field::extension::Extendable; |
9 | 10 | use serde::Serialize; |
10 | 11 |
|
11 | 12 | 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}; |
12 | 17 |
|
13 | 18 | mod challenges; |
14 | 19 | pub mod oracle; |
@@ -63,6 +68,33 @@ impl FriConfig { |
63 | 68 | pub const fn num_cap_elements(&self) -> usize { |
64 | 69 | 1 << self.cap_height |
65 | 70 | } |
| 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 | + } |
66 | 98 | } |
67 | 99 |
|
68 | 100 | /// FRI parameters, including generated parameters which are specific to an instance size, in |
@@ -109,4 +141,41 @@ impl FriParams { |
109 | 141 | pub fn final_poly_len(&self) -> usize { |
110 | 142 | 1 << self.final_poly_bits() |
111 | 143 | } |
| 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 | + } |
112 | 181 | } |
0 commit comments