openvm_stark_backend/
config.rs
1use 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
11pub 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 type Pcs: Pcs<Self::Challenge, Self::Challenger>;
23
24 type RapPhaseSeq: RapPhaseSeq<Val<Self>, Self::Challenge, Self::Challenger>;
26
27 type Challenge: ExtensionField<Val<Self>> + Send + Sync;
29
30 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}