openvm_stark_backend/prover/
types.rs1use std::sync::Arc;
2
3use derivative::Derivative;
4use p3_field::Field;
5use p3_matrix::{dense::RowMajorMatrix, Matrix};
6use serde::{Deserialize, Serialize};
7
8use super::hal::ProverBackend;
9use crate::{
10 config::{Com, PcsProof, PcsProverData, RapPhaseSeqPartialProof, StarkGenericConfig, Val},
11 keygen::types::{LinearConstraint, StarkVerifyingKey},
12 proof::{AirProofData, Commitments, OpeningProof, Proof},
13};
14
15pub struct DeviceMultiStarkProvingKey<'a, PB: ProverBackend> {
17 pub(super) air_ids: Vec<usize>,
18 pub per_air: Vec<DeviceStarkProvingKey<'a, PB>>,
19 pub trace_height_constraints: Vec<LinearConstraint>,
22 pub vk_pre_hash: PB::Commitment,
23}
24
25impl<'a, PB: ProverBackend> DeviceMultiStarkProvingKey<'a, PB> {
26 pub fn new(
27 air_ids: Vec<usize>,
28 per_air: Vec<DeviceStarkProvingKey<'a, PB>>,
29 trace_height_constraints: Vec<LinearConstraint>,
30 vk_pre_hash: PB::Commitment,
31 ) -> Self {
32 assert_eq!(air_ids.len(), per_air.len());
33 Self {
34 air_ids,
35 per_air,
36 trace_height_constraints,
37 vk_pre_hash,
38 }
39 }
40}
41
42pub struct DeviceStarkProvingKey<'a, PB: ProverBackend> {
43 pub air_name: &'a str,
45 pub vk: &'a StarkVerifyingKey<PB::Val, PB::Commitment>,
46 pub preprocessed_data: Option<SingleCommitPreimage<PB::Matrix, PB::PcsData>>,
48 pub rap_partial_pk: PB::RapPartialProvingKey,
50}
51
52#[derive(Clone)]
58pub struct SingleCommitPreimage<Matrix, PcsData> {
59 pub trace: Matrix,
60 pub data: PcsData,
61 pub matrix_idx: u32,
62}
63
64#[derive(derive_new::new)]
65pub struct ProvingContext<'a, PB: ProverBackend> {
66 pub per_air: Vec<(usize, AirProvingContext<'a, PB>)>,
68}
69
70impl<'a, PB: ProverBackend> ProvingContext<'a, PB> {
71 pub fn into_air_proving_ctx_vec(self) -> Vec<AirProvingContext<'a, PB>> {
72 self.per_air.into_iter().map(|(_, x)| x).collect()
73 }
74}
75
76impl<'a, PB: ProverBackend> IntoIterator for ProvingContext<'a, PB> {
77 type Item = (usize, AirProvingContext<'a, PB>);
78 type IntoIter = std::vec::IntoIter<Self::Item>;
79
80 fn into_iter(self) -> Self::IntoIter {
81 self.per_air.into_iter()
82 }
83}
84
85pub struct AirProvingContext<'a, PB: ProverBackend> {
93 #[allow(clippy::type_complexity)]
95 pub cached_mains: Vec<(
96 PB::Commitment,
97 SingleCommitPreimage<&'a PB::Matrix, &'a PB::PcsData>,
98 )>,
99 pub common_main: Option<PB::Matrix>,
101 pub public_values: Vec<PB::Val>,
104}
105
106pub struct PairView<T, Val> {
114 pub log_trace_height: u8,
116 pub preprocessed: Option<T>,
118 pub partitioned_main: Vec<T>,
120 pub public_values: Vec<Val>,
122}
123
124pub struct RapView<T, Val, Challenge> {
138 pub pair: PairView<T, Val>,
139 pub per_phase: Vec<RapSinglePhaseView<T, Challenge>>,
142}
143
144#[derive(Clone)]
145pub struct RapSinglePhaseView<T, Challenge> {
146 pub inner: Option<T>,
148 pub challenges: Vec<Challenge>,
150 pub exposed_values: Vec<Challenge>,
153}
154
155impl<T, Challenge> Default for RapSinglePhaseView<T, Challenge> {
156 fn default() -> Self {
157 Self {
158 inner: None,
159 challenges: Vec::new(),
160 exposed_values: Vec::new(),
161 }
162 }
163}
164
165#[derive(derive_new::new)]
166pub struct ProverDataAfterRapPhases<PB: ProverBackend> {
167 pub committed_pcs_data_per_phase: Vec<(PB::Commitment, PB::PcsData)>,
171 pub rap_views_per_phase: Vec<Vec<RapSinglePhaseView<usize, PB::Challenge>>>,
175}
176
177#[derive(Serialize, Deserialize, Derivative)]
182#[serde(bound = "")]
183#[derivative(Clone(bound = ""))]
184pub struct HalProof<PB: ProverBackend> {
185 pub commitments: Commitments<PB::Commitment>,
187 pub opening: PB::OpeningProof,
189 pub per_air: Vec<AirProofData<PB::Val, PB::Challenge>>,
191 pub rap_partial_proof: PB::RapPartialProof,
193}
194
195impl<PB, SC: StarkGenericConfig> From<HalProof<PB>> for Proof<SC>
196where
197 PB: ProverBackend<Val = Val<SC>, Challenge = SC::Challenge, Commitment = Com<SC>>,
198 PB::OpeningProof: Into<OpeningProof<PcsProof<SC>, SC::Challenge>>,
199 PB::RapPartialProof: Into<Option<RapPhaseSeqPartialProof<SC>>>,
200{
201 fn from(proof: HalProof<PB>) -> Self {
202 Proof {
203 commitments: proof.commitments,
204 opening: proof.opening.into(),
205 per_air: proof.per_air,
206 rap_phase_seq_proof: proof.rap_partial_proof.into(),
207 }
208 }
209}
210
211#[derive(Derivative, derive_new::new)]
214#[derivative(Clone(bound = "Com<SC>: Clone"))]
215pub struct ProofInput<SC: StarkGenericConfig> {
216 pub per_air: Vec<(usize, AirProofInput<SC>)>,
218}
219
220#[derive(Serialize, Deserialize, Derivative)]
221#[serde(bound(
222 serialize = "PcsProverData<SC>: Serialize",
223 deserialize = "PcsProverData<SC>: Deserialize<'de>"
224))]
225#[derivative(Clone(bound = "Com<SC>: Clone"))]
226pub struct CommittedTraceData<SC: StarkGenericConfig> {
227 pub trace: Arc<RowMajorMatrix<Val<SC>>>,
228 pub commitment: Com<SC>,
229 pub pcs_data: Arc<PcsProverData<SC>>,
230}
231
232#[derive(Derivative)]
239#[derivative(Clone(bound = "Com<SC>: Clone"))]
240pub struct AirProofInput<SC: StarkGenericConfig> {
241 pub cached_mains_pdata: Vec<(Com<SC>, Arc<PcsProverData<SC>>)>,
245 pub raw: AirProofRawInput<Val<SC>>,
246}
247
248#[derive(Clone, Debug)]
250pub struct AirProofRawInput<F: Field> {
251 pub cached_mains: Vec<Arc<RowMajorMatrix<F>>>,
253 pub common_main: Option<RowMajorMatrix<F>>,
255 pub public_values: Vec<F>,
257}
258
259impl<F: Field> AirProofRawInput<F> {
260 pub fn height(&self) -> usize {
261 let mut height = None;
262 for m in self.cached_mains.iter() {
263 if let Some(h) = height {
264 assert_eq!(h, m.height());
265 } else {
266 height = Some(m.height());
267 }
268 }
269 let common_h = self.common_main.as_ref().map(|trace| trace.height());
270 if let Some(h) = height {
271 if let Some(common_h) = common_h {
272 assert_eq!(h, common_h);
273 }
274 h
275 } else {
276 common_h.unwrap_or(0)
277 }
278 }
279}