@lodestar/beacon-node 1.41.0-dev.b90dff673d → 1.41.0-dev.bb16850567

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 (171) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +9 -0
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  5. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  6. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  7. package/lib/api/impl/validator/index.d.ts.map +1 -1
  8. package/lib/api/impl/validator/index.js +5 -1
  9. package/lib/api/impl/validator/index.js.map +1 -1
  10. package/lib/chain/archiveStore/archiveStore.d.ts +0 -1
  11. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  12. package/lib/chain/archiveStore/archiveStore.js +0 -9
  13. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  14. package/lib/chain/archiveStore/interface.d.ts +4 -4
  15. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  16. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  17. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +4 -1
  19. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  20. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  21. package/lib/chain/archiveStore/utils/archiveBlocks.js +38 -0
  22. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  23. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  24. package/lib/chain/blocks/importBlock.js +12 -8
  25. package/lib/chain/blocks/importBlock.js.map +1 -1
  26. package/lib/chain/blocks/verifyBlocksSignatures.js +1 -1
  27. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  28. package/lib/chain/chain.d.ts +3 -3
  29. package/lib/chain/chain.d.ts.map +1 -1
  30. package/lib/chain/chain.js +20 -9
  31. package/lib/chain/chain.js.map +1 -1
  32. package/lib/chain/interface.d.ts +2 -2
  33. package/lib/chain/interface.d.ts.map +1 -1
  34. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  35. package/lib/chain/prepareNextSlot.js +6 -2
  36. package/lib/chain/prepareNextSlot.js.map +1 -1
  37. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  38. package/lib/chain/produceBlock/produceBlockBody.js +9 -1
  39. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  40. package/lib/chain/regen/errors.d.ts +11 -1
  41. package/lib/chain/regen/errors.d.ts.map +1 -1
  42. package/lib/chain/regen/errors.js +2 -0
  43. package/lib/chain/regen/errors.js.map +1 -1
  44. package/lib/chain/regen/interface.d.ts +12 -6
  45. package/lib/chain/regen/interface.d.ts.map +1 -1
  46. package/lib/chain/regen/queued.d.ts +11 -6
  47. package/lib/chain/regen/queued.d.ts.map +1 -1
  48. package/lib/chain/regen/queued.js +40 -8
  49. package/lib/chain/regen/queued.js.map +1 -1
  50. package/lib/chain/regen/regen.d.ts +5 -0
  51. package/lib/chain/regen/regen.d.ts.map +1 -1
  52. package/lib/chain/regen/regen.js +33 -6
  53. package/lib/chain/regen/regen.js.map +1 -1
  54. package/lib/chain/stateCache/datastore/db.d.ts +4 -5
  55. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
  56. package/lib/chain/stateCache/datastore/db.js +32 -10
  57. package/lib/chain/stateCache/datastore/db.js.map +1 -1
  58. package/lib/chain/stateCache/datastore/file.d.ts +1 -1
  59. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
  60. package/lib/chain/stateCache/datastore/file.js +5 -5
  61. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  62. package/lib/chain/stateCache/datastore/types.d.ts +1 -1
  63. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
  64. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +7 -4
  65. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  66. package/lib/chain/stateCache/fifoBlockStateCache.js +8 -3
  67. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  68. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +33 -14
  69. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  70. package/lib/chain/stateCache/persistentCheckpointsCache.js +217 -119
  71. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  72. package/lib/chain/stateCache/types.d.ts +15 -8
  73. package/lib/chain/stateCache/types.d.ts.map +1 -1
  74. package/lib/chain/stateCache/types.js.map +1 -1
  75. package/lib/chain/validation/dataColumnSidecar.d.ts +2 -1
  76. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  77. package/lib/chain/validation/dataColumnSidecar.js +124 -107
  78. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  79. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  80. package/lib/chain/validation/voluntaryExit.js +2 -2
  81. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  82. package/lib/metrics/metrics/beacon.d.ts +2 -1
  83. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  84. package/lib/metrics/metrics/beacon.js +9 -3
  85. package/lib/metrics/metrics/beacon.js.map +1 -1
  86. package/lib/metrics/metrics/lodestar.d.ts +5 -5
  87. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  88. package/lib/metrics/metrics/lodestar.js +16 -14
  89. package/lib/metrics/metrics/lodestar.js.map +1 -1
  90. package/lib/network/discv5/utils.d.ts +1 -1
  91. package/lib/network/discv5/utils.d.ts.map +1 -1
  92. package/lib/network/discv5/utils.js +5 -4
  93. package/lib/network/discv5/utils.js.map +1 -1
  94. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  95. package/lib/network/gossip/gossipsub.js +9 -6
  96. package/lib/network/gossip/gossipsub.js.map +1 -1
  97. package/lib/network/libp2p/index.d.ts +1 -1
  98. package/lib/network/libp2p/index.d.ts.map +1 -1
  99. package/lib/network/libp2p/index.js +35 -17
  100. package/lib/network/libp2p/index.js.map +1 -1
  101. package/lib/network/metadata.d.ts +1 -0
  102. package/lib/network/metadata.d.ts.map +1 -1
  103. package/lib/network/metadata.js +1 -0
  104. package/lib/network/metadata.js.map +1 -1
  105. package/lib/network/options.d.ts +2 -0
  106. package/lib/network/options.d.ts.map +1 -1
  107. package/lib/network/options.js +3 -0
  108. package/lib/network/options.js.map +1 -1
  109. package/lib/network/peers/discover.d.ts +2 -0
  110. package/lib/network/peers/discover.d.ts.map +1 -1
  111. package/lib/network/peers/discover.js +41 -10
  112. package/lib/network/peers/discover.js.map +1 -1
  113. package/lib/sync/range/range.d.ts.map +1 -1
  114. package/lib/sync/range/range.js +1 -0
  115. package/lib/sync/range/range.js.map +1 -1
  116. package/lib/sync/utils/downloadByRange.d.ts +6 -3
  117. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  118. package/lib/sync/utils/downloadByRange.js +6 -5
  119. package/lib/sync/utils/downloadByRange.js.map +1 -1
  120. package/lib/sync/utils/downloadByRoot.js +1 -1
  121. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  122. package/lib/util/dataColumns.d.ts.map +1 -1
  123. package/lib/util/dataColumns.js +5 -1
  124. package/lib/util/dataColumns.js.map +1 -1
  125. package/lib/util/execution.d.ts.map +1 -1
  126. package/lib/util/execution.js +17 -8
  127. package/lib/util/execution.js.map +1 -1
  128. package/package.json +28 -27
  129. package/src/api/impl/beacon/blocks/index.ts +11 -0
  130. package/src/api/impl/beacon/state/utils.ts +2 -2
  131. package/src/api/impl/validator/index.ts +7 -3
  132. package/src/chain/archiveStore/archiveStore.ts +0 -10
  133. package/src/chain/archiveStore/interface.ts +4 -4
  134. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +8 -5
  135. package/src/chain/archiveStore/utils/archiveBlocks.ts +59 -1
  136. package/src/chain/blocks/importBlock.ts +12 -7
  137. package/src/chain/blocks/verifyBlocksSignatures.ts +1 -1
  138. package/src/chain/chain.ts +27 -14
  139. package/src/chain/interface.ts +2 -2
  140. package/src/chain/prepareNextSlot.ts +6 -2
  141. package/src/chain/produceBlock/produceBlockBody.ts +8 -1
  142. package/src/chain/regen/errors.ts +6 -1
  143. package/src/chain/regen/interface.ts +12 -6
  144. package/src/chain/regen/queued.ts +48 -12
  145. package/src/chain/regen/regen.ts +37 -7
  146. package/src/chain/stateCache/datastore/db.ts +33 -10
  147. package/src/chain/stateCache/datastore/file.ts +6 -5
  148. package/src/chain/stateCache/datastore/types.ts +3 -2
  149. package/src/chain/stateCache/fifoBlockStateCache.ts +10 -4
  150. package/src/chain/stateCache/persistentCheckpointsCache.ts +248 -139
  151. package/src/chain/stateCache/types.ts +18 -8
  152. package/src/chain/validation/dataColumnSidecar.ts +146 -126
  153. package/src/chain/validation/voluntaryExit.ts +2 -1
  154. package/src/metrics/metrics/beacon.ts +9 -3
  155. package/src/metrics/metrics/lodestar.ts +16 -14
  156. package/src/network/discv5/utils.ts +5 -4
  157. package/src/network/gossip/gossipsub.ts +12 -7
  158. package/src/network/libp2p/index.ts +40 -18
  159. package/src/network/metadata.ts +1 -0
  160. package/src/network/options.ts +5 -1
  161. package/src/network/peers/discover.ts +46 -11
  162. package/src/sync/range/range.ts +1 -0
  163. package/src/sync/utils/downloadByRange.ts +12 -3
  164. package/src/sync/utils/downloadByRoot.ts +1 -1
  165. package/src/util/dataColumns.ts +6 -2
  166. package/src/util/execution.ts +23 -12
  167. package/lib/chain/archiveStore/utils/archivePayloads.d.ts +0 -7
  168. package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +0 -1
  169. package/lib/chain/archiveStore/utils/archivePayloads.js +0 -10
  170. package/lib/chain/archiveStore/utils/archivePayloads.js.map +0 -1
  171. package/src/chain/archiveStore/utils/archivePayloads.ts +0 -15
