diff --git a/packages/beacon-node/src/chain/validation/dataColumnSidecar.ts b/packages/beacon-node/src/chain/validation/dataColumnSidecar.ts index 332b1982a5db..a1c831f7d5f3 100644 --- a/packages/beacon-node/src/chain/validation/dataColumnSidecar.ts +++ b/packages/beacon-node/src/chain/validation/dataColumnSidecar.ts @@ -72,6 +72,8 @@ export function validateDataColumnsSidecars( if ( columnBlockHeader.slot !== blockSlot || !byteArrayEquals(columnBlockRoot, blockRoot) || + kzgCommitments.length === 0 || + blockKzgCommitments.length === 0 || blockKzgCommitments.length !== kzgCommitments.length || blockKzgCommitments .map((commitment, i) => byteArrayEquals(commitment, kzgCommitments[i])) diff --git a/packages/beacon-node/test/unit/util/dataColumn.test.ts b/packages/beacon-node/test/unit/util/dataColumn.test.ts index d38156b488f0..b000555c4c4b 100644 --- a/packages/beacon-node/test/unit/util/dataColumn.test.ts +++ b/packages/beacon-node/test/unit/util/dataColumn.test.ts @@ -103,4 +103,41 @@ describe("data column sidecars", () => { expect(validateDataColumnsSidecars(slot, blockRoot, kzgCommitments, columnSidecars)).toBeUndefined(); }); + + it("fail for no blob commitments in validateDataColumnsSidecars", () => { + const chainConfig = createChainForkConfig({ + ...defaultChainConfig, + ALTAIR_FORK_EPOCH: 0, + BELLATRIX_FORK_EPOCH: 0, + DENEB_FORK_EPOCH: 0, + ELECTRA_FORK_EPOCH: 0, + }); + const genesisValidatorsRoot = Buffer.alloc(32, 0xaa); + const config = createBeaconConfig(chainConfig, genesisValidatorsRoot); + + const chain = getMockedBeaconChain({config}); + afterEachCallbacks.push(() => chain.close()); + + const slot = 0; + const blobs = [generateRandomBlob(), generateRandomBlob()]; + const kzgCommitments = blobs.map((blob) => ckzg.blobToKzgCommitment(blob)); + + const signedBeaconBlock = ssz.deneb.SignedBeaconBlock.defaultValue(); + + for (const kzgCommitment of kzgCommitments) { + signedBeaconBlock.message.body.executionPayload.transactions.push(transactionForKzgCommitment(kzgCommitment)); + signedBeaconBlock.message.body.blobKzgCommitments.push(kzgCommitment); + } + const blockRoot = ssz.deneb.BeaconBlock.hashTreeRoot(signedBeaconBlock.message); + const columnSidecars = computeDataColumnSidecars(config, signedBeaconBlock, { + blobs, + }); + + expect(columnSidecars.length).toEqual(NUMBER_OF_COLUMNS); + expect(columnSidecars[0].column.length).toEqual(blobs.length); + + expect(() => validateDataColumnsSidecars(slot, blockRoot, [], columnSidecars)).toThrow( + `Invalid data column sidecar slot=${slot}` + ); + }); });