Skip to content

Commit 052e3bb

Browse files
committed
Compressed pairing for g1/g2 setup
1 parent ad4508e commit 052e3bb

File tree

2 files changed

+64
-8
lines changed

2 files changed

+64
-8
lines changed

src/backends/arkworks/ark_pairing.rs

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,20 @@ mod pairing_helpers {
330330
ArkGT(result.0)
331331
}
332332

333+
pub(super) fn multi_pair_g2_setup_optimized_compressed(
334+
ps: &[ArkG1],
335+
qs: &[ArkG2],
336+
) -> ArkGTCompressed {
337+
let combined = if cfg!(feature = "parallel") {
338+
multi_pair_g2_setup_parallel(ps, qs)
339+
} else {
340+
multi_pair_g2_setup_sequential(ps, qs)
341+
};
342+
let result = Bn254::compressed_final_exponentiation(combined)
343+
.expect("Final exponentiation should not fail");
344+
ArkGTCompressed(result)
345+
}
346+
333347
/// Optimized multi-pairing dispatch for G1 from setup
334348
pub(super) fn multi_pair_g1_setup_optimized(ps: &[ArkG1], qs: &[ArkG2]) -> ArkGT {
335349
let combined = if cfg!(feature = "parallel") {
@@ -341,6 +355,20 @@ mod pairing_helpers {
341355
Bn254::final_exponentiation(combined).expect("Final exponentiation should not fail");
342356
ArkGT(result.0)
343357
}
358+
359+
pub(super) fn multi_pair_g1_setup_optimized_compressed(
360+
ps: &[ArkG1],
361+
qs: &[ArkG2],
362+
) -> ArkGTCompressed {
363+
let combined = if cfg!(feature = "parallel") {
364+
multi_pair_g1_setup_parallel(ps, qs)
365+
} else {
366+
multi_pair_g1_setup_sequential(ps, qs)
367+
};
368+
let result = Bn254::compressed_final_exponentiation(combined)
369+
.expect("Final exponentiation should not fail");
370+
ArkGTCompressed(result)
371+
}
344372
}
345373

346374
impl CompressedPairingCurve for BN254 {
@@ -349,7 +377,7 @@ impl CompressedPairingCurve for BN254 {
349377
type GT = ArkGT;
350378
type CompressedGT = ArkGTCompressed;
351379

352-
fn multi_pair(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
380+
fn multi_pair_compressed(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
353381
assert_eq!(
354382
ps.len(),
355383
qs.len(),
@@ -361,6 +389,34 @@ impl CompressedPairingCurve for BN254 {
361389

362390
pairing_helpers::multi_pair_optimized_compressed(ps, qs)
363391
}
392+
393+
#[tracing::instrument(skip_all, name = "BN254::multi_pair_g2_setup_compressed", fields(len = ps.len()))]
394+
fn multi_pair_g2_setup_compressed(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
395+
assert_eq!(
396+
ps.len(),
397+
qs.len(),
398+
"multi_pair_g2_setup requires equal length vectors"
399+
);
400+
401+
// TODO: handle empty case properly by implementing the default implementation of CompressedGT in arkworks.
402+
assert!(!ps.is_empty());
403+
404+
pairing_helpers::multi_pair_g2_setup_optimized_compressed(ps, qs)
405+
}
406+
407+
#[tracing::instrument(skip_all, name = "BN254::multi_pair_g1_setup_compressed", fields(len = ps.len()))]
408+
fn multi_pair_g1_setup_compressed(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
409+
assert_eq!(
410+
ps.len(),
411+
qs.len(),
412+
"multi_pair_g1_setup requires equal length vectors"
413+
);
414+
415+
// TODO: handle empty case properly by implementing the default implementation of CompressedGT in arkworks.
416+
assert!(!ps.is_empty());
417+
418+
pairing_helpers::multi_pair_g1_setup_optimized_compressed(ps, qs)
419+
}
364420
}
365421

366422
impl PairingCurve for BN254 {

src/primitives/arithmetic.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ pub trait CompressedPairingCurve: Clone {
6969
type GT: Group;
7070
type CompressedGT;
7171

72-
fn pair(p: &Self::G1, q: &Self::G2) -> Self::CompressedGT {
73-
Self::multi_pair(&[p.clone()], &[q.clone()])
72+
fn pair_compressed(p: &Self::G1, q: &Self::G2) -> Self::CompressedGT {
73+
Self::multi_pair_compressed(&[p.clone()], &[q.clone()])
7474
}
7575

76-
fn multi_pair(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT;
76+
fn multi_pair_compressed(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT;
7777

7878
/// Optimized multi-pairing when G2 points come from setup/generators
7979
///
@@ -90,8 +90,8 @@ pub trait CompressedPairingCurve: Clone {
9090
///
9191
/// # Default Implementation
9292
/// Delegates to `multi_pair`
93-
fn multi_pair_g2_setup(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
94-
Self::multi_pair(ps, qs)
93+
fn multi_pair_g2_setup_compressed(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
94+
Self::multi_pair_compressed(ps, qs)
9595
}
9696

9797
/// Optimized multi-pairing when G1 points are from the prover setup.
@@ -109,8 +109,8 @@ pub trait CompressedPairingCurve: Clone {
109109
///
110110
/// # Default Implementation
111111
/// Delegates to `multi_pair`
112-
fn multi_pair_g1_setup(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
113-
Self::multi_pair(ps, qs)
112+
fn multi_pair_g1_setup_compressed(ps: &[Self::G1], qs: &[Self::G2]) -> Self::CompressedGT {
113+
Self::multi_pair_compressed(ps, qs)
114114
}
115115
}
116116

0 commit comments

Comments
 (0)