@@ -29,7 +29,6 @@ export interface NetworkOptions
29
29
  useWorker?: boolean;
30
30
  maxYoungGenerationSizeMb?: number;
31
31
  disableLightClientServer?: boolean;
32
-
33
32
  /**
34
33
  * During E2E tests observe a lot of following `missing stream`:
35
34
  *
@@ -48,11 +47,14 @@ export interface NetworkOptions
48
47
  * We need to increase this only for the testing purpose
49
48
  */
50
49
  disconnectThreshold?: number;
50
+ quic?: boolean;
51
+ tcp?: boolean;
51
52
  }
52
53
 
53
54
  export const defaultNetworkOptions: NetworkOptions = {
54
55
  maxPeers: 210, // Allow some room above targetPeers for new inbound peers
55
56
  targetPeers: 200,
57
+ // In CLI usage this is typically overridden; when unset it serves as a fallback default (e.g. programmatic usage/tests)
56
58
  localMultiaddrs: ["/ip4/0.0.0.0/tcp/9000", "/ip6/::/tcp/9000"],
57
59
  bootMultiaddrs: [],
58
60
  /** disabled by default */
@@ -67,6 +69,8 @@ export const defaultNetworkOptions: NetworkOptions = {
67
69
  slotsToSubscribeBeforeAggregatorDuty: 2,
68
70
  // This will enable the light client server by default
69
71
  disableLightClientServer: false,
72
+ quic: false,
73
+ tcp: true,
70
74
  // specific option for fulu
71
75
  // - this is the same to TARGET_SUBNET_PEERS
72
76
  // - for fusaka-devnets, we have 25-30 peers per subnet
@@ -59,6 +59,7 @@ export enum DiscoveredPeerStatus {
59
59
  cached = "cached",
60
60
  dropped = "dropped",
61
61
  no_multiaddrs = "no_multiaddrs",
62
+ transport_incompatible = "transport_incompatible",
62
63
  peer_cooling_down = "peer_cooling_down",
63
64
  }
64
65
 
@@ -88,7 +89,8 @@ export type SubnetDiscvQueryMs = {
88
89
 
89
90
  type CachedENR = {
90
91
  peerId: PeerId;
91
- multiaddrTCP: Multiaddr;
92
+ multiaddrTCP?: Multiaddr;
93
+ multiaddrQUIC?: Multiaddr;
92
94
  subnets: Record<SubnetType, boolean[]>;
93
95
  addedUnixMs: number;
94
96
  // custodyGroups is null for pre-fulu
@@ -114,6 +116,7 @@ export class PeerDiscovery {
114
116
  attnets: new Map(),
115
117
  syncnets: new Map(),
116
118
  };
119
+ private transports: string[];
117
120
 
118
121
  private custodyGroupQueries: CustodyGroupQueries;
119
122
 
@@ -180,6 +183,17 @@ export class PeerDiscovery {
180
183
  }
181
184
  });
182
185
  }
186
+
187
+ // Transport tags vary by library: @libp2p/tcp uses '@libp2p/tcp', @chainsafe/libp2p-quic uses 'quic'
188
+ // Normalize to simple 'tcp' / 'quic' strings for matching
189
+ this.transports = libp2p.services.components.transportManager
190
+ .getTransports()
191
+ .map((t) => t[Symbol.toStringTag])
192
+ .map((tag) => {
193
+ if (tag?.includes("tcp")) return "tcp";
194
+ if (tag?.includes("quic")) return "quic";
195
+ return tag;
196
+ });
183
197
  }
