Skip to content

Commit 45ecf1a

Browse files
authored
Merge pull request #774 from openmina/fix-verif
Fix zkapp verification with feature flags
2 parents 216764f + 52216fa commit 45ecf1a

File tree

4 files changed

+320
-113
lines changed

4 files changed

+320
-113
lines changed

ledger/src/proofs/step.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
prepared_statement::{DeferredValues, PreparedStatement, ProofState},
99
},
1010
unfinalized::dummy_ipa_step_challenges_computed,
11-
util::proof_evaluation_to_list,
11+
util::proof_evaluation_to_absorption_sequence,
1212
verifiers::wrap_domains,
1313
wrap::{
1414
create_oracle_with_public_input, dummy_ipa_wrap_sg, wrap_verifier, Domain,
@@ -2002,7 +2002,7 @@ pub fn expand_deferred(params: ExpandDeferredParams) -> Result<DeferredValues<Fp
20022002
}
20032003
};
20042004

2005-
let xs = proof_evaluation_to_list(&evals.evals.evals);
2005+
let xs = proof_evaluation_to_absorption_sequence(&evals.evals.evals);
20062006
let (x1, x2) = &evals.evals.public_input;
20072007

20082008
let old_bulletproof_challenges: Vec<_> = old_bulletproof_challenges

ledger/src/proofs/transaction.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4181,7 +4181,7 @@ mod tests_with_wasm {
41814181
}
41824182

