mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-16 03:12:41 +00:00
* Refactor BlobSidecar to new type * Fix some compile errors * Gossip verification compiles * Fix http api types take 1 * Fix another round of compile errors * Beacon node crate compiles * EF tests compile * Remove all blob signing from VC * fmt * Tests compile * Fix some tests * Fix more http tests * get compiling * Fix gossip conditions and tests * Add basic proof generation and verification * remove unnecessary ssz decode * add back build_sidecar * remove default at fork for blobs * fix beacon chain tests * get relase tests compiling * fix lints * fix existing spec tests * add new ef tests * fix gossip duplicate rule * lints * add back sidecar signature check in gossip * add finalized descendant check to blob sidecar gossip * fix error conversion * fix release tests * sidecar inclusion self review cleanup * Add proof verification and computation metrics * Remove accidentally committed file * Unify some block and blob errors; add slashing conditions for sidecars * Address review comment * Clean up re-org tests (#4957) * Address more review comments * Add Comments & Eliminate Unnecessary Clones * update names * Update beacon_node/beacon_chain/src/metrics.rs Co-authored-by: Jimmy Chen <jchen.tc@gmail.com> * Update beacon_node/network/src/network_beacon_processor/tests.rs Co-authored-by: Jimmy Chen <jchen.tc@gmail.com> * pr feedback * fix test compile * Sidecar Inclusion proof small refactor and updates (#4967) * Update some comments, variables and small cosmetic fixes. * Couple blobs and proofs into a tuple in `PayloadAndBlobs` for simplicity and safety. * Update function comment. * Update testing/ef_tests/src/cases/merkle_proof_validity.rs Co-authored-by: Jimmy Chen <jchen.tc@gmail.com> * Rename the block and blob wrapper types used in the beacon API interfaces. * make sure gossip invalid blobs are passed to the slasher (#4970) * Add blob headers to slasher before adding to DA checker * Replace Vec with HashSet in BlockQueue * fmt * Rename gindex -> index * Simplify gossip condition --------- Co-authored-by: realbigsean <seananderson33@gmail.com> Co-authored-by: realbigsean <sean@sigmaprime.io> Co-authored-by: Michael Sproul <michael@sigmaprime.io> Co-authored-by: Mark Mackey <mark@sigmaprime.io> Co-authored-by: Jimmy Chen <jchen.tc@gmail.com>
79 lines
2.7 KiB
Rust
79 lines
2.7 KiB
Rust
use kzg::{Blob as KzgBlob, Error as KzgError, Kzg};
|
|
use types::{Blob, EthSpec, Hash256, 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>) -> Result<KzgBlob, KzgError> {
|
|
KzgBlob::from_bytes(blob.as_ref()).map_err(Into::into)
|
|
}
|
|
|
|
/// Validate a single blob-commitment-proof triplet from a `BlobSidecar`.
|
|
pub fn validate_blob<T: EthSpec>(
|
|
kzg: &Kzg,
|
|
blob: &Blob<T>,
|
|
kzg_commitment: KzgCommitment,
|
|
kzg_proof: KzgProof,
|
|
) -> Result<(), KzgError> {
|
|
let _timer = crate::metrics::start_timer(&crate::metrics::KZG_VERIFICATION_SINGLE_TIMES);
|
|
let kzg_blob = ssz_blob_to_crypto_blob::<T>(blob)?;
|
|
kzg.verify_blob_kzg_proof(&kzg_blob, kzg_commitment, kzg_proof)
|
|
}
|
|
|
|
/// Validate a batch of blob-commitment-proof triplets from multiple `BlobSidecars`.
|
|
pub fn validate_blobs<T: EthSpec>(
|
|
kzg: &Kzg,
|
|
expected_kzg_commitments: &[KzgCommitment],
|
|
blobs: Vec<&Blob<T>>,
|
|
kzg_proofs: &[KzgProof],
|
|
) -> Result<(), KzgError> {
|
|
let _timer = crate::metrics::start_timer(&crate::metrics::KZG_VERIFICATION_BATCH_TIMES);
|
|
let blobs = blobs
|
|
.into_iter()
|
|
.map(|blob| ssz_blob_to_crypto_blob::<T>(blob))
|
|
.collect::<Result<Vec<_>, KzgError>>()?;
|
|
|
|
kzg.verify_blob_kzg_proof_batch(&blobs, expected_kzg_commitments, kzg_proofs)
|
|
}
|
|
|
|
/// 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> {
|
|
let kzg_blob = ssz_blob_to_crypto_blob::<T>(blob)?;
|
|
kzg.compute_blob_kzg_proof(&kzg_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> {
|
|
let kzg_blob = ssz_blob_to_crypto_blob::<T>(blob)?;
|
|
kzg.blob_to_kzg_commitment(&kzg_blob)
|
|
}
|
|
|
|
/// Compute the kzg proof for a given blob and an evaluation point z.
|
|
pub fn compute_kzg_proof<T: EthSpec>(
|
|
kzg: &Kzg,
|
|
blob: &Blob<T>,
|
|
z: Hash256,
|
|
) -> Result<(KzgProof, Hash256), KzgError> {
|
|
let z = z.0.into();
|
|
let kzg_blob = ssz_blob_to_crypto_blob::<T>(blob)?;
|
|
kzg.compute_kzg_proof(&kzg_blob, &z)
|
|
.map(|(proof, z)| (proof, Hash256::from_slice(&z.to_vec())))
|
|
}
|
|
|
|
/// Verify a `kzg_proof` for a `kzg_commitment` that evaluating a polynomial at `z` results in `y`
|
|
pub fn verify_kzg_proof<T: EthSpec>(
|
|
kzg: &Kzg,
|
|
kzg_commitment: KzgCommitment,
|
|
kzg_proof: KzgProof,
|
|
z: Hash256,
|
|
y: Hash256,
|
|
) -> Result<bool, KzgError> {
|
|
kzg.verify_kzg_proof(kzg_commitment, &z.0.into(), &y.0.into(), kzg_proof)
|
|
}
|