1use ark_ff::{One, Zero};
2use mina_curves::pasta::{Fp, Fq};
3
4use super::{
5 field::Boolean,
6 step::{Basic, FeatureFlags, ForStep, ForStepKind, OptFlag},
7 transaction::CircuitPlonkVerificationKeyEvals,
8 wrap::{Domain, Domains},
9};
10
11pub trait ProofConstants {
12 const PRIMARY_LEN: usize;
14 const AUX_LEN: usize;
16 const PREVIOUS_CHALLENGES: usize;
17 const ROWS: usize;
18}
19
20pub struct StepTransactionProof {}
21pub struct WrapTransactionProof {}
22
23pub struct StepBlockProof {}
24pub struct WrapBlockProof {}
25
26pub struct StepMergeProof {}
27pub struct WrapMergeProof {}
28
29pub struct StepZkappProvedProof {}
30pub struct StepZkappOptSignedProof {}
31pub struct StepZkappOptSignedOptSignedProof {}
32pub struct WrapZkappProof {}
34pub struct WrapZkappProvedProof {}
36pub struct WrapZkappOptSignedProof {}
37
38impl ProofConstants for StepZkappOptSignedOptSignedProof {
39 const PRIMARY_LEN: usize = 67;
40 const AUX_LEN: usize = 104914;
41 const PREVIOUS_CHALLENGES: usize = 0;
42 const ROWS: usize = 18655;
43}
44
45impl ProofConstants for StepZkappOptSignedProof {
46 const PRIMARY_LEN: usize = 67;
47 const AUX_LEN: usize = 71842;
48 const PREVIOUS_CHALLENGES: usize = 0;
49 const ROWS: usize = 11332;
50}
51
52impl ProofConstants for StepZkappProvedProof {
53 const PRIMARY_LEN: usize = 67;
54 const AUX_LEN: usize = 210350;
55 const PREVIOUS_CHALLENGES: usize = 1;
56 const ROWS: usize = 20023;
57}
58
59impl ProofConstants for WrapZkappProof {
61 const PRIMARY_LEN: usize = WrapTransactionProof::PRIMARY_LEN;
62 const AUX_LEN: usize = WrapTransactionProof::AUX_LEN;
63 const PREVIOUS_CHALLENGES: usize = WrapTransactionProof::PREVIOUS_CHALLENGES;
64 const ROWS: usize = WrapTransactionProof::ROWS;
65}
66
67impl ProofConstants for WrapZkappProvedProof {
69 const PRIMARY_LEN: usize = WrapTransactionProof::PRIMARY_LEN;
70 const AUX_LEN: usize = WrapTransactionProof::AUX_LEN;
71 const PREVIOUS_CHALLENGES: usize = WrapTransactionProof::PREVIOUS_CHALLENGES;
72 const ROWS: usize = WrapTransactionProof::ROWS;
73}
74
75impl ProofConstants for WrapZkappOptSignedProof {
77 const PRIMARY_LEN: usize = WrapTransactionProof::PRIMARY_LEN;
78 const AUX_LEN: usize = WrapTransactionProof::AUX_LEN;
79 const PREVIOUS_CHALLENGES: usize = WrapTransactionProof::PREVIOUS_CHALLENGES;
80 const ROWS: usize = WrapTransactionProof::ROWS;
81}
82
83impl ProofConstants for StepTransactionProof {
84 const PRIMARY_LEN: usize = 67;
85 const AUX_LEN: usize = 94478;
86 const PREVIOUS_CHALLENGES: usize = 0;
87 const ROWS: usize = 17806;
88}
89
90impl ProofConstants for WrapTransactionProof {
91 const PRIMARY_LEN: usize = 40;
92 const AUX_LEN: usize = 179491;
93 const PREVIOUS_CHALLENGES: usize = 2;
94 const ROWS: usize = 15122;
95}
96
97impl ProofConstants for WrapMergeProof {
99 const PRIMARY_LEN: usize = WrapTransactionProof::PRIMARY_LEN;
100 const AUX_LEN: usize = WrapTransactionProof::AUX_LEN;
101 const PREVIOUS_CHALLENGES: usize = WrapTransactionProof::PREVIOUS_CHALLENGES;
102 const ROWS: usize = WrapTransactionProof::ROWS;
103}
104
105impl ProofConstants for WrapBlockProof {
106 const PRIMARY_LEN: usize = 40;
107 const AUX_LEN: usize = 179208;
108 const PREVIOUS_CHALLENGES: usize = 2;
109 const ROWS: usize = 14657;
110}
111
112impl ProofConstants for StepMergeProof {
113 const PRIMARY_LEN: usize = 67;
114 const AUX_LEN: usize = 352469;
115 const PREVIOUS_CHALLENGES: usize = 2;
116 const ROWS: usize = 29010;
117}
118
119impl ProofConstants for StepBlockProof {
120 const PRIMARY_LEN: usize = 67;
121 const AUX_LEN: usize = 338873;
122 const PREVIOUS_CHALLENGES: usize = 2;
123 const ROWS: usize = 34797;
124}
125
126pub trait ForWrapData {
127 fn wrap_data() -> WrapData;
128}
129
130#[derive(Debug)]
131pub struct WrapData {
132 pub which_index: u64,
133 pub pi_branches: u64,
134 pub step_widths: Box<[u64]>, pub step_domains: Box<[Domains]>, pub wrap_domain_indices: Box<[Fq; 2]>,
137}
138
139impl ForWrapData for WrapTransactionProof {
140 fn wrap_data() -> WrapData {
141 WrapData {
142 which_index: 0,
143 pi_branches: 5,
144 step_widths: default_step_widths(),
145 step_domains: default_step_domains(),
146 wrap_domain_indices: default_wrap_domain_indices(),
147 }
148 }
149}
150
151impl ForWrapData for WrapZkappProof {
152 fn wrap_data() -> WrapData {
153 WrapData {
154 which_index: 2,
155 pi_branches: 5,
156 step_widths: default_step_widths(),
157 step_domains: default_step_domains(),
158 wrap_domain_indices: default_wrap_domain_indices(),
159 }
160 }
161}
162
163impl ForWrapData for WrapZkappProvedProof {
164 fn wrap_data() -> WrapData {
165 WrapData {
166 which_index: 4,
167 pi_branches: 5,
168 step_widths: default_step_widths(),
169 step_domains: default_step_domains(),
170 wrap_domain_indices: Box::new([Fq::one(), Fq::zero()]),
171 }
172 }
173}
174
175impl ForWrapData for WrapZkappOptSignedProof {
176 fn wrap_data() -> WrapData {
177 WrapData {
178 which_index: 3,
179 pi_branches: 5,
180 step_widths: default_step_widths(),
181 step_domains: default_step_domains(),
182 wrap_domain_indices: default_wrap_domain_indices(),
183 }
184 }
185}
186
187impl ForWrapData for WrapBlockProof {
188 fn wrap_data() -> WrapData {
189 WrapData {
190 which_index: 0,
191 pi_branches: 1,
192 step_widths: Box::new([2]),
193 step_domains: Box::new([Domains {
194 h: Domain::Pow2RootsOfUnity(16),
195 }]),
196 wrap_domain_indices: default_wrap_domain_indices(),
197 }
198 }
199}
200
201impl ForWrapData for WrapMergeProof {
202 fn wrap_data() -> WrapData {
203 WrapData {
204 which_index: 1,
205 pi_branches: 5,
206 step_widths: default_step_widths(),
207 step_domains: default_step_domains(),
208 wrap_domain_indices: default_wrap_domain_indices(),
209 }
210 }
211}
212
213fn default_step_domains() -> Box<[Domains]> {
214 Box::new([
215 Domains {
216 h: Domain::Pow2RootsOfUnity(15),
217 },
218 Domains {
219 h: Domain::Pow2RootsOfUnity(15),
220 },
221 Domains {
222 h: Domain::Pow2RootsOfUnity(15),
223 },
224 Domains {
225 h: Domain::Pow2RootsOfUnity(14),
226 },
227 Domains {
228 h: Domain::Pow2RootsOfUnity(15),
229 },
230 ])
231}
232
233fn default_wrap_domain_indices() -> Box<[Fq; 2]> {
234 Box::new([Fq::one(), Fq::one()])
235}
236
237fn default_step_widths() -> Box<[u64]> {
238 Box::new([0, 2, 0, 0, 1])
239}
240
241pub fn make_step_transaction_data(wrap_key: &CircuitPlonkVerificationKeyEvals<Fp>) -> ForStep {
242 let basic = Basic {
243 proof_verifieds: vec![0, 2, 0, 0, 1],
244 wrap_domain: Domains {
245 h: Domain::Pow2RootsOfUnity(14),
246 },
247 step_domains: default_step_domains(),
248 feature_flags: FeatureFlags {
249 range_check0: OptFlag::No,
250 range_check1: OptFlag::No,
251 foreign_field_add: OptFlag::No,
252 foreign_field_mul: OptFlag::No,
253 xor: OptFlag::No,
254 rot: OptFlag::No,
255 lookup: OptFlag::No,
256 runtime_tables: OptFlag::No,
257 },
258 };
259
260 let self_branches = 5;
261 let max_proofs_verified = 2;
262 let self_data = ForStep {
263 branches: self_branches,
264 max_proofs_verified,
265 proof_verifieds: ForStepKind::Known(
266 basic
267 .proof_verifieds
268 .iter()
269 .copied()
270 .map(Fp::from)
271 .collect(),
272 ),
273 public_input: (),
274 wrap_key: wrap_key.clone(), wrap_domain: ForStepKind::Known(basic.wrap_domain.h),
276 step_domains: ForStepKind::Known(basic.step_domains),
277 feature_flags: basic.feature_flags,
278 num_chunks: 1,
279 zk_rows: 3,
280 };
281
282 self_data
283}
284
285pub fn make_step_zkapp_data(wrap_key: &CircuitPlonkVerificationKeyEvals<Fp>) -> ForStep {
287 let basic = Basic {
288 proof_verifieds: vec![0, 2, 0, 0, 1],
289 wrap_domain: Domains {
290 h: Domain::Pow2RootsOfUnity(15),
291 },
292 step_domains: default_step_domains(),
293 feature_flags: FeatureFlags {
294 range_check0: OptFlag::Maybe,
295 range_check1: OptFlag::Maybe,
296 foreign_field_add: OptFlag::Maybe,
297 foreign_field_mul: OptFlag::Maybe,
298 xor: OptFlag::Maybe,
299 rot: OptFlag::Maybe,
300 lookup: OptFlag::Maybe,
301 runtime_tables: OptFlag::Maybe,
302 },
303 };
304
305 let self_branches = 5; let max_proofs_verified = 2;
307 let self_data = ForStep {
308 branches: self_branches,
309 max_proofs_verified,
310 proof_verifieds: ForStepKind::Known(
311 basic
312 .proof_verifieds
313 .iter()
314 .copied()
315 .map(Fp::from)
316 .collect(),
317 ),
318 public_input: (),
319 wrap_key: wrap_key.clone(), wrap_domain: ForStepKind::SideLoaded(Box::new([
321 Boolean::True,
322 Boolean::False,
323 Boolean::False,
324 ])),
325 step_domains: ForStepKind::SideLoaded(()),
326 feature_flags: basic.feature_flags,
327 num_chunks: 1,
328 zk_rows: 3,
329 };
330
331 self_data
332}
333
334pub fn make_step_block_data(wrap_key: &CircuitPlonkVerificationKeyEvals<Fp>) -> ForStep {
335 let basic = Basic {
336 proof_verifieds: vec![2],
337 wrap_domain: Domains {
338 h: Domain::Pow2RootsOfUnity(14),
339 },
340 step_domains: Box::new([Domains {
341 h: Domain::Pow2RootsOfUnity(16),
342 }]),
343 feature_flags: FeatureFlags {
344 range_check0: OptFlag::No,
345 range_check1: OptFlag::No,
346 foreign_field_add: OptFlag::No,
347 foreign_field_mul: OptFlag::No,
348 xor: OptFlag::No,
349 rot: OptFlag::No,
350 lookup: OptFlag::No,
351 runtime_tables: OptFlag::No,
352 },
353 };
354
355 let self_branches = 1;
356 let max_proofs_verified = 2;
357 let self_data = ForStep {
358 branches: self_branches,
359 max_proofs_verified,
360 proof_verifieds: ForStepKind::Known(
361 basic
362 .proof_verifieds
363 .iter()
364 .copied()
365 .map(Fp::from)
366 .collect(),
367 ),
368 public_input: (),
369 wrap_key: wrap_key.clone(), wrap_domain: ForStepKind::Known(basic.wrap_domain.h),
371 step_domains: ForStepKind::Known(basic.step_domains),
372 feature_flags: basic.feature_flags,
373 num_chunks: 1,
374 zk_rows: 3,
375 };
376
377 self_data
378}