mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-15 02:42:38 +00:00
Merge branch 'deneb-free-blobs' into get-validator-block-and-blobs
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
use kzg::{Error as KzgError, Kzg, BYTES_PER_BLOB};
|
||||
use types::{Blob, BlobsSidecar, EthSpec, Hash256, KzgCommitment, KzgProof, Slot};
|
||||
use types::{Blob, EthSpec, KzgCommitment, KzgProof};
|
||||
|
||||
/// Converts a blob ssz List object to an array to be used with the kzg
|
||||
/// crypto library.
|
||||
fn ssz_blob_to_crypto_blob<T: EthSpec>(blob: Blob<T>) -> kzg::Blob {
|
||||
let blob_vec: Vec<u8> = blob.into();
|
||||
let mut arr = [0; BYTES_PER_BLOB];
|
||||
@@ -8,47 +10,48 @@ fn ssz_blob_to_crypto_blob<T: EthSpec>(blob: Blob<T>) -> kzg::Blob {
|
||||
arr.into()
|
||||
}
|
||||
|
||||
pub fn validate_blobs_sidecar<T: EthSpec>(
|
||||
/// Validate a single blob-commitment-proof triplet from a `BlobSidecar`.
|
||||
pub fn validate_blob<T: EthSpec>(
|
||||
kzg: &Kzg,
|
||||
slot: Slot,
|
||||
beacon_block_root: Hash256,
|
||||
expected_kzg_commitments: &[KzgCommitment],
|
||||
blobs_sidecar: &BlobsSidecar<T>,
|
||||
blob: Blob<T>,
|
||||
kzg_commitment: KzgCommitment,
|
||||
kzg_proof: KzgProof,
|
||||
) -> Result<bool, KzgError> {
|
||||
if slot != blobs_sidecar.beacon_block_slot
|
||||
|| beacon_block_root != blobs_sidecar.beacon_block_root
|
||||
|| blobs_sidecar.blobs.len() != expected_kzg_commitments.len()
|
||||
{
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
let blobs = blobs_sidecar
|
||||
.blobs
|
||||
.clone() // TODO(pawan): avoid this clone
|
||||
.into_iter()
|
||||
.map(|blob| ssz_blob_to_crypto_blob::<T>(blob))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
kzg.verify_aggregate_kzg_proof(
|
||||
&blobs,
|
||||
expected_kzg_commitments,
|
||||
blobs_sidecar.kzg_aggregated_proof,
|
||||
kzg.verify_blob_kzg_proof(
|
||||
ssz_blob_to_crypto_blob::<T>(blob),
|
||||
kzg_commitment,
|
||||
kzg_proof,
|
||||
)
|
||||
}
|
||||
|
||||
pub fn compute_aggregate_kzg_proof<T: EthSpec>(
|
||||
/// Validate a batch of blob-commitment-proof triplets from multiple `BlobSidecars`.
|
||||
pub fn validate_blobs<T: EthSpec>(
|
||||
kzg: &Kzg,
|
||||
expected_kzg_commitments: &[KzgCommitment],
|
||||
blobs: &[Blob<T>],
|
||||
) -> Result<KzgProof, KzgError> {
|
||||
kzg_proofs: &[KzgProof],
|
||||
) -> Result<bool, KzgError> {
|
||||
let blobs = blobs
|
||||
.iter()
|
||||
.map(|blob| ssz_blob_to_crypto_blob::<T>(blob.clone())) // TODO(pawan): avoid this clone
|
||||
.map(|blob| ssz_blob_to_crypto_blob::<T>(blob.clone())) // Avoid this clone
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
kzg.compute_aggregate_kzg_proof(&blobs)
|
||||
kzg.verify_blob_kzg_proof_batch(&blobs, expected_kzg_commitments, kzg_proofs)
|
||||
}
|
||||
|
||||
pub fn blob_to_kzg_commitment<T: EthSpec>(kzg: &Kzg, blob: Blob<T>) -> KzgCommitment {
|
||||
let blob = ssz_blob_to_crypto_blob::<T>(blob);
|
||||
kzg.blob_to_kzg_commitment(blob)
|
||||
/// Compute the kzg proof given an ssz blob and its kzg commitment.
|
||||
pub fn compute_blob_kzg_proof<T: EthSpec>(
|
||||
kzg: &Kzg,
|
||||
blob: Blob<T>,
|
||||
kzg_commitment: KzgCommitment,
|
||||
) -> Result<KzgProof, KzgError> {
|
||||
kzg.compute_blob_kzg_proof(ssz_blob_to_crypto_blob::<T>(blob), kzg_commitment)
|
||||
}
|
||||
|
||||
/// Compute the kzg commitment for a given blob.
|
||||
pub fn blob_to_kzg_commitment<T: EthSpec>(
|
||||
kzg: &Kzg,
|
||||
blob: Blob<T>,
|
||||
) -> Result<KzgCommitment, KzgError> {
|
||||
kzg.blob_to_kzg_commitment(ssz_blob_to_crypto_blob::<T>(blob))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user