184
198
 
185
199
  static async init(modules: PeerDiscoveryModules, opts: PeerDiscoveryOpts): Promise<PeerDiscovery> {
@@ -372,10 +386,15 @@ export class PeerDiscovery {
372
386
  return;
373
387
  }
374
388
 
389
+ // Select multiaddrs by protocol rather than index — libp2p discovery events
390
+ // don't guarantee ordering or number of addresses
391
+ const multiaddrTCP = multiaddrs.find((ma) => ma.toString().includes("/tcp/"));
392
+ const multiaddrQUIC = multiaddrs.find((ma) => ma.toString().includes("/quic-v1"));
393
+
375
394
  const attnets = zeroAttnets;
376
395
  const syncnets = zeroSyncnets;
377
396
 
378
- const status = this.handleDiscoveredPeer(id, multiaddrs[0], attnets, syncnets, undefined);
397
+ const status = this.handleDiscoveredPeer(id, multiaddrTCP, multiaddrQUIC, attnets, syncnets, undefined);
379
398
  this.logger.debug("Discovered peer via libp2p", {peer: prettyPrintPeerId(id), status});
380
399
  this.metrics?.discovery.discoveredStatus.inc({status});
381
400
  };
@@ -388,13 +407,15 @@ export class PeerDiscovery {
388
407
  this.randomNodeQuery.count++;
389
408
  }
