openvm_stark_backend/
config.rs

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