p3_uni_stark/
config.rs

1use core::marker::PhantomData;
2
3use p3_challenger::{CanObserve, CanSample, FieldChallenger};
4use p3_commit::{Pcs, PolynomialSpace};
5use p3_field::{ExtensionField, Field};
6
7pub type PcsError<SC> = <<SC as StarkGenericConfig>::Pcs as Pcs<
8    <SC as StarkGenericConfig>::Challenge,
9    <SC as StarkGenericConfig>::Challenger,
10>>::Error;
11
12pub type Domain<SC> = <<SC as StarkGenericConfig>::Pcs as Pcs<
13    <SC as StarkGenericConfig>::Challenge,
14    <SC as StarkGenericConfig>::Challenger,
15>>::Domain;
16
17pub type Val<SC> = <Domain<SC> as PolynomialSpace>::Val;
18
19pub type PackedVal<SC> = <Val<SC> as Field>::Packing;
20
21pub type PackedChallenge<SC> =
22    <<SC as StarkGenericConfig>::Challenge as ExtensionField<Val<SC>>>::ExtensionPacking;
23
24pub trait StarkGenericConfig {
25    /// The PCS used to commit to trace polynomials.
26    type Pcs: Pcs<Self::Challenge, Self::Challenger>;
27
28    /// The field from which most random challenges are drawn.
29    type Challenge: ExtensionField<Val<Self>>;
30
31    /// The challenger (Fiat-Shamir) implementation used.
32    type Challenger: FieldChallenger<Val<Self>>
33        + CanObserve<<Self::Pcs as Pcs<Self::Challenge, Self::Challenger>>::Commitment>
34        + CanSample<Self::Challenge>;
35
36    fn pcs(&self) -> &Self::Pcs;
37}
38
39#[derive(Debug)]
40pub struct StarkConfig<Pcs, Challenge, Challenger> {
41    pcs: Pcs,
42    _phantom: PhantomData<(Challenge, Challenger)>,
43}
44
45impl<Pcs, Challenge, Challenger> StarkConfig<Pcs, Challenge, Challenger> {
46    pub const fn new(pcs: Pcs) -> Self {
47        Self {
48            pcs,
49            _phantom: PhantomData,
50        }
51    }
52}
53
54impl<Pcs, Challenge, Challenger> StarkGenericConfig for StarkConfig<Pcs, Challenge, Challenger>
55where
56    Challenge: ExtensionField<<Pcs::Domain as PolynomialSpace>::Val>,
57    Pcs: p3_commit::Pcs<Challenge, Challenger>,
58    Challenger: FieldChallenger<<Pcs::Domain as PolynomialSpace>::Val>
59        + CanObserve<<Pcs as p3_commit::Pcs<Challenge, Challenger>>::Commitment>
60        + CanSample<Challenge>,
61{
62    type Pcs = Pcs;
63    type Challenge = Challenge;
64    type Challenger = Challenger;
65
66    fn pcs(&self) -> &Self::Pcs {
67        &self.pcs
68    }
69}