390
409
  const peerId = enr.peerId;
391
- // tcp multiaddr is known to be be present, checked inside the worker
410
+ // At least one transport is known to be present, checked inside the worker
392
411
  const multiaddrTCP = enr.getLocationMultiaddr(ENRKey.tcp);
393
- if (!multiaddrTCP) {
394
- this.logger.warn("Discv5 worker sent enr without tcp multiaddr", {enr: enr.encodeTxt()});
412
+ const multiaddrQUIC = enr.getLocationMultiaddr(ENRKey.quic);
413
+ if (!multiaddrTCP && !multiaddrQUIC) {
414
+ this.logger.warn("Discv5 worker sent enr without any transport multiaddr", {enr: enr.encodeTxt()});
395
415
  this.metrics?.discovery.discoveredStatus.inc({status: DiscoveredPeerStatus.no_multiaddrs});
396
416
  return;
397
417
  }
418
+
398
419
  // Are this fields mandatory?
399
420
  const attnetsBytes = enr.kvs.get(ENRKey.attnets); // 64 bits
400
421
  const syncnetsBytes = enr.kvs.get(ENRKey.syncnets); // 4 bits
@@ -414,7 +435,7 @@ export class PeerDiscovery {
414
435
  const syncnets = syncnetsBytes ? deserializeEnrSubnets(syncnetsBytes, SYNC_COMMITTEE_SUBNET_COUNT) : zeroSyncnets;
415
436
  const custodyGroupCount = custodyGroupCountBytes ? bytesToInt(custodyGroupCountBytes, "be") : undefined;
416
437
 
417
- const status = this.handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets, custodyGroupCount);
438
+ const status = this.handleDiscoveredPeer(peerId, multiaddrTCP, multiaddrQUIC, attnets, syncnets, custodyGroupCount);
418
439
  this.logger.debug("Discovered peer via discv5", {
419
440
  peer: prettyPrintPeerId(peerId),
420
441
  status,
@@ -428,7 +449,8 @@ export class PeerDiscovery {
428
449
  */
429
450
  private handleDiscoveredPeer(
430
451
  peerId: PeerId,
431
- multiaddrTCP: Multiaddr,
452
+ multiaddrTCP: Multiaddr | undefined,
453
+ multiaddrQUIC: Multiaddr | undefined,
432
454
  attnets: boolean[],
433
455
  syncnets: boolean[],
434
456
  custodySubnetCount?: number
@@ -454,6 +476,13 @@ export class PeerDiscovery {
454
476
  return DiscoveredPeerStatus.already_connected;
455
477
  }
456
478
 
479
+ // ignore peers if they don't share any transport with us
480
+ const hasTcpMatch = this.transports.includes("tcp") && multiaddrTCP;
481
+ const hasQuicMatch = this.transports.includes("quic") && multiaddrQUIC;
482
+ if (!hasTcpMatch && !hasQuicMatch) {
483
+ return DiscoveredPeerStatus.transport_incompatible;
484
+ }
485
+
457
486
  // Ignore dialing peers
458
487
  if (
459
488
  this.libp2p.services.components.connectionManager
@@ -469,6 +498,7 @@ export class PeerDiscovery {
469
498
  const cachedPeer: CachedENR = {
470
499
  peerId,
471
500
  multiaddrTCP,
501
+ multiaddrQUIC,
472
502
  subnets: {attnets, syncnets},
473
503
  addedUnixMs: Date.now(),
474
504
  // for pre-fulu, custodyGroups is null
@@ -566,19 +596,24 @@ export class PeerDiscovery {
566
596
  // are not successful.
567
597
  this.peersToConnect = Math.max(this.peersToConnect - 1, 0);
568
598
 
569
- const {peerId, multiaddrTCP} = cachedPeer;
599
+ const {peerId, multiaddrTCP, multiaddrQUIC} = cachedPeer;
570
600
 
571
601
  // Must add the multiaddrs array to the address book before dialing
572
602
  // https://github.com/libp2p/js-libp2p/blob/aec8e3d3bb1b245051b60c2a890550d262d5b062/src/index.js#L638
573
- const peer = await this.libp2p.peerStore.merge(peerId, {multiaddrs: [multiaddrTCP]});
603
+ const peer = await this.libp2p.peerStore.merge(peerId, {
604
+ multiaddrs: [multiaddrQUIC, multiaddrTCP].filter(Boolean) as Multiaddr[],
605
+ });
574
606
  if (peer.addresses.length === 0) {
575
607
  this.metrics?.discovery.notDialReason.inc({reason: NotDialReason.no_multiaddrs});
576
608
  return;
577
609
  }
578
610
 
579
- // Note: PeerDiscovery adds the multiaddrTCP beforehand
611
+ // Note: PeerDiscovery adds the multiaddrs beforehand
580
612
  const peerIdShort = prettyPrintPeerId(peerId);
581
- this.logger.debug("Dialing discovered peer", {peer: peerIdShort});
613
+ this.logger.debug("Dialing discovered peer", {
614
+ peer: peerIdShort,
615
+ addresses: peer.addresses.map((a) => a.multiaddr.toString()).join(", "),
616
+ });
582
617
 
583
618
  this.metrics?.discovery.dialAttempts.inc();
584
619
  const timer = this.metrics?.discovery.dialTime.startTimer();
@@ -206,6 +206,7 @@ export class RangeSync extends (EventEmitter as {new (): RangeSyncEmitter}) {
206
206
  logger: this.logger,
207
207
  peerIdStr: peer.peerId,
208
208
  batchBlocks,
209
+ peerDasMetrics: this.chain.metrics?.peerDas,
209
210
  ...batch.getRequestsForPeer(peer),
210
211
  });
211
212
  const cached = cacheByRangeResponses({
@@ -12,6 +12,7 @@ import {
12
12
  import {SeenBlockInput} from "../../chain/seenCache/seenGossipBlockInput.js";
13
13
  import {validateBlockBlobSidecars} from "../../chain/validation/blobSidecar.js";
14
14
  import {validateBlockDataColumnSidecars} from "../../chain/validation/dataColumnSidecar.js";
15
+ import {BeaconMetrics} from "../../metrics/metrics/beacon.js";
15
16
  import {INetwork} from "../../network/index.js";
16
17
  import {getBlobKzgCommitments} from "../../util/dataColumns.js";
17
18
  import {PeerIdStr} from "../../util/peerId.js";
@@ -35,6 +36,7 @@ export type DownloadAndCacheByRangeProps = DownloadByRangeRequests & {
35
36
  logger: Logger;
36
37
  peerIdStr: string;
37
38
  batchBlocks?: IBlockInput[];
39
+ peerDasMetrics?: BeaconMetrics["peerDas"] | null;
38
40
  };
39
41
 
40
42
  export type CacheByRangeResponsesProps = {
@@ -196,6 +198,7 @@ export async function downloadByRange({
196
198
  blocksRequest,
197
199
  blobsRequest,
198
200
  columnsRequest,
201
+ peerDasMetrics,
199
202
  }: DownloadAndCacheByRangeProps): Promise<WarnResult<ValidatedResponses, DownloadByRangeError>> {
200
203
  let response: DownloadByRangeResponses;
201
204
  try {
@@ -220,6 +223,7 @@ export async function downloadByRange({
220
223
  blocksRequest,
221
224
  blobsRequest,
222
225
  columnsRequest,
226
+ peerDasMetrics,
223
227
  ...response,
224
228
  });
225
229
 
@@ -290,10 +294,12 @@ export async function validateResponses({
290
294
  blocks,
291
295
  blobSidecars,
292
296
  columnSidecars,
297
+ peerDasMetrics,
293
298
  }: DownloadByRangeRequests &
294
299
  DownloadByRangeResponses & {
295
300
  config: ChainForkConfig;
296
301
  batchBlocks?: IBlockInput[];
302
+ peerDasMetrics?: BeaconMetrics["peerDas"] | null;
297
303
  }): Promise<WarnResult<ValidatedResponses, DownloadByRangeError>> {
298
304
  // Blocks are always required for blob/column validation
299
305
  // If a blocksRequest is provided, blocks have just been downloaded
@@ -372,7 +378,8 @@ export async function validateResponses({
372
378
  config,
373
379
  columnsRequest,
374
380
  blocksForDataValidation,
375
- columnSidecars
381
+ columnSidecars,
382
+ peerDasMetrics
376
383
  );
377
384
  validatedResponses.validatedColumnSidecars = validatedColumnSidecarsResult.result;
378
385
  warnings = validatedColumnSidecarsResult.warnings;
@@ -608,7 +615,8 @@ export async function validateColumnsByRangeResponse(
608
615
  config: ChainForkConfig,
609
616
  request: fulu.DataColumnSidecarsByRangeRequest,
610
617
  blocks: ValidatedBlock[],
611
- columnSidecars: fulu.DataColumnSidecars
618
+ columnSidecars: fulu.DataColumnSidecars,
619
+ peerDasMetrics?: BeaconMetrics["peerDas"] | null
612
620
  ): Promise<WarnResult<ValidatedColumnSidecars[], DownloadByRangeError>> {
613
621
  const warnings: DownloadByRangeError[] = [];
614
622
 
@@ -764,7 +772,8 @@ export async function validateColumnsByRangeResponse(
764
772
  slot,
765
773
  blockRoot,
766
774
  blobCount,
767
- columnSidecars
775
+ columnSidecars,
776
+ peerDasMetrics
768
777
  ).then(() => ({
769
778
  blockRoot,
770
779
  columnSidecars,
@@ -440,7 +440,7 @@ export async function fetchAndValidateColumns({
440
440
  );
441
441
  }
442
442
 
443
- await validateBlockDataColumnSidecars(chain, slot, blockRoot, blobCount, columnSidecars);
443
+ await validateBlockDataColumnSidecars(chain, slot, blockRoot, blobCount, columnSidecars, chain?.metrics?.peerDas);
444
444
 
445
445
  return {result: columnSidecars, warnings: warnings.length > 0 ? warnings : null};
446
446
  }
@@ -425,7 +425,8 @@ export async function recoverDataColumnSidecars(
425
425
  partialSidecars.set(columnSidecar.index, columnSidecar);
426
426
  }
427
427
 
428
- const timer = metrics?.recoverDataColumnSidecars.recoverTime.startTimer();
428
+ const timer = metrics?.peerDas.dataColumnsReconstructionTime.startTimer();
429
+
429
430
  // if this function throws, we catch at the consumer side
430
431
  const fullSidecars = await dataColumnMatrixRecovery(partialSidecars).catch(() => null);
431
432
  timer?.();
@@ -435,6 +436,7 @@ export async function recoverDataColumnSidecars(
435
436
 
436
437
  if (blockInput.getAllColumns().length === NUMBER_OF_COLUMNS) {
437
438
  // either gossip or getBlobsV2 resolved availability while we were recovering
439
+ metrics?.dataColumns.alreadyAdded.inc(fullSidecars.length);
438
440
  return DataColumnReconstructionCode.SuccessLate;
439
441
  }
440
442
 
@@ -458,8 +460,10 @@ export async function recoverDataColumnSidecars(
458
460
  sidecarsToPublish.push(columnSidecar);
459
461
  }
460
462
  }
463
+ metrics?.peerDas.reconstructedColumns.inc(sidecarsToPublish.length);
464
+ metrics?.dataColumns.bySource.inc({source: BlockInputSource.recovery}, sidecarsToPublish.length);
461
465
  emitter.emit(ChainEvent.publishDataColumns, sidecarsToPublish);
462
-
466
+ // TODO: Can we record dataColumns.sentPeersPerSubnet metric somehow
463
467
  return DataColumnReconstructionCode.SuccessResolved;
464
468
  }
465
469
 
@@ -173,16 +173,21 @@ export async function getDataColumnSidecarsFromExecution(
173
173
  }
174
174
 
175
175
  let dataColumnSidecars: fulu.DataColumnSidecars;
176
- const cellsAndProofs = await getCellsAndProofs(blobs);
177
- if (blockInput.hasBlock()) {
178
- dataColumnSidecars = getDataColumnSidecarsFromBlock(
179
- config,
180
- blockInput.getBlock() as fulu.SignedBeaconBlock,
181
- cellsAndProofs
182
- );
183
- } else {
184
- const firstSidecar = blockInput.getAllColumns()[0];
185
- dataColumnSidecars = getDataColumnSidecarsFromColumnSidecar(firstSidecar, cellsAndProofs);
176
+ const compTimer = metrics?.peerDas.dataColumnSidecarComputationTime.startTimer();
177
+ try {
178
+ const cellsAndProofs = await getCellsAndProofs(blobs);
179
+ if (blockInput.hasBlock()) {
180
+ dataColumnSidecars = getDataColumnSidecarsFromBlock(
181
+ config,
182
+ blockInput.getBlock() as fulu.SignedBeaconBlock,
183
+ cellsAndProofs
184
+ );
185
+ } else {
186
+ const firstSidecar = blockInput.getAllColumns()[0];
187
+ dataColumnSidecars = getDataColumnSidecarsFromColumnSidecar(firstSidecar, cellsAndProofs);
188
+ }
189
+ } finally {
190
+ compTimer?.();
186
191
  }
187
192
 
188
193
  // Publish columns if and only if subscribed to them
@@ -191,13 +196,15 @@ export async function getDataColumnSidecarsFromExecution(
191
196
 
192
197
  // for columns that we already seen, it will be ignored through `ignoreDuplicatePublishError` gossip option
193
198
  emitter.emit(ChainEvent.publishDataColumns, sampledColumns);
199
+ // TODO: Can we record dataColumns.sentPeersPerSubnet metric here somehow
194
200
 
195
201
  // add all sampled columns to the block input, even if we didn't sample them
196
202
  const seenTimestampSec = Date.now() / 1000;
203
+ let alreadyAddedColumnsCount = 0;
197
204
  for (const columnSidecar of sampledColumns) {
198
205
  if (blockInput.hasColumn(columnSidecar.index)) {
199
206
  // columns may have been added while waiting
200
- // TODO(fulu): add metrics for this condition
207
+ alreadyAddedColumnsCount++;
201
208
  continue;
202
209
  }
203
210
 
@@ -217,7 +224,11 @@ export async function getDataColumnSidecarsFromExecution(
217
224
  });
218
225
  }
219
226
  }
227
+ metrics?.dataColumns.alreadyAdded.inc(alreadyAddedColumnsCount);
220
228
 
221
- metrics?.dataColumns.bySource.inc({source: BlockInputSource.engine}, previouslyMissingColumns.length);
229
+ metrics?.dataColumns.bySource.inc(
230
+ {source: BlockInputSource.engine},
231
+ previouslyMissingColumns.length - alreadyAddedColumnsCount
232
+ );
222
233
  return DataColumnEngineResult.SuccessResolved;
223
234
  }
@@ -1,7 +0,0 @@
1
- import { CheckpointWithHex } from "@lodestar/fork-choice";
2
- import { IBeaconChain } from "../../interface.js";
3
- /**
4
- * Archives execution payload envelopes from hot DB to archive DB after finalization.
5
- */
6
- export declare function archiveExecutionPayloadEnvelopes(chain: IBeaconChain, _finalized: CheckpointWithHex): Promise<void>;
7
- //# sourceMappingURL=archivePayloads.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archivePayloads.d.ts","sourceRoot":"","sources":["../../../../src/chain/archiveStore/utils/archivePayloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAEhD;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Archives execution payload envelopes from hot DB to archive DB after finalization.
3
- */
4
- export async function archiveExecutionPayloadEnvelopes(chain, _finalized) {
5
- const finalizedBlock = chain.forkChoice.getFinalizedBlock();
6
- if (!finalizedBlock)
7
- return;
8
- // TODO GLOAS: Implement payload envelope archival after epbs fork choice changes are merged
9
- }
10
- //# sourceMappingURL=archivePayloads.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archivePayloads.js","sourceRoot":"","sources":["../../../../src/chain/archiveStore/utils/archivePayloads.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,KAAmB,EACnB,UAA6B,EACd;IACf,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;IAC5D,IAAI,CAAC,cAAc;QAAE,OAAO;IAE5B,4FAA4F;AAFhE,CAG7B"}
@@ -1,15 +0,0 @@
1
- import {CheckpointWithHex} from "@lodestar/fork-choice";
2
- import {IBeaconChain} from "../../interface.js";
3
-
4
- /**
5
- * Archives execution payload envelopes from hot DB to archive DB after finalization.
6
- */
7
- export async function archiveExecutionPayloadEnvelopes(
8
- chain: IBeaconChain,
9
- _finalized: CheckpointWithHex
10
- ): Promise<void> {
11
- const finalizedBlock = chain.forkChoice.getFinalizedBlock();
12
- if (!finalizedBlock) return;
13
-
14
- // TODO GLOAS: Implement payload envelope archival after epbs fork choice changes are merged
15
- }