@lodestar/beacon-node 1.43.0-dev.374360e50a → 1.43.0-dev.38cd4b01e7

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 (151) hide show
  1. package/lib/api/impl/beacon/pool/index.js +3 -3
  2. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  3. package/lib/chain/blocks/importExecutionPayload.d.ts +4 -0
  4. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  5. package/lib/chain/blocks/importExecutionPayload.js +12 -1
  6. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  7. package/lib/chain/blocks/index.d.ts.map +1 -1
  8. package/lib/chain/blocks/index.js +6 -7
  9. package/lib/chain/blocks/index.js.map +1 -1
  10. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +8 -1
  11. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  12. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +19 -0
  13. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  14. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +16 -0
  15. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  16. package/lib/chain/blocks/utils/chainSegment.d.ts +1 -3
  17. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  18. package/lib/chain/blocks/utils/chainSegment.js +29 -26
  19. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  20. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  21. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +5 -4
  22. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  23. package/lib/chain/chain.d.ts.map +1 -1
  24. package/lib/chain/chain.js +15 -1
  25. package/lib/chain/chain.js.map +1 -1
  26. package/lib/chain/initState.d.ts.map +1 -1
  27. package/lib/chain/initState.js +6 -1
  28. package/lib/chain/initState.js.map +1 -1
  29. package/lib/chain/lightClient/index.d.ts.map +1 -1
  30. package/lib/chain/lightClient/index.js +1 -1
  31. package/lib/chain/lightClient/index.js.map +1 -1
  32. package/lib/chain/opPools/payloadAttestationPool.d.ts +1 -1
  33. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  34. package/lib/chain/opPools/payloadAttestationPool.js +30 -10
  35. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  36. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +7 -6
  37. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  38. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +21 -5
  39. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  40. package/lib/chain/validation/payloadAttestationMessage.d.ts +1 -1
  41. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  42. package/lib/chain/validation/payloadAttestationMessage.js +5 -3
  43. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  44. package/lib/metrics/metrics/lodestar.d.ts +4 -0
  45. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  46. package/lib/metrics/metrics/lodestar.js +5 -0
  47. package/lib/metrics/metrics/lodestar.js.map +1 -1
  48. package/lib/network/interface.d.ts +1 -0
  49. package/lib/network/interface.d.ts.map +1 -1
  50. package/lib/network/network.d.ts +1 -0
  51. package/lib/network/network.d.ts.map +1 -1
  52. package/lib/network/network.js +3 -0
  53. package/lib/network/network.js.map +1 -1
  54. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  55. package/lib/network/processor/gossipHandlers.js +33 -3
  56. package/lib/network/processor/gossipHandlers.js.map +1 -1
  57. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  58. package/lib/network/reqresp/ReqRespBeaconNode.js +1 -1
  59. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  60. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts +9 -0
  61. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts.map +1 -0
  62. package/lib/network/reqresp/handlers/beaconBlocksByHead.js +61 -0
  63. package/lib/network/reqresp/handlers/beaconBlocksByHead.js.map +1 -0
  64. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  65. package/lib/network/reqresp/handlers/index.js +5 -0
  66. package/lib/network/reqresp/handlers/index.js.map +1 -1
  67. package/lib/network/reqresp/interface.d.ts +1 -1
  68. package/lib/network/reqresp/interface.js +1 -1
  69. package/lib/network/reqresp/protocols.d.ts +1 -0
  70. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  71. package/lib/network/reqresp/protocols.js +5 -0
  72. package/lib/network/reqresp/protocols.js.map +1 -1
  73. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  74. package/lib/network/reqresp/rateLimit.js +4 -0
  75. package/lib/network/reqresp/rateLimit.js.map +1 -1
  76. package/lib/network/reqresp/score.d.ts.map +1 -1
  77. package/lib/network/reqresp/score.js +1 -0
  78. package/lib/network/reqresp/score.js.map +1 -1
  79. package/lib/network/reqresp/types.d.ts +3 -0
  80. package/lib/network/reqresp/types.d.ts.map +1 -1
  81. package/lib/network/reqresp/types.js +3 -0
  82. package/lib/network/reqresp/types.js.map +1 -1
  83. package/lib/sync/constants.d.ts +7 -1
  84. package/lib/sync/constants.d.ts.map +1 -1
  85. package/lib/sync/constants.js +7 -4
  86. package/lib/sync/constants.js.map +1 -1
  87. package/lib/sync/range/batch.d.ts +32 -6
  88. package/lib/sync/range/batch.d.ts.map +1 -1
  89. package/lib/sync/range/batch.js +163 -26
  90. package/lib/sync/range/batch.js.map +1 -1
  91. package/lib/sync/range/chain.d.ts +16 -2
  92. package/lib/sync/range/chain.d.ts.map +1 -1
  93. package/lib/sync/range/chain.js +77 -4
  94. package/lib/sync/range/chain.js.map +1 -1
  95. package/lib/sync/range/range.d.ts.map +1 -1
  96. package/lib/sync/range/range.js +54 -5
  97. package/lib/sync/range/range.js.map +1 -1
  98. package/lib/sync/range/utils/peerBalancer.d.ts +2 -1
  99. package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -1
  100. package/lib/sync/range/utils/peerBalancer.js +8 -4
  101. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  102. package/lib/sync/sync.d.ts.map +1 -1
  103. package/lib/sync/sync.js +13 -0
  104. package/lib/sync/sync.js.map +1 -1
  105. package/lib/sync/unknownBlock.d.ts +7 -0
  106. package/lib/sync/unknownBlock.d.ts.map +1 -1
  107. package/lib/sync/unknownBlock.js +127 -10
  108. package/lib/sync/unknownBlock.js.map +1 -1
  109. package/lib/sync/utils/downloadByRange.d.ts +36 -9
  110. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  111. package/lib/sync/utils/downloadByRange.js +87 -38
  112. package/lib/sync/utils/downloadByRange.js.map +1 -1
  113. package/lib/sync/utils/rateLimit.d.ts +2 -0
  114. package/lib/sync/utils/rateLimit.d.ts.map +1 -0
  115. package/lib/sync/utils/rateLimit.js +15 -0
  116. package/lib/sync/utils/rateLimit.js.map +1 -0
  117. package/package.json +15 -16
  118. package/src/api/impl/beacon/pool/index.ts +3 -3
  119. package/src/chain/blocks/importExecutionPayload.ts +18 -6
  120. package/src/chain/blocks/index.ts +5 -7
  121. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +27 -1
  122. package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -0
  123. package/src/chain/blocks/utils/chainSegment.ts +30 -27
  124. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +7 -4
  125. package/src/chain/chain.ts +17 -0
  126. package/src/chain/initState.ts +9 -1
  127. package/src/chain/lightClient/index.ts +6 -6
  128. package/src/chain/opPools/payloadAttestationPool.ts +34 -10
  129. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +23 -6
  130. package/src/chain/validation/payloadAttestationMessage.ts +6 -4
  131. package/src/metrics/metrics/lodestar.ts +6 -0
  132. package/src/network/interface.ts +1 -0
  133. package/src/network/network.ts +12 -0
  134. package/src/network/processor/gossipHandlers.ts +37 -3
  135. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -0
  136. package/src/network/reqresp/handlers/beaconBlocksByHead.ts +91 -0
  137. package/src/network/reqresp/handlers/index.ts +5 -0
  138. package/src/network/reqresp/interface.ts +1 -1
  139. package/src/network/reqresp/protocols.ts +6 -0
  140. package/src/network/reqresp/rateLimit.ts +4 -0
  141. package/src/network/reqresp/score.ts +1 -0
  142. package/src/network/reqresp/types.ts +5 -0
  143. package/src/sync/constants.ts +8 -4
  144. package/src/sync/range/batch.ts +204 -30
  145. package/src/sync/range/chain.ts +94 -5
  146. package/src/sync/range/range.ts +68 -5
  147. package/src/sync/range/utils/peerBalancer.ts +9 -3
  148. package/src/sync/sync.ts +13 -1
  149. package/src/sync/unknownBlock.ts +157 -10
  150. package/src/sync/utils/downloadByRange.ts +153 -39
  151. package/src/sync/utils/rateLimit.ts +16 -0
