Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove blst dependency #279

Merged
merged 1 commit into from
Jan 20, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Remove blst dependency
ArtiomTr committed Jan 15, 2025

Verified

This commit was signed with the committer’s verified signature.
ArtiomTr Artiom Tretjakovas
commit d80645851b585933c5bbba2cf39a129244fa3873
3 changes: 0 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion arkworks/Cargo.toml
Original file line number Diff line number Diff line change
@@ -4,7 +4,6 @@ version = "0.1.0"
edition = "2021"

[dependencies]
blst = "0.3.11"
kzg = { path = "../kzg", default-features = false }
ark-std = { version = "^0.4.0", default-features = false }
ark-ff = { version = "^0.4.2", default-features = false, features = [ "asm" ] }
8 changes: 4 additions & 4 deletions arkworks/src/consts.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use kzg::eth::c_bindings::{blst_fp, blst_fp2, blst_p1, blst_p2};

use crate::kzg_types::{ArkG1, ArkG2};
use crate::P2;
use blst::{blst_fp, blst_fp2, blst_p1};

/** The G1 identity/infinity */
#[rustfmt::skip]
@@ -117,7 +117,7 @@ pub const G1_NEGATIVE_GENERATOR: ArkG1 = ArkG1::from_blst_p1(blst_p1 {
},
});

