@lodestar/beacon-node 1.29.0-peerDAS.008adb8ef0 → 1.29.0-peerDAS.446e34eb28

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 (60) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +2 -1
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/chain/chain.d.ts +7 -3
  4. package/lib/chain/chain.js +10 -7
  5. package/lib/chain/chain.js.map +1 -1
  6. package/lib/chain/errors/dataColumnSidecarError.d.ts +46 -4
  7. package/lib/chain/errors/dataColumnSidecarError.js +10 -1
  8. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  9. package/lib/chain/interface.d.ts +7 -3
  10. package/lib/chain/interface.js.map +1 -1
  11. package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -2
  12. package/lib/chain/produceBlock/produceBlockBody.js +11 -2
  13. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  14. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +3 -2
  15. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +31 -2
  16. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
  17. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +10 -4
  18. package/lib/chain/seenCache/seenGossipBlockInput.js +45 -86
  19. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  20. package/lib/chain/validation/dataColumnSidecar.d.ts +22 -2
  21. package/lib/chain/validation/dataColumnSidecar.js +175 -21
  22. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  23. package/lib/execution/engine/http.js +21 -8
  24. package/lib/execution/engine/http.js.map +1 -1
  25. package/lib/execution/engine/mock.js +1 -0
  26. package/lib/execution/engine/mock.js.map +1 -1
  27. package/lib/execution/engine/types.d.ts +2 -0
  28. package/lib/execution/engine/types.js.map +1 -1
  29. package/lib/network/core/networkCore.js +1 -1
  30. package/lib/network/core/networkCore.js.map +1 -1
  31. package/lib/network/gossip/interface.d.ts +1 -1
  32. package/lib/network/gossip/topic.d.ts +3 -1
  33. package/lib/network/gossip/topic.js +8 -8
  34. package/lib/network/gossip/topic.js.map +1 -1
  35. package/lib/network/metadata.d.ts +2 -2
  36. package/lib/network/metadata.js +13 -10
  37. package/lib/network/metadata.js.map +1 -1
  38. package/lib/network/network.js +4 -3
  39. package/lib/network/network.js.map +1 -1
  40. package/lib/network/peers/peerManager.js +8 -8
  41. package/lib/network/peers/peerManager.js.map +1 -1
  42. package/lib/network/processor/gossipHandlers.js +4 -4
  43. package/lib/network/processor/gossipHandlers.js.map +1 -1
  44. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +4 -0
  45. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +62 -37
  46. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  47. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +10 -4
  48. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  49. package/lib/sync/unknownBlock.js +1 -0
  50. package/lib/sync/unknownBlock.js.map +1 -1
  51. package/lib/util/blobs.d.ts +2 -1
  52. package/lib/util/blobs.js +8 -4
  53. package/lib/util/blobs.js.map +1 -1
  54. package/lib/util/dataColumns.d.ts +6 -0
  55. package/lib/util/dataColumns.js +92 -4
  56. package/lib/util/dataColumns.js.map +1 -1
  57. package/lib/util/metadata.d.ts +4 -0
  58. package/lib/util/metadata.js +7 -0
  59. package/lib/util/metadata.js.map +1 -1
  60. package/package.json +14 -14
@@ -1,8 +1,9 @@
1
- import { ExecutionPayload } from "@lodestar/types";
1
+ import { ForkPostDeneb } from "@lodestar/params";
2
+ import { ExecutionPayload, fulu } from "@lodestar/types";
2
3
  import { BlobsBundle } from "../../execution/index.js";
3
4
  /**
4
5
  * Optionally sanity-check that the KZG commitments match the versioned hashes in the transactions
5
6
  * https://github.com/ethereum/consensus-specs/blob/11a037fd9227e29ee809c9397b09f8cc3383a8c0/specs/eip4844/validator.md#blob-kzg-commitments
6
7
  */
7
- export declare function validateBlobsAndKzgCommitments(_payload: ExecutionPayload, blobsBundle: BlobsBundle): void;
8
+ export declare function validateBlobsAndKzgCommitments(fork: ForkPostDeneb, _payload: ExecutionPayload, blobsBundle: BlobsBundle, cells?: fulu.Cell[][]): void;
8
9
  //# sourceMappingURL=validateBlobsAndKzgCommitments.d.ts.map
@@ -1,11 +1,40 @@
1
+ import { CELLS_PER_EXT_BLOB, ForkSeq } from "@lodestar/params";
2
+ import { ckzg } from "../../util/kzg.js";
1
3
  /**
2
4
  * Optionally sanity-check that the KZG commitments match the versioned hashes in the transactions
3
5
  * https://github.com/ethereum/consensus-specs/blob/11a037fd9227e29ee809c9397b09f8cc3383a8c0/specs/eip4844/validator.md#blob-kzg-commitments
4
6
  */