@@ -1,8 +1,9 @@
1
1
  import { isForkPostDeneb, isForkPostFulu, isForkPostGloas } from "@lodestar/params";
2
- import { LodestarError, prettyPrintIndices } from "@lodestar/utils";
2
+ import { LodestarError, byteArrayEquals, prettyPrintIndices, toRootHex } from "@lodestar/utils";
3
3
  import { isBlockInputColumns } from "../../chain/blocks/blockInput/blockInput.js";
4
4
  import { isDaOutOfRange } from "../../chain/blocks/blockInput/utils.js";
5
5
  import { BlockError, BlockErrorCode } from "../../chain/errors/index.js";
6
+ import { ZERO_HASH } from "../../constants/constants.js";
6
7
  import { MAX_BATCH_DOWNLOAD_ATTEMPTS, MAX_BATCH_PROCESSING_ATTEMPTS } from "../constants.js";
7
8
  import { getBatchSlotRange, hashBlocks } from "./utils/index.js";
8
9
  export { BatchStatus };
@@ -34,6 +35,12 @@ function formatRangeReq(req) {
34
35
  function formatColumnsReq(req) {
35
36
  return `startSlot=${req.startSlot},count=${req.count},cols=${prettyPrintIndices(req.columns)}`;
36
37
  }
38
+ function getTrackedRequest({ parentPayloadRequest, columnsRequest }) {
39
+ return {
40
+ parentPayload: parentPayloadRequest != null,
41
+ byRangeColumns: new Set(parentPayloadRequest == null ? (columnsRequest?.columns ?? []) : []),
42
+ };
43
+ }
37
44
  /**
38
45
  * Batches are downloaded at the first block of the epoch.
39
46
  *
@@ -54,8 +61,8 @@ export class Batch {
54
61
  requests;
55
62
  /** State of the batch. */
56
63
  state = { status: BatchStatus.AwaitingDownload, blocks: [], payloadEnvelopes: null };
57
- /** Peers that provided good data */
58
- goodPeers = [];
64
+ /** Peers that provided good data, with column coverage for by_range requests */
65
+ successfulDownloads = new Map();
59
66
  /** The `Attempts` that have been made and failed to send us this batch. */
60
67
  failedProcessingAttempts = [];
61
68
  /** The `Attempts` that have been made and failed because of execution malfunction. */
@@ -65,7 +72,9 @@ export class Batch {
65
72
  config;
66
73
  clock;
67
74
  custodyConfig;
68
- constructor(startEpoch, config, clock, custodyConfig) {
75
+ isFirstBatchInChain;
76
+ latestBid;
77
+ constructor(startEpoch, config, clock, custodyConfig, isFirstBatchInChain, latestBid, targetSlot) {
69
78
  this.config = config;
70
79
  this.clock = clock;
71
80
  this.custodyConfig = custodyConfig;
@@ -73,9 +82,36 @@ export class Batch {
73
82
  this.forkName = this.config.getForkName(startSlot);
74
83
  this.startEpoch = startEpoch;
75
84
  this.startSlot = startSlot;
76
- this.count = count;
85
+ this.count = Math.min(count, targetSlot - startSlot + 1);
86
+ this.isFirstBatchInChain = isFirstBatchInChain;
87
+ this.latestBid = latestBid;
77
88
  this.requests = this.getRequests([]);
78
89
  }
90
+ shouldDownloadParentEnvelope(firstBlock) {
91
+ if (!this.isFirstBatchInChain)
92
+ return false;
93
+ if (this.startSlot === 0 || !isForkPostGloas(this.config.getForkName(this.startSlot - 1))) {
94
+ return false;
95
+ }
96
+ // we only know if we should download parent envelope if firstBlock is downloaded
97
+ if (firstBlock === undefined)
98
+ return false;
99
+ if (this.latestBid === undefined)
100
+ return false;
101
+ const firstBlockBidParentHash = firstBlock.message.body.signedExecutionPayloadBid.message
102
+ .parentBlockHash;
103
+ return byteArrayEquals(firstBlockBidParentHash, this.latestBid.blockHash);
104
+ }
105
+ getParentPayloadCommitments(parentBlockRoot) {
106
+ if (this.latestBid === undefined) {
107
+ throw new Error(`Coding error: getParentPayloadCommitments called without latestBid for parentBlockRoot=${toRootHex(parentBlockRoot)}`);
108
+ }
109
+ return {
110
+ blockRoot: parentBlockRoot,
111
+ blockRootHex: toRootHex(parentBlockRoot),
112
+ kzgCommitments: this.latestBid.blobKzgCommitments,
113
+ };
114
+ }
79
115
  /**
80
116
  * Builds ByRange requests for block, blobs and columns
81
117
  */
@@ -203,6 +239,33 @@ export class Batch {
203
239
  count: endSlot - envelopeStartSlot + 1,
204
240
  };
205
241
  }
242
+ // Only the first batch of a SyncChain may need the dangling-parent payload by-root.
243
+ if (blocks.length > 0 && this.shouldDownloadParentEnvelope(blocks[0].getBlock())) {
244
+ // shouldDownloadParentEnvelope() = true means there are at least 1 block
245
+ const parentRoot = blocks[0].getBlock().message.parentRoot;
246
+ if (!byteArrayEquals(parentRoot, ZERO_HASH)) {
247
+ const parentRootHex = toRootHex(parentRoot);
248
+ let parentPayloadInput;
249
+ if (this.state.payloadEnvelopes) {
250
+ for (const pi of this.state.payloadEnvelopes.values()) {
251
+ if (pi.blockRootHex === parentRootHex) {
252
+ parentPayloadInput = pi;
253
+ break;
254
+ }
255
+ }
256
+ }
257
+ const needsEnvelope = !parentPayloadInput?.hasPayloadEnvelope();
258
+ const missingColumns = parentPayloadInput
259
+ ? parentPayloadInput.getMissingSampledColumnMeta().missing
260
+ : this.custodyConfig.sampledColumns;
261
+ if (needsEnvelope || missingColumns.length > 0) {
262
+ requests.parentPayloadRequest = {
263
+ ...(needsEnvelope ? { envelopeBlockRoot: parentRoot } : {}),
264
+ ...(missingColumns.length > 0 ? { blockRoot: parentRoot, columns: missingColumns } : {}),
265
+ };
266
+ }
267
+ }
268
+ }
206
269
  return requests;
207
270
  }
208
271
  /**
@@ -212,22 +275,22 @@ export class Batch {
212
275
  if (!isForkPostFulu(this.forkName)) {
213
276
  return this.requests;
214
277
  }
215
- // post-fulu we need to ensure that we only request columns that the peer has advertised
216
- const { columnsRequest } = this.requests;
217
- if (columnsRequest == null) {
218
- return this.requests;
219
- }
278
+ // post-fulu we need to ensure that we only request columns that the peer has advertised.
279
+ const { columnsRequest, parentPayloadRequest } = this.requests;
220
280
  const peerColumns = new Set(peer.custodyColumns ?? []);
221
- const requestedColumns = columnsRequest.columns.filter((c) => peerColumns.has(c));
222
- if (requestedColumns.length === columnsRequest.columns.length) {
223
- return this.requests;
224
- }
281
+ const filteredColumnsRequest = columnsRequest != null ? columnsRequest.columns.filter((c) => peerColumns.has(c)) : null;
282
+ const parentColumns = parentPayloadRequest?.columns;
283
+ const filteredParentColumns = parentColumns != null ? parentColumns.filter((c) => peerColumns.has(c)) : null;
284
+ const updatedColumnRequest = columnsRequest != null && filteredColumnsRequest != null
285
+ ? { columnsRequest: { ...columnsRequest, columns: filteredColumnsRequest } }
286
+ : {};
287
+ const updatedParentPayloadRequest = parentPayloadRequest != null && filteredParentColumns != null
288
+ ? { parentPayloadRequest: { ...parentPayloadRequest, columns: filteredParentColumns } }
289
+ : {};
225
290
  return {
226
291
  ...this.requests,
227
- columnsRequest: {
228
- ...columnsRequest,
229
- columns: requestedColumns,
230
- },
292
+ ...updatedColumnRequest,
293
+ ...updatedParentPayloadRequest,
231
294
  };
232
295
  }
233
296
  /**
@@ -236,6 +299,31 @@ export class Batch {
236
299
  getFailedPeers() {
237
300
  return [...this.failedDownloadAttempts, ...this.failedProcessingAttempts.flatMap((a) => a.peers)];
238
301
  }
302
+ /**
303
+ * True only if the peer has already returned a successful response for the current request.
304
+ * A by_range success may update `this.requests` to parent_payload, and the same peer is then
305
+ * still eligible for the newly discovered parent payload data.
306
+ * For by_range, a peer that previously succeeded with a superset of requested columns is skipped.
307
+ */
308
+ hasPeerSucceededCurrentRequest(peer) {
309
+ const successfulDownload = this.successfulDownloads.get(peer.peerId);
310
+ if (successfulDownload == null)
311
+ return false;
312
+ const request = getTrackedRequest(this.getRequestsForPeer(peer));
313
+ if (request.parentPayload)
314
+ return successfulDownload.parentPayload;
315
+ const requestByRangeColumns = request.byRangeColumns;
316
+ if (requestByRangeColumns.size === 0) {
317
+ // this means a download blocks/envelops by_range only
318
+ // don't do that again if we already did it
319
+ // see https://github.com/ChainSafe/lodestar/issues/9357
320
+ return true;
321
+ }
322
+ return [...requestByRangeColumns].every((column) => successfulDownload.byRangeColumns.has(column));
323
+ }
324
+ getSuccessfulPeers() {
325
+ return Array.from(this.successfulDownloads.keys());
326
+ }
239
327
  getMetadata() {
240
328
  const { blocksRequest, blobsRequest, columnsRequest, envelopesRequest } = this.requests;
241
329
  const failedProcessingPeerList = this.failedProcessingAttempts.flatMap((a) => a.peers);
@@ -271,9 +359,11 @@ export class Batch {
271
359
  if (this.state.status !== BatchStatus.AwaitingDownload) {
272
360
  throw new BatchError(this.wrongStatusErrorType(BatchStatus.AwaitingDownload));
273
361
  }
362
+ const request = getTrackedRequest(this.getRequestsForPeer(peer));
274
363
  this.state = {
275
364
  status: BatchStatus.Downloading,
276
- peer,
365
+ peer: peer.peerId,
366
+ request,
277
367
  blocks: this.state.blocks,
278
368
  payloadEnvelopes: this.state.payloadEnvelopes,
279
369
  };
@@ -287,7 +377,17 @@ export class Batch {
287
377
  }
288
378
  // ensure that blocks are always sorted before getting stored on the batch.state or being used to getRequests
289
379
  blocks.sort((a, b) => a.slot - b.slot);
290
- this.goodPeers.push(peer);
380
+ const successfulDownload = this.successfulDownloads.get(peer) ?? {
381
+ parentPayload: false,
382
+ byRangeColumns: new Set(),
383
+ };
384
+ successfulDownload.parentPayload ||= this.state.request.parentPayload;
385
+ if (!this.state.request.parentPayload) {
386
+ for (const column of this.state.request.byRangeColumns) {
387
+ successfulDownload.byRangeColumns.add(column);
388
+ }
389
+ }
390
+ this.successfulDownloads.set(peer, successfulDownload);
291
391
  let allComplete = true;
292
392
  const slots = new Set();
293
393
  for (const block of blocks) {
@@ -313,13 +413,36 @@ export class Batch {
313
413
  if (allComplete && isForkPostGloas(this.forkName)) {
314
414
  for (const block of blocks) {
315
415
  const payloadInput = newPayloadEnvelopes?.get(block.slot);
316
- // by_range needs to download all columns
317
- if (!payloadInput?.hasPayloadEnvelope() || !payloadInput.hasComputedAllData()) {
416
+ // only need to make sure envelope has all columns, not all blocks have payload
417
+ // assertLinearChainSegment() was called before reaching this
418
+ if (payloadInput?.hasPayloadEnvelope() && !payloadInput.hasComputedAllData()) {
318
419
  allComplete = false;
319
420
  break;
320
421
  }
321
422
  }
322
423
  }
424
+ // First batch of a sync chain must additionally have the dangling-parent payload fully
425
+ // present, otherwise `processBlocks` will throw PARENT_PAYLOAD_UNKNOWN. The parent's
426
+ // `PayloadEnvelopeInput` is identified by `blockRootHex` matching `blocks[0].parentRoot`.
427
+ if (allComplete && blocks.length > 0 && this.shouldDownloadParentEnvelope(blocks[0].getBlock())) {
428
+ const parentRoot = blocks[0].getBlock().message.parentRoot;
429
+ // Genesis has no parent payload — nothing to wait for.
430
+ if (!byteArrayEquals(parentRoot, ZERO_HASH)) {
431
+ const parentRootHex = toRootHex(parentRoot);
432
+ let parentPayloadComplete = false;
433
+ if (newPayloadEnvelopes) {
434
+ for (const payloadInput of newPayloadEnvelopes.values()) {
435
+ if (payloadInput.blockRootHex === parentRootHex) {
436
+ parentPayloadComplete = payloadInput.hasPayloadEnvelope() && payloadInput.hasComputedAllData();
437
+ break;
438
+ }
439
+ }
440
+ }
441
+ if (!parentPayloadComplete) {
442
+ allComplete = false;
443
+ }
444
+ }
445
+ }
323
446
  if (allComplete) {
324
447
  this.state = { status: BatchStatus.AwaitingProcessing, blocks, payloadEnvelopes: newPayloadEnvelopes };
325
448
  }
@@ -346,6 +469,20 @@ export class Batch {
346
469
  payloadEnvelopes: this.state.payloadEnvelopes,
347
470
  };
348
471
  }
472
+ /**
473
+ * Downloading -> AwaitingDownload (without counting as a failed attempt).
474
+ * Used when the peer rate-limited us — the request was never actually served.
475
+ */
476
+ downloadingRateLimited() {
477
+ if (this.state.status !== BatchStatus.Downloading) {
478
+ throw new BatchError(this.wrongStatusErrorType(BatchStatus.Downloading));
479
+ }
480
+ this.state = {
481
+ status: BatchStatus.AwaitingDownload,
482
+ blocks: this.state.blocks,
483
+ payloadEnvelopes: this.state.payloadEnvelopes,
484
+ };
485
+ }
349
486
  /**
350
487
  * AwaitingProcessing -> Processing
351
488
  */
@@ -356,10 +493,10 @@ export class Batch {
356
493
  const blocks = this.state.blocks;
357
494
  const payloadEnvelopes = this.state.payloadEnvelopes;
358
495
  const hash = hashBlocks(blocks, this.config); // tracks blocks to report peer on processing error
359
- // Reset goodPeers in case another download attempt needs to be made. When Attempt is successful or not the peers
360
- // that the data came from will be handled by the Attempt that goes for processing
361
- const peers = this.goodPeers;
362
- this.goodPeers = [];
496
+ // Reset successfulDownloads in case another download attempt needs to be made. When Attempt is successful or not
497
+ // the peers that the data came from will be handled by the Attempt that goes for processing.
498
+ const peers = this.getSuccessfulPeers();
499
+ this.successfulDownloads.clear();
363
500
  this.state = { status: BatchStatus.Processing, blocks, payloadEnvelopes, attempt: { peers, hash } };
364
501
  return { blocks, payloadEnvelopes, peers };
365
502
  }
@@ -1 +1 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/sync/range/batch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/sync/range/batch.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ChainForkConfig } from "@lodestar/config";
2
- import { Epoch, Root, Slot } from "@lodestar/types";
2
+ import { Epoch, Root, Slot, gloas } from "@lodestar/types";
3
3
  import { Logger } from "@lodestar/utils";
4
4
  import { IBlockInput } from "../../chain/blocks/blockInput/types.js";
5
5
  import { PayloadEnvelopeInput } from "../../chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
@@ -100,13 +100,25 @@ export declare class SyncChain {
100
100
  private readonly batchProcessor;
101
101
  /** Sorted map of batches undergoing some kind of processing. */
102
102
  private readonly batches;
103
+ /**
104
+ * `true` until the first `Batch` is constructed via `includeNextBatch`
105
+ */
106
+ private isFirstBatch;
103
107
  private readonly peerset;
108
+ /**
109
+ * Tracks peers that have rate-limited us, mapped to the timestamp (ms) until which we should avoid them.
110
+ * This is a sync-layer optimization to avoid assigning batches to backed-off peers.
111
+ * The reqresp SelfRateLimiter independently enforces backoff at the protocol level as a safety net.
112
+ */
113
+ private readonly rateLimitedPeers;
114
+ private rateLimitBackoffTimeout;
104
115
  private readonly logger;
105
116
  private readonly config;
106
117
  private readonly clock;
107
118
  private readonly metrics;
108
119
  private readonly custodyConfig;
109
- constructor(initialBatchEpoch: Epoch, initialTarget: ChainTarget, syncType: RangeSyncType, fns: SyncChainFns, modules: SyncChainModules);
120
+ private readonly latestBid;
121
+ constructor(initialBatchEpoch: Epoch, initialTarget: ChainTarget, syncType: RangeSyncType, fns: SyncChainFns, modules: SyncChainModules, latestBid: gloas.ExecutionPayloadBid | undefined);
110
122
  /**
111
123
  * Start syncing a new chain or an old one with an existing peer list
112
124
  * In the same call, advance the chain if localFinalizedEpoch >
@@ -151,6 +163,8 @@ export declare class SyncChain {
151
163
  * Backlogs requests into a single pending request
152
164
  */
153
165
  private triggerBatchDownloader;
166
+ private scheduleRateLimitBackoffRetry;
167
+ private clearRateLimitBackoffTimer;
154
168
  /**
155
169
  * Attempts to request the next required batches from the peer pool if the chain is syncing.
156
170
  * It will exhaust the peer pool and left over batches until the batch buffer is reached.
@@ -1 +1 @@
1
- {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../../src/sync/range/chain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../../src/sync/range/chain.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { ItTrigger } from "../../util/itTrigger.js";
8
8
  import { wrapError } from "../../util/wrapError.js";
9
9
  import { BATCH_BUFFER_SIZE, EPOCHS_PER_BATCH, MAX_LOOK_AHEAD_EPOCHS } from "../constants.js";
10
10
  import { DownloadByRangeErrorCode } from "../utils/downloadByRange.js";
11
+ import { getRateLimitedUntilMs } from "../utils/rateLimit.js";
11
12
  import { RangeSyncType } from "../utils/remoteSyncType.js";
12
13
  import { Batch, BatchError, BatchErrorCode, BatchStatus } from "./batch.js";
13
14
  import { ChainPeersBalancer, batchStartEpochIsAfterSlot, computeHighestTarget, getBatchSlotRange, getNextBatchToProcess, isSyncChainDone, toArr, toBeDownloadedStartEpoch, validateBatchesStatus, } from "./utils/index.js";
@@ -59,13 +60,25 @@ export class SyncChain {
59
60
  batchProcessor = new ItTrigger();
60
61
  /** Sorted map of batches undergoing some kind of processing. */
61
62
  batches = new Map();
63
+ /**
64
+ * `true` until the first `Batch` is constructed via `includeNextBatch`
65
+ */
66
+ isFirstBatch = true;
62
67
  peerset = new Map();
68
+ /**
69
+ * Tracks peers that have rate-limited us, mapped to the timestamp (ms) until which we should avoid them.
70
+ * This is a sync-layer optimization to avoid assigning batches to backed-off peers.
71
+ * The reqresp SelfRateLimiter independently enforces backoff at the protocol level as a safety net.
72
+ */
73
+ rateLimitedPeers = new Map();
74
+ rateLimitBackoffTimeout;
63
75
  logger;
64
76
  config;
65
77
  clock;
66
78
  metrics;
67
79
  custodyConfig;
68
- constructor(initialBatchEpoch, initialTarget, syncType, fns, modules) {
80
+ latestBid;
81
+ constructor(initialBatchEpoch, initialTarget, syncType, fns, modules, latestBid) {
69
82
  const { config, clock, custodyConfig, logger, metrics } = modules;
70
83
  this.firstBatchEpoch = initialBatchEpoch;
71
84
  this.lastEpochWithProcessBlocks = initialBatchEpoch;
@@ -80,6 +93,7 @@ export class SyncChain {
80
93
  this.clock = clock;
81
94
  this.metrics = metrics;
82
95
  this.custodyConfig = custodyConfig;
96
+ this.latestBid = latestBid;
83
97
  this.logger = logger;
84
98
  this.logId = `${syncType}-${nextChainId++}`;
85
99
  if (metrics) {
@@ -122,6 +136,7 @@ export class SyncChain {
122
136
  */
123
137
  stopSyncing() {
124
138
  this.status = SyncChainStatus.Stopped;
139
+ this.clearRateLimitBackoffTimer();
125
140
  this.logger.debug("SyncChain stopSyncing", { id: this.logId });
126
141
  }
127
142
  /**
@@ -129,6 +144,7 @@ export class SyncChain {
129
144
  */
130
145
  remove() {
131
146
  this.logger.debug("SyncChain remove", { id: this.logId });
147
+ this.clearRateLimitBackoffTimer();
132
148
  this.batchProcessor.end(new ErrorAborted("SyncChain"));
133
149
  }
134
150
  /**
@@ -145,6 +161,7 @@ export class SyncChain {
145
161
  */
146
162
  removePeer(peerId) {
147
163
  const deleted = this.peerset.delete(peerId);
164
+ this.rateLimitedPeers.delete(peerId);
148
165
  this.computeTarget();
149
166
  return deleted;
150
167
  }
@@ -234,6 +251,9 @@ export class SyncChain {
234
251
  }
235
252
  throw e;
236
253
  }
254
+ finally {
255
+ this.clearRateLimitBackoffTimer();
256
+ }
237
257
  }
238
258
  /**
239
259
  * Request to process batches if possible
@@ -254,6 +274,35 @@ export class SyncChain {
254
274
  this.batchProcessor.end(e);
255
275
  }
256
276
  }
277
+ scheduleRateLimitBackoffRetry() {
278
+ this.clearRateLimitBackoffTimer();
279
+ if (this.status !== SyncChainStatus.Syncing || this.rateLimitedPeers.size === 0) {
280
+ return;
281
+ }
282
+ const now = Date.now();
283
+ let retryAt = null;
284
+ for (const [peerId, rateLimitedUntil] of this.rateLimitedPeers.entries()) {
285
+ if (rateLimitedUntil <= now) {
286
+ this.rateLimitedPeers.delete(peerId);
287
+ continue;
288
+ }
289
+ retryAt = Math.min(retryAt ?? rateLimitedUntil, rateLimitedUntil);
290
+ }
291
+ if (retryAt === null) {
292
+ return;
293
+ }
294
+ this.rateLimitBackoffTimeout = setTimeout(() => {
295
+ this.rateLimitBackoffTimeout = undefined;
296
+ this.triggerBatchDownloader();
297
+ this.scheduleRateLimitBackoffRetry();
298
+ }, Math.max(0, retryAt - now));
299
+ }
300
+ clearRateLimitBackoffTimer() {
301
+ if (this.rateLimitBackoffTimeout !== undefined) {
302
+ clearTimeout(this.rateLimitBackoffTimeout);
303
+ this.rateLimitBackoffTimeout = undefined;
304
+ }
305
+ }
257
306
  /**
258
307
  * Attempts to request the next required batches from the peer pool if the chain is syncing.
259
308
  * It will exhaust the peer pool and left over batches until the batch buffer is reached.
@@ -262,8 +311,17 @@ export class SyncChain {
262
311
  if (this.status !== SyncChainStatus.Syncing) {
263
312
  return;
264
313
  }
314
+ const now = Date.now();
265
315
  const peersSyncInfo = [];
266
316
  for (const [peerId, target] of this.peerset.entries()) {
317
+ // Skip peers that are currently in rate-limit backoff
318
+ const rateLimitedUntil = this.rateLimitedPeers.get(peerId);
319
+ if (rateLimitedUntil !== undefined) {
320
+ if (now < rateLimitedUntil) {
321
+ continue;
322
+ }
323
+ this.rateLimitedPeers.delete(peerId);
324
+ }
267
325
  try {
268
326
  peersSyncInfo.push({ ...this.getConnectedPeerSyncMeta(peerId), target });
269
327
  }
@@ -325,7 +383,10 @@ export class SyncChain {
325
383
  this.logger.error("Attempting to add existing Batch to SyncChain", { id: this.logId, startEpoch });
326
384
  return null;
327
385
  }
328
- const batch = new Batch(startEpoch, this.config, this.clock, this.custodyConfig);
386
+ const batch = new Batch(startEpoch, this.config, this.clock, this.custodyConfig, this.isFirstBatch,
387
+ // `latestBid` is only meaningful for the first batch's parent-payload check
388
+ this.isFirstBatch ? this.latestBid : undefined, this.target.slot);
389
+ this.isFirstBatch = false;
329
390
  this.batches.set(startEpoch, batch);
330
391
  return batch;
331
392
  }
@@ -339,7 +400,7 @@ export class SyncChain {
339
400
  peer: prettyPrintPeerIdStr(peer.peerId),
340
401
  });
341
402
  try {
342
- batch.startDownloading(peer.peerId);
403
+ batch.startDownloading(peer);
343
404
  // wrapError ensures to never call both batch success() and batch error()
344
405
  const res = await wrapError(this.downloadByRange(peer, batch, this.syncType));
345
406
  if (res.err) {
@@ -367,6 +428,8 @@ export class SyncChain {
367
428
  case DownloadByRangeErrorCode.OUT_OF_ORDER_BLOCKS:
368
429
  case DownloadByRangeErrorCode.OUT_OF_RANGE_BLOCKS:
369
430
  case DownloadByRangeErrorCode.PARENT_ROOT_MISMATCH:
431
+ case DownloadByRangeErrorCode.INVALID_ENVELOPE_BEACON_BLOCK_ROOT:
432
+ case DownloadByRangeErrorCode.INVALID_CHAIN_SEGMENT:
370
433
  case BlobSidecarErrorCode.INCLUSION_PROOF_INVALID:
371
434
  case BlobSidecarErrorCode.INVALID_KZG_PROOF_BATCH:
372
435
  case DataColumnSidecarErrorCode.INCORRECT_KZG_COMMITMENTS_COUNT:
@@ -376,7 +439,17 @@ export class SyncChain {
376
439
  this.reportPeer(peer.peerId, PeerAction.LowToleranceError, res.err.message);
377
440
  }
378
441
  this.logger.verbose("Batch download error", { id: this.logId, ...batch.getMetadata(), peer: prettyPrintPeerIdStr(peer.peerId) }, res.err);
379
- batch.downloadingError(peer.peerId); // Throws after MAX_DOWNLOAD_ATTEMPTS
442
+ const rateLimitedUntilMs = getRateLimitedUntilMs(res.err);
443
+ if (rateLimitedUntilMs !== null) {
444
+ // Peer rate-limited us — don't count as a failed download attempt and mark peer for backoff
445
+ this.rateLimitedPeers.set(peer.peerId, rateLimitedUntilMs);
446
+ this.scheduleRateLimitBackoffRetry();
447
+ batch.downloadingRateLimited();
448
+ this.triggerBatchDownloader();
449
+ }
450
+ else {
451
+ batch.downloadingError(peer.peerId); // Throws after MAX_DOWNLOAD_ATTEMPTS
452
+ }
380
453
  }
381
454
  else {
382
455
  this.logger.verbose("Batch download success", {