pub const G2_GENERATOR: ArkG2 = ArkG2::from_blst_p2(P2 {
pub const G2_GENERATOR: ArkG2 = ArkG2::from_blst_p2(blst_p2 {
x: blst_fp2 {
fp: [
blst_fp {
@@ -192,7 +192,7 @@ pub const G2_GENERATOR: ArkG2 = ArkG2::from_blst_p2(P2 {
},
});

pub const G2_NEGATIVE_GENERATOR: ArkG2 = ArkG2::from_blst_p2(P2 {
pub const G2_NEGATIVE_GENERATOR: ArkG2 = ArkG2::from_blst_p2(blst_p2 {
x: blst_fp2 {
fp: [
blst_fp {
7 changes: 3 additions & 4 deletions arkworks/src/kzg_types.rs
Original file line number Diff line number Diff line change
@@ -23,11 +23,10 @@ use ark_std::{One, Zero};

#[cfg(feature = "rand")]
use ark_std::UniformRand;
use kzg::eth::c_bindings::CKZGSettings;
use kzg::eth::c_bindings::{blst_fp, blst_fr, blst_p1, blst_p2, CKZGSettings};

use crate::fft_g1::fft_g1_fast;

use blst::{blst_fp, blst_fr, blst_p1};
use kzg::common_utils::reverse_bit_order;
use kzg::msm::precompute::{precompute, PrecomputationTable};
use kzg::{
@@ -422,11 +421,11 @@ impl PairingVerify<ArkG1, ArkG2> for ArkG1 {
pub struct ArkG2(pub Projective<g2::Config>);

impl ArkG2 {
pub const fn from_blst_p2(p2: blst::blst_p2) -> Self {
pub const fn from_blst_p2(p2: blst_p2) -> Self {
Self(blst_p2_into_pc_g2projective(&p2))
}

pub const fn to_blst_p2(&self) -> blst::blst_p2 {
pub const fn to_blst_p2(&self) -> blst_p2 {
pc_g2projective_into_blst_p2(self.0)
}
}
12 changes: 0 additions & 12 deletions arkworks/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,3 @@
pub type Pairing = blst::Pairing;
pub type Fp = blst::blst_fp;
pub type Fp12 = blst::blst_fp12;
pub type Fp6 = blst::blst_fp6;
pub type Fr = blst::blst_fr;
pub type P1 = blst::blst_p1;
pub type P1Affine = blst::blst_p1_affine;
pub type P2 = blst::blst_p2;
pub type P2Affine = blst::blst_p2_affine;
pub type Scalar = blst::blst_scalar;
pub type Uniq = blst::blst_uniq;

pub mod consts;
pub mod das;
pub mod eip_4844;
38 changes: 13 additions & 25 deletions arkworks/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
use super::{Fp, P1};
use crate::kzg_proofs::FFTSettings;
use crate::kzg_types::{ArkFp, ArkFr, ArkG1, ArkG1Affine};
use crate::P2;
use ark_bls12_381::{g1, g2, Fq, Fq2, Fr as Bls12Fr};
use ark_ec::models::short_weierstrass::Projective;
use ark_ff::Fp2;
use ark_poly::univariate::DensePolynomial as DensePoly;
use ark_poly::DenseUVPolynomial;
use blst::{blst_fp, blst_fp2, blst_fr, blst_p1, blst_p2};

use kzg::eip_4844::PrecomputationTableManager;
use kzg::eth::c_bindings::CKZGSettings;
use kzg::eth::c_bindings::{blst_fp, blst_fp2, blst_fr, blst_p1, blst_p2, CKZGSettings};

use kzg::eth;

@@ -39,8 +36,8 @@ pub fn blst_poly_into_pc_poly(pd: &[ArkFr]) -> DensePoly<Bls12Fr> {
DensePoly::from_coefficients_vec(poly)
}

pub const fn pc_fq_into_blst_fp(fq: Fq) -> Fp {
Fp { l: fq.0 .0 }
pub const fn pc_fq_into_blst_fp(fq: Fq) -> blst_fp {
blst_fp { l: fq.0 .0 }
}

pub const fn blst_fr_into_pc_fr(fr: blst_fr) -> Bls12Fr {
@@ -51,10 +48,10 @@ pub const fn blst_fr_into_pc_fr(fr: blst_fr) -> Bls12Fr {
}

pub const fn pc_fr_into_blst_fr(fr: Bls12Fr) -> blst_fr {
blst::blst_fr { l: fr.0 .0 }
blst_fr { l: fr.0 .0 }
}

pub const fn blst_fp_into_pc_fq(fp: &Fp) -> Fq {
pub const fn blst_fp_into_pc_fq(fp: &blst_fp) -> Fq {
Fq {
0: ark_ff::BigInt(fp.l),
1: core::marker::PhantomData,
@@ -68,7 +65,7 @@ pub const fn blst_fp2_into_pc_fq2(fp: &blst_fp2) -> Fq2 {
}
}

pub const fn blst_p1_into_pc_g1projective(p1: &P1) -> Projective<g1::Config> {
pub const fn blst_p1_into_pc_g1projective(p1: &blst_p1) -> Projective<g1::Config> {
Projective {
x: blst_fp_into_pc_fq(&p1.x),
y: blst_fp_into_pc_fq(&p1.y),
@@ -84,7 +81,7 @@ pub const fn pc_g1projective_into_blst_p1(p1: Projective<g1::Config>) -> blst_p1
}
}

pub const fn blst_p2_into_pc_g2projective(p2: &P2) -> Projective<g2::Config> {
pub const fn blst_p2_into_pc_g2projective(p2: &blst_p2) -> Projective<g2::Config> {
Projective {
x: blst_fp2_into_pc_fq2(&p2.x),
y: blst_fp2_into_pc_fq2(&p2.y),
@@ -94,23 +91,14 @@ pub const fn blst_p2_into_pc_g2projective(p2: &P2) -> Projective<g2::Config> {

pub const fn pc_g2projective_into_blst_p2(p2: Projective<g2::Config>) -> blst_p2 {
blst_p2 {
x: blst::blst_fp2 {
fp: [
blst::blst_fp { l: p2.x.c0.0 .0 },
blst::blst_fp { l: p2.x.c1.0 .0 },
],
x: blst_fp2 {
fp: [blst_fp { l: p2.x.c0.0 .0 }, blst_fp { l: p2.x.c1.0 .0 }],
},
y: blst::blst_fp2 {
fp: [
blst::blst_fp { l: p2.y.c0.0 .0 },
blst::blst_fp { l: p2.y.c1.0 .0 },
],
y: blst_fp2 {
fp: [blst_fp { l: p2.y.c0.0 .0 }, blst_fp { l: p2.y.c1.0 .0 }],
},
z: blst::blst_fp2 {
fp: [
blst::blst_fp { l: p2.z.c0.0 .0 },
blst::blst_fp { l: p2.z.c1.0 .0 },
],
z: blst_fp2 {
fp: [blst_fp { l: p2.z.c0.0 .0 }, blst_fp { l: p2.z.c1.0 .0 }],
},
}
}
99 changes: 67 additions & 32 deletions arkworks3/src/kzg_types.rs
Original file line number Diff line number Diff line change
@@ -11,7 +11,6 @@ use crate::utils::{
blst_p2_into_pc_g2projective, pc_fr_into_blst_fr, pc_g1projective_into_blst_p1,
pc_g2projective_into_blst_p2, PolyData,
};
use crate::P2;
use ark_bls12_381::{g1, g2, Fr, G1Affine};
use ark_ec::ModelParameters;
use ark_ec::{models::short_weierstrass_jacobian::GroupProjective, AffineCurve, ProjectiveCurve};
@@ -22,13 +21,9 @@ use ark_std::{One, Zero};
#[cfg(feature = "rand")]
use ark_std::UniformRand;

use blst::{
blst_fp, blst_fp2, blst_fr, blst_p1, blst_p1_affine, blst_p1_compress, blst_p1_from_affine,
blst_p1_in_g1, blst_p1_uncompress, blst_p2, blst_p2_affine, blst_p2_from_affine,
blst_p2_uncompress, BLST_ERROR,
};
use kzg::common_utils::reverse_bit_order;
use kzg::eip_4844::{BYTES_PER_FIELD_ELEMENT, BYTES_PER_G1, BYTES_PER_G2};
use kzg::eth::c_bindings::{blst_fp, blst_fp2, blst_fr, blst_p1, blst_p2};
use kzg::msm::precompute::{precompute, PrecomputationTable};
use kzg::{
FFTFr, FFTSettings, FFTSettingsPoly, Fr as KzgFr, G1Affine as G1AffineTrait, G1Fp, G1GetFp,
@@ -83,14 +78,10 @@ impl KzgFr for ArkFr {
}

fn zero() -> Self {
// Self::from_u64(0)
Self { fr: Fr::zero() }
}

fn one() -> Self {
// let one = Fr::one();
// // assert_eq!(one.0.0, [0, 1, 1, 1], "must be eq");
// Self { fr: one }
Self::from_u64(1)
}

@@ -363,17 +354,21 @@ impl G1 for ArkG1 {
)
})
.and_then(|bytes: &[u8; BYTES_PER_G1]| {
let mut blst_affine = blst_p1_affine::default();
let result = unsafe { blst_p1_uncompress(&mut blst_affine, bytes.as_ptr()) };
let mut blst_affine = blst::blst_p1_affine::default();
let result = unsafe { blst::blst_p1_uncompress(&mut blst_affine, bytes.as_ptr()) };

if result != BLST_ERROR::BLST_SUCCESS {
if result != blst::BLST_ERROR::BLST_SUCCESS {
return Err("Failed to deserialize G1".to_owned());
}

let mut blst_point = blst_p1::default();
unsafe { blst_p1_from_affine(&mut blst_point, &blst_affine) };
let mut blst_point = blst::blst_p1::default();
unsafe { blst::blst_p1_from_affine(&mut blst_point, &blst_affine) };

Ok(ArkG1::from_blst_p1(blst_point))
Ok(ArkG1::from_blst_p1(blst_p1 {
x: blst_fp { l: blst_point.x.l },
y: blst_fp { l: blst_point.y.l },
z: blst_fp { l: blst_point.z.l },
}))
})
}

@@ -382,10 +377,18 @@ impl G1 for ArkG1 {
Self::from_bytes(&bytes)
}

fn to_bytes(&self) -> [u8; 48] {
fn to_bytes(&self) -> [u8; BYTES_PER_G1] {
let mut out = [0u8; BYTES_PER_G1];
let v = self.to_blst_p1();
unsafe {
blst_p1_compress(out.as_mut_ptr(), &self.to_blst_p1());
blst::blst_p1_compress(
out.as_mut_ptr(),
&blst::blst_p1 {
x: blst::blst_fp { l: v.x.l },
y: blst::blst_fp { l: v.y.l },
z: blst::blst_fp { l: v.z.l },
},
);
}
out
}
@@ -395,12 +398,13 @@ impl G1 for ArkG1 {
}

fn is_inf(&self) -> bool {
let temp = &self.0;
temp.z.is_zero()
self.0.is_zero()
}

fn is_valid(&self) -> bool {
unsafe { blst_p1_in_g1(&self.to_blst_p1()) }
let affine = self.0.into_affine();

affine.is_on_curve() && affine.is_in_correct_subgroup_assuming_on_curve()
}

fn dbl(&self) -> Self {
@@ -490,18 +494,18 @@ impl PairingVerify<ArkG1, ArkG2> for ArkG1 {
pub struct ArkG2(pub GroupProjective<g2::Parameters>);

impl ArkG2 {
pub fn from_blst_p2(p2: blst::blst_p2) -> Self {
pub fn from_blst_p2(p2: blst_p2) -> Self {
Self(blst_p2_into_pc_g2projective(&p2))
}

pub fn to_blst_p2(&self) -> blst::blst_p2 {
pub fn to_blst_p2(&self) -> blst_p2 {
pc_g2projective_into_blst_p2(self.0)
}
}

impl G2 for ArkG2 {
fn generator() -> Self {
ArkG2::from_blst_p2(P2 {
ArkG2::from_blst_p2(blst_p2 {
x: blst_fp2 {
fp: [
blst_fp {
@@ -578,7 +582,7 @@ impl G2 for ArkG2 {
}

fn negative_generator() -> Self {
ArkG2::from_blst_p2(P2 {
ArkG2::from_blst_p2(blst_p2 {
x: blst_fp2 {
fp: [
blst_fp {
@@ -666,17 +670,48 @@ impl G2 for ArkG2 {
)
})
.and_then(|bytes: &[u8; BYTES_PER_G2]| {
let mut blst_affine = blst_p2_affine::default();
let result = unsafe { blst_p2_uncompress(&mut blst_affine, bytes.as_ptr()) };
let mut blst_affine = blst::blst_p2_affine::default();
let result = unsafe { blst::blst_p2_uncompress(&mut blst_affine, bytes.as_ptr()) };

if result != BLST_ERROR::BLST_SUCCESS {
if result != blst::BLST_ERROR::BLST_SUCCESS {
return Err("Failed to deserialize G1".to_owned());
}

let mut blst_point = blst_p2::default();
unsafe { blst_p2_from_affine(&mut blst_point, &blst_affine) };

Ok(ArkG2::from_blst_p2(blst_point))
let mut blst_point = blst::blst_p2::default();
unsafe { blst::blst_p2_from_affine(&mut blst_point, &blst_affine) };

Ok(ArkG2::from_blst_p2(blst_p2 {
x: blst_fp2 {
fp: [
blst_fp {
l: blst_point.x.fp[0].l,
},
blst_fp {
l: blst_point.x.fp[1].l,
},
],
},
y: blst_fp2 {
fp: [
blst_fp {
l: blst_point.y.fp[0].l,
},
blst_fp {
l: blst_point.y.fp[1].l,
},
],
},
z: blst_fp2 {
fp: [
blst_fp {
l: blst_point.z.fp[0].l,
},
blst_fp {
l: blst_point.z.fp[1].l,
},
],
},
}))
})
}

12 changes: 0 additions & 12 deletions arkworks3/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,3 @@
pub type Pairing = blst::Pairing;
pub type Fp = blst::blst_fp;
pub type Fp12 = blst::blst_fp12;
pub type Fp6 = blst::blst_fp6;
pub type Fr = blst::blst_fr;
pub type P1 = blst::blst_p1;
pub type P1Affine = blst::blst_p1_affine;
pub type P2 = blst::blst_p2;
pub type P2Affine = blst::blst_p2_affine;
pub type Scalar = blst::blst_scalar;
pub type Uniq = blst::blst_uniq;

pub mod consts;
pub mod das;
pub mod eip_4844;
Loading
Loading