p3_fri/config.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
use alloc::vec::Vec;
use core::fmt::Debug;
use p3_field::Field;
use p3_matrix::Matrix;
#[derive(Debug)]
pub struct FriConfig<M> {
pub log_blowup: usize,
pub num_queries: usize,
pub proof_of_work_bits: usize,
pub mmcs: M,
}
impl<M> FriConfig<M> {
pub const fn blowup(&self) -> usize {
1 << self.log_blowup
}
/// Returns the soundness bits of this FRI instance based on the
/// [ethSTARK](https://eprint.iacr.org/2021/582) conjecture.
///
/// Certain users may instead want to look at proven soundness, a more complex calculation which
/// isn't currently supported by this crate.
pub fn conjectured_soundness_bits(&self) -> usize {
self.log_blowup * self.num_queries + self.proof_of_work_bits
}
}
/// Whereas `FriConfig` encompasses parameters the end user can set, `FriGenericConfig` is
/// set by the PCS calling FRI, and abstracts over implementation details of the PCS.
pub trait FriGenericConfig<F: Field> {
type InputProof;
type InputError: Debug;
/// We can ask FRI to sample extra query bits (LSB) for our own purposes.
/// They will be passed to our callbacks, but ignored (shifted off) by FRI.
fn extra_query_index_bits(&self) -> usize;
/// Fold a row, returning a single column.
/// Right now the input row will always be 2 columns wide,
/// but we may support higher folding arity in the future.
fn fold_row(
&self,
index: usize,
log_height: usize,
beta: F,
evals: impl Iterator<Item = F>,
) -> F;
/// Same as applying fold_row to every row, possibly faster.
fn fold_matrix<M: Matrix<F>>(&self, beta: F, m: M) -> Vec<F>;
}