5
- export function validateBlobsAndKzgCommitments(_payload, blobsBundle) {
6
- // sanity-check that the KZG commitments match the blobs (as produced by the execution engine)
7
+ export function validateBlobsAndKzgCommitments(fork, _payload, blobsBundle, cells) {
7
8
  if (blobsBundle.blobs.length !== blobsBundle.commitments.length) {
8
9
  throw Error(`Blobs bundle blobs len ${blobsBundle.blobs.length} != commitments len ${blobsBundle.commitments.length}`);
9
10
  }
11
+ if (ForkSeq[fork] < ForkSeq.fulu) {
12
+ if (blobsBundle.proofs.length !== blobsBundle.blobs.length) {
13
+ throw new Error(`Invalid proofs length for BlobsBundleV1 format: expected ${blobsBundle.blobs.length}, got ${blobsBundle.proofs.length}`);
14
+ }
15
+ try {
16
+ ckzg.verifyBlobKzgProofBatch(blobsBundle.blobs, blobsBundle.commitments, blobsBundle.proofs);
17
+ }
18
+ catch {
19
+ throw new Error("Error in verifyBlobKzgProofBatch");
20
+ }
21
+ return;
22
+ }
23
+ if (!cells) {
24
+ cells = blobsBundle.blobs.map((blob) => ckzg.computeCells(blob));
25
+ }
26
+ const expectedProofsLength = blobsBundle.blobs.length * CELLS_PER_EXT_BLOB;
27
+ if (blobsBundle.proofs.length !== expectedProofsLength) {
28
+ throw Error(`Invalid proofs length for BlobsBundleV2 format: expected ${expectedProofsLength}, got ${blobsBundle.proofs.length}`);
29
+ }
30
+ const commitmentBytes = blobsBundle.commitments.flatMap((commitment) => Array(CELLS_PER_EXT_BLOB).fill(commitment));
31
+ const cellIndices = Array.from({ length: blobsBundle.blobs.length }).flatMap(() => Array.from({ length: CELLS_PER_EXT_BLOB }, (_, i) => i));
32
+ const proofBytes = blobsBundle.proofs.flat();
33
+ try {
34
+ ckzg.verifyCellKzgProofBatch(commitmentBytes, cellIndices, cells.flat(), proofBytes);
35
+ }
36
+ catch {
37
+ throw new Error("Error in verifyCellKzgProofBatch");
38
+ }
10
39
  }
11
40
  //# sourceMappingURL=validateBlobsAndKzgCommitments.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validateBlobsAndKzgCommitments.js","sourceRoot":"","sources":["../../../src/chain/produceBlock/validateBlobsAndKzgCommitments.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,UAAU,8BAA8B,CAAC,QAA0B,EAAE,WAAwB;IACjG,8FAA8F;IAC9F,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAChE,MAAM,KAAK,CACT,0BAA0B,WAAW,CAAC,KAAK,CAAC,MAAM,uBAAuB,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAC1G,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validateBlobsAndKzgCommitments.js","sourceRoot":"","sources":["../../../src/chain/produceBlock/validateBlobsAndKzgCommitments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAiB,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAG5E,OAAO,EAAC,IAAI,EAAC,MAAM,mBAAmB,CAAC;AAEvC;;;GAGG;AAEH,MAAM,UAAU,8BAA8B,CAC5C,IAAmB,EACnB,QAA0B,EAC1B,WAAwB,EACxB,KAAqB;IAErB,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAChE,MAAM,KAAK,CACT,0BAA0B,WAAW,CAAC,KAAK,CAAC,MAAM,uBAAuB,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAC1G,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,4DAA4D,WAAW,CAAC,KAAK,CAAC,MAAM,SAAS,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CACzH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,oBAAoB,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,kBAAkB,CAAC;IAC3E,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;QACvD,MAAM,KAAK,CACT,4DAA4D,oBAAoB,SAAS,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CACrH,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpH,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC9E,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,kBAAkB,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CACtD,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,eAAe,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { ChainForkConfig } from "@lodestar/config";
2
2
  import { ForkName } from "@lodestar/params";
3
3
  import { RootHex, SignedBeaconBlock, deneb, fulu } from "@lodestar/types";
4
+ import { Logger } from "@lodestar/utils";
4
5
  import { IExecutionEngine } from "../../execution/index.js";
5
6
  import { Metrics } from "../../metrics/index.js";
6
7
  import { CustodyConfig } from "../../util/dataColumns.js";
@@ -21,7 +22,7 @@ type GossipedBlockInput = {
21
22
  dataColumnSidecar: fulu.DataColumnSidecar;
22
23
  dataColumnBytes: Uint8Array | null;
23
24
  };
24
- type BlockInputCacheType = {
25
+ export type BlockInputCacheType = {
25
26
  fork: ForkName;
26
27
  block?: SignedBeaconBlock;
27
28
  cachedData?: CachedData;
@@ -72,13 +73,18 @@ export declare class SeenGossipBlockInput {
72
73
  private readonly custodyConfig;
73
74
  private readonly executionEngine;
74
75
  private readonly emitter;
75
- constructor(custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter);
76
+ private readonly logger;
77
+ constructor(custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter, logger: Logger);
76
78
  globalCacheId: number;
77
79
  prune(): void;
78
80
  hasBlock(blockRoot: RootHex): boolean;
81
+ /**
82
+ * Intended to be used for gossip validation, specifically this check:
83
+ * [IGNORE] The sidecar is the first sidecar for the tuple (block_header.slot, block_header.proposer_index,
84
+ * sidecar.index) with valid header signature, sidecar inclusion proof, and kzg proof
85
+ */
86
+ hasDataColumnSidecar(sidecar: fulu.DataColumnSidecar): boolean;
79
87
  getGossipBlockInput(config: ChainForkConfig, gossipedInput: GossipedBlockInput, metrics: Metrics | null): GossipBlockInputResponse;
80
- private hasSampledDataColumns;
81
- private reconstructColumns;
82
88
  }
83
89
  export declare function getEmptyBlockInputCacheEntry(fork: ForkName, globalCacheId: number): BlockInputCacheType;
84
90
  export {};
@@ -2,11 +2,11 @@ import { toHexString } from "@chainsafe/ssz";
2
2
  import { ForkName, NUMBER_OF_COLUMNS, isForkPostDeneb } from "@lodestar/params";
3
3
  import { ssz } from "@lodestar/types";
4
4
  import { pruneSetToMax } from "@lodestar/utils";
5
- import { kzgCommitmentToVersionedHash } from "../../util/blobs.js";
6
- import { getCellsAndProofs, getDataColumnSidecarsFromBlock, getDataColumnSidecarsFromColumnSidecar, } from "../../util/dataColumns.js";
5
+ import { getDataColumnsFromExecution, hasSampledDataColumns } from "../../util/dataColumns.js";
7
6
  import { callInNextEventLoop } from "../../util/eventLoop.js";
8
7
  import { BlobsSource, BlockSource, DataColumnsSource, GossipedInputType, getBlockInput, getBlockInputBlobs, getBlockInputDataColumns, } from "../blocks/types.js";
9
- import { ChainEvent } from "../emitter.js";
8
+ import { DataColumnSidecarErrorCode, DataColumnSidecarGossipError } from "../errors/dataColumnSidecarError.js";
9
+ import { GossipAction } from "../errors/gossipValidation.js";
10
10
  export var BlockInputAvailabilitySource;
11
11
  (function (BlockInputAvailabilitySource) {
12
12
  BlockInputAvailabilitySource["GOSSIP"] = "gossip";
@@ -25,12 +25,13 @@ const MAX_GOSSIPINPUT_CACHE = 5;
25
25
  * block are seen by SeenGossipBlockInput
26
26
  */
27
27
  export class SeenGossipBlockInput {
28
- constructor(custodyConfig, executionEngine, emitter) {
28
+ constructor(custodyConfig, executionEngine, emitter, logger) {
29
29
  this.blockInputCache = new Map();
30
30
  this.globalCacheId = 0;
31
31
  this.custodyConfig = custodyConfig;
32
32
  this.executionEngine = executionEngine;
33
33
  this.emitter = emitter;
34
+ this.logger = logger;
34
35
  }
35
36
  prune() {
36
37
  pruneSetToMax(this.blockInputCache, MAX_GOSSIPINPUT_CACHE);
@@ -38,6 +39,30 @@ export class SeenGossipBlockInput {
38
39
  hasBlock(blockRoot) {
39
40
  return this.blockInputCache.has(blockRoot);
40
41
  }
42
+ /**
43
+ * Intended to be used for gossip validation, specifically this check:
44
+ * [IGNORE] The sidecar is the first sidecar for the tuple (block_header.slot, block_header.proposer_index,
45
+ * sidecar.index) with valid header signature, sidecar inclusion proof, and kzg proof
46
+ */
47
+ hasDataColumnSidecar(sidecar) {
48
+ const blockRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(sidecar.signedBlockHeader.message);
49
+ const blockRootHex = toHexString(blockRoot);
50
+ const blockCache = this.blockInputCache.get(blockRootHex);
51
+ if (blockCache === undefined) {
52
+ return false;
53
+ }
54
+ if (blockCache.cachedData === undefined || blockCache.cachedData.fork !== ForkName.fulu) {
55
+ return false;
56
+ }
57
+ const existingSidecar = blockCache.cachedData.dataColumnsCache.get(sidecar.index);
58
+ if (!existingSidecar) {
59
+ return false;
60
+ }
61
+ return (sidecar.signedBlockHeader.message.slot === existingSidecar.dataColumn.signedBlockHeader.message.slot &&
62
+ sidecar.index === existingSidecar.dataColumn.index &&
63
+ sidecar.signedBlockHeader.message.proposerIndex ===
64
+ existingSidecar.dataColumn.signedBlockHeader.message.proposerIndex);
65
+ }
41
66
  getGossipBlockInput(config, gossipedInput, metrics) {
42
67
  let blockHex;
43
68
  let blockCache;
@@ -68,9 +93,15 @@ export class SeenGossipBlockInput {
68
93
  blockHex = toHexString(blockRoot);
69
94
  blockCache = this.blockInputCache.get(blockHex) ?? getEmptyBlockInputCacheEntry(fork, ++this.globalCacheId);
70
95
  if (blockCache.cachedData?.fork !== ForkName.fulu) {
71
- throw Error(`blob data at non fulu fork=${blockCache.fork}`);
96
+ throw Error(`data column data at non fulu fork=${blockCache.fork}`);
97
+ }
98
+ if (this.hasDataColumnSidecar(dataColumnSidecar)) {
99
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
100
+ code: DataColumnSidecarErrorCode.ALREADY_KNOWN,
101
+ slot: dataColumnSidecar.signedBlockHeader.message.slot,
102
+ columnIdx: dataColumnSidecar.index,
103
+ });
72
104
  }
73
- // TODO: freetheblobs check if its the same blob or a duplicate and throw/take actions
74
105
  blockCache.cachedData?.dataColumnsCache.set(dataColumnSidecar.index, {
75
106
  dataColumn: dataColumnSidecar,
76
107
  // easily splice out the unsigned message as blob is a fixed length type
@@ -84,7 +115,13 @@ export class SeenGossipBlockInput {
84
115
  if (!this.blockInputCache.has(blockHex)) {
85
116
  this.blockInputCache.set(blockHex, blockCache);
86
117
  callInNextEventLoop(() => {
87
- this.reconstructColumns(config, blockHex);
118
+ getDataColumnsFromExecution(config, this.custodyConfig, this.executionEngine, this.emitter, blockCache)
119
+ .then((_success) => {
120
+ // TODO: (@matthewkeil) add metrics collection point here
121
+ })
122
+ .catch((error) => {
123
+ this.logger.error("Error getting data columns from execution", { blockHex }, error);
124
+ });
88
125
  });
89
126
  }
90
127
  const { block: signedBlock, blockInputPromise, resolveBlockInput, cachedData } = blockCache;
@@ -161,7 +198,7 @@ export class SeenGossipBlockInput {
161
198
  blockInputMeta: { pending: null, haveColumns: 0, expectedColumns: 0 },
162
199
  };
163
200
  }
164
- if (this.hasSampledDataColumns(dataColumnsCache)) {
201
+ if (hasSampledDataColumns(this.custodyConfig, dataColumnsCache)) {
165
202
  const allDataColumns = getBlockInputDataColumns(dataColumnsCache, this.custodyConfig.sampledColumns);
166
203
  metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({ source: BlockInputAvailabilitySource.GOSSIP });
167
204
  const { dataColumns } = allDataColumns;
@@ -246,84 +283,6 @@ export class SeenGossipBlockInput {
246
283
  // blockInputMeta: {pending: GossipedInputType.block, haveBlobs: blobsCache.size, expectedBlobs: null},
247
284
  // };
248
285
  }
249
- hasSampledDataColumns(dataColumnCache) {
250
- return (dataColumnCache.size >= this.custodyConfig.sampledColumns.length &&
251
- this.custodyConfig.sampledColumns.reduce((acc, columnIndex) => acc && dataColumnCache.has(columnIndex), true));
252
- }
253
- async reconstructColumns(config, blockRoot) {
254
- const blockCache = this.blockInputCache.get(blockRoot);
255
- if (blockCache === undefined || blockCache.fork !== ForkName.fulu) {
256
- return;
257
- }
258
- if (!blockCache.cachedData) {
259
- // this condition should never get hit... just a sanity check
260
- throw new Error("invalid blockCache");
261
- }
262
- // If already have all columns, exit
263
- if (blockCache.cachedData.fork !== ForkName.fulu ||
264
- this.hasSampledDataColumns(blockCache.cachedData.dataColumnsCache)) {
265
- return;
266
- }
267
- let commitments;
268
- if (blockCache.block) {
269
- const block = blockCache.block;
270
- commitments = block.message.body.blobKzgCommitments;
271
- }
272
- else {
273
- const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
274
- commitments = firstSidecar?.dataColumn.kzgCommitments;
275
- }
276
- if (!commitments) {
277
- throw new Error("blockInputCache missing both block and cachedData");
278
- }
279
- // Process KZG commitments into versioned hashes
280
- const versionedHashes = commitments.map(kzgCommitmentToVersionedHash);
281
- // Return if block has no blobs
282
- if (versionedHashes.length === 0) {
283
- return;
284
- }
285
- // Get blobs from execution engine
286
- const blobs = await this.executionEngine.getBlobs(blockCache.fork, versionedHashes);
287
- // Execution engine was unable to find one or more blobs
288
- if (blobs === null) {
289
- return;
290
- }
291
- // Return if we received all data columns while waiting for getBlobs
292
- if (this.hasSampledDataColumns(blockCache.cachedData.dataColumnsCache)) {
293
- return;
294
- }
295
- let dataColumnSidecars;
296
- const cellsAndProofs = getCellsAndProofs(blobs);
297
- if (blockCache.block) {
298
- dataColumnSidecars = getDataColumnSidecarsFromBlock(config, blockCache.block, cellsAndProofs);
299
- }
300
- else {
301
- const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
302
- if (!firstSidecar) {
303
- throw new Error("blockInputCache missing both block and data column sidecar");
304
- }
305
- dataColumnSidecars = getDataColumnSidecarsFromColumnSidecar(firstSidecar.dataColumn, cellsAndProofs);
306
- }
307
- // Publish columns if and only if subscribed to them
308
- const sampledColumns = this.custodyConfig.sampledColumns.map((columnIndex) => dataColumnSidecars[columnIndex]);
309
- this.emitter.emit(ChainEvent.publishDataColumns, sampledColumns);
310
- for (const column of sampledColumns) {
311
- blockCache.cachedData.dataColumnsCache.set(column.index, { dataColumn: column, dataColumnBytes: null });
312
- }
313
- const allDataColumns = getBlockInputDataColumns(blockCache.cachedData.dataColumnsCache, this.custodyConfig.sampledColumns);
314
- // TODO: Add metrics
315
- // metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({source: BlockInputAvailabilitySource.GOSSIP});
316
- const blockData = {
317
- fork: blockCache.cachedData.fork,
318
- ...allDataColumns,
319
- dataColumnsSource: DataColumnsSource.gossip,
320
- };
321
- blockCache.cachedData.resolveAvailability(blockData);
322
- if (blockCache.block !== undefined) {
323
- const blockInput = getBlockInput.availableData(config, blockCache.block, BlockSource.gossip, blockData);
324
- blockCache.resolveBlockInput(blockInput);
325
- }
326
- }
327
286
  }
328
287
  export function getEmptyBlockInputCacheEntry(fork, globalCacheId) {
329
288
  // Capture both the promise and its callbacks for blockInput and final availability
@@ -1 +1 @@
1
- {"version":3,"file":"seenGossipBlockInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenGossipBlockInput.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seenGossipBlockInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenGossipBlockInput.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,28 @@
1
- import { Root, Slot, deneb, fulu } from "@lodestar/types";
1
+ import { Root, Slot, SubnetID, deneb, fulu } from "@lodestar/types";
2
2
  import { Metrics } from "../../metrics/metrics.js";
3
3
  import { IBeaconChain } from "../interface.js";
4
- export declare function validateGossipDataColumnSidecar(chain: IBeaconChain, dataColumnSideCar: fulu.DataColumnSidecar, gossipIndex: number): Promise<void>;
4
+ export declare function validateGossipDataColumnSidecar(chain: IBeaconChain, dataColumnSidecar: fulu.DataColumnSidecar, gossipSubnet: SubnetID): Promise<void>;
5
5
  export declare function validateDataColumnsSidecars(blockSlot: Slot, blockRoot: Root, blockKzgCommitments: deneb.BlobKzgCommitments, dataColumnSidecars: fulu.DataColumnSidecars, metrics: Metrics | null, opts?: {
6
6
  skipProofsCheck: boolean;
7
7
  }): void;
8
+ /**
9
+ * SPEC FUNCTION
10
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar
11
+ */
12
+ export declare function verifyDataColumnSidecar(dataColumnSidecar: fulu.DataColumnSidecar): void;
13
+ /**
14
+ * SPEC FUNCTION
15
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_kzg_proofs
16
+ */
17
+ export declare function verifyDataColumnSidecarKzgProofs(commitments: Uint8Array[], cellIndices: number[], cells: Uint8Array[], proofs: Uint8Array[]): void;
18
+ /**
19
+ * SPEC FUNCTION
20
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_inclusion_proof
21
+ */
22
+ export declare function verifyDataColumnSidecarInclusionProof(dataColumnSidecar: fulu.DataColumnSidecar): boolean;
23
+ /**
24
+ * SPEC FUNCTION
25
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#compute_subnet_for_data_column_sidecar
26
+ */
27
+ export declare function computeSubnetForDataColumnSidecar(columnSidecar: fulu.DataColumnSidecar): SubnetID;
8
28
  //# sourceMappingURL=dataColumnSidecar.d.ts.map
@@ -1,36 +1,138 @@
1
1
  import { DATA_COLUMN_SIDECAR_SUBNET_COUNT, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH, KZG_COMMITMENTS_SUBTREE_INDEX, NUMBER_OF_COLUMNS, } from "@lodestar/params";
2
2
  import { ssz } from "@lodestar/types";
3
- import { toHex, verifyMerkleBranch } from "@lodestar/utils";
3
+ import { toHex, toRootHex, verifyMerkleBranch } from "@lodestar/utils";
4
+ import { computeStartSlotAtEpoch, getBlockHeaderProposerSignatureSet } from "@lodestar/state-transition";
4
5
  import { byteArrayEquals } from "../../util/bytes.js";
5
6
  import { ckzg } from "../../util/kzg.js";
6
7
  import { DataColumnSidecarErrorCode, DataColumnSidecarGossipError } from "../errors/dataColumnSidecarError.js";
7
8
  import { GossipAction } from "../errors/gossipValidation.js";
8
- export async function validateGossipDataColumnSidecar(chain, dataColumnSideCar, gossipIndex) {
9
- const dataColumnSlot = dataColumnSideCar.signedBlockHeader.message.slot;
10
- if (dataColumnSideCar.index > NUMBER_OF_COLUMNS ||
11
- dataColumnSideCar.index % DATA_COLUMN_SIDECAR_SUBNET_COUNT !== gossipIndex) {
9
+ import { RegenCaller } from "../regen/interface.js";
10
+ // SPEC FUNCTION
11
+ // https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#data_column_sidecar_subnet_id
12
+ export async function validateGossipDataColumnSidecar(chain, dataColumnSidecar, gossipSubnet) {
13
+ const blockHeader = dataColumnSidecar.signedBlockHeader.message;
14
+ // 1) [REJECT] The sidecar is valid as verified by verify_data_column_sidecar
15
+ verifyDataColumnSidecar(dataColumnSidecar);
16
+ // 2) [REJECT] The sidecar is for the correct subnet -- i.e. compute_subnet_for_data_column_sidecar(sidecar.index) == subnet_id
17
+ if (computeSubnetForDataColumnSidecar(dataColumnSidecar) !== gossipSubnet) {
12
18
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
13
- code: DataColumnSidecarErrorCode.INVALID_INDEX,
14
- columnIndex: dataColumnSideCar.index,
15
- gossipIndex,
19
+ code: DataColumnSidecarErrorCode.INVALID_SUBNET,
20
+ columnIdx: dataColumnSidecar.index,
21
+ gossipSubnet: gossipSubnet,
16
22
  });
17
23
  }
18
- // [IGNORE] The sidecar is not from a future slot (with a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) --
19
- // i.e. validate that sidecar.slot <= current_slot (a client MAY queue future blocks for processing at
20
- // the appropriate slot).
24
+ // 3) [IGNORE] The sidecar is not from a future slot (with a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance)
25
+ // -- i.e. validate that sidecar.slot <= current_slot (a client MAY queue future blocks
26
+ // for processing at the appropriate slot).
21
27
  const currentSlotWithGossipDisparity = chain.clock.currentSlotWithGossipDisparity;
22
- if (currentSlotWithGossipDisparity < dataColumnSlot) {
28
+ if (currentSlotWithGossipDisparity < blockHeader.slot) {
23
29
  throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
24
30
  code: DataColumnSidecarErrorCode.FUTURE_SLOT,
25
31
  currentSlot: currentSlotWithGossipDisparity,
26
- blockSlot: dataColumnSlot,
32
+ blockSlot: blockHeader.slot,
33
+ });
34
+ }
35
+ // 4) [IGNORE] The sidecar is from a slot greater than the latest finalized slot -- i.e. validate that
36
+ // sidecar.slot > compute_start_slot_at_epoch(state.finalized_checkpoint.epoch)
37
+ const finalizedCheckpoint = chain.forkChoice.getFinalizedCheckpoint();
38
+ const finalizedSlot = computeStartSlotAtEpoch(finalizedCheckpoint.epoch);
39
+ if (blockHeader.slot <= finalizedSlot) {
40
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
41
+ code: DataColumnSidecarErrorCode.WOULD_REVERT_FINALIZED_SLOT,
42
+ blockSlot: blockHeader.slot,
43
+ finalizedSlot,
27
44
  });
28
45
  }
29
- if (!validateInclusionProof(dataColumnSideCar, chain.metrics)) {
46
+ // 6) [IGNORE] The sidecar's block's parent (defined by block_header.parent_root) has been seen (via gossip
47
+ // or non-gossip sources)
48
+ const parentRoot = toRootHex(blockHeader.parentRoot);
49
+ const parentBlock = chain.forkChoice.getBlockHex(parentRoot);
50
+ if (parentBlock === null) {
51
+ // If fork choice does *not* consider the parent to be a descendant of the finalized block,
52
+ // then there are two more cases:
53
+ //
54
+ // 1. We have the parent stored in our database. Because fork-choice has confirmed the
55
+ // parent is *not* in our post-finalization DAG, all other blocks must be either
56
+ // pre-finalization or conflicting with finalization.
57
+ // 2. The parent is unknown to us, we probably want to download it since it might actually
58
+ // descend from the finalized root.
59
+ // (Non-Lighthouse): Since we prune all blocks non-descendant from finalized checking the `db.block` database won't be useful to guard
60
+ // against known bad fork blocks, so we throw PARENT_UNKNOWN for cases (1) and (2)
61
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
62
+ code: DataColumnSidecarErrorCode.PARENT_UNKNOWN,
63
+ parentRoot,
64
+ });
65
+ }
66
+ // 8) [REJECT] The sidecar is from a higher slot than the sidecar's block's parent
67
+ if (parentBlock.slot >= blockHeader.slot) {
68
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
69
+ code: DataColumnSidecarErrorCode.NOT_LATER_THAN_PARENT,
70
+ parentSlot: parentBlock.slot,
71
+ slot: blockHeader.slot,
72
+ });
73
+ }
74
+ // getBlockSlotState also checks for whether the current finalized checkpoint is an ancestor of the block.
75
+ // As a result, we throw an IGNORE (whereas the spec says we should REJECT for this scenario).
76
+ // this is something we should change this in the future to make the code airtight to the spec.
77
+ // 7) [REJECT] The sidecar's block's parent passes validation.
78
+ const blockState = await chain.regen
79
+ .getBlockSlotState(parentRoot, blockHeader.slot, { dontTransferCache: true }, RegenCaller.validateGossipBlock)
80
+ .catch(() => {
81
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
82
+ code: DataColumnSidecarErrorCode.PARENT_UNKNOWN,
83
+ parentRoot,
84
+ });
85
+ });
86
+ // 5) [REJECT] The proposer signature of sidecar.signed_block_header, is valid with respect to the block_header.proposer_index pubkey.
87
+ const signatureSet = getBlockHeaderProposerSignatureSet(blockState, dataColumnSidecar.signedBlockHeader);
88
+ // Don't batch so verification is not delayed
89
+ if (!(await chain.bls.verifySignatureSets([signatureSet], {
90
+ verifyOnMainThread: blockHeader.slot > chain.forkChoice.getHead().slot,
91
+ }))) {
92
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
93
+ code: DataColumnSidecarErrorCode.PROPOSAL_SIGNATURE_INVALID,
94
+ });
95
+ }
96
+ // 9) [REJECT] The current finalized_checkpoint is an ancestor of the sidecar's block
97
+ // -- i.e. get_checkpoint_block(store, block_header.parent_root, store.finalized_checkpoint.epoch)
98
+ // == store.finalized_checkpoint.root
99
+ // Handled by 7)
100
+ // 10) [REJECT] The sidecar's kzg_commitments field inclusion proof is valid as verified by
101
+ // verify_data_column_sidecar_inclusion_proof
102
+ // TODO: Can cache result on (commitments, proof, header) in the future
103
+ if (!verifyDataColumnSidecarInclusionProof(dataColumnSidecar)) {
30
104
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
31
105
  code: DataColumnSidecarErrorCode.INCLUSION_PROOF_INVALID,
32
- slot: dataColumnSideCar.signedBlockHeader.message.slot,
33
- columnIdx: dataColumnSideCar.index,
106
+ slot: dataColumnSidecar.signedBlockHeader.message.slot,
107
+ columnIdx: dataColumnSidecar.index,
108
+ });
109
+ }
110
+ // 11) [REJECT] The sidecar's column data is valid as verified by verify_data_column_sidecar_kzg_proofs
111
+ try {
112
+ verifyDataColumnSidecarKzgProofs(dataColumnSidecar.kzgCommitments, Array.from({ length: dataColumnSidecar.column.length }, () => dataColumnSidecar.index), dataColumnSidecar.column, dataColumnSidecar.kzgProofs);
113
+ }
114
+ catch {
115
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
116
+ code: DataColumnSidecarErrorCode.INVALID_KZG_PROOF,
117
+ slot: blockHeader.slot,
118
+ columnIdx: dataColumnSidecar.index,
119
+ });
120
+ }
121
+ // 12) [IGNORE] The sidecar is the first sidecar for the tuple (block_header.slot, block_header.proposer_index,
122
+ // sidecar.index) with valid header signature, sidecar inclusion proof, and kzg proof
123
+ // -- Handled in seenGossipBlockInput
124
+ // 13) [REJECT] The sidecar is proposed by the expected proposer_index for the block's slot in the context of the current
125
+ // shuffling (defined by block_header.parent_root/block_header.slot). If the proposer_index cannot
126
+ // immediately be verified against the expected shuffling, the sidecar MAY be queued for later processing
127
+ // while proposers for the block's branch are calculated -- in such a case do not REJECT, instead IGNORE
128
+ // this message.
129
+ const proposerIndex = blockHeader.proposerIndex;
130
+ const expectedProposerIndex = blockState.epochCtx.getBeaconProposer(blockHeader.slot);
131
+ if (proposerIndex !== expectedProposerIndex) {
132
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
133
+ code: DataColumnSidecarErrorCode.INCORRECT_PROPOSER,
134
+ actualProposerIndex: proposerIndex,
135
+ expectedProposerIndex,
34
136
  });
