use alloc::string::ToString;
use c_kzg::{Blob as KzgBlob, Bytes48, ethereum_kzg_settings};
use super::{BlobData, BlobSidecar, Error};
impl BlobData {
#[must_use]
pub fn eth_kzg_settings(
precompute: Option<u64>,
) -> &'static c_kzg::KzgSettings {
const DEFAULT_PRECOMPUTE: u64 = 0;
ethereum_kzg_settings(precompute.unwrap_or(DEFAULT_PRECOMPUTE))
}
pub fn verify_blob_kzg_proof(
settings: &c_kzg::KzgSettings,
sidecar: &BlobSidecar,
) -> Result<bool, Error> {
let blob = KzgBlob::from_bytes(&sidecar.data)?;
let commitment_bytes = Bytes48::new(sidecar.commitment);
let proof_bytes = Bytes48::new(sidecar.proof);
Ok(settings.verify_blob_kzg_proof(
&blob,
&commitment_bytes,
&proof_bytes,
)?)
}
pub fn from_datapart(
data: &[u8],
precompute: Option<u64>,
) -> Result<Self, Error> {
let blob = KzgBlob::from_bytes(data)?;
let settings = Self::eth_kzg_settings(precompute);
let commitment = settings.blob_to_kzg_commitment(&blob)?.to_bytes();
let proof = settings
.compute_blob_kzg_proof(&blob, &commitment)?
.to_bytes();
let sidecar = BlobSidecar {
commitment: commitment.into_inner(),
proof: proof.into_inner(),
data: blob.into_inner(),
};
let versioned_hash =
BlobData::hash_from_commitment(&sidecar.commitment);
Ok(Self {
hash: versioned_hash,
data: Some(sidecar),
})
}
}
impl From<c_kzg::Error> for Error {
fn from(kzg_error: c_kzg::Error) -> Self {
Self::Blob(kzg_error.to_string())
}
}