openvm_stark_backend/keygen/
types.rs1use std::sync::Arc;
5
6use derivative::Derivative;
7use p3_matrix::dense::RowMajorMatrix;
8use serde::{Deserialize, Serialize};
9
10use crate::{
11 air_builders::symbolic::SymbolicConstraintsDag,
12 config::{Com, PcsProverData, RapPartialProvingKey, StarkGenericConfig, Val},
13 interaction::RapPhaseSeqKind,
14};
15
16#[derive(Clone, Debug, Serialize, Deserialize)]
18pub struct TraceWidth {
19 pub preprocessed: Option<usize>,
20 pub cached_mains: Vec<usize>,
21 pub common_main: usize,
22 pub after_challenge: Vec<usize>,
24}
25
26impl TraceWidth {
27 pub fn main_widths(&self) -> Vec<usize> {
29 let mut ret = self.cached_mains.clone();
30 if self.common_main != 0 {
31 ret.push(self.common_main);
32 }
33 ret
34 }
35
36 pub fn main_width(&self) -> usize {
39 self.cached_mains.iter().sum::<usize>() + self.common_main
40 }
41
42 pub fn total_width(&self, ext_degree: usize) -> usize {
45 self.preprocessed.unwrap_or(0)
46 + self.main_width()
47 + self.after_challenge.iter().sum::<usize>() * ext_degree
48 }
49}
50
51#[derive(Clone, Debug, Serialize, Deserialize)]
52#[repr(C)]
53pub struct StarkVerifyingParams {
54 pub width: TraceWidth,
56 pub num_public_values: usize,
58 pub num_exposed_values_after_challenge: Vec<usize>,
60 pub num_challenges_to_sample: Vec<usize>,
62}
63
64#[derive(Clone, Serialize, Deserialize)]
68pub struct VerifierSinglePreprocessedData<Com> {
69 pub commit: Com,
71}
72
73#[derive(Clone, Serialize, Deserialize)]
75#[repr(C)]
76pub struct StarkVerifyingKey<Val, Com> {
77 pub preprocessed_data: Option<VerifierSinglePreprocessedData<Com>>,
79 pub params: StarkVerifyingParams,
81 pub symbolic_constraints: SymbolicConstraintsDag<Val>,
84 pub quotient_degree: u8,
88 pub rap_phase_seq_kind: RapPhaseSeqKind,
89}
90
91#[derive(Derivative, Serialize, Deserialize)]
96#[derivative(Clone(bound = "Com<SC>: Clone"))]
97#[serde(bound(
98 serialize = "Com<SC>: Serialize",
99 deserialize = "Com<SC>: Deserialize<'de>"
100))]
101pub struct MultiStarkVerifyingKey<SC: StarkGenericConfig> {
102 pub inner: MultiStarkVerifyingKey0<SC>,
105 pub pre_hash: Com<SC>,
108}
109
110#[derive(Derivative, Serialize, Deserialize)]
113#[derivative(Clone(bound = "Com<SC>: Clone"))]
114#[serde(bound(
115 serialize = "Com<SC>: Serialize",
116 deserialize = "Com<SC>: Deserialize<'de>"
117))]
118pub struct MultiStarkVerifyingKey0<SC: StarkGenericConfig> {
119 pub per_air: Vec<StarkVerifyingKey<Val<SC>, Com<SC>>>,
120 pub trace_height_constraints: Vec<LinearConstraint>,
121 pub log_up_pow_bits: usize,
122 pub deep_pow_bits: usize,
123}
124
125#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
126pub struct LinearConstraint {
127 pub coefficients: Vec<u32>,
128 pub threshold: u32,
129}
130
131#[derive(Serialize, Deserialize, Derivative)]
133#[derivative(Clone(bound = "Com<SC>: Clone"))]
134#[serde(bound(
135 serialize = "PcsProverData<SC>: Serialize",
136 deserialize = "PcsProverData<SC>: Deserialize<'de>"
137))]
138pub struct StarkProvingKey<SC: StarkGenericConfig> {
139 pub air_name: String,
141 pub vk: StarkVerifyingKey<Val<SC>, Com<SC>>,
143 pub preprocessed_data: Option<ProverOnlySinglePreprocessedData<SC>>,
145 pub rap_partial_pk: RapPartialProvingKey<SC>,
147}
148
149#[derive(Serialize, Deserialize, Derivative)]
154#[derivative(Clone(bound = "Com<SC>: Clone"))]
155#[serde(bound(
156 serialize = "PcsProverData<SC>: Serialize",
157 deserialize = "PcsProverData<SC>: Deserialize<'de>"
158))]
159pub struct MultiStarkProvingKey<SC: StarkGenericConfig> {
160 pub per_air: Vec<StarkProvingKey<SC>>,
161 pub trace_height_constraints: Vec<LinearConstraint>,
162 pub max_constraint_degree: usize,
164 pub log_up_pow_bits: usize,
165 pub deep_pow_bits: usize,
166 pub vk_pre_hash: Com<SC>,
168}
169
170impl<Val, Com> StarkVerifyingKey<Val, Com> {
171 pub fn num_cached_mains(&self) -> usize {
172 self.params.width.cached_mains.len()
173 }
174
175 pub fn has_common_main(&self) -> bool {
176 self.params.width.common_main != 0
177 }
178
179 pub fn has_interaction(&self) -> bool {
180 !self.symbolic_constraints.interactions.is_empty()
181 }
182}
183
184impl<SC: StarkGenericConfig> MultiStarkProvingKey<SC> {
185 pub fn get_vk(&self) -> MultiStarkVerifyingKey<SC> {
186 MultiStarkVerifyingKey {
187 inner: self.get_vk0(),
188 pre_hash: self.vk_pre_hash.clone(),
189 }
190 }
191
192 fn get_vk0(&self) -> MultiStarkVerifyingKey0<SC> {
193 MultiStarkVerifyingKey0 {
194 per_air: self.per_air.iter().map(|pk| pk.vk.clone()).collect(),
195 trace_height_constraints: self.trace_height_constraints.clone(),
196 log_up_pow_bits: self.log_up_pow_bits,
197 deep_pow_bits: self.deep_pow_bits,
198 }
199 }
200}
201impl<SC: StarkGenericConfig> MultiStarkVerifyingKey<SC> {
202 pub fn num_challenges_per_phase(&self) -> Vec<usize> {
203 self.full_view().num_challenges_per_phase()
204 }
205
206 pub fn main_widths(&self) -> Vec<usize> {
207 self.full_view().main_widths()
208 }
209
210 pub fn total_widths(&self) -> Vec<usize> {
211 self.full_view().total_widths::<SC::Challenge>()
212 }
213
214 pub fn num_interactions(&self) -> Vec<usize> {
215 self.full_view().num_interactions()
216 }
217}
218
219#[derive(Serialize, Deserialize, Derivative)]
222#[derivative(Clone(bound = "Com<SC>: Clone"))]
223#[serde(bound(
224 serialize = "PcsProverData<SC>: Serialize",
225 deserialize = "PcsProverData<SC>: Deserialize<'de>"
226))]
227pub struct ProverOnlySinglePreprocessedData<SC: StarkGenericConfig> {
228 pub trace: Arc<RowMajorMatrix<Val<SC>>>,
230 pub data: Arc<PcsProverData<SC>>,
232}