mirror of
https://github.com/sigp/lighthouse.git
synced 2026-07-04 21:34:36 +00:00
@@ -55,7 +55,7 @@ fn all_benches(c: &mut Criterion) {
|
|||||||
b.iter(|| {
|
b.iter(|| {
|
||||||
black_box(reconstruct_data_columns(
|
black_box(reconstruct_data_columns(
|
||||||
&kzg,
|
&kzg,
|
||||||
&column_sidecars.iter().as_slice()[0..column_sidecars.len() / 2],
|
column_sidecars.iter().as_slice()[0..column_sidecars.len() / 2].to_vec(),
|
||||||
spec.as_ref(),
|
spec.as_ref(),
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -376,7 +376,7 @@ impl<E: EthSpec> KzgVerifiedCustodyDataColumn<E> {
|
|||||||
) -> Result<Vec<KzgVerifiedCustodyDataColumn<E>>, KzgError> {
|
) -> Result<Vec<KzgVerifiedCustodyDataColumn<E>>, KzgError> {
|
||||||
let all_data_columns = reconstruct_data_columns(
|
let all_data_columns = reconstruct_data_columns(
|
||||||
kzg,
|
kzg,
|
||||||
&partial_set_of_columns
|
partial_set_of_columns
|
||||||
.iter()
|
.iter()
|
||||||
.map(|d| d.clone_arc())
|
.map(|d| d.clone_arc())
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
|
|||||||
@@ -365,14 +365,18 @@ pub fn reconstruct_blobs<E: EthSpec>(
|
|||||||
/// Reconstruct all data columns from a subset of data column sidecars (requires at least 50%).
|
/// Reconstruct all data columns from a subset of data column sidecars (requires at least 50%).
|
||||||
pub fn reconstruct_data_columns<E: EthSpec>(
|
pub fn reconstruct_data_columns<E: EthSpec>(
|
||||||
kzg: &Kzg,
|
kzg: &Kzg,
|
||||||
data_columns: &[Arc<DataColumnSidecar<E>>],
|
mut data_columns: Vec<Arc<DataColumnSidecar<E>>>,
|
||||||
spec: &ChainSpec,
|
spec: &ChainSpec,
|
||||||
) -> Result<DataColumnSidecarList<E>, KzgError> {
|
) -> Result<DataColumnSidecarList<E>, KzgError> {
|
||||||
|
// Sort data columns by index to ensure ascending order for KZG operations
|
||||||
|
data_columns.sort_unstable_by_key(|dc| dc.index);
|
||||||
|
|
||||||
let first_data_column = data_columns
|
let first_data_column = data_columns
|
||||||
.first()
|
.first()
|
||||||
.ok_or(KzgError::InconsistentArrayLength(
|
.ok_or(KzgError::InconsistentArrayLength(
|
||||||
"data_columns should have at least one element".to_string(),
|
"data_columns should have at least one element".to_string(),
|
||||||
))?;
|
))?;
|
||||||
|
|
||||||
let num_of_blobs = first_data_column.kzg_commitments.len();
|
let num_of_blobs = first_data_column.kzg_commitments.len();
|
||||||
|
|
||||||
let blob_cells_and_proofs_vec =
|
let blob_cells_and_proofs_vec =
|
||||||
@@ -381,7 +385,7 @@ pub fn reconstruct_data_columns<E: EthSpec>(
|
|||||||
.map(|row_index| {
|
.map(|row_index| {
|
||||||
let mut cells: Vec<KzgCellRef> = vec![];
|
let mut cells: Vec<KzgCellRef> = vec![];
|
||||||
let mut cell_ids: Vec<u64> = vec![];
|
let mut cell_ids: Vec<u64> = vec![];
|
||||||
for data_column in data_columns {
|
for data_column in &data_columns {
|
||||||
let cell = data_column.column.get(row_index).ok_or(
|
let cell = data_column.column.get(row_index).ok_or(
|
||||||
KzgError::InconsistentArrayLength(format!(
|
KzgError::InconsistentArrayLength(format!(
|
||||||
"Missing data column at row index {row_index}"
|
"Missing data column at row index {row_index}"
|
||||||
@@ -433,6 +437,7 @@ mod test {
|
|||||||
test_build_data_columns_empty(&kzg, &spec);
|
test_build_data_columns_empty(&kzg, &spec);
|
||||||
test_build_data_columns(&kzg, &spec);
|
test_build_data_columns(&kzg, &spec);
|
||||||
test_reconstruct_data_columns(&kzg, &spec);
|
test_reconstruct_data_columns(&kzg, &spec);
|
||||||
|
test_reconstruct_data_columns_unordered(&kzg, &spec);
|
||||||
test_reconstruct_blobs_from_data_columns(&kzg, &spec);
|
test_reconstruct_blobs_from_data_columns(&kzg, &spec);
|
||||||
test_validate_data_columns(&kzg, &spec);
|
test_validate_data_columns(&kzg, &spec);
|
||||||
}
|
}
|
||||||
@@ -505,7 +510,7 @@ mod test {
|
|||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn test_reconstruct_data_columns(kzg: &Kzg, spec: &ChainSpec) {
|
fn test_reconstruct_data_columns(kzg: &Kzg, spec: &ChainSpec) {
|
||||||
let num_of_blobs = 6;
|
let num_of_blobs = 2;
|
||||||
let (signed_block, blobs, proofs) =
|
let (signed_block, blobs, proofs) =
|
||||||
create_test_fulu_block_and_blobs::<E>(num_of_blobs, spec);
|
create_test_fulu_block_and_blobs::<E>(num_of_blobs, spec);
|
||||||
let blob_refs = blobs.iter().collect::<Vec<_>>();
|
let blob_refs = blobs.iter().collect::<Vec<_>>();
|
||||||
@@ -516,7 +521,7 @@ mod test {
|
|||||||
// Now reconstruct
|
// Now reconstruct
|
||||||
let reconstructed_columns = reconstruct_data_columns(
|
let reconstructed_columns = reconstruct_data_columns(
|
||||||
kzg,
|
kzg,
|
||||||
&column_sidecars.iter().as_slice()[0..column_sidecars.len() / 2],
|
column_sidecars.iter().as_slice()[0..column_sidecars.len() / 2].to_vec(),
|
||||||
spec,
|
spec,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@@ -526,6 +531,27 @@ mod test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
fn test_reconstruct_data_columns_unordered(kzg: &Kzg, spec: &ChainSpec) {
|
||||||
|
let num_of_blobs = 2;
|
||||||
|
let (signed_block, blobs, proofs) =
|
||||||
|
create_test_fulu_block_and_blobs::<E>(num_of_blobs, spec);
|
||||||
|
let blob_refs = blobs.iter().collect::<Vec<_>>();
|
||||||
|
let column_sidecars =
|
||||||
|
blobs_to_data_column_sidecars(&blob_refs, proofs.to_vec(), &signed_block, kzg, spec)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Test reconstruction with columns in reverse order (non-ascending)
|
||||||
|
let mut subset_columns: Vec<_> =
|
||||||
|
column_sidecars.iter().as_slice()[0..column_sidecars.len() / 2].to_vec();
|
||||||
|
subset_columns.reverse(); // This would fail without proper sorting in reconstruct_data_columns
|
||||||
|
let reconstructed_columns = reconstruct_data_columns(kzg, subset_columns, spec).unwrap();
|
||||||
|
|
||||||
|
for i in 0..E::number_of_columns() {
|
||||||
|
assert_eq!(reconstructed_columns.get(i), column_sidecars.get(i), "{i}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn test_reconstruct_blobs_from_data_columns(kzg: &Kzg, spec: &ChainSpec) {
|
fn test_reconstruct_blobs_from_data_columns(kzg: &Kzg, spec: &ChainSpec) {
|
||||||
let num_of_blobs = 6;
|
let num_of_blobs = 6;
|
||||||
|
|||||||
Reference in New Issue
Block a user