(
combined_comms: BTreeMap<Option<usize>, E::G1>,
combined_witness: E::G1,
combined_adjusted_witness: E::G1,
vk: &VerifierKey<E>,
)
| 92 | } |
| 93 | |
| 94 | fn check_elems( |
| 95 | combined_comms: BTreeMap<Option<usize>, E::G1>, |
| 96 | combined_witness: E::G1, |
| 97 | combined_adjusted_witness: E::G1, |
| 98 | vk: &VerifierKey<E>, |
| 99 | ) -> Result<bool, Error> { |
| 100 | let check_time = start_timer!(|| "Checking elems"); |
| 101 | let mut g1_projective_elems: Vec<E::G1> = Vec::new(); |
| 102 | let mut g2_prepared_elems: Vec<E::G2Prepared> = Vec::new(); |
| 103 | |
| 104 | for (degree_bound, comm) in combined_comms.into_iter() { |
| 105 | let shift_power = if let Some(degree_bound) = degree_bound { |
| 106 | vk.get_shift_power(degree_bound) |
| 107 | .ok_or(Error::UnsupportedDegreeBound(degree_bound))? |
| 108 | } else { |
| 109 | vk.prepared_h.clone() |
| 110 | }; |
| 111 | |
| 112 | g1_projective_elems.push(comm); |
| 113 | g2_prepared_elems.push(shift_power); |
| 114 | } |
| 115 | |
| 116 | g1_projective_elems.push(-combined_adjusted_witness); |
| 117 | g2_prepared_elems.push(vk.prepared_h.clone()); |
| 118 | |
| 119 | g1_projective_elems.push(-combined_witness); |
| 120 | g2_prepared_elems.push(vk.prepared_beta_h.clone()); |
| 121 | |
| 122 | let g1_prepared_elems_iter: Vec<E::G1Prepared> = |
| 123 | E::G1::normalize_batch(g1_projective_elems.as_slice()) |
| 124 | .into_iter() |
| 125 | .map(|a| a.into()) |
| 126 | .collect::<Vec<_>>(); |
| 127 | |
| 128 | let is_one: bool = E::multi_pairing(g1_prepared_elems_iter, g2_prepared_elems) |
| 129 | .0 |
| 130 | .is_one(); |
| 131 | end_timer!(check_time); |
| 132 | Ok(is_one) |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | impl<E, P> PolynomialCommitment<E::ScalarField, P> for SonicKZG10<E, P> |
nothing calls this directly
no test coverage detected