openvm_stark_backend/
config.rs1use 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
12pub 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 type Pcs: Pcs<Self::Challenge, Self::Challenger>;
24
25 type RapPhaseSeq: RapPhaseSeq<Val<Self>, Self::Challenge, Self::Challenger>;
27
28 type Challenge: ExtensionField<Val<Self>> + Send + Sync;
30
31 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}