35
137
  }
36
138
  }
@@ -82,10 +184,62 @@ export function validateDataColumnsSidecars(blockSlot, blockRoot, blockKzgCommit
82
184
  throw new Error(`Invalid data column sidecars in slot=${blockSlot} blockRoot=${toHex(blockRoot)}`);
83
185
  }
84
186
  }
85
- function validateInclusionProof(dataColumnSidecar, metrics) {
86
- const timer = metrics?.peerDas.dataColumnSidecarInclusionProofVerificationTime.startTimer();
87
- const result = verifyMerkleBranch(ssz.deneb.BlobKzgCommitments.hashTreeRoot(dataColumnSidecar.kzgCommitments), dataColumnSidecar.kzgCommitmentsInclusionProof, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH, KZG_COMMITMENTS_SUBTREE_INDEX, dataColumnSidecar.signedBlockHeader.message.bodyRoot);
88
- timer?.();
89
- return result;
187
+ /**
188
+ * SPEC FUNCTION
189
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar
190
+ */
191
+ export function verifyDataColumnSidecar(dataColumnSidecar) {
192
+ if (dataColumnSidecar.index >= NUMBER_OF_COLUMNS) {
193
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
194
+ code: DataColumnSidecarErrorCode.INVALID_INDEX,
195
+ columnIdx: dataColumnSidecar.index,
196
+ });
197
+ }
198
+ if (dataColumnSidecar.kzgCommitments.length === 0) {
199
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
200
+ code: DataColumnSidecarErrorCode.NO_COMMITMENTS,
201
+ columnIdx: dataColumnSidecar.index,
202
+ });
203
+ }
204
+ if (dataColumnSidecar.column.length !== dataColumnSidecar.kzgCommitments.length ||
205
+ dataColumnSidecar.column.length !== dataColumnSidecar.kzgProofs.length) {
206
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
207
+ code: DataColumnSidecarErrorCode.MISMATCHED_LENGTHS,
208
+ columnLength: dataColumnSidecar.column.length,
209
+ commitmentsLength: dataColumnSidecar.kzgCommitments.length,
210
+ proofsLength: dataColumnSidecar.kzgProofs.length,
211
+ });
212
+ }
213
+ }
214
+ /**
215
+ * SPEC FUNCTION
216
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_kzg_proofs
217
+ */
218
+ export function verifyDataColumnSidecarKzgProofs(commitments, cellIndices, cells, proofs) {
219
+ let valid;
220
+ try {
221
+ valid = ckzg.verifyCellKzgProofBatch(commitments, cellIndices, cells, proofs);
222
+ }
223
+ catch (e) {
224
+ e.message = `Error on verifyCellKzgProofBatch: ${e.message}`;
225
+ throw e;
226
+ }
227
+ if (!valid) {
228
+ throw Error("Invalid verifyCellKzgProofBatch");
229
+ }
230
+ }
231
+ /**
232
+ * SPEC FUNCTION
233
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_inclusion_proof
234
+ */
235
+ export function verifyDataColumnSidecarInclusionProof(dataColumnSidecar) {
236
+ return verifyMerkleBranch(ssz.deneb.BlobKzgCommitments.hashTreeRoot(dataColumnSidecar.kzgCommitments), dataColumnSidecar.kzgCommitmentsInclusionProof, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH, KZG_COMMITMENTS_SUBTREE_INDEX, dataColumnSidecar.signedBlockHeader.message.bodyRoot);
237
+ }
238
+ /**
239
+ * SPEC FUNCTION
240
+ * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#compute_subnet_for_data_column_sidecar
241
+ */
242
+ export function computeSubnetForDataColumnSidecar(columnSidecar) {
243
+ return columnSidecar.index % DATA_COLUMN_SIDECAR_SUBNET_COUNT;
90
244
  }
91
245
  //# sourceMappingURL=dataColumnSidecar.js.map