@lodestar/beacon-node 1.43.0-dev.549a5b8115 → 1.43.0-dev.59c06807b6

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 (173) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +10 -0
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/debug/index.d.ts.map +1 -1
  5. package/lib/api/impl/debug/index.js +0 -1
  6. package/lib/api/impl/debug/index.js.map +1 -1
  7. package/lib/api/impl/validator/index.d.ts.map +1 -1
  8. package/lib/api/impl/validator/index.js +2 -1
  9. package/lib/api/impl/validator/index.js.map +1 -1
  10. package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
  11. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  12. package/lib/chain/blocks/blockInput/blockInput.js +4 -1
  13. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  14. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  15. package/lib/chain/blocks/importBlock.js +16 -29
  16. package/lib/chain/blocks/importBlock.js.map +1 -1
  17. package/lib/chain/blocks/importExecutionPayload.d.ts +4 -0
  18. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  19. package/lib/chain/blocks/importExecutionPayload.js +15 -6
  20. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  21. package/lib/chain/blocks/index.d.ts.map +1 -1
  22. package/lib/chain/blocks/index.js +29 -17
  23. package/lib/chain/blocks/index.js.map +1 -1
  24. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +11 -1
  25. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  26. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +24 -1
  27. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  28. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +16 -0
  29. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  30. package/lib/chain/blocks/types.d.ts +2 -1
  31. package/lib/chain/blocks/types.d.ts.map +1 -1
  32. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  33. package/lib/chain/blocks/utils/chainSegment.js +8 -0
  34. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  35. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  36. package/lib/chain/blocks/verifyBlock.js +5 -6
  37. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  38. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  39. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  40. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  41. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  42. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  43. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  44. package/lib/chain/blocks/verifyBlocksSanityChecks.js +16 -7
  45. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  46. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
  47. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +10 -6
  49. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  50. package/lib/chain/chain.d.ts.map +1 -1
  51. package/lib/chain/chain.js +25 -10
  52. package/lib/chain/chain.js.map +1 -1
  53. package/lib/chain/emitter.d.ts +0 -11
  54. package/lib/chain/emitter.d.ts.map +1 -1
  55. package/lib/chain/emitter.js +0 -4
  56. package/lib/chain/emitter.js.map +1 -1
  57. package/lib/chain/errors/proposerPreferences.d.ts +8 -1
  58. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -1
  59. package/lib/chain/errors/proposerPreferences.js +1 -0
  60. package/lib/chain/errors/proposerPreferences.js.map +1 -1
  61. package/lib/chain/initState.d.ts.map +1 -1
  62. package/lib/chain/initState.js +6 -1
  63. package/lib/chain/initState.js.map +1 -1
  64. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  65. package/lib/chain/prepareNextSlot.js +16 -18
  66. package/lib/chain/prepareNextSlot.js.map +1 -1
  67. package/lib/chain/produceBlock/produceBlockBody.d.ts +12 -3
  68. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  69. package/lib/chain/produceBlock/produceBlockBody.js +33 -20
  70. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  71. package/lib/chain/regen/queued.d.ts.map +1 -1
  72. package/lib/chain/regen/queued.js +1 -4
  73. package/lib/chain/regen/queued.js.map +1 -1
  74. package/lib/chain/regen/regen.d.ts.map +1 -1
  75. package/lib/chain/regen/regen.js +1 -4
  76. package/lib/chain/regen/regen.js.map +1 -1
  77. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +14 -10
  78. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  79. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +63 -19
  80. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  81. package/lib/chain/seenCache/seenProposerPreferences.d.ts +8 -7
  82. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -1
  83. package/lib/chain/seenCache/seenProposerPreferences.js +11 -10
  84. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -1
  85. package/lib/chain/validation/executionPayloadBid.js +11 -8
  86. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  87. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -1
  88. package/lib/chain/validation/proposerPreferences.js +39 -17
  89. package/lib/chain/validation/proposerPreferences.js.map +1 -1
  90. package/lib/network/gossip/topic.d.ts +2 -0
  91. package/lib/network/gossip/topic.d.ts.map +1 -1
  92. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  93. package/lib/network/processor/gossipHandlers.js +24 -7
  94. package/lib/network/processor/gossipHandlers.js.map +1 -1
  95. package/lib/network/processor/index.js +5 -5
  96. package/lib/network/processor/index.js.map +1 -1
  97. package/lib/node/nodejs.js +2 -2
  98. package/lib/node/nodejs.js.map +1 -1
  99. package/lib/node/notifier.js +1 -7
  100. package/lib/node/notifier.js.map +1 -1
  101. package/lib/sync/constants.d.ts +3 -1
  102. package/lib/sync/constants.d.ts.map +1 -1
  103. package/lib/sync/constants.js +3 -4
  104. package/lib/sync/constants.js.map +1 -1
  105. package/lib/sync/range/batch.d.ts +23 -3
  106. package/lib/sync/range/batch.d.ts.map +1 -1
  107. package/lib/sync/range/batch.js +191 -36
  108. package/lib/sync/range/batch.js.map +1 -1
  109. package/lib/sync/range/chain.d.ts +13 -2
  110. package/lib/sync/range/chain.d.ts.map +1 -1
  111. package/lib/sync/range/chain.js +61 -9
  112. package/lib/sync/range/chain.js.map +1 -1
  113. package/lib/sync/range/range.d.ts.map +1 -1
  114. package/lib/sync/range/range.js +14 -3
  115. package/lib/sync/range/range.js.map +1 -1
  116. package/lib/sync/sync.d.ts.map +1 -1
  117. package/lib/sync/sync.js +13 -0
  118. package/lib/sync/sync.js.map +1 -1
  119. package/lib/sync/unknownBlock.d.ts +7 -2
  120. package/lib/sync/unknownBlock.d.ts.map +1 -1
  121. package/lib/sync/unknownBlock.js +138 -57
  122. package/lib/sync/unknownBlock.js.map +1 -1
  123. package/lib/sync/utils/downloadByRange.d.ts +29 -8
  124. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  125. package/lib/sync/utils/downloadByRange.js +104 -42
  126. package/lib/sync/utils/downloadByRange.js.map +1 -1
  127. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  128. package/lib/sync/utils/downloadByRoot.js +10 -0
  129. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  130. package/lib/util/sszBytes.d.ts.map +1 -1
  131. package/lib/util/sszBytes.js +8 -6
  132. package/lib/util/sszBytes.js.map +1 -1
  133. package/package.json +16 -16
  134. package/src/api/impl/beacon/blocks/index.ts +13 -0
  135. package/src/api/impl/debug/index.ts +0 -1
  136. package/src/api/impl/validator/index.ts +2 -1
  137. package/src/chain/blocks/blockInput/blockInput.ts +4 -1
  138. package/src/chain/blocks/importBlock.ts +16 -49
  139. package/src/chain/blocks/importExecutionPayload.ts +21 -11
  140. package/src/chain/blocks/index.ts +18 -9
  141. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +32 -2
  142. package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -0
  143. package/src/chain/blocks/types.ts +2 -1
  144. package/src/chain/blocks/utils/chainSegment.ts +8 -0
  145. package/src/chain/blocks/verifyBlock.ts +7 -5
  146. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  147. package/src/chain/blocks/verifyBlocksSanityChecks.ts +16 -6
  148. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +14 -6
  149. package/src/chain/chain.ts +29 -9
  150. package/src/chain/emitter.ts +0 -11
  151. package/src/chain/errors/proposerPreferences.ts +9 -1
  152. package/src/chain/initState.ts +9 -1
  153. package/src/chain/prepareNextSlot.ts +21 -29
  154. package/src/chain/produceBlock/produceBlockBody.ts +41 -25
  155. package/src/chain/regen/queued.ts +2 -7
  156. package/src/chain/regen/regen.ts +2 -7
  157. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +78 -22
  158. package/src/chain/seenCache/seenProposerPreferences.ts +14 -11
  159. package/src/chain/validation/executionPayloadBid.ts +11 -8
  160. package/src/chain/validation/proposerPreferences.ts +37 -18
  161. package/src/network/processor/gossipHandlers.ts +30 -7
  162. package/src/network/processor/index.ts +5 -5
  163. package/src/node/nodejs.ts +2 -2
  164. package/src/node/notifier.ts +1 -8
  165. package/src/sync/constants.ts +4 -4
  166. package/src/sync/range/batch.ts +240 -42
  167. package/src/sync/range/chain.ts +77 -10
  168. package/src/sync/range/range.ts +16 -3
  169. package/src/sync/sync.ts +13 -1
  170. package/src/sync/unknownBlock.ts +170 -60
  171. package/src/sync/utils/downloadByRange.ts +166 -44
  172. package/src/sync/utils/downloadByRoot.ts +12 -0
  173. package/src/util/sszBytes.ts +8 -6
