@lodestar/beacon-node 1.35.0-dev.47470aab65 → 1.35.0-dev.497d67cb8a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +7 -1
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/config/constants.d.ts +9 -9
  5. package/lib/api/impl/config/constants.js +16 -9
  6. package/lib/api/impl/config/constants.js.map +1 -1
  7. package/lib/api/impl/validator/index.d.ts.map +1 -1
  8. package/lib/api/impl/validator/index.js +15 -25
  9. package/lib/api/impl/validator/index.js.map +1 -1
  10. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  11. package/lib/chain/blocks/blockInput/blockInput.js +2 -1
  12. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  13. package/lib/chain/chain.d.ts +1 -1
  14. package/lib/chain/chain.d.ts.map +1 -1
  15. package/lib/chain/chain.js +1 -2
  16. package/lib/chain/chain.js.map +1 -1
  17. package/lib/chain/lightClient/index.d.ts +2 -2
  18. package/lib/chain/lightClient/index.d.ts.map +1 -1
  19. package/lib/chain/lightClient/index.js +2 -0
  20. package/lib/chain/lightClient/index.js.map +1 -1
  21. package/lib/chain/produceBlock/produceBlockBody.d.ts +1 -4
  22. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  23. package/lib/chain/produceBlock/produceBlockBody.js +13 -4
  24. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  25. package/lib/chain/regen/interface.d.ts +1 -0
  26. package/lib/chain/regen/interface.d.ts.map +1 -1
  27. package/lib/chain/regen/interface.js +1 -0
  28. package/lib/chain/regen/interface.js.map +1 -1
  29. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  30. package/lib/chain/seenCache/seenGossipBlockInput.js +8 -1
  31. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  32. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  33. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  34. package/lib/network/gossip/topic.js +2 -2
  35. package/lib/network/gossip/topic.js.map +1 -1
  36. package/lib/network/peers/datastore.d.ts +2 -2
  37. package/lib/network/peers/datastore.d.ts.map +1 -1
  38. package/lib/network/peers/datastore.js +2 -2
  39. package/lib/network/peers/datastore.js.map +1 -1
  40. package/lib/network/peers/datastore_bun.d.ts +3 -0
  41. package/lib/network/peers/datastore_bun.d.ts.map +1 -0
  42. package/lib/network/peers/datastore_bun.js +3 -0
  43. package/lib/network/peers/datastore_bun.js.map +1 -0
  44. package/lib/sync/utils/downloadByRange.d.ts +2 -1
  45. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  46. package/lib/sync/utils/downloadByRange.js +8 -3
  47. package/lib/sync/utils/downloadByRange.js.map +1 -1
  48. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  49. package/lib/sync/utils/downloadByRoot.js +2 -1
  50. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  51. package/lib/util/dataColumns.d.ts.map +1 -1
  52. package/lib/util/dataColumns.js +4 -2
  53. package/lib/util/dataColumns.js.map +1 -1
  54. package/package.json +19 -14
  55. package/src/api/impl/beacon/blocks/index.ts +10 -1
  56. package/src/api/impl/config/constants.ts +17 -9
  57. package/src/api/impl/validator/index.ts +15 -30
  58. package/src/chain/blocks/blockInput/blockInput.ts +5 -3
  59. package/src/chain/chain.ts +0 -2
  60. package/src/chain/lightClient/index.ts +11 -3
  61. package/src/chain/produceBlock/produceBlockBody.ts +16 -14
  62. package/src/chain/regen/interface.ts +1 -0
  63. package/src/chain/seenCache/seenGossipBlockInput.ts +10 -2
  64. package/src/chain/validation/dataColumnSidecar.ts +1 -1
  65. package/src/network/gossip/topic.ts +2 -2
  66. package/src/network/peers/datastore.ts +4 -4
  67. package/src/network/peers/datastore_bun.ts +3 -0
  68. package/src/sync/utils/downloadByRange.ts +12 -6
  69. package/src/sync/utils/downloadByRoot.ts +12 -4
  70. package/src/util/dataColumns.ts +11 -2
