Skip to content

Commit

Permalink
updated blast code inside mcl
Browse files Browse the repository at this point in the history
  • Loading branch information
Maksasj committed Dec 5, 2024
1 parent 225bc83 commit 3aab3e2
Show file tree
Hide file tree
Showing 9 changed files with 370 additions and 655 deletions.
4 changes: 2 additions & 2 deletions mcl/src/data_availability_sampling.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use alloc::string::String;
use alloc::vec::Vec;
use core::cmp::Ordering;

use kzg::{Fr, DAS};
use kzg::{DASExtension, Fr};

use crate::types::fft_settings::FsFFTSettings;
use crate::types::fr::FsFr;
Expand Down Expand Up @@ -71,7 +71,7 @@ impl FsFFTSettings {
}
}

impl DAS<FsFr> for FsFFTSettings {
impl DASExtension<FsFr> for FsFFTSettings {
/// Polynomial extension for data availability sampling. Given values of even indices, produce values of odd indices.
/// FFTSettings must hold at least 2 times the roots of provided evens.
/// The resulting odd indices make the right half of the coefficients of the inverse FFT of the combined indices zero.
Expand Down
89 changes: 43 additions & 46 deletions mcl/src/eip_4844.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@ use core::ptr;
use kzg::eip_4844::{
blob_to_kzg_commitment_rust, compute_blob_kzg_proof_rust, compute_kzg_proof_rust,
load_trusted_setup_rust, verify_blob_kzg_proof_batch_rust, verify_blob_kzg_proof_rust,
verify_kzg_proof_rust, FIELD_ELEMENTS_PER_CELL, FIELD_ELEMENTS_PER_EXT_BLOB,
verify_kzg_proof_rust, BYTES_PER_G1, FIELD_ELEMENTS_PER_BLOB, TRUSTED_SETUP_NUM_G1_POINTS,
TRUSTED_SETUP_NUM_G2_POINTS,
};
use kzg::eth::c_bindings::{
Blob, Bytes32, Bytes48, CKZGSettings, CKzgRet, KZGCommitment, KZGProof,
};
use kzg::eth::{FIELD_ELEMENTS_PER_CELL, FIELD_ELEMENTS_PER_EXT_BLOB};
use kzg::{cfg_into_iter, Fr, G1};
#[cfg(feature = "std")]
use libc::FILE;
Expand All @@ -19,18 +24,12 @@ use std::io::Read;
#[cfg(feature = "std")]
use kzg::eip_4844::load_trusted_setup_string;

use kzg::eip_4844::{
Blob, Bytes32, Bytes48, CKZGSettings, KZGCommitment, KZGProof, BYTES_PER_G1, C_KZG_RET,
C_KZG_RET_BADARGS, C_KZG_RET_OK, FIELD_ELEMENTS_PER_BLOB, TRUSTED_SETUP_NUM_G1_POINTS,
TRUSTED_SETUP_NUM_G2_POINTS,
};

use crate::types::fr::FsFr;

use crate::types::g1::FsG1;
use crate::types::kzg_settings::FsKZGSettings;
use crate::utils::{
deserialize_blob, handle_ckzg_badargs, kzg_settings_to_c, kzg_settings_to_rust,
PRECOMPUTATION_TABLES,
deserialize_blob, handle_ckzg_badargs, kzg_settings_to_c, PRECOMPUTATION_TABLES,
};

#[cfg(feature = "parallel")]
Expand All @@ -56,18 +55,18 @@ pub unsafe extern "C" fn blob_to_kzg_commitment(
out: *mut KZGCommitment,
blob: *const Blob,
s: &CKZGSettings,
) -> C_KZG_RET {
) -> CKzgRet {
if TRUSTED_SETUP_NUM_G1_POINTS == 0 {
// FIXME: load_trusted_setup should set this value, but if not, it fails
TRUSTED_SETUP_NUM_G1_POINTS = FIELD_ELEMENTS_PER_BLOB
};

let deserialized_blob = handle_ckzg_badargs!(deserialize_blob(blob));
let settings = handle_ckzg_badargs!(kzg_settings_to_rust(s));
let settings: FsKZGSettings = handle_ckzg_badargs!(s.try_into());
let tmp = handle_ckzg_badargs!(blob_to_kzg_commitment_rust(&deserialized_blob, &settings));

(*out).bytes = tmp.to_bytes();
C_KZG_RET_OK
CKzgRet::Ok
}

/// # Safety
Expand All @@ -81,7 +80,7 @@ pub unsafe extern "C" fn load_trusted_setup(
g2_monomial_bytes: *const u8,
num_g2_monomial_bytes: u64,
_precompute: u64,
) -> C_KZG_RET {
) -> CKzgRet {
*out = CKZGSettings {
brp_roots_of_unity: ptr::null_mut(),
roots_of_unity: ptr::null_mut(),
Expand Down Expand Up @@ -113,7 +112,7 @@ pub unsafe extern "C" fn load_trusted_setup(
PRECOMPUTATION_TABLES.save_precomputation(settings.precomputation.take(), &c_settings);

*out = c_settings;
C_KZG_RET_OK
CKzgRet::Ok
}

/// # Safety
Expand All @@ -122,7 +121,7 @@ pub unsafe extern "C" fn load_trusted_setup(
pub unsafe extern "C" fn load_trusted_setup_file(
out: *mut CKZGSettings,
in_: *mut FILE,
) -> C_KZG_RET {
) -> CKzgRet {
*out = CKZGSettings {
brp_roots_of_unity: ptr::null_mut(),
roots_of_unity: ptr::null_mut(),
Expand All @@ -146,7 +145,7 @@ pub unsafe extern "C" fn load_trusted_setup_file(
// Helps pass the Java test "shouldThrowExceptionOnIncorrectTrustedSetupFromFile",
// as well as 5 others that pass only if this one passes (likely because Java doesn't
// deallocate its KZGSettings pointer when no exception is thrown).
return C_KZG_RET_BADARGS;
return CKzgRet::BadArgs;
}
let mut settings = handle_ckzg_badargs!(load_trusted_setup_rust(
&g1_monomial_bytes,
Expand All @@ -160,7 +159,7 @@ pub unsafe extern "C" fn load_trusted_setup_file(

*out = c_settings;

C_KZG_RET_OK
CKzgRet::Ok
}

/// # Safety
Expand All @@ -170,22 +169,22 @@ pub unsafe extern "C" fn compute_blob_kzg_proof(
blob: *const Blob,
commitment_bytes: *const Bytes48,
s: &CKZGSettings,
) -> C_KZG_RET {
) -> CKzgRet {
let deserialized_blob = match deserialize_blob(blob) {
Ok(value) => value,
Err(err) => return err,
};

let commitment_g1 = handle_ckzg_badargs!(FsG1::from_bytes(&(*commitment_bytes).bytes));
let settings = handle_ckzg_badargs!(kzg_settings_to_rust(s));
let settings: FsKZGSettings = handle_ckzg_badargs!(s.try_into());
let proof = handle_ckzg_badargs!(compute_blob_kzg_proof_rust(
&deserialized_blob,
&commitment_g1,
&settings
));

(*out).bytes = proof.to_bytes();
C_KZG_RET_OK
CKzgRet::Ok
}

/// # Safety
Expand Down Expand Up @@ -270,13 +269,13 @@ pub unsafe extern "C" fn verify_kzg_proof(
y_bytes: *const Bytes32,
proof_bytes: *const Bytes48,
s: &CKZGSettings,
) -> C_KZG_RET {
) -> CKzgRet {
let frz = handle_ckzg_badargs!(FsFr::from_bytes(&(*z_bytes).bytes));
let fry = handle_ckzg_badargs!(FsFr::from_bytes(&(*y_bytes).bytes));
let g1commitment = handle_ckzg_badargs!(FsG1::from_bytes(&(*commitment_bytes).bytes));
let g1proof = handle_ckzg_badargs!(FsG1::from_bytes(&(*proof_bytes).bytes));

let settings = handle_ckzg_badargs!(kzg_settings_to_rust(s));
let settings: FsKZGSettings = handle_ckzg_badargs!(s.try_into());

let result = handle_ckzg_badargs!(verify_kzg_proof_rust(
&g1commitment,
Expand All @@ -287,7 +286,7 @@ pub unsafe extern "C" fn verify_kzg_proof(
));

*ok = result;
C_KZG_RET_OK
CKzgRet::Ok
}

/// # Safety
Expand All @@ -298,11 +297,11 @@ pub unsafe extern "C" fn verify_blob_kzg_proof(
commitment_bytes: *const Bytes48,
proof_bytes: *const Bytes48,
s: &CKZGSettings,
) -> C_KZG_RET {
) -> CKzgRet {
let deserialized_blob = handle_ckzg_badargs!(deserialize_blob(blob));
let commitment_g1 = handle_ckzg_badargs!(FsG1::from_bytes(&(*commitment_bytes).bytes));
let proof_g1 = handle_ckzg_badargs!(FsG1::from_bytes(&(*proof_bytes).bytes));
let settings = handle_ckzg_badargs!(kzg_settings_to_rust(s));
let settings: FsKZGSettings = handle_ckzg_badargs!(s.try_into());

let result = handle_ckzg_badargs!(verify_blob_kzg_proof_rust(
&deserialized_blob,
Expand All @@ -312,7 +311,7 @@ pub unsafe extern "C" fn verify_blob_kzg_proof(
));

*ok = result;
C_KZG_RET_OK
CKzgRet::Ok
}

/// # Safety
Expand All @@ -324,45 +323,43 @@ pub unsafe extern "C" fn verify_blob_kzg_proof_batch(
proofs_bytes: *const Bytes48,
n: usize,
s: &CKZGSettings,
) -> C_KZG_RET {
) -> CKzgRet {
let raw_blobs = core::slice::from_raw_parts(blobs, n);
let raw_commitments = core::slice::from_raw_parts(commitments_bytes, n);
let raw_proofs = core::slice::from_raw_parts(proofs_bytes, n);

let deserialized_blobs: Result<Vec<Vec<FsFr>>, C_KZG_RET> = cfg_into_iter!(raw_blobs)
.map(|raw_blob| deserialize_blob(raw_blob).map_err(|_| C_KZG_RET_BADARGS))
let deserialized_blobs: Result<Vec<Vec<FsFr>>, CKzgRet> = cfg_into_iter!(raw_blobs)
.map(|raw_blob| deserialize_blob(raw_blob).map_err(|_| CKzgRet::BadArgs))
.collect();

let commitments_g1: Result<Vec<FsG1>, C_KZG_RET> = cfg_into_iter!(raw_commitments)
.map(|raw_commitment| {
FsG1::from_bytes(&raw_commitment.bytes).map_err(|_| C_KZG_RET_BADARGS)
})
let commitments_g1: Result<Vec<FsG1>, CKzgRet> = cfg_into_iter!(raw_commitments)
.map(|raw_commitment| FsG1::from_bytes(&raw_commitment.bytes).map_err(|_| CKzgRet::BadArgs))
.collect();

let proofs_g1: Result<Vec<FsG1>, C_KZG_RET> = cfg_into_iter!(raw_proofs)
.map(|raw_proof| FsG1::from_bytes(&raw_proof.bytes).map_err(|_| C_KZG_RET_BADARGS))
let proofs_g1: Result<Vec<FsG1>, CKzgRet> = cfg_into_iter!(raw_proofs)
.map(|raw_proof| FsG1::from_bytes(&raw_proof.bytes).map_err(|_| CKzgRet::BadArgs))
.collect();

if let (Ok(blobs), Ok(commitments), Ok(proofs)) =
(deserialized_blobs, commitments_g1, proofs_g1)
{
let settings = match kzg_settings_to_rust(s) {
let settings: FsKZGSettings = match s.try_into() {
Ok(value) => value,
Err(_) => return C_KZG_RET_BADARGS,
Err(_) => return CKzgRet::BadArgs,
};

let result =
verify_blob_kzg_proof_batch_rust(blobs.as_slice(), &commitments, &proofs, &settings);

if let Ok(result) = result {
*ok = result;
C_KZG_RET_OK
CKzgRet::Ok
} else {
C_KZG_RET_BADARGS
CKzgRet::BadArgs
}
} else {
*ok = false;
C_KZG_RET_BADARGS
CKzgRet::BadArgs
}
}

Expand All @@ -374,29 +371,29 @@ pub unsafe extern "C" fn compute_kzg_proof(
blob: *const Blob,
z_bytes: *const Bytes32,
s: &CKZGSettings,
) -> C_KZG_RET {
) -> CKzgRet {
let deserialized_blob = match deserialize_blob(blob) {
Ok(value) => value,
Err(err) => return err,
};

let frz = match FsFr::from_bytes(&(*z_bytes).bytes) {
Ok(value) => value,
Err(_) => return C_KZG_RET_BADARGS,
Err(_) => return CKzgRet::BadArgs,
};

let settings = match kzg_settings_to_rust(s) {
let settings: FsKZGSettings = match s.try_into() {
Ok(value) => value,
Err(_) => return C_KZG_RET_BADARGS,
Err(_) => return CKzgRet::BadArgs,
};

let (proof_out_tmp, fry_tmp) = match compute_kzg_proof_rust(&deserialized_blob, &frz, &settings)
{
Ok(value) => value,
Err(_) => return C_KZG_RET_BADARGS,
Err(_) => return CKzgRet::BadArgs,
};

(*proof_out).bytes = proof_out_tmp.to_bytes();
(*y_out).bytes = fry_tmp.to_bytes();
C_KZG_RET_OK
CKzgRet::Ok
}
Loading

0 comments on commit 3aab3e2

Please sign in to comment.