@@ -1,8 +1,9 @@
1
1
  import { isForkPostDeneb, isForkPostFulu, isForkPostGloas } from "@lodestar/params";
2
- import { LodestarError } 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 };
@@ -28,6 +29,12 @@ var BatchStatus;
28
29
  */
29
30
  BatchStatus["AwaitingValidation"] = "AwaitingValidation";
30
31
  })(BatchStatus || (BatchStatus = {}));
32
+ function formatRangeReq(req) {
33
+ return `startSlot=${req.startSlot},count=${req.count}`;
34
+ }
35
+ function formatColumnsReq(req) {
36
+ return `startSlot=${req.startSlot},count=${req.count},cols=${prettyPrintIndices(req.columns)}`;
37
+ }
31
38
  /**
32
39
  * Batches are downloaded at the first block of the epoch.
33
40
  *
@@ -59,7 +66,9 @@ export class Batch {
59
66
  config;
60
67
  clock;
61
68
  custodyConfig;
62
- constructor(startEpoch, config, clock, custodyConfig) {
69
+ isFirstBatchInChain;
70
+ latestBid;
71
+ constructor(startEpoch, config, clock, custodyConfig, isFirstBatchInChain, latestBid, targetSlot) {
63
72
  this.config = config;
64
73
  this.clock = clock;
65
74
  this.custodyConfig = custodyConfig;
@@ -67,9 +76,36 @@ export class Batch {
67
76
  this.forkName = this.config.getForkName(startSlot);
68
77
  this.startEpoch = startEpoch;
69
78
  this.startSlot = startSlot;
70
- this.count = count;
79
+ this.count = Math.min(count, targetSlot - startSlot + 1);
80
+ this.isFirstBatchInChain = isFirstBatchInChain;
81
+ this.latestBid = latestBid;
71
82
  this.requests = this.getRequests([]);
72
83
  }
84
+ shouldDownloadParentEnvelope(firstBlock) {
85
+ if (!this.isFirstBatchInChain)
86
+ return false;
87
+ if (this.startSlot === 0 || !isForkPostGloas(this.config.getForkName(this.startSlot - 1))) {
88
+ return false;
89
+ }
90
+ // we only know if we should download parent envelope if firstBlock is downloaded
91
+ if (firstBlock === undefined)
92
+ return false;
93
+ if (this.latestBid === undefined)
94
+ return false;
95
+ const firstBlockBidParentHash = firstBlock.message.body.signedExecutionPayloadBid.message
96
+ .parentBlockHash;
97
+ return byteArrayEquals(firstBlockBidParentHash, this.latestBid.blockHash);
98
+ }
99
+ getParentPayloadCommitments(parentBlockRoot) {
100
+ if (this.latestBid === undefined) {
101
+ throw new Error(`Coding error: getParentPayloadCommitments called without latestBid for parentBlockRoot=${toRootHex(parentBlockRoot)}`);
102
+ }
103
+ return {
104
+ blockRoot: parentBlockRoot,
105
+ blockRootHex: toRootHex(parentBlockRoot),
106
+ kzgCommitments: this.latestBid.blobKzgCommitments,
107
+ };
108
+ }
73
109
  /**
74
110
  * Builds ByRange requests for block, blobs and columns
75
111
  */
