openvm_stark_backend/
config.rs

1//! [StarkGenericConfig](config::StarkGenericConfig) and associated types. Originally taken from Plonky3 under MIT license.
2
3use std::marker::PhantomData;
4
5use p3_challenger::{CanObserve, CanSample, FieldChallenger};
6use p3_commit::{Pcs, PolynomialSpace};
7use p3_field::{ExtensionField, Field};
8
9use crate::interaction::RapPhaseSeq;
10
11/// Based on [p3_uni_stark::StarkGenericConfig].
12pub trait StarkGenericConfig
13where
14    Domain<Self>: Send + Sync,
15    Com<Self>: Send + Sync,
16    PcsProof<Self>: Send + Sync,
17    PcsProverData<Self>: Send + Sync,
18    RapPhaseSeqPartialProof<Self>: Send + Sync,
19    RapPartialProvingKey<Self>: Send + Sync,
20{
21    /// The PCS used to commit to trace polynomials.
22    type Pcs: Pcs<Self::Challenge, Self::Challenger>;
23
24    /// The RAP challenge phases used to establish, e.g., that interactions are balanced.
25    type RapPhaseSeq: RapPhaseSeq<Val<Self>, Self::Challenge, Self::Challenger>;
26
27    /// The field from which most random challenges are drawn.
28    type Challenge: ExtensionField<Val<Self>> + Send + Sync;
29
30    /// The challenger (Fiat-Shamir) implementation used.
31    type Challenger: FieldChallenger<Val<Self>>
32        + CanObserve<<Self::Pcs as Pcs<Self::Challenge, Self::Challenger>>::Commitment>
33        + CanSample<Self::Challenge>;
34
35    fn pcs(&self) -> &Self::Pcs;
36
37    fn rap_phase_seq(&self) -> &Self::RapPhaseSeq;
38}
39
40pub type Val<SC> = <<<SC as StarkGenericConfig>::Pcs as Pcs<
41    <SC as StarkGenericConfig>::Challenge,
42    <SC as StarkGenericConfig>::Challenger,
43>>::Domain as PolynomialSpace>::Val;
44
45pub type Com<SC> = <<SC as StarkGenericConfig>::Pcs as Pcs<
46    <SC as StarkGenericConfig>::Challenge,
47    <SC as StarkGenericConfig>::Challenger,
48>>::Commitment;
49
50pub type PcsProverData<SC> = <<SC as StarkGenericConfig>::Pcs as Pcs<
51    <SC as StarkGenericConfig>::Challenge,
52    <SC as StarkGenericConfig>::Challenger,
53>>::ProverData;
54
55pub type PcsProof<SC> = <<SC as StarkGenericConfig>::Pcs as Pcs<
56    <SC as StarkGenericConfig>::Challenge,
57    <SC as StarkGenericConfig>::Challenger,
58>>::Proof;
59
60pub type PcsError<SC> = <<SC as StarkGenericConfig>::Pcs as Pcs<
61    <SC as StarkGenericConfig>::Challenge,
62    <SC as StarkGenericConfig>::Challenger,
63>>::Error;
64
65pub type Domain<SC> = <<SC as StarkGenericConfig>::Pcs as Pcs<
66    <SC as StarkGenericConfig>::Challenge,
67    <SC as StarkGenericConfig>::Challenger,
68>>::Domain;
69
70pub type RapPhaseSeqPartialProof<SC> = <<SC as StarkGenericConfig>::RapPhaseSeq as RapPhaseSeq<
71    Val<SC>,
72    <SC as StarkGenericConfig>::Challenge,
73    <SC as StarkGenericConfig>::Challenger,
74>>::PartialProof;
75
76pub type RapPartialProvingKey<SC> = <<SC as StarkGenericConfig>::RapPhaseSeq as RapPhaseSeq<
77    Val<SC>,
78    <SC as StarkGenericConfig>::Challenge,
79    <SC as StarkGenericConfig>::Challenger,
80>>::PartialProvingKey;
81
82pub type RapPhaseSeqError<SC> = <<SC as StarkGenericConfig>::RapPhaseSeq as RapPhaseSeq<
83    Val<SC>,
84    <SC as StarkGenericConfig>::Challenge,
85    <SC as StarkGenericConfig>::Challenger,
86>>::Error;
87
88pub type PackedVal<SC> = <Val<SC> as Field>::Packing;
89
90pub type PackedChallenge<SC> =
91    <<SC as StarkGenericConfig>::Challenge as ExtensionField<Val<SC>>>::ExtensionPacking;
92
93#[derive(Debug)]
94pub struct StarkConfig<Pcs, RapPhaseSeq, Challenge, Challenger> {
95    pcs: Pcs,
96    rap_phase: RapPhaseSeq,
97    _phantom: PhantomData<(Challenge, Challenger)>,
98}
99
100impl<Pcs, RapPhaseSeq, Challenge, Challenger> StarkConfig<Pcs, RapPhaseSeq, Challenge, Challenger> {
101    pub const fn new(pcs: Pcs, rap_phase: RapPhaseSeq) -> Self {
102        Self {
103            pcs,
104            rap_phase,
105            _phantom: PhantomData,
106        }
107    }
108}
109
110impl<Pcs, Rps, Challenge, Challenger> StarkGenericConfig
111    for StarkConfig<Pcs, Rps, Challenge, Challenger>
112where
113    Challenge: ExtensionField<<Pcs::Domain as PolynomialSpace>::Val>,
114    Pcs: p3_commit::Pcs<Challenge, Challenger>,
115    Pcs::Domain: Send + Sync,
116    Pcs::Commitment: Send + Sync,
117    Pcs::ProverData: Send + Sync,
118    Pcs::Proof: Send + Sync,
119    Rps: RapPhaseSeq<<Pcs::Domain as PolynomialSpace>::Val, Challenge, Challenger>,
120    Rps::PartialProof: Send + Sync,
121    Rps::PartialProvingKey: Send + Sync,
122    Challenger: FieldChallenger<<Pcs::Domain as PolynomialSpace>::Val>
123        + CanObserve<<Pcs as p3_commit::Pcs<Challenge, Challenger>>::Commitment>
124        + CanSample<Challenge>,
125{
126    type Pcs = Pcs;
127    type RapPhaseSeq = Rps;
128    type Challenge = Challenge;
129    type Challenger = Challenger;
130
131    fn pcs(&self) -> &Self::Pcs {
132        &self.pcs
133    }
134    fn rap_phase_seq(&self) -> &Self::RapPhaseSeq {
135        &self.rap_phase
136    }
137}
138
139pub struct UniStarkConfig<SC>(pub SC);
140
141impl<SC: StarkGenericConfig> p3_uni_stark::StarkGenericConfig for UniStarkConfig<SC> {
142    type Pcs = SC::Pcs;
143
144    type Challenge = SC::Challenge;
145
146    type Challenger = SC::Challenger;
147
148    fn pcs(&self) -> &Self::Pcs {
149        self.0.pcs()
150    }
151}