| 86 | } |
| 87 | |
| 88 | pub(crate) fn groth16_generate_segments( |
| 89 | skip_evaluation: bool, |
| 90 | all_output_hints: &mut Vec<Segment>, |
| 91 | eval_ins: InputProofRaw, |
| 92 | pubs: PublicParams, |
| 93 | claimed_assertions: &mut Option<Vec<HashBytes>>, |
| 94 | ) -> bool { |
| 95 | macro_rules! push_compare_or_return { |
| 96 | ($seg:ident) => {{ |
| 97 | all_output_hints.push($seg.clone()); |
| 98 | if $seg.scr_type.is_final_script() { |
| 99 | if let DataType::U256Data(felem) = $seg.result.0 { |
| 100 | if felem != ark_ff::BigInt::<4>::one() { |
| 101 | return false; |
| 102 | } |
| 103 | } else { |
| 104 | unreachable!(); |
| 105 | } |
| 106 | } else if $seg.is_valid_input == false { |
| 107 | return false; |
| 108 | } else { |
| 109 | let matches = compare(&$seg.result.0, claimed_assertions); |
| 110 | if matches.is_some() && matches.unwrap() == false { |
| 111 | return false; |
| 112 | } |
| 113 | } |
| 114 | }}; |
| 115 | } |
| 116 | let vky = pubs.ks_vks; |
| 117 | let vky0 = pubs.vky0; |
| 118 | |
| 119 | let (gp2, gp4, gq4, gc, pub_scalars) = raw_input_proof_to_segments(eval_ins, all_output_hints); |
| 120 | let (gp2x, gp2y) = (gp2[0].clone(), gp2[1].clone()); |
| 121 | let (gp4x, gp4y) = (gp4[0].clone(), gp4[1].clone()); |
| 122 | let (q4xc0, q4xc1, q4yc0, q4yc1) = ( |
| 123 | gq4[0].clone(), |
| 124 | gq4[1].clone(), |
| 125 | gq4[2].clone(), |
| 126 | gq4[3].clone(), |
| 127 | ); |
| 128 | let gc = gc.to_vec(); |
| 129 | |
| 130 | let pub_scalars = pub_scalars.to_vec(); |
| 131 | |
| 132 | let p4 = wrap_hints_precompute_p(skip_evaluation, all_output_hints.len(), &gp4y, &gp4x); |
| 133 | push_compare_or_return!(p4); |
| 134 | |
| 135 | let p2 = wrap_hints_precompute_p(skip_evaluation, all_output_hints.len(), &gp2y, &gp2x); |
| 136 | push_compare_or_return!(p2); |
| 137 | |
| 138 | let msms = wrap_hint_msm( |
| 139 | skip_evaluation, |
| 140 | all_output_hints.len(), |
| 141 | pub_scalars.clone(), |
| 142 | vky.clone(), |
| 143 | ); |
| 144 | for msm in &msms { |
| 145 | push_compare_or_return!(msm); |