@@ -107,6 +143,7 @@ export class Batch {
107
143
  const neededColumns = new Set();
108
144
  const envelopesBySlot = this.state.payloadEnvelopes ?? new Map();
109
145
  // ensure blocks are in slot-wise order
146
+ const isPostGloas = isForkPostGloas(this.forkName);
110
147
  for (const blockInput of blocks) {
111
148
  const blockSlot = blockInput.slot;
112
149
  // check if block/data is present (hasBlock/hasAllData). If present then check if startSlot is the same as
@@ -122,20 +159,38 @@ export class Batch {
122
159
  if (blockInput.hasBlock() && blockStartSlot === blockSlot) {
123
160
  blockStartSlot = blockSlot + 1;
124
161
  }
125
- if (blockInput.hasBlock() &&
126
- envelopeStartSlot === blockSlot &&
127
- envelopesBySlot.get(blockSlot)?.hasPayloadEnvelope()) {
128
- envelopeStartSlot = blockSlot + 1;
129
- }
130
- if (!blockInput.hasAllData()) {
131
- if (isBlockInputColumns(blockInput)) {
132
- for (const index of blockInput.getMissingSampledColumnMeta().missing) {
162
+ // Range sync uses hasComputedAllData (all sampled columns physically present), not hasAllData
163
+ // which flips at the reconstruction threshold. Sync never triggers reconstruction, so accepting
164
+ // a half-downloaded block here makes writeBlockInputToDb later block on waitForComputedAllData.
165
+ if (isPostGloas) {
166
+ // Post-Gloas: column data lives on PayloadEnvelopeInput, not on BlockInputNoData.
167
+ const payloadInput = envelopesBySlot.get(blockSlot);
168
+ if (blockInput.hasBlock() && envelopeStartSlot === blockSlot && payloadInput?.hasPayloadEnvelope()) {
169
+ envelopeStartSlot = blockSlot + 1;
170
+ }
171
+ if (payloadInput && !payloadInput.hasComputedAllData()) {
172
+ for (const index of payloadInput.getMissingSampledColumnMeta().missing) {
133
173
  neededColumns.add(index);
134
174
  }
135
175
  }
176
+ else if (payloadInput?.hasComputedAllData() && dataStartSlot === blockSlot) {
177
+ // Only advance dataStartSlot when we know columns for this slot are complete. If
178
+ // payloadInput is missing entirely we cannot tell, so stop here so the next round
179
+ // re-requests columns (and envelopes) starting at this slot.
180
+ dataStartSlot = blockSlot + 1;
181
+ }
136
182
  }
137
- else if (dataStartSlot === blockSlot) {
138
- dataStartSlot = blockSlot + 1;
183
+ else {
184
+ if (isBlockInputColumns(blockInput) ? !blockInput.hasComputedAllData() : !blockInput.hasAllData()) {
185
+ if (isBlockInputColumns(blockInput)) {
186
+ for (const index of blockInput.getMissingSampledColumnMeta().missing) {
187
+ neededColumns.add(index);
188
+ }
189
+ }
190
+ }
191
+ else if (dataStartSlot === blockSlot) {
192
+ dataStartSlot = blockSlot + 1;
193
+ }
139
194
  }
140
195
  }
141
196
  // if the blockStartSlot or dataStartSlot is after the desired endSlot then no request will be made for the batch
@@ -154,11 +209,15 @@ export class Batch {
154
209
  // range of 40 - 63, startSlot will be inclusive but subtraction will exclusive so need to + 1
155
210
  const count = endSlot - dataStartSlot + 1;
156
211
  if (isForkPostFulu(this.forkName) && withinValidRequestWindow) {
157
- requests.columnsRequest = {
158
- count,
159
- startSlot: dataStartSlot,
160
- columns: Array.from(neededColumns),
161
- };
212
+ // Skip the column re-request when we have no specific column indices outstanding.
213
+ // Peer rejects an empty `columns` list
214
+ if (neededColumns.size > 0) {
215
+ requests.columnsRequest = {
216
+ count,
217
+ startSlot: dataStartSlot,
218
+ columns: Array.from(neededColumns),
219
+ };
220
+ }
162
221
  }
163
222
  else if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
164
223
  requests.blobsRequest = {
@@ -174,6 +233,33 @@ export class Batch {
174
233
  count: endSlot - envelopeStartSlot + 1,
175
234
  };
176
235
  }
236
+ // Only the first batch of a SyncChain may need the dangling-parent payload by-root.
237
+ if (blocks.length > 0 && this.shouldDownloadParentEnvelope(blocks[0].getBlock())) {
238
+ // shouldDownloadParentEnvelope() = true means there are at least 1 block
239
+ const parentRoot = blocks[0].getBlock().message.parentRoot;
240
+ if (!byteArrayEquals(parentRoot, ZERO_HASH)) {
241
+ const parentRootHex = toRootHex(parentRoot);
242
+ let parentPayloadInput;
243
+ if (this.state.payloadEnvelopes) {
244
+ for (const pi of this.state.payloadEnvelopes.values()) {
245
+ if (pi.blockRootHex === parentRootHex) {
246
+ parentPayloadInput = pi;
247
+ break;
248
+ }
249
+ }
250
+ }
251
+ const needsEnvelope = !parentPayloadInput?.hasPayloadEnvelope();
252
+ const missingColumns = parentPayloadInput
253
+ ? parentPayloadInput.getMissingSampledColumnMeta().missing
254
+ : this.custodyConfig.sampledColumns;
255
+ if (needsEnvelope || missingColumns.length > 0) {
256
+ requests.parentPayloadRequest = {
257
+ ...(needsEnvelope ? { envelopeBlockRoot: parentRoot } : {}),
258
+ ...(missingColumns.length > 0 ? { blockRoot: parentRoot, columns: missingColumns } : {}),
259
+ };
260
+ }
261
+ }
262
+ }
177
263
  return requests;
178
264
  }
179
265
  /**
@@ -183,22 +269,22 @@ export class Batch {
183
269
  if (!isForkPostFulu(this.forkName)) {
184
270
  return this.requests;
185
271
  }
186
- // post-fulu we need to ensure that we only request columns that the peer has advertised
187
- const { columnsRequest } = this.requests;
188
- if (columnsRequest == null) {
189
- return this.requests;
190
- }
272
+ // post-fulu we need to ensure that we only request columns that the peer has advertised.
273
+ const { columnsRequest, parentPayloadRequest } = this.requests;
191
274
  const peerColumns = new Set(peer.custodyColumns ?? []);
192
- const requestedColumns = columnsRequest.columns.filter((c) => peerColumns.has(c));
193
- if (requestedColumns.length === columnsRequest.columns.length) {
194
- return this.requests;
195
- }
275
+ const filteredColumnsRequest = columnsRequest != null ? columnsRequest.columns.filter((c) => peerColumns.has(c)) : null;
276
+ const parentColumns = parentPayloadRequest?.columns;
277
+ const filteredParentColumns = parentColumns != null ? parentColumns.filter((c) => peerColumns.has(c)) : null;
278
+ const updatedColumnRequest = columnsRequest != null && filteredColumnsRequest != null
279
+ ? { columnsRequest: { ...columnsRequest, columns: filteredColumnsRequest } }
280
+ : {};
281
+ const updatedParentPayloadRequest = parentPayloadRequest != null && filteredParentColumns != null
282
+ ? { parentPayloadRequest: { ...parentPayloadRequest, columns: filteredParentColumns } }
283
+ : {};
196
284
  return {
197
285
  ...this.requests,
198
- columnsRequest: {
199
- ...columnsRequest,
200
- columns: requestedColumns,
201
- },
286
+ ...updatedColumnRequest,
287
+ ...updatedParentPayloadRequest,
202
288
  };
203
289
  }
204
290
  /**
@@ -208,7 +294,26 @@ export class Batch {
208
294
  return [...this.failedDownloadAttempts, ...this.failedProcessingAttempts.flatMap((a) => a.peers)];
209
295
  }
210
296
  getMetadata() {
211
- return { startEpoch: this.startEpoch, status: this.state.status };
297
+ const { blocksRequest, blobsRequest, columnsRequest, envelopesRequest } = this.requests;
298
+ const failedProcessingPeerList = this.failedProcessingAttempts.flatMap((a) => a.peers);
299
+ return {
300
+ startEpoch: this.startEpoch,
301
+ startSlot: this.startSlot,
302
+ count: this.count,
303
+ status: this.state.status,
304
+ ...(blocksRequest && { blocksReq: formatRangeReq(blocksRequest) }),
305
+ ...(blobsRequest && { blobsReq: formatRangeReq(blobsRequest) }),
306
+ ...(columnsRequest && { columnsReq: formatColumnsReq(columnsRequest) }),
307
+ ...(envelopesRequest && { envelopesReq: formatRangeReq(envelopesRequest) }),
308
+ downloadAttempts: this.failedDownloadAttempts.length,
309
+ processingAttempts: this.failedProcessingAttempts.length,
310
+ ...(this.failedDownloadAttempts.length > 0 && {
311
+ failedDownloadPeers: this.failedDownloadAttempts.join(","),
312
+ }),
313
+ ...(failedProcessingPeerList.length > 0 && {
314
+ failedProcessingPeers: failedProcessingPeerList.join(","),
315
+ }),
316
+ };
212
317
  }
213
318
  getBlocks() {
214
319
  return this.state.blocks;
@@ -244,7 +349,11 @@ export class Batch {
244
349
  const slots = new Set();
245
350
  for (const block of blocks) {
246
351
  slots.add(block.slot);
247
- if (!block.hasBlockAndAllData()) {
352
+ const dataComplete = isBlockInputColumns(block)
353
+ ? // by_range needs to download all columns
354
+ block.hasBlock() && block.hasComputedAllData()
355
+ : block.hasBlockAndAllData();
356
+ if (!dataComplete) {
248
357
  allComplete = false;
249
358
  }
250
359
  }
@@ -258,12 +367,44 @@ export class Batch {
258
367
  });
259
368
  }
260
369
  const newPayloadEnvelopes = payloadEnvelopes ?? this.state.payloadEnvelopes;
370
+ if (allComplete && isForkPostGloas(this.forkName)) {
371
+ for (const block of blocks) {
372
+ const payloadInput = newPayloadEnvelopes?.get(block.slot);
373
+ // by_range needs every block's envelope and all sampled columns.
374
+ if (!payloadInput?.hasPayloadEnvelope() || !payloadInput.hasComputedAllData()) {
375
+ allComplete = false;
376
+ break;
377
+ }
378
+ }
379
+ }
380
+ // First batch of a sync chain must additionally have the dangling-parent payload fully
381
+ // present, otherwise `processBlocks` will throw PARENT_PAYLOAD_UNKNOWN. The parent's
382
+ // `PayloadEnvelopeInput` is identified by `blockRootHex` matching `blocks[0].parentRoot`.
383
+ if (allComplete && blocks.length > 0 && this.shouldDownloadParentEnvelope(blocks[0].getBlock())) {
384
+ const parentRoot = blocks[0].getBlock().message.parentRoot;
385
+ // Genesis has no parent payload — nothing to wait for.
386
+ if (!byteArrayEquals(parentRoot, ZERO_HASH)) {
387
+ const parentRootHex = toRootHex(parentRoot);
388
+ let parentPayloadComplete = false;
389
+ if (newPayloadEnvelopes) {
390
+ for (const payloadInput of newPayloadEnvelopes.values()) {
391
+ if (payloadInput.blockRootHex === parentRootHex) {
392
+ parentPayloadComplete = payloadInput.hasPayloadEnvelope() && payloadInput.hasComputedAllData();
393
+ break;
394
+ }
395
+ }
396
+ }
397
+ if (!parentPayloadComplete) {
398
+ allComplete = false;
399
+ }
400
+ }
401
+ }
261
402
  if (allComplete) {
262
403
  this.state = { status: BatchStatus.AwaitingProcessing, blocks, payloadEnvelopes: newPayloadEnvelopes };
263
404
  }
264
405
  else {
265
- this.requests = this.getRequests(blocks);
266
406
  this.state = { status: BatchStatus.AwaitingDownload, blocks, payloadEnvelopes: newPayloadEnvelopes };
407
+ this.requests = this.getRequests(blocks);
267
408
  }
268
409
  return this.state;
269
410
  }
@@ -284,6 +425,20 @@ export class Batch {
284
425
  payloadEnvelopes: this.state.payloadEnvelopes,
285
426
  };
286
427
  }
428
+ /**
429
+ * Downloading -> AwaitingDownload (without counting as a failed attempt).
430
+ * Used when the peer rate-limited us — the request was never actually served.
431
+ */
432
+ downloadingRateLimited() {
433
+ if (this.state.status !== BatchStatus.Downloading) {
434
+ throw new BatchError(this.wrongStatusErrorType(BatchStatus.Downloading));
435
+ }
436
+ this.state = {
437
+ status: BatchStatus.AwaitingDownload,
438
+ blocks: this.state.blocks,
439
+ payloadEnvelopes: this.state.payloadEnvelopes,
440
+ };
441
+ }
287
442
  /**
288
443
  * AwaitingProcessing -> Processing
289
444
  */
@@ -299,7 +454,7 @@ export class Batch {
299
454
  const peers = this.goodPeers;
300
455
  this.goodPeers = [];
301
456
  this.state = { status: BatchStatus.Processing, blocks, payloadEnvelopes, attempt: { peers, hash } };
302
- return { blocks, payloadEnvelopes };
457
+ return { blocks, payloadEnvelopes, peers };
303
458
  }
304
459
  /**
305
460
  * Processing -> AwaitingValidation
@@ -372,7 +527,7 @@ export class Batch {
372
527
  }
373
528
  /** Helper to construct typed BatchError. Stack traces are correct as the error is thrown above */
374
529
  errorType(type) {
375
- return { ...type, ...this.getMetadata() };
530
+ return { ...type, startEpoch: this.startEpoch, status: this.state.status };
376
531
  }
377
532
  wrongStatusErrorType(expectedStatus) {
378
533
  return this.errorType({ code: BatchErrorCode.WRONG_STATUS, expectedStatus });
@@ -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,24 @@ 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;
104
114
  private readonly logger;
105
115
  private readonly config;
106
116
  private readonly clock;
107
117
  private readonly metrics;
108
118
  private readonly custodyConfig;
109
- constructor(initialBatchEpoch: Epoch, initialTarget: ChainTarget, syncType: RangeSyncType, fns: SyncChainFns, modules: SyncChainModules);
119
+ private readonly latestBid;
120
+ constructor(initialBatchEpoch: Epoch, initialTarget: ChainTarget, syncType: RangeSyncType, fns: SyncChainFns, modules: SyncChainModules, latestBid: gloas.ExecutionPayloadBid | undefined);
110
121
  /**
111
122
  * Start syncing a new chain or an old one with an existing peer list
112
123
  * In the same call, advance the chain if localFinalizedEpoch >
@@ -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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"}
@@ -1,4 +1,5 @@
1
- import { ErrorAborted, toRootHex } from "@lodestar/utils";
1
+ import { RequestErrorCode } from "@lodestar/reqresp";
2
+ import { ErrorAborted, prettyPrintIndices, toRootHex } from "@lodestar/utils";
2
3
  import { isBlockInputBlobs, isBlockInputColumns } from "../../chain/blocks/blockInput/blockInput.js";
3
4
  import { BlockInputErrorCode } from "../../chain/blocks/blockInput/errors.js";
4
5
  import { BlobSidecarErrorCode } from "../../chain/errors/blobSidecarError.js";
@@ -6,7 +7,7 @@ import { DataColumnSidecarErrorCode } from "../../chain/errors/dataColumnSidecar
6
7
  import { PeerAction, prettyPrintPeerIdStr } from "../../network/index.js";
7
8
  import { ItTrigger } from "../../util/itTrigger.js";
8
9
  import { wrapError } from "../../util/wrapError.js";
9
- import { BATCH_BUFFER_SIZE, EPOCHS_PER_BATCH, MAX_LOOK_AHEAD_EPOCHS } from "../constants.js";
10
+ import { BATCH_BUFFER_SIZE, EPOCHS_PER_BATCH, MAX_LOOK_AHEAD_EPOCHS, RATE_LIMITED_PEER_BACKOFF_MS, } from "../constants.js";
10
11
  import { DownloadByRangeErrorCode } from "../utils/downloadByRange.js";
11
12
  import { RangeSyncType } from "../utils/remoteSyncType.js";
12
13
  import { Batch, BatchError, BatchErrorCode, BatchStatus } from "./batch.js";
@@ -59,13 +60,24 @@ 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();
63
74
  logger;
64
75
  config;
65
76
  clock;
66
77
  metrics;
67
78
  custodyConfig;
68
- constructor(initialBatchEpoch, initialTarget, syncType, fns, modules) {
79
+ latestBid;
80
+ constructor(initialBatchEpoch, initialTarget, syncType, fns, modules, latestBid) {
69
81
  const { config, clock, custodyConfig, logger, metrics } = modules;
70
82
  this.firstBatchEpoch = initialBatchEpoch;
71
83
  this.lastEpochWithProcessBlocks = initialBatchEpoch;
@@ -80,6 +92,7 @@ export class SyncChain {
80
92
  this.clock = clock;
81
93
  this.metrics = metrics;
82
94
  this.custodyConfig = custodyConfig;
95
+ this.latestBid = latestBid;
83
96
  this.logger = logger;
84
97
  this.logId = `${syncType}-${nextChainId++}`;
85
98
  if (metrics) {
@@ -122,11 +135,13 @@ export class SyncChain {
122
135
  */
123
136
  stopSyncing() {
124
137
  this.status = SyncChainStatus.Stopped;
138
+ this.logger.debug("SyncChain stopSyncing", { id: this.logId });
125
139
  }
126
140
  /**
127
141
  * Permanently remove this chain. Throws the main AsyncIterable
128
142
  */
129
143
  remove() {
144
+ this.logger.debug("SyncChain remove", { id: this.logId });
130
145
  this.batchProcessor.end(new ErrorAborted("SyncChain"));
131
146
  }
132
147
  /**
@@ -143,6 +158,7 @@ export class SyncChain {
143
158
  */
144
159
  removePeer(peerId) {
145
160
  const deleted = this.peerset.delete(peerId);
161
+ this.rateLimitedPeers.delete(peerId);
146
162
  this.computeTarget();
147
163
  return deleted;
148
164
  }
@@ -260,8 +276,17 @@ export class SyncChain {
260
276
  if (this.status !== SyncChainStatus.Syncing) {
261
277
  return;
262
278
  }
279
+ const now = Date.now();
263
280
  const peersSyncInfo = [];
264
281
  for (const [peerId, target] of this.peerset.entries()) {
282
+ // Skip peers that are currently in rate-limit backoff
283
+ const rateLimitedUntil = this.rateLimitedPeers.get(peerId);
284
+ if (rateLimitedUntil !== undefined) {
285
+ if (now < rateLimitedUntil) {
286
+ continue;
287
+ }
288
+ this.rateLimitedPeers.delete(peerId);
289
+ }
265
290
  try {
266
291
  peersSyncInfo.push({ ...this.getConnectedPeerSyncMeta(peerId), target });
267
292
  }
@@ -323,7 +348,10 @@ export class SyncChain {
323
348
  this.logger.error("Attempting to add existing Batch to SyncChain", { id: this.logId, startEpoch });
324
349
  return null;
325
350
  }
326
- const batch = new Batch(startEpoch, this.config, this.clock, this.custodyConfig);
351
+ const batch = new Batch(startEpoch, this.config, this.clock, this.custodyConfig, this.isFirstBatch,
352
+ // `latestBid` is only meaningful for the first batch's parent-payload check
353
+ this.isFirstBatch ? this.latestBid : undefined, this.target.slot);
354
+ this.isFirstBatch = false;
327
355
  this.batches.set(startEpoch, batch);
328
356
  return batch;
329
357
  }
@@ -374,7 +402,15 @@ export class SyncChain {
374
402
  this.reportPeer(peer.peerId, PeerAction.LowToleranceError, res.err.message);
375
403
  }
376
404
  this.logger.verbose("Batch download error", { id: this.logId, ...batch.getMetadata(), peer: prettyPrintPeerIdStr(peer.peerId) }, res.err);
377
- batch.downloadingError(peer.peerId); // Throws after MAX_DOWNLOAD_ATTEMPTS
405
+ if (errCode === RequestErrorCode.RESP_RATE_LIMITED || errCode === RequestErrorCode.REQUEST_SELF_RATE_LIMITED) {
406
+ // Peer rate-limited us — don't count as a failed download attempt and mark peer for backoff
407
+ this.rateLimitedPeers.set(peer.peerId, Date.now() + RATE_LIMITED_PEER_BACKOFF_MS);
408
+ batch.downloadingRateLimited();
409
+ this.triggerBatchDownloader();
410
+ }
411
+ else {
412
+ batch.downloadingError(peer.peerId); // Throws after MAX_DOWNLOAD_ATTEMPTS
413
+ }
378
414
  }
379
415
  else {
380
416
  this.logger.verbose("Batch download success", {
@@ -392,7 +428,7 @@ export class SyncChain {
392
428
  if (warnings && warnings.length > 0) {
393
429
  for (const warning of warnings) {
394
430
  this.metrics?.syncRange.downloadByRange.warn.inc({ client: peer.client, code: warning.type.code });
395
- this.logger.debug("Batch downloaded with warning", { id: this.logId, epoch: batch.startEpoch, ...logMeta, peer: prettyPrintPeerIdStr(peer.peerId) }, warning);
431
+ this.logger.debug("Batch downloaded with warning", { id: this.logId, ...batch.getMetadata(), ...logMeta, peer: prettyPrintPeerIdStr(peer.peerId) }, warning);
396
432
  }
397
433
  }
398
434
  for (const block of downloadSuccessOutput.blocks) {
@@ -415,10 +451,16 @@ export class SyncChain {
415
451
  logMessage = "Partially downloaded batch by range. Attempting another round of downloads";
416
452
  // the flow will continue to call triggerBatchDownloader() below
417
453
  }
454
+ const blockSlots = downloadSuccessOutput.blocks.map((b) => b.slot);
455
+ const envelopeSlots = downloadSuccessOutput.payloadEnvelopes
456
+ ? Array.from(downloadSuccessOutput.payloadEnvelopes.keys())
457
+ : null;
418
458
  this.logger.debug(logMessage, {
419
459
  id: this.logId,
420
- epoch: batch.startEpoch,
460
+ ...batch.getMetadata(),
421
461
  ...logMeta,
462
+ blockSlots: prettyPrintIndices(blockSlots),
463
+ ...(envelopeSlots ? { envelopeSlots: prettyPrintIndices(envelopeSlots) } : {}),
422
464
  peer: prettyPrintPeerIdStr(peer.peerId),
423
465
  });
424
466
  }
@@ -439,11 +481,21 @@ export class SyncChain {
439
481
  * Sends `batch` to the processor. Note: batch may be empty
440
482
  */
441
483
  async processBatch(batch) {
442
- const { blocks, payloadEnvelopes } = batch.startProcessing();
484
+ const { blocks, payloadEnvelopes, peers } = batch.startProcessing();
485
+ const logCtx = {
486
+ id: this.logId,
487
+ ...batch.getMetadata(),
488
+ blockCount: blocks.length,
489
+ blockSlots: prettyPrintIndices(blocks.map((b) => b.slot)),
490
+ ...(payloadEnvelopes ? { envelopeSlots: prettyPrintIndices(Array.from(payloadEnvelopes.keys())) } : {}),
491
+ peers: peers.map(prettyPrintPeerIdStr).join(","),
492
+ };
493
+ this.logger.verbose("Processing batch", logCtx);
443
494
  // wrapError ensures to never call both batch success() and batch error()
444
495
  const res = await wrapError(this.processChainSegment(blocks, payloadEnvelopes, this.syncType));
445
496
  if (!res.err) {
446
497
  batch.processingSuccess();
498
+ this.logger.verbose("Processed batch", { ...logCtx, ...batch.getMetadata() });
447
499
  // If the processed batch is not empty, validate previous AwaitingValidation blocks.
448
500
  if (blocks.length > 0) {
449
501
  this.advanceChain(batch.startEpoch);
@@ -452,7 +504,7 @@ export class SyncChain {
452
504
  this.triggerBatchProcessor();
453
505
  }
454
506
  else {
455
- this.logger.verbose("Batch process error", { id: this.logId, ...batch.getMetadata() }, res.err);
507
+ this.logger.verbose("Batch process error", logCtx, res.err);
456
508
  batch.processingError(res.err); // Throws after MAX_BATCH_PROCESSING_ATTEMPTS
457
509
  // At least one block was successfully verified and imported, so we can be sure all
458
510
  // previous batches are valid and we only need to download the current failed batch.