41834183
#[cfg(test)]
4184-
mod tests {
4184+
pub(super) mod tests {
41854185
use std::path::Path;
41864186

41874187
use mina_p2p_messages::binprot::{
@@ -4215,7 +4215,7 @@ mod tests {
42154215
PerformJob(mina_p2p_messages::v2::SnarkWorkerWorkerRpcsVersionedGetWorkV2TResponse),
42164216
}
42174217

4218-
fn panic_in_ci() {
4218+
pub fn panic_in_ci() {
42194219
fn is_ci() -> bool {
42204220
std::env::var("CI").is_ok()
42214221
}

ledger/src/proofs/util.rs

Lines changed: 173 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ pub fn challenge_polynomial_checked<F: FieldWitness>(
134134
}
135135

136136
/// Note: Outdated URL
137-
/// Note: Same as `to_absorption_sequence`
137+
/// Note: Different than `to_absorption_sequence`
138138
/// https://github.com/MinaProtocol/mina/blob/4af0c229548bc96d76678f11b6842999de5d3b0b/src/lib/pickles_types/plonk_types.ml#L611
139139
pub fn proof_evaluation_to_list<F: FieldWitness>(
140140
e: &ProofEvaluations<PointEvaluations<Vec<F>>>,
@@ -211,6 +211,86 @@ pub fn proof_evaluation_to_list<F: FieldWitness>(
211211
list
212212
}
213213

214+
pub fn proof_evaluation_to_absorption_sequence<F: FieldWitness>(
215+
e: &ProofEvaluations<PointEvaluations<Vec<F>>>,
216+
) -> Vec<&PointEvaluations<Vec<F>>> {
217+
let ProofEvaluations {
218+
public: _,
219+
w,
220+
coefficients,
221+
z,
222+
s,
223+
generic_selector,
224+
poseidon_selector,
225+
complete_add_selector,
226+
mul_selector,
227+
emul_selector,
228+
endomul_scalar_selector,
229+
range_check0_selector,
230+
range_check1_selector,
231+
foreign_field_add_selector,
232+
foreign_field_mul_selector,
233+
xor_selector,
234+
rot_selector,
235+
lookup_aggregation,
236+
lookup_table,
237+
lookup_sorted,
238+
runtime_lookup_table,
239+
runtime_lookup_table_selector,
240+
xor_lookup_selector,
241+
lookup_gate_lookup_selector,
242+
range_check_lookup_selector,
243+
foreign_field_mul_lookup_selector,
244+
} = e;
245+
246+
let mut list = vec![
247+
z,
248+
generic_selector,
249+
poseidon_selector,
250+
complete_add_selector,
251+
mul_selector,
252+
emul_selector,
253+
endomul_scalar_selector,
254+
];
255+
256+
list.extend(w.iter());
257+
list.extend(coefficients.iter());
258+
list.extend(s.iter());
259+
260+
list.extend(
261+
[
262+
range_check0_selector,
263+
range_check1_selector,
264+
foreign_field_add_selector,
265+
foreign_field_mul_selector,
266+
xor_selector,
267+
rot_selector,
268+
lookup_aggregation,
269+
lookup_table,
270+
]
271+
.into_iter()
272+
.filter_map(|v| v.as_ref()),
273+
);
274+
275+
list.extend(lookup_sorted.iter().filter_map(|v| v.as_ref()));
276+
277+
list.extend(
278+
[
279+
runtime_lookup_table,
280+
runtime_lookup_table_selector,
281+
xor_lookup_selector,
282+
lookup_gate_lookup_selector,
283+
range_check_lookup_selector,
284+
foreign_field_mul_lookup_selector,
285+
]
286+
.into_iter()
287+
.filter_map(|v| v.as_ref()),
288+
);
289+
290+
#[allow(clippy::iter_cloned_collect)]
291+
list.iter().cloned().collect()
292+
}
293+
214294
/// https://github.com/MinaProtocol/mina/blob/4af0c229548bc96d76678f11b6842999de5d3b0b/src/lib/pickles_types/plonk_types.ml#L611
215295
pub fn proof_evaluation_to_list_opt<F: FieldWitness>(
216296
e: &ProofEvaluations<PointEvaluations<Vec<F>>>,
@@ -312,7 +392,98 @@ pub fn to_absorption_sequence_opt<F: FieldWitness>(
312392
evals: &ProofEvaluations<PointEvaluations<Vec<F>>>,
313393
hack_feature_flags: OptFlag,
314394
) -> Vec<Opt<PointEvaluations<Vec<F>>>> {
315-
proof_evaluation_to_list_opt(evals, hack_feature_flags)
395+
let ProofEvaluations {
396+
public: _,
397+
w,
398+
coefficients,
399+
z,
400+
s,
401+
generic_selector,
402+
poseidon_selector,
403+
complete_add_selector,
404+
mul_selector,
405+
emul_selector,
406+
endomul_scalar_selector,
407+
range_check0_selector,
408+
range_check1_selector,
409+
foreign_field_add_selector,
410+
foreign_field_mul_selector,
411+
xor_selector,
412+
rot_selector,
413+
lookup_aggregation,
414+
lookup_table,
415+
lookup_sorted,
416+
runtime_lookup_table,
417+
runtime_lookup_table_selector,
418+
xor_lookup_selector,
419+
lookup_gate_lookup_selector,
420+
range_check_lookup_selector,
421+
foreign_field_mul_lookup_selector,
422+
} = evals;
423+
424+
let mut list = vec![
425+
Opt::Some(z.clone()),
426+
Opt::Some(generic_selector.clone()),
427+
Opt::Some(poseidon_selector.clone()),
428+
Opt::Some(complete_add_selector.clone()),
429+
Opt::Some(mul_selector.clone()),
430+
Opt::Some(emul_selector.clone()),
431+
Opt::Some(endomul_scalar_selector.clone()),
432+
];
433+
434+
list.extend(w.iter().cloned().map(Opt::Some));
435+
list.extend(coefficients.iter().cloned().map(Opt::Some));
436+
list.extend(s.iter().cloned().map(Opt::Some));
437+
438+
let zero = || PointEvaluations {
439+
zeta: vec![F::zero()],
440+
zeta_omega: vec![F::zero()],
441+
};
442+
let to_opt = |v: &Option<PointEvaluations<Vec<F>>>| {
443+
if let OptFlag::Maybe = hack_feature_flags {
444+
match v {
445+
Some(v) => Opt::Maybe(Boolean::True, v.clone()),
446+
None => Opt::Maybe(Boolean::False, zero()),
447+
}
448+
} else {
449+
match v {
450+
Some(v) => Opt::Some(v.clone()),
451+
None => Opt::No,
452+
}
453+
}
454+
};
455+
456+
list.extend(
457+
[
458+
range_check0_selector,
459+
range_check1_selector,
460+
foreign_field_add_selector,
461+
foreign_field_mul_selector,
462+
xor_selector,
463+
rot_selector,
464+
lookup_aggregation,
465+
lookup_table,
466+
]
467+
.iter()
468+
.map(|e| to_opt(e)),
469+
);
470+
471+
list.extend(lookup_sorted.iter().map(to_opt));
472+
473+
list.extend(
474+
[
475+
runtime_lookup_table,
476+
runtime_lookup_table_selector,
477+
xor_lookup_selector,
478+
lookup_gate_lookup_selector,
479+
range_check_lookup_selector,
480+
foreign_field_mul_lookup_selector,
481+
]
482+
.into_iter()
483+
.map(to_opt),
484+
);
485+
486+
list
316487
}
317488

318489
pub fn sha256_sum(s: &[u8]) -> String {

0 commit comments

Comments
 (0)