Skip to content

Commit 8abc5e1

Browse files
authored
DataColumnSidecarsForReconstruct: Add guards (prysmaticlabs#15051)
1 parent b1ac53c commit 8abc5e1

File tree

3 files changed

+43
-10
lines changed

3 files changed

+43
-10
lines changed

beacon-chain/core/peerdas/reconstruction.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,25 @@ func DataColumnSidecarsForReconstruct(
9797

9898
// Get the column sidecars.
9999
sidecars := make([]*ethpb.DataColumnSidecar, 0, fieldparams.NumberOfColumns)
100-
for columnIndex := uint64(0); columnIndex < fieldparams.NumberOfColumns; columnIndex++ {
100+
for columnIndex := range fieldparams.NumberOfColumns {
101101
column := make([]kzg.Cell, 0, blobsCount)
102102
kzgProofOfColumn := make([]kzg.Proof, 0, blobsCount)
103103

104-
for rowIndex := 0; rowIndex < blobsCount; rowIndex++ {
104+
for rowIndex := range blobsCount {
105105
cellsForRow := cellsAndProofs[rowIndex].Cells
106106
proofsForRow := cellsAndProofs[rowIndex].Proofs
107107

108+
if len(cellsForRow) != fieldparams.NumberOfColumns {
109+
return nil, errors.Errorf("cells don't have the expected size: expected %d - actual %d", fieldparams.NumberOfColumns, len(cellsForRow))
110+
}
111+
108112
cell := cellsForRow[columnIndex]
109113
column = append(column, cell)
110114

115+
if len(proofsForRow) != fieldparams.NumberOfColumns {
116+
return nil, errors.Errorf("proofs don't have the expected size: expected %d - actual %d", fieldparams.NumberOfColumns, len(proofsForRow))
117+
}
118+
111119
kzgProof := proofsForRow[columnIndex]
112120
kzgProofOfColumn = append(kzgProofOfColumn, kzgProof)
113121
}
@@ -124,7 +132,7 @@ func DataColumnSidecarsForReconstruct(
124132
}
125133

126134
sidecar := &ethpb.DataColumnSidecar{
127-
ColumnIndex: columnIndex,
135+
ColumnIndex: uint64(columnIndex),
128136
DataColumn: columnBytes,
129137
KzgCommitments: blobKzgCommitments,
130138
KzgProof: kzgProofOfColumnBytes,

beacon-chain/sync/subscriber_beacon_blocks.go

+16-3
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,21 @@ func (s *Service) reconstructAndBroadcastBlobs(ctx context.Context, block interf
7575
}
7676

7777
// reconstructAndBroadcastBlobsInDataColumn reconstructs and broadcasts blobs in data column format for a given beacon block, it also saves data column sidecars into the blob storage.
78-
func (s *Service) reconstructAndBroadcastBlobsInDataColumn(ctx context.Context, block interfaces.ReadOnlySignedBeaconBlock) {
79-
blockRoot, err := block.Block().HashTreeRoot()
78+
func (s *Service) reconstructAndBroadcastBlobsInDataColumn(ctx context.Context, roSignedBlock interfaces.ReadOnlySignedBeaconBlock) {
79+
block := roSignedBlock.Block()
80+
81+
kzgCommitments, err := block.Body().BlobKzgCommitments()
82+
if err != nil {
83+
log.WithError(err).Error("Failed to read commitments from block")
84+
return
85+
}
86+
87+
if len(kzgCommitments) == 0 {
88+
// No blobs to reconstruct.
89+
return
90+
}
91+
92+
blockRoot, err := block.HashTreeRoot()
8093
if err != nil {
8194
log.WithError(err).Error("Failed to calculate block root")
8295
return
@@ -87,7 +100,7 @@ func (s *Service) reconstructAndBroadcastBlobsInDataColumn(ctx context.Context,
87100
}
88101

89102
// when this function is called, it's from the time when the block is received, so in almost all situations we need to get the data column from EL instead of the blob storage.
90-
sidecars, err := s.cfg.executionReconstructor.ReconstructDataColumnSidecars(ctx, block, blockRoot)
103+
sidecars, err := s.cfg.executionReconstructor.ReconstructDataColumnSidecars(ctx, roSignedBlock, blockRoot)
91104
if err != nil {
92105
log.WithError(err).Debug("Cannot reconstruct data column sidecars after receiving the block")
93106
return

beacon-chain/sync/subscriber_beacon_blocks_test.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,6 @@ func TestReconstructAndBroadcastBlobs(t *testing.T) {
218218
Genesis: time.Now(),
219219
}
220220

221-
b := util.NewBeaconBlockFulu()
222-
sb, err := blocks.NewSignedBeaconBlock(b)
223-
require.NoError(t, err)
224-
225221
allColumns := make([]blocks.VerifiedRODataColumn, 128)
226222
for i := range allColumns {
227223
rod, err := blocks.NewRODataColumn(
@@ -244,15 +240,18 @@ func TestReconstructAndBroadcastBlobs(t *testing.T) {
244240
tests := []struct {
245241
name string
246242
dataColumnSidecars []blocks.VerifiedRODataColumn
243+
blobCount int
247244
expectedDataColumnCount int
248245
}{
249246
{
250247
name: "Constructed 0 data columns with no blobs",
248+
blobCount: 0,
251249
dataColumnSidecars: nil,
252250
expectedDataColumnCount: 0,
253251
},
254252
{
255253
name: "Constructed 128 data columns with all blobs",
254+
blobCount: 1,
256255
dataColumnSidecars: allColumns,
257256
expectedDataColumnCount: 8, // default is 8
258257
},
@@ -276,6 +275,19 @@ func TestReconstructAndBroadcastBlobs(t *testing.T) {
276275
receivedDataColumnsFromRoot: gcache.New(1*time.Minute, 2*time.Minute),
277276
storedDataColumnsFromRoot: gcache.New(1*time.Minute, 2*time.Minute),
278277
}
278+
279+
kzgCommitments := make([][]byte, 0, tt.blobCount)
280+
for range tt.blobCount {
281+
kzgCommitment := make([]byte, 48)
282+
kzgCommitments = append(kzgCommitments, kzgCommitment)
283+
}
284+
285+
b := util.NewBeaconBlockFulu()
286+
b.Block.Body.BlobKzgCommitments = kzgCommitments
287+
288+
sb, err := blocks.NewSignedBeaconBlock(b)
289+
require.NoError(t, err)
290+
279291
s.reconstructAndBroadcastBlobs(context.Background(), sb)
280292
require.Equal(t, tt.expectedDataColumnCount, len(chainService.DataColumns))
281293
})

0 commit comments

Comments
 (0)