Skip to content

Commit 4a18d57

Browse files
committed
pairing-product for ML-KZG; update change log
1 parent 02f3b52 commit 4a18d57

File tree

2 files changed

+26
-25
lines changed

2 files changed

+26
-25
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Pending
44

5+
- [\#98](https://github.com/arkworks-rs/poly-commit/pull/98) Use pairing-product to accelerate `KZG` and `multilinear_pc` verifications.
6+
57
### Breaking changes
68

79
- [\#82](https://github.com/arkworks-rs/poly-commit/pull/82) Function parameter `opening_challenge: F` for `open`,

src/multilinear_pc/mod.rs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -194,39 +194,38 @@ impl<E: PairingEngine> MultilinearPC<E> {
194194
value: E::Fr,
195195
proof: &Proof<E>,
196196
) -> bool {
197-
let left = E::pairing(
198-
commitment.g_product.into_projective() - &vk.g.mul(value),
199-
vk.h,
200-
);
201-
202197
let scalar_size = E::Fr::size_in_bits();
203-
let window_size = FixedBase::get_mul_window_size(vk.nv);
198+
let window_size = FixedBaseMSM::get_mul_window_size(verifier_param.num_vars);
204199

205-
let g_table = FixedBase::get_window_table(scalar_size, window_size, vk.g.into_projective());
206-
let g_mul: Vec<E::G1Projective> = FixedBase::msm(scalar_size, window_size, &g_table, point);
200+
let g_table = FixedBaseMSM::get_window_table(
201+
scalar_size,
202+
window_size,
203+
verifier_param.g.into_projective(),
204+
);
205+
let g_mul: Vec<E::G1Projective> =
206+
FixedBaseMSM::multi_scalar_mul(scalar_size, window_size, &g_table, point);
207207

208-
let pairing_lefts: Vec<_> = (0..vk.nv)
209-
.map(|i| vk.g_mask_random[i].into_projective() - &g_mul[i])
210-
.collect();
211-
let pairing_lefts: Vec<E::G1Affine> =
212-
E::G1Projective::batch_normalization_into_affine(&pairing_lefts);
213-
let pairing_lefts: Vec<E::G1Prepared> = pairing_lefts
214-
.into_iter()
215-
.map(|x| E::G1Prepared::from(x))
208+
let mut g1_vec: Vec<_> = (0..verifier_param.num_vars)
209+
.map(|i| verifier_param.g_mask[i].into_projective() - g_mul[i])
216210
.collect();
211+
g1_vec.push(verifier_param.g.mul(value) - commitment.g_product.into_projective());
217212

218-
let pairing_rights: Vec<E::G2Prepared> = proof
219-
.proofs
220-
.iter()
221-
.map(|x| E::G2Prepared::from(*x))
222-
.collect();
213+
let g1_vec: Vec<E::G1Affine> = E::G1Projective::batch_normalization_into_affine(&g1_vec);
214+
let tmp = g1_vec[verifier_param.num_vars];
223215

224-
let pairings: Vec<_> = pairing_lefts
216+
let mut pairings: Vec<_> = g1_vec
225217
.into_iter()
226-
.zip(pairing_rights.into_iter())
218+
.take(verifier_param.num_vars)
219+
.map(E::G1Prepared::from)
220+
.zip(proof.proofs.iter().map(|&x| E::G2Prepared::from(x)))
227221
.collect();
228-
let right = E::product_of_pairings(pairings.iter());
229-
left == right
222+
223+
pairings.push((
224+
E::G1Prepared::from(tmp),
225+
E::G2Prepared::from(verifier_param.h),
226+
));
227+
228+
E::product_of_pairings(pairings.iter()) == E::Fqk::one()
230229
}
231230
}
232231

0 commit comments

Comments
 (0)