@@ -4,9 +4,11 @@ import {
4
4
  ForkPostBellatrix,
5
5
  ForkPostDeneb,
6
6
  ForkPostFulu,
7
+ ForkPreGloas,
7
8
  ForkSeq,
8
9
  isForkPostAltair,
9
10
  isForkPostBellatrix,
11
+ isForkPostGloas,
10
12
  } from "@lodestar/params";
11
13
  import {
12
14
  CachedBeaconStateAllForks,
@@ -90,7 +92,6 @@ export type BlockAttributes = {
90
92
  graffiti: Bytes32;
91
93
  slot: Slot;
92
94
  parentBlockRoot: Root;
93
- parentSlot: Slot;
94
95
  feeRecipient?: string;
95
96
  };
96
97
 
@@ -182,7 +183,14 @@ export async function produceBlockBody<T extends BlockType>(
182
183
  };
183
184
  this.logger.verbose("Producing beacon block body", logMeta);
184
185
 
185
- if (isForkPostBellatrix(fork)) {
186
+ if (isForkPostGloas(fork)) {
187
+ // TODO GLOAS: Set body.signedExecutionPayloadBid and body.payloadAttestation
188
+ const commonBlockBody = await commonBlockBodyPromise;
189
+ blockBody = Object.assign({}, commonBlockBody) as AssembledBodyType<T>;
190
+ executionPayloadValue = BigInt(0);
191
+
192
+ // We don't deal with blinded blocks, execution engine, blobs and execution requests post-gloas
193
+ } else if (isForkPostBellatrix(fork)) {
186
194
  const safeBlockHash = this.forkChoice.getJustifiedBlock().executionPayloadBlockHash ?? ZERO_HASH_HEX;
187
195
  const finalizedBlockHash = this.forkChoice.getFinalizedBlock().executionPayloadBlockHash ?? ZERO_HASH_HEX;
188
196
  const feeRecipient = requestedFeeRecipient ?? this.beaconProposerCache.getOrDefault(proposerIndex);
@@ -307,6 +315,7 @@ export async function produceBlockBody<T extends BlockType>(
307
315
 
308
316
  // blockType === BlockType.Full
309
317
  else {
318
+ // enginePromise only supports pre-gloas
310
319
  const enginePromise = (async () => {
311
320
  const endExecutionPayload = this.metrics?.executionBlockProductionTimeSteps.startTimer();
312
321
 
@@ -384,13 +393,13 @@ export async function produceBlockBody<T extends BlockType>(
384
393
  blockBody = Object.assign({}, commonBlockBody) as AssembledBodyType<BlockType.Blinded>;
385
394
 
386
395
  if (engineRes.isPremerge) {
387
- (blockBody as BeaconBlockBody<ForkPostBellatrix>).executionPayload = engineRes.executionPayload;
396
+ (blockBody as BeaconBlockBody<ForkPostBellatrix & ForkPreGloas>).executionPayload = engineRes.executionPayload;
388
397
  executionPayloadValue = engineRes.executionPayloadValue;
389
398
  } else {
390
399
  const {prepType, payloadId, executionPayload, blobsBundle, executionRequests} = engineRes;
391
400
  shouldOverrideBuilder = engineRes.shouldOverrideBuilder;
392
401
 
393
- (blockBody as BeaconBlockBody<ForkPostBellatrix>).executionPayload = executionPayload;
402
+ (blockBody as BeaconBlockBody<ForkPostBellatrix & ForkPreGloas>).executionPayload = executionPayload;
394
403
  (produceResult as ProduceFullBellatrix).executionPayload = executionPayload;
395
404
  executionPayloadValue = engineRes.executionPayloadValue;
396
405
  Object.assign(logMeta, {transactions: executionPayload.transactions.length, shouldOverrideBuilder});
@@ -723,15 +732,7 @@ export async function produceCommonBlockBody<T extends BlockType>(
723
732
  this: BeaconChain,
724
733
  blockType: T,
725
734
  currentState: CachedBeaconStateAllForks,
726
- {
727
- randaoReveal,
728
- graffiti,
729
- slot,
730
- parentSlot,
731
- parentBlockRoot,
732
- }: BlockAttributes & {
733
- parentSlot: Slot;
734
- }
735
+ {randaoReveal, graffiti, slot, parentBlockRoot}: BlockAttributes
735
736
  ): Promise<CommonBlockBody> {
736
737
  const stepsMetrics =
737
738
  blockType === BlockType.Full
@@ -783,7 +784,8 @@ export async function produceCommonBlockBody<T extends BlockType>(
783
784
 
784
785
  const endSyncAggregate = stepsMetrics?.startTimer();
785
786
  if (ForkSeq[fork] >= ForkSeq.altair) {
786
- const syncAggregate = this.syncContributionAndProofPool.getAggregate(parentSlot, parentBlockRoot);
787
+ const previousSlot = slot - 1;
788
+ const syncAggregate = this.syncContributionAndProofPool.getAggregate(previousSlot, parentBlockRoot);
787
789
  this.metrics?.production.producedSyncAggregateParticipants.observe(
788
790
  syncAggregate.syncCommitteeBits.getTrueBitIndexes().length
789
791
  );
@@ -10,6 +10,7 @@ export enum RegenCaller {
10
10
  produceBlock = "produceBlock",
11
11
  validateGossipBlock = "validateGossipBlock",
12
12
  validateGossipBlob = "validateGossipBlob",
13
+ validateGossipDataColumn = "validateGossipDataColumn",
13
14
  precomputeEpoch = "precomputeEpoch",
14
15
  predictProposerHead = "predictProposerHead",
15
16
  produceAttestationData = "produceAttestationData",
@@ -1,6 +1,6 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {CheckpointWithHex} from "@lodestar/fork-choice";
3
- import {ForkName, ForkPostFulu, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
3
+ import {ForkName, ForkPostFulu, ForkPreGloas, isForkPostDeneb, isForkPostFulu, isForkPostGloas} from "@lodestar/params";
4
4
  import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
5
5
  import {RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
6
6
  import {LodestarError, Logger} from "@lodestar/utils";
@@ -155,6 +155,12 @@ export class SeenBlockInput {
155
155
  let blockInput = this.blockInputs.get(blockRootHex) as IBlockInput;
156
156
  if (!blockInput) {
157
157
  const {forkName, daOutOfRange} = this.buildCommonProps(block.message.slot);
158
+
159
+ // TODO GLOAS: Implement
160
+ if (isForkPostGloas(forkName)) {
161
+ throw Error("Not implemented");
162
+ }
163
+ // Pre-deneb
158
164
  if (!isForkPostDeneb(forkName)) {
159
165
  blockInput = BlockInputPreData.createFromBlock({
160
166
  block,
@@ -165,9 +171,10 @@ export class SeenBlockInput {
165
171
  seenTimestampSec,
166
172
  peerIdStr,
167
173
  });
174
+ // Fulu Only
168
175
  } else if (isForkPostFulu(forkName)) {
169
176
  blockInput = BlockInputColumns.createFromBlock({
170
- block: block as SignedBeaconBlock<ForkPostFulu>,
177
+ block: block as SignedBeaconBlock<ForkPostFulu & ForkPreGloas>,
171
178
  blockRootHex,
172
179
  daOutOfRange,
173
180
  forkName,
@@ -177,6 +184,7 @@ export class SeenBlockInput {
177
184
  seenTimestampSec,
178
185
  peerIdStr,
179
186
  });
187
+ // Deneb and Electra
180
188
  } else {
181
189
  blockInput = BlockInputBlobs.createFromBlock({
182
190
  block: block as SignedBeaconBlock<ForkBlobsDA>,
@@ -99,7 +99,7 @@ export async function validateGossipDataColumnSidecar(
99
99
  // this is something we should change this in the future to make the code airtight to the spec.
100
100
  // 7) [REJECT] The sidecar's block's parent passes validation.
101
101
  const blockState = await chain.regen
102
- .getBlockSlotState(parentRoot, blockHeader.slot, {dontTransferCache: true}, RegenCaller.validateGossipBlock)
102
+ .getBlockSlotState(parentRoot, blockHeader.slot, {dontTransferCache: true}, RegenCaller.validateGossipDataColumn)
103
103
  .catch(() => {
104
104
  throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
105
105
  code: DataColumnSidecarErrorCode.PARENT_UNKNOWN,
@@ -245,8 +245,8 @@ export function getCoreTopicsAtFork(
245
245
  topics.push(...getDataColumnSidecarTopics(networkConfig));
246
246
  }
247
247
 
248
- // After Deneb also track blob_sidecar_{subnet_id}
249
- if (ForkSeq[fork] >= ForkSeq.deneb) {
248
+ // After Deneb and before Fulu also track blob_sidecar_{subnet_id}
249
+ if (ForkSeq[fork] >= ForkSeq.deneb && ForkSeq[fork] < ForkSeq.fulu) {
250
250
  const {config} = networkConfig;
251
251
  const subnetCount = isForkPostElectra(fork)
252
252
  ? config.BLOB_SIDECAR_SUBNET_COUNT_ELECTRA
@@ -1,7 +1,7 @@
1
1
  import {AbortOptions} from "@libp2p/interface";
2
2
  import {BaseDatastore} from "datastore-core";
3
- import {FsDatastore} from "datastore-fs";
4
3
  import {Key, KeyQuery, Pair, Query} from "interface-datastore";
4
+ import {LevelDatastore} from "#datastore-wrapper";
5
5
 
6
6
  type MemoryItem = {
7
7
  lastAccessedMs: number;
@@ -22,7 +22,7 @@ type MemoryItem = {
22
22
  * - Update lastAccessedMs
23
23
  */
24
24
  export class Eth2PeerDataStore extends BaseDatastore {
25
- private _dbDatastore: FsDatastore;
25
+ private _dbDatastore: LevelDatastore;
26
26
  private _memoryDatastore: Map<string, MemoryItem>;
27
27
  /** Same to PersistentPeerStore of the old libp2p implementation */
28
28
  private _dirtyItems = new Set<string>();
@@ -32,7 +32,7 @@ export class Eth2PeerDataStore extends BaseDatastore {
32
32
  private _maxMemoryItems: number;
33
33
 
34
34
  constructor(
35
- dbDatastore: FsDatastore | string,
35
+ dbDatastore: LevelDatastore | string,
36
36
  {threshold = 5, maxMemoryItems = 50}: {threshold?: number | undefined; maxMemoryItems?: number | undefined} = {}
37
37
  ) {
38
38
  super();
@@ -44,7 +44,7 @@ export class Eth2PeerDataStore extends BaseDatastore {
44
44
  throw Error(`Threshold ${threshold} should be at most maxMemoryItems ${maxMemoryItems}`);
45
45
  }
46
46
 
47
- this._dbDatastore = typeof dbDatastore === "string" ? new FsDatastore(dbDatastore) : dbDatastore;
47
+ this._dbDatastore = typeof dbDatastore === "string" ? new LevelDatastore(dbDatastore) : dbDatastore;
48
48
  this._memoryDatastore = new Map();
49
49
  this._threshold = threshold;
50
50
  this._maxMemoryItems = maxMemoryItems;
@@ -0,0 +1,3 @@
1
+ import {FsDatastore} from "datastore-fs";
2
+
3
+ export const LevelDatastore = FsDatastore;
@@ -1,5 +1,5 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
- import {ForkPostDeneb, ForkPostFulu} from "@lodestar/params";
2
+ import {ForkPostDeneb, ForkPostFulu, ForkPreFulu, ForkPreGloas} from "@lodestar/params";
3
3
  import {SignedBeaconBlock, Slot, deneb, fulu, phase0} from "@lodestar/types";
4
4
  import {LodestarError, Logger, fromHex, prettyBytes, prettyPrintIndices, toRootHex} from "@lodestar/utils";
5
5
  import {
@@ -458,14 +458,16 @@ export function validateBlockByRangeResponse(
458
458
  }
459
459
 
460
460
  /**
461
- * Should not be called directly. Only exported for unit testing purposes
461
+ * Should not be called directly. Only exported for unit testing purposes.
462
+ * This is used only in Deneb and Electra
462
463
  */
463
464
  export async function validateBlobsByRangeResponse(
464
465
  dataRequestBlocks: ValidatedBlock[],
465
466
  blobSidecars: deneb.BlobSidecars
466
467
  ): Promise<ValidatedBlobSidecars[]> {
467
468
  const expectedBlobCount = dataRequestBlocks.reduce(
468
- (acc, {block}) => (block as SignedBeaconBlock<ForkPostDeneb>).message.body.blobKzgCommitments.length + acc,
469
+ (acc, {block}) =>
470
+ (block as SignedBeaconBlock<ForkPostDeneb & ForkPreFulu>).message.body.blobKzgCommitments.length + acc,
469
471
  0
470
472
  );
471
473
  if (blobSidecars.length > expectedBlobCount) {
@@ -492,7 +494,8 @@ export async function validateBlobsByRangeResponse(
492
494
  const validateSidecarsPromises: Promise<ValidatedBlobSidecars>[] = [];
493
495
  for (let blockIndex = 0, blobSidecarIndex = 0; blockIndex < dataRequestBlocks.length; blockIndex++) {
494
496
  const {block, blockRoot} = dataRequestBlocks[blockIndex];
495
- const blockKzgCommitments = (block as SignedBeaconBlock<ForkPostDeneb>).message.body.blobKzgCommitments;
497
+ const blockKzgCommitments = (block as SignedBeaconBlock<ForkPostDeneb & ForkPreFulu>).message.body
498
+ .blobKzgCommitments;
496
499
  if (blockKzgCommitments.length === 0) {
497
500
  continue;
498
501
  }
@@ -532,8 +535,9 @@ export async function validateColumnsByRangeResponse(
532
535
  columnSidecars: fulu.DataColumnSidecars
533
536
  ): Promise<WarnResult<ValidatedColumnSidecars[], DownloadByRangeError>> {
534
537
  // Expected column count considering currently-validated batch blocks
538
+ // TODO GLOAS: Post-gloas's blobKzgCommitments is not in beacon block body. Need to source it from somewhere else.
535
539
  const expectedColumnCount = dataRequestBlocks.reduce((acc, {block}) => {
536
- return (block as SignedBeaconBlock<ForkPostDeneb>).message.body.blobKzgCommitments.length > 0
540
+ return (block as SignedBeaconBlock<ForkPostDeneb & ForkPreGloas>).message.body.blobKzgCommitments.length > 0
537
541
  ? request.columns.length + acc
538
542
  : acc;
539
543
  }, 0);
@@ -566,7 +570,9 @@ export async function validateColumnsByRangeResponse(
566
570
  const {block, blockRoot} = dataRequestBlocks[blockIndex];
567
571
  const slot = block.message.slot;
568
572
  const blockRootHex = toRootHex(blockRoot);
569
- const blockKzgCommitments = (block as SignedBeaconBlock<ForkPostFulu>).message.body.blobKzgCommitments;
573
+ // TODO GLOAS: Post-gloas's blobKzgCommitments is not in beacon block body. Need to source it from somewhere else.
574
+ const blockKzgCommitments = (block as SignedBeaconBlock<ForkPostFulu & ForkPreGloas>).message.body
575
+ .blobKzgCommitments;
570
576
  const expectedColumns = blockKzgCommitments.length ? request.columns.length : 0;
571
577
 
572
578
  if (expectedColumns === 0) {
@@ -1,7 +1,14 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ChainForkConfig} from "@lodestar/config";
3
- import {ForkPostDeneb, ForkPostFulu, ForkPreFulu, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
4
- import {BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
3
+ import {
4
+ ForkPostDeneb,
5
+ ForkPostFulu,
6
+ ForkPreFulu,
7
+ ForkPreGloas,
8
+ isForkPostDeneb,
9
+ isForkPostFulu,
10
+ } from "@lodestar/params";
11
+ import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
5
12
  import {LodestarError, fromHex, prettyBytes, prettyPrintIndices, toHex, toRootHex} from "@lodestar/utils";
6
13
  import {isBlockInputBlobs, isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
7
14
  import {BlockInputSource, IBlockInput} from "../../chain/blocks/blockInput/types.js";
@@ -269,7 +276,7 @@ export async function fetchByRoot({
269
276
  missing: network.custodyConfig.sampledColumns,
270
277
  });
271
278
  } else if (isForkPostDeneb(forkName)) {
272
- const commitments = (block as SignedBeaconBlock<ForkPostDeneb>).message.body.blobKzgCommitments;
279
+ const commitments = (block as SignedBeaconBlock<ForkPostDeneb & ForkPreFulu>).message.body.blobKzgCommitments;
273
280
  const blobCount = commitments.length;
274
281
  blobSidecars = await fetchAndValidateBlobs({
275
282
  config,
@@ -369,7 +376,8 @@ export async function fetchAndValidateColumns({
369
376
  }: FetchByRootAndValidateColumnsProps): Promise<WarnResult<fulu.DataColumnSidecars, DownloadByRootError>> {
370
377
  const {peerId: peerIdStr} = peerMeta;
371
378
  const slot = block.message.slot;
372
- const blobCount = block.message.body.blobKzgCommitments.length;
379
+ // TODO GLOAS: Get blob count from somewhere else since blobKzgCommitments is absent from block body
380
+ const blobCount = (block.message.body as BeaconBlockBody<ForkPostFulu & ForkPreGloas>).blobKzgCommitments.length;
373
381
  if (blobCount === 0) {
374
382
  return {result: [], warnings: null};
375
383
  }
@@ -1,7 +1,14 @@
1
1
  import {digest} from "@chainsafe/as-sha256";
2
2
  import {Tree} from "@chainsafe/persistent-merkle-tree";
3
3
  import {ChainForkConfig} from "@lodestar/config";
4
- import {ForkAll, ForkName, ForkPostFulu, KZG_COMMITMENTS_GINDEX, NUMBER_OF_COLUMNS} from "@lodestar/params";
4
+ import {
5
+ ForkAll,
6
+ ForkName,
7
+ ForkPostFulu,
8
+ ForkPreGloas,
9
+ KZG_COMMITMENTS_GINDEX,
10
+ NUMBER_OF_COLUMNS,
11
+ } from "@lodestar/params";
5
12
  import {signedBlockToSignedHeader} from "@lodestar/state-transition";
6
13
  import {
7
14
  BeaconBlockBody,
@@ -303,7 +310,9 @@ export function getDataColumnSidecarsFromBlock(
303
310
  signedBlock: SignedBeaconBlock<ForkPostFulu>,
304
311
  cellsAndKzgProofs: {cells: Uint8Array[]; proofs: Uint8Array[]}[]
305
312
  ): fulu.DataColumnSidecars {
306
- const blobKzgCommitments = signedBlock.message.body.blobKzgCommitments;
313
+ // TODO GLOAS: Need to get blobKzgCommitments from somewhere else
314
+ const blobKzgCommitments = (signedBlock.message.body as BeaconBlockBody<ForkPostFulu & ForkPreGloas>)
315
+ .blobKzgCommitments;
307
316
 
308
317
  // No need to create data column sidecars if there are no blobs
309
318
  if (blobKzgCommitments.length === 0) {