@lodestar/beacon-node 1.49.0-dev.ae6cc426f1 → 1.49.0-dev.c256679454

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 (212) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +2 -2
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.js +4 -2
  5. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  6. package/lib/api/impl/validator/index.d.ts.map +1 -1
  7. package/lib/api/impl/validator/index.js +9 -7
  8. package/lib/api/impl/validator/index.js.map +1 -1
  9. package/lib/chain/archiveStore/archiveStore.d.ts +1 -2
  10. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  11. package/lib/chain/archiveStore/archiveStore.js +4 -7
  12. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  13. package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -1
  14. package/lib/chain/archiveStore/historicalState/metrics.js +5 -6
  15. package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
  16. package/lib/chain/archiveStore/utils/pruneHistory.d.ts +2 -2
  17. package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/utils/pruneHistory.js +15 -3
  19. package/lib/chain/archiveStore/utils/pruneHistory.js.map +1 -1
  20. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  21. package/lib/chain/blocks/importExecutionPayload.js +13 -0
  22. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  23. package/lib/chain/blocks/index.js +2 -2
  24. package/lib/chain/blocks/index.js.map +1 -1
  25. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +1 -1
  26. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  27. package/lib/chain/emitter.d.ts +10 -0
  28. package/lib/chain/emitter.d.ts.map +1 -1
  29. package/lib/chain/emitter.js +4 -0
  30. package/lib/chain/emitter.js.map +1 -1
  31. package/lib/chain/errors/attesterSlashingError.d.ts +4 -1
  32. package/lib/chain/errors/attesterSlashingError.d.ts.map +1 -1
  33. package/lib/chain/errors/attesterSlashingError.js +1 -0
  34. package/lib/chain/errors/attesterSlashingError.js.map +1 -1
  35. package/lib/chain/errors/payloadAttestation.d.ts +4 -0
  36. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -1
  37. package/lib/chain/errors/payloadAttestation.js +1 -0
  38. package/lib/chain/errors/payloadAttestation.js.map +1 -1
  39. package/lib/chain/errors/proposerSlashingError.d.ts +4 -1
  40. package/lib/chain/errors/proposerSlashingError.d.ts.map +1 -1
  41. package/lib/chain/errors/proposerSlashingError.js +1 -0
  42. package/lib/chain/errors/proposerSlashingError.js.map +1 -1
  43. package/lib/chain/interface.d.ts +1 -1
  44. package/lib/chain/interface.d.ts.map +1 -1
  45. package/lib/chain/options.d.ts +0 -4
  46. package/lib/chain/options.d.ts.map +1 -1
  47. package/lib/chain/options.js +0 -1
  48. package/lib/chain/options.js.map +1 -1
  49. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  50. package/lib/chain/produceBlock/computeNewStateRoot.js +4 -2
  51. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  52. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  53. package/lib/chain/produceBlock/produceBlockBody.js +6 -6
  54. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  55. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +2 -1
  56. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  57. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +3 -2
  58. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  59. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  60. package/lib/chain/validation/attesterSlashing.js +1 -2
  61. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  62. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  63. package/lib/chain/validation/payloadAttestationMessage.js +8 -1
  64. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  65. package/lib/chain/validation/proposerSlashing.js +1 -2
  66. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  67. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  68. package/lib/chain/validatorMonitor.js +2 -2
  69. package/lib/chain/validatorMonitor.js.map +1 -1
  70. package/lib/db/beacon.d.ts +1 -2
  71. package/lib/db/beacon.d.ts.map +1 -1
  72. package/lib/db/beacon.js +1 -3
  73. package/lib/db/beacon.js.map +1 -1
  74. package/lib/db/buckets.d.ts +0 -1
  75. package/lib/db/buckets.d.ts.map +1 -1
  76. package/lib/db/buckets.js +1 -1
  77. package/lib/db/buckets.js.map +1 -1
  78. package/lib/db/interface.d.ts +1 -2
  79. package/lib/db/interface.d.ts.map +1 -1
  80. package/lib/db/repositories/blockArchive.d.ts +5 -0
  81. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  82. package/lib/db/repositories/blockArchive.js +36 -1
  83. package/lib/db/repositories/blockArchive.js.map +1 -1
  84. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  85. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  86. package/lib/db/repositories/index.d.ts +0 -1
  87. package/lib/db/repositories/index.d.ts.map +1 -1
  88. package/lib/db/repositories/index.js +0 -1
  89. package/lib/db/repositories/index.js.map +1 -1
  90. package/lib/metrics/metrics/lodestar.d.ts +21 -11
  91. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  92. package/lib/metrics/metrics/lodestar.js +48 -23
  93. package/lib/metrics/metrics/lodestar.js.map +1 -1
  94. package/lib/metrics/metrics.d.ts +3 -1
  95. package/lib/metrics/metrics.d.ts.map +1 -1
  96. package/lib/metrics/metrics.js +2 -2
  97. package/lib/metrics/metrics.js.map +1 -1
  98. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  99. package/lib/network/gossip/gossipsub.js +15 -0
  100. package/lib/network/gossip/gossipsub.js.map +1 -1
  101. package/lib/network/gossip/topic.d.ts +1 -1
  102. package/lib/network/gossip/topic.d.ts.map +1 -1
  103. package/lib/network/gossip/topic.js +1 -1
  104. package/lib/network/gossip/topic.js.map +1 -1
  105. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  106. package/lib/network/processor/gossipHandlers.js +16 -5
  107. package/lib/network/processor/gossipHandlers.js.map +1 -1
  108. package/lib/network/processor/gossipValidatorFn.d.ts +2 -0
  109. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  110. package/lib/network/processor/gossipValidatorFn.js +88 -7
  111. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  112. package/lib/network/processor/index.d.ts +6 -2
  113. package/lib/network/processor/index.d.ts.map +1 -1
  114. package/lib/network/processor/index.js +62 -24
  115. package/lib/network/processor/index.js.map +1 -1
  116. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  117. package/lib/network/reqresp/handlers/index.js +20 -4
  118. package/lib/network/reqresp/handlers/index.js.map +1 -1
  119. package/lib/node/nodejs.d.ts +2 -7
  120. package/lib/node/nodejs.d.ts.map +1 -1
  121. package/lib/node/nodejs.js +2 -22
  122. package/lib/node/nodejs.js.map +1 -1
  123. package/lib/sync/interface.d.ts +1 -2
  124. package/lib/sync/interface.d.ts.map +1 -1
  125. package/lib/sync/options.d.ts +0 -6
  126. package/lib/sync/options.d.ts.map +1 -1
  127. package/lib/sync/options.js +0 -2
  128. package/lib/sync/options.js.map +1 -1
  129. package/lib/sync/types.d.ts +21 -2
  130. package/lib/sync/types.d.ts.map +1 -1
  131. package/lib/sync/types.js +22 -2
  132. package/lib/sync/types.js.map +1 -1
  133. package/lib/sync/unknownBlock.d.ts +20 -0
  134. package/lib/sync/unknownBlock.d.ts.map +1 -1
  135. package/lib/sync/unknownBlock.js +199 -15
  136. package/lib/sync/unknownBlock.js.map +1 -1
  137. package/lib/util/shuffle.d.ts +0 -4
  138. package/lib/util/shuffle.d.ts.map +1 -1
  139. package/lib/util/shuffle.js +0 -8
  140. package/lib/util/shuffle.js.map +1 -1
  141. package/package.json +16 -16
  142. package/src/api/impl/beacon/blocks/index.ts +2 -2
  143. package/src/api/impl/beacon/pool/index.ts +6 -2
  144. package/src/api/impl/validator/index.ts +9 -7
  145. package/src/chain/archiveStore/archiveStore.ts +4 -8
  146. package/src/chain/archiveStore/historicalState/metrics.ts +5 -7
  147. package/src/chain/archiveStore/utils/pruneHistory.ts +18 -6
  148. package/src/chain/blocks/importExecutionPayload.ts +14 -0
  149. package/src/chain/blocks/index.ts +2 -2
  150. package/src/chain/blocks/payloadEnvelopeInput/types.ts +1 -1
  151. package/src/chain/emitter.ts +7 -2
  152. package/src/chain/errors/attesterSlashingError.ts +3 -1
  153. package/src/chain/errors/payloadAttestation.ts +2 -0
  154. package/src/chain/errors/proposerSlashingError.ts +3 -1
  155. package/src/chain/interface.ts +1 -1
  156. package/src/chain/options.ts +0 -5
  157. package/src/chain/produceBlock/computeNewStateRoot.ts +9 -2
  158. package/src/chain/produceBlock/produceBlockBody.ts +17 -6
  159. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +3 -2
  160. package/src/chain/validation/attesterSlashing.ts +1 -2
  161. package/src/chain/validation/payloadAttestationMessage.ts +9 -0
  162. package/src/chain/validation/proposerSlashing.ts +1 -2
  163. package/src/chain/validatorMonitor.ts +12 -2
  164. package/src/db/beacon.ts +0 -5
  165. package/src/db/buckets.ts +1 -1
  166. package/src/db/interface.ts +0 -3
  167. package/src/db/repositories/blockArchive.ts +38 -1
  168. package/src/db/repositories/index.ts +0 -1
  169. package/src/metrics/metrics/lodestar.ts +58 -26
  170. package/src/metrics/metrics.ts +7 -2
  171. package/src/network/gossip/gossipsub.ts +18 -1
  172. package/src/network/gossip/topic.ts +2 -2
  173. package/src/network/processor/gossipHandlers.ts +18 -5
  174. package/src/network/processor/gossipValidatorFn.ts +111 -7
  175. package/src/network/processor/index.ts +81 -24
  176. package/src/network/reqresp/handlers/index.ts +49 -5
  177. package/src/node/nodejs.ts +0 -27
  178. package/src/sync/interface.ts +1 -2
  179. package/src/sync/options.ts +0 -8
  180. package/src/sync/types.ts +24 -5
  181. package/src/sync/unknownBlock.ts +207 -14
  182. package/src/util/shuffle.ts +0 -9
  183. package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts +0 -20
  184. package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +0 -1
  185. package/lib/chain/archiveStore/utils/updateBackfillRange.js +0 -40
  186. package/lib/chain/archiveStore/utils/updateBackfillRange.js.map +0 -1
  187. package/lib/db/repositories/backfilledRanges.d.ts +0 -18
  188. package/lib/db/repositories/backfilledRanges.d.ts.map +0 -1
  189. package/lib/db/repositories/backfilledRanges.js +0 -26
  190. package/lib/db/repositories/backfilledRanges.js.map +0 -1
  191. package/lib/sync/backfill/backfill.d.ts +0 -169
  192. package/lib/sync/backfill/backfill.d.ts.map +0 -1
  193. package/lib/sync/backfill/backfill.js +0 -686
  194. package/lib/sync/backfill/backfill.js.map +0 -1
  195. package/lib/sync/backfill/errors.d.ts +0 -30
  196. package/lib/sync/backfill/errors.d.ts.map +0 -1
  197. package/lib/sync/backfill/errors.js +0 -15
  198. package/lib/sync/backfill/errors.js.map +0 -1
  199. package/lib/sync/backfill/index.d.ts +0 -2
  200. package/lib/sync/backfill/index.d.ts.map +0 -1
  201. package/lib/sync/backfill/index.js +0 -2
  202. package/lib/sync/backfill/index.js.map +0 -1
  203. package/lib/sync/backfill/verify.d.ts +0 -18
  204. package/lib/sync/backfill/verify.d.ts.map +0 -1
  205. package/lib/sync/backfill/verify.js +0 -36
  206. package/lib/sync/backfill/verify.js.map +0 -1
  207. package/src/chain/archiveStore/utils/updateBackfillRange.ts +0 -50
  208. package/src/db/repositories/backfilledRanges.ts +0 -29
  209. package/src/sync/backfill/backfill.ts +0 -916
  210. package/src/sync/backfill/errors.ts +0 -23
  211. package/src/sync/backfill/index.ts +0 -1
  212. package/src/sync/backfill/verify.ts +0 -58
@@ -13,12 +13,6 @@ export type SyncOptions = {
13
13
  disableRangeSync?: boolean;
14
14
  /** USE FOR TESTING ONLY. Disable unknown block sync completely */
15
15
  disableBlockInputSync?: boolean;
16
- /**
17
- * The batch size of slots for backfill sync can attempt to sync/process before yielding
18
- * to sync loop. This number can be increased or decreased to make a suitable resource
19
- * allocation to backfill sync. The default of 0 would mean backfill sync will be skipped
20
- */
21
- backfillBatchSize: number;
22
16
  /** For testing only, MAX_PENDING_BLOCKS by default */
23
17
  maxPendingBlocks?: number;
24
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/sync/options.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kEAAkE;IAClE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAMhC,CAAC"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/sync/options.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kEAAkE;IAClE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAC"}
@@ -2,8 +2,6 @@ import { SLOTS_PER_EPOCH } from "@lodestar/params";
2
2
  export const defaultSyncOptions = {
3
3
  isSingleNode: false,
4
4
  disableProcessAsChainSegment: false,
5
- /** By default skip the backfill sync */
6
- backfillBatchSize: 0,
7
5
  slotImportTolerance: SLOTS_PER_EPOCH,
8
6
  };
9
7
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/sync/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAsCjD,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,YAAY,EAAE,KAAK;IACnB,4BAA4B,EAAE,KAAK;IACnC,wCAAwC;IACxC,iBAAiB,EAAE,CAAC;IACpB,mBAAmB,EAAE,eAAe;CACrC,CAAC"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/sync/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAgCjD,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,YAAY,EAAE,KAAK;IACnB,4BAA4B,EAAE,KAAK;IACnC,mBAAmB,EAAE,eAAe;CACrC,CAAC"}
@@ -20,6 +20,14 @@ export declare enum PendingBlockType {
20
20
  * Payload analog of UNKNOWN_BLOCK_ROOT: we have a beacon block root but not its execution payload envelope.
21
21
  */
22
22
  UNKNOWN_PAYLOAD_BLOCK_ROOT = "unknown_payload_block_root",
23
+ /**
24
+ * Same as UNKNOWN_PAYLOAD_BLOCK_ROOT, but the trigger also carries the payload's slot
25
+ */
26
+ UNKNOWN_PAYLOAD_BLOCK_ROOT_SLOT = "unknown_payload_block_root_slot",
27
+ /**
28
+ * Same as UNKNOWN_PAYLOAD_BLOCK_ROOT_SLOT for the current slot
29
+ */
30
+ DEFERRED_PAYLOAD_BLOCK_ROOT = "deferred_payload_block_root",
23
31
  /**
24
32
  * Payload analog of INCOMPLETE_BLOCK_INPUT: we have a partial payload input that did not complete in time.
25
33
  */
@@ -43,6 +51,19 @@ export declare enum FetchResult {
43
51
  FailureTriedAllPeers = "failure_tried_all_peers",
44
52
  FailureMaxAttempts = "failure_max_attempts"
45
53
  }
54
+ /**
55
+ * Outcome of a slot's deferred optimistic payload searches, recorded once when its poll loop ends.
56
+ */
57
+ export declare enum DeferredPayloadResult {
58
+ /** gossip delivered every watched payload before PAYLOAD_DUE, no search was needed */
59
+ ImportedBeforeSearch = "imported_before_search",
60
+ /** at least one was missing at PAYLOAD_DUE, we searched, and all were imported afterwards */
61
+ ImportedAfterSearch = "imported_after_search",
62
+ /** something was still not in fork choice when the slot ended */
63
+ Unresolved = "unresolved",
64
+ /** the slot had no optimistic search and no payload import at all, eg a skipped slot */
65
+ ResolvedNoRoot = "resolved_no_root"
66
+ }
46
67
  export declare enum PendingBlockInputStatus {
47
68
  pending = "pending",
48
69
  fetching = "fetching",
@@ -76,8 +97,6 @@ export declare enum DroppedItemReason {
76
97
  invalidEnvelope = "invalid_envelope",
77
98
  /** a payload had an invalid signature (INVALID_SIGNATURE) */
78
99
  invalidSignature = "invalid_signature",
79
- /** a block root was given up on after exhausting download attempts (data could not be fetched) */
80
- unavailable = "unavailable",
81
100
  /** an unexpected / unhandled error code led to removal */
82
101
  unknown = "unknown"
83
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
package/lib/sync/types.js CHANGED
@@ -18,6 +18,14 @@ export var PendingBlockType;
18
18
  * Payload analog of UNKNOWN_BLOCK_ROOT: we have a beacon block root but not its execution payload envelope.
19
19
  */
20
20
  PendingBlockType["UNKNOWN_PAYLOAD_BLOCK_ROOT"] = "unknown_payload_block_root";
21
+ /**
22
+ * Same as UNKNOWN_PAYLOAD_BLOCK_ROOT, but the trigger also carries the payload's slot
23
+ */
24
+ PendingBlockType["UNKNOWN_PAYLOAD_BLOCK_ROOT_SLOT"] = "unknown_payload_block_root_slot";
25
+ /**
26
+ * Same as UNKNOWN_PAYLOAD_BLOCK_ROOT_SLOT for the current slot
27
+ */
28
+ PendingBlockType["DEFERRED_PAYLOAD_BLOCK_ROOT"] = "deferred_payload_block_root";
21
29
  /**
22
30
  * Payload analog of INCOMPLETE_BLOCK_INPUT: we have a partial payload input that did not complete in time.
23
31
  */
@@ -43,6 +51,20 @@ export var FetchResult;
43
51
  FetchResult["FailureTriedAllPeers"] = "failure_tried_all_peers";
44
52
  FetchResult["FailureMaxAttempts"] = "failure_max_attempts";
45
53
  })(FetchResult || (FetchResult = {}));
54
+ /**
55
+ * Outcome of a slot's deferred optimistic payload searches, recorded once when its poll loop ends.
56
+ */
57
+ export var DeferredPayloadResult;
58
+ (function (DeferredPayloadResult) {
59
+ /** gossip delivered every watched payload before PAYLOAD_DUE, no search was needed */
60
+ DeferredPayloadResult["ImportedBeforeSearch"] = "imported_before_search";
61
+ /** at least one was missing at PAYLOAD_DUE, we searched, and all were imported afterwards */
62
+ DeferredPayloadResult["ImportedAfterSearch"] = "imported_after_search";
63
+ /** something was still not in fork choice when the slot ended */
64
+ DeferredPayloadResult["Unresolved"] = "unresolved";
65
+ /** the slot had no optimistic search and no payload import at all, eg a skipped slot */
66
+ DeferredPayloadResult["ResolvedNoRoot"] = "resolved_no_root";
67
+ })(DeferredPayloadResult || (DeferredPayloadResult = {}));
46
68
  export var PendingBlockInputStatus;
47
69
  (function (PendingBlockInputStatus) {
48
70
  PendingBlockInputStatus["pending"] = "pending";
@@ -78,8 +100,6 @@ export var DroppedItemReason;
78
100
  DroppedItemReason["invalidEnvelope"] = "invalid_envelope";
79
101
  /** a payload had an invalid signature (INVALID_SIGNATURE) */
80
102
  DroppedItemReason["invalidSignature"] = "invalid_signature";
81
- /** a block root was given up on after exhausting download attempts (data could not be fetched) */
82
- DroppedItemReason["unavailable"] = "unavailable";
83
103
  /** an unexpected / unhandled error code led to removal */
84
104
  DroppedItemReason["unknown"] = "unknown";
85
105
  })(DroppedItemReason || (DroppedItemReason = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,10 @@ import { INetwork } from "../network/index.js";
6
6
  import { PeerSyncMeta } from "../network/peers/peersData.js";
7
7
  import { PeerIdStr } from "../util/peerId.js";
8
8
  import { SyncOptions } from "./options.js";
9
+ /**
10
+ * Poll pending payloads of the current slot this often, between PAYLOAD_DUE and the end of the slot.
11
+ */
12
+ export declare const PAYLOAD_POLL_INTERVAL_MS = 1000;
9
13
  /**
10
14
  * BlockInputSync is a class that handles ReqResp to find blocks and data related to a specific blockRoot. The
11
15
  * blockRoot may have been found via object gossip, or the API. Gossip objects that can trigger a search are block,
@@ -55,6 +59,11 @@ export declare class BlockInputSync {
55
59
  private subscribedToNetworkEvents;
56
60
  private peerBalancer;
57
61
  private rateLimitBackoffTimeout;
62
+ /**
63
+ * Search unknown payload starting at PAYLOAD_DUE_BPS.
64
+ */
65
+ private readonly deferredPayloadRoots;
66
+ private payloadPollAbortController;
58
67
  constructor(config: ChainForkConfig, network: INetwork, chain: IBeaconChain, logger: Logger, metrics: Metrics | null, opts?: SyncOptions | undefined);
59
68
  subscribeToNetwork(): void;
60
69
  unsubscribeFromNetwork(): void;
@@ -69,6 +78,7 @@ export declare class BlockInputSync {
69
78
  */
70
79
  private onIncompleteBlockInput;
71
80
  private onUnknownEnvelopeBlockRoot;
81
+ private onUnknownEnvelopeBlockRootSlot;
72
82
  private onIncompletePayloadEnvelope;
73
83
  /**
74
84
  * Process an unknownBlockParent event and register the block in `pendingBlocks` Map.
@@ -104,6 +114,16 @@ export declare class BlockInputSync {
104
114
  private triggerUnknownBlockSearch;
105
115
  private scheduleRateLimitBackoffRetry;
106
116
  private clearRateLimitBackoffTimer;
117
+ /**
118
+ * Start this slot's payload poll: end the previous slot's loop, move roots it never got to
119
+ * into pendingPayloads, then poll from PAYLOAD_DUE to the end of the slot.
120
+ */
121
+ private startPayloadPollAtSlot;
122
+ /**
123
+ * Poll unknown payloads of the current slot.
124
+ */
125
+ private pollPayloadsAtSlot;
126
+ private addDeferredPayloadRoot;
107
127
  private downloadBlock;
108
128
  /**
109
129
  * Import a block that has already passed the local dependency checks in BlockInputSync.
@@ -1 +1 @@
1
- {"version":3,"file":"unknownBlock.d.ts","sourceRoot":"","sources":["../../src/sync/unknownBlock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unknownBlock.d.ts","sourceRoot":"","sources":["../../src/sync/unknownBlock.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { routes } from "@lodestar/api";
2
2
  import { ForkSeq, SLOTS_PER_EPOCH, isForkPostGloas } from "@lodestar/params";
3
3
  import { RequestError, RequestErrorCode } from "@lodestar/reqresp";
4
4
  import { computeTimeAtSlot } from "@lodestar/state-transition";
5
- import { fromHex, prettyPrintIndices, pruneSetToMax, sleep, toRootHex } from "@lodestar/utils";
5
+ import { fromHex, isErrorAborted, prettyPrintIndices, pruneSetToMax, sleep, toRootHex } from "@lodestar/utils";
6
6
  import { isBlockInputBlobs, isBlockInputColumns } from "../chain/blocks/blockInput/blockInput.js";
7
7
  import { BlockInputSource } from "../chain/blocks/blockInput/types.js";
8
8
  import { PayloadError, PayloadErrorCode } from "../chain/blocks/importExecutionPayload.js";
@@ -13,11 +13,12 @@ import { validateGloasBlockDataColumnSidecars } from "../chain/validation/dataCo
13
13
  import { validateGossipExecutionPayloadEnvelope } from "../chain/validation/executionPayloadEnvelope.js";
14
14
  import { NetworkEvent, prettyPrintPeerIdStr } from "../network/index.js";
15
15
  import { MAX_PEERS_PER_ROOT } from "../network/processor/constants.js";
16
+ import { ClockEvent } from "../util/clock.js";
16
17
  import { shuffle } from "../util/shuffle.js";
17
18
  import { sortBy } from "../util/sortBy.js";
18
19
  import { wrapError } from "../util/wrapError.js";
19
20
  import { MAX_CONCURRENT_REQUESTS } from "./constants.js";
20
- import { DownloadResult, DroppedItemReason, FetchResult, PendingBlockInputStatus, PendingBlockType, PendingPayloadInputStatus, getBlockInputSyncCacheItemRootHex, getBlockInputSyncCacheItemSlot, getPayloadSyncCacheItemRootHex, getPayloadSyncCacheItemSlot, isPendingBlockInput, isPendingPayloadEnvelope, isPendingPayloadInput, } from "./types.js";
21
+ import { DeferredPayloadResult, DownloadResult, DroppedItemReason, FetchResult, PendingBlockInputStatus, PendingBlockType, PendingPayloadInputStatus, getBlockInputSyncCacheItemRootHex, getBlockInputSyncCacheItemSlot, getPayloadSyncCacheItemRootHex, getPayloadSyncCacheItemSlot, isPendingBlockInput, isPendingPayloadEnvelope, isPendingPayloadInput, } from "./types.js";
21
22
  import { DownloadByRootError, downloadByRoot } from "./utils/downloadByRoot.js";
22
23
  import { getAllDescendantBlocks, getUnknownAndAncestorBlocks } from "./utils/pendingBlocksTree.js";
23
24
  import { getRateLimitedUntilMs } from "./utils/rateLimit.js";
@@ -28,6 +29,10 @@ const MAX_PENDING_BLOCKS = 100;
28
29
  * A pending payload without slot can only stay at most 2 epochs.
29
30
  */
30
31
  const PRUNE_UNRESOLVED_SLOT_EPOCHS = 2;
32
+ /**
33
+ * Poll pending payloads of the current slot this often, between PAYLOAD_DUE and the end of the slot.
34
+ */
35
+ export const PAYLOAD_POLL_INTERVAL_MS = 1_000;
31
36
  class UnknownBlockRateLimitedError extends Error {
32
37
  constructor(message) {
33
38
  super(message);
@@ -84,6 +89,11 @@ export class BlockInputSync {
84
89
  subscribedToNetworkEvents = false;
85
90
  peerBalancer;
86
91
  rateLimitBackoffTimeout;
92
+ /**
93
+ * Search unknown payload starting at PAYLOAD_DUE_BPS.
94
+ */
95
+ deferredPayloadRoots = new Map();
96
+ payloadPollAbortController;
87
97
  constructor(config, network, chain, logger, metrics, opts) {
88
98
  this.config = config;
89
99
  this.network = network;
@@ -109,6 +119,7 @@ export class BlockInputSync {
109
119
  this.logger.verbose("BlockInputSync enabled.");
110
120
  this.chain.emitter.on(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
111
121
  this.chain.emitter.on(ChainEvent.unknownEnvelopeBlockRoot, this.onUnknownEnvelopeBlockRoot);
122
+ this.chain.emitter.on(ChainEvent.unknownEnvelopeBlockRootSlot, this.onUnknownEnvelopeBlockRootSlot);
112
123
  this.chain.emitter.on(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
113
124
  this.chain.emitter.on(ChainEvent.incompletePayloadEnvelope, this.onIncompletePayloadEnvelope);
114
125
  this.chain.emitter.on(ChainEvent.blockUnknownParent, this.onUnknownParent);
@@ -117,6 +128,7 @@ export class BlockInputSync {
117
128
  this.chain.emitter.on(routes.events.EventType.executionPayload, this.onPayloadImported);
118
129
  this.network.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
119
130
  this.network.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
131
+ this.chain.clock.on(ClockEvent.slot, this.startPayloadPollAtSlot);
120
132
  // Seed the balancer with peers that connected before we subscribed
121
133
  for (const peerId of this.network.getConnectedPeers()) {
122
134
  try {
@@ -127,13 +139,21 @@ export class BlockInputSync {
127
139
  }
128
140
  }
129
141
  this.subscribedToNetworkEvents = true;
142
+ // we subscribe mid-slot, and a root can be deferred at any point in the slot, so start this
143
+ // slot's loop now instead of waiting for the next ClockEvent.slot
144
+ this.startPayloadPollAtSlot(this.chain.clock.currentSlot);
130
145
  }
131
146
  }
132
147
  unsubscribeFromNetwork() {
133
148
  this.logger.verbose("BlockInputSync disabled.");
134
149
  this.clearRateLimitBackoffTimer();
150
+ this.chain.clock.off(ClockEvent.slot, this.startPayloadPollAtSlot);
151
+ this.payloadPollAbortController?.abort();
152
+ this.payloadPollAbortController = undefined;
153
+ this.deferredPayloadRoots.clear();
135
154
  this.chain.emitter.off(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
136
155
  this.chain.emitter.off(ChainEvent.unknownEnvelopeBlockRoot, this.onUnknownEnvelopeBlockRoot);
156
+ this.chain.emitter.off(ChainEvent.unknownEnvelopeBlockRootSlot, this.onUnknownEnvelopeBlockRootSlot);
137
157
  this.chain.emitter.off(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
138
158
  this.chain.emitter.off(ChainEvent.incompletePayloadEnvelope, this.onIncompletePayloadEnvelope);
139
159
  this.chain.emitter.off(ChainEvent.blockUnknownParent, this.onUnknownParent);
@@ -157,8 +177,11 @@ export class BlockInputSync {
157
177
  onUnknownBlockRoot = (data) => {
158
178
  try {
159
179
  const isNewRoot = this.addByRootHex(data.rootHex, data.peer);
160
- if (isNewRoot) {
180
+ // A retained entry (an earlier download failed, #10018) is not new but still needs a retry pass.
181
+ if (this.pendingBlocks.get(data.rootHex)?.status === PendingBlockInputStatus.pending) {
161
182
  this.triggerUnknownBlockSearch();
183
+ }
184
+ if (isNewRoot) {
162
185
  this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.UNKNOWN_BLOCK_ROOT });
163
186
  this.metrics?.blockInputSync.source.inc({ source: data.source });
164
187
  }
@@ -194,6 +217,33 @@ export class BlockInputSync {
194
217
  this.logger.debug("Error handling unknownEnvelopeBlockRoot event", {}, e);
195
218
  }
196
219
  };
220
+ onUnknownEnvelopeBlockRootSlot = (data) => {
221
+ try {
222
+ if (data.slot === this.chain.clock.currentSlot) {
223
+ // we receive the optimistic search, the poll loop searches it at PAYLOAD_DUE or on its next
224
+ // tick. If that loop already returned - every root it watched was imported - this root waits
225
+ // for the next slot, where startPayloadPollAtSlot moves it to pendingPayloads. That is not the normal
226
+ // scenario, and in a forking condition it only delays the search of the extra root
227
+ const deferred = this.deferredPayloadRoots.get(data.rootHex);
228
+ if (deferred === undefined) {
229
+ this.deferredPayloadRoots.set(data.rootHex, { slot: data.slot, source: data.source, peer: data.peer });
230
+ }
231
+ else if (deferred.peer === undefined) {
232
+ deferred.peer = data.peer;
233
+ }
234
+ return;
235
+ }
236
+ const isNewRoot = this.addByPayloadRootHex(data.rootHex, data.peer, data.slot);
237
+ if (isNewRoot) {
238
+ this.triggerUnknownBlockSearch();
239
+ this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.UNKNOWN_PAYLOAD_BLOCK_ROOT_SLOT });
240
+ this.metrics?.blockInputSync.payloadSource.inc({ source: data.source });
241
+ }
242
+ }
243
+ catch (e) {
244
+ this.logger.debug("Error handling unknownEnvelopeBlockRootSlot event", {}, e);
245
+ }
246
+ };
197
247
  onIncompletePayloadEnvelope = (data) => {
198
248
  try {
199
249
  this.addByPayloadInput(data.payloadInput, data.peer);
@@ -288,12 +338,21 @@ export class BlockInputSync {
288
338
  belowFinalizedPayloads++;
289
339
  }
290
340
  }
291
- let deletedBlocks = 0;
341
+ let belowFinalizedBlocks = 0;
342
+ let agedOutBlocks = 0;
292
343
  for (const [rootHex, block] of this.pendingBlocks) {
293
344
  const slot = getBlockInputSyncCacheItemSlot(block);
294
- if (typeof slot === "number" && slot < finalizedSlot) {
345
+ if (typeof slot !== "number") {
346
+ // we may not be able to download a root, hence there is no slot for it
347
+ if (nowSec - block.timeAddedSec > maxSecInCache) {
348
+ this.pendingBlocks.delete(rootHex);
349
+ agedOutBlocks++;
350
+ }
351
+ continue;
352
+ }
353
+ if (slot < finalizedSlot) {
295
354
  this.pendingBlocks.delete(rootHex);
296
- deletedBlocks++;
355
+ belowFinalizedBlocks++;
297
356
  }
298
357
  }
299
358
  if (belowFinalizedPayloads > 0) {
@@ -302,15 +361,19 @@ export class BlockInputSync {
302
361
  if (agedOutPayloads > 0) {
303
362
  this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.agedOut }, agedOutPayloads);
304
363
  }
305
- if (deletedBlocks > 0) {
306
- this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.belowFinalized }, deletedBlocks);
364
+ if (belowFinalizedBlocks > 0) {
365
+ this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.belowFinalized }, belowFinalizedBlocks);
366
+ }
367
+ if (agedOutBlocks > 0) {
368
+ this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.agedOut }, agedOutBlocks);
307
369
  }
308
- this.logger.debug("BlockInputSync.pruneFinalized dropped pre-finalized pending items", {
370
+ this.logger.debug("BlockInputSync.pruneFinalized dropped stale pending items", {
309
371
  finalizedSlot,
310
372
  finalizedRoot: checkpoint.rootHex,
311
373
  belowFinalizedPayloads,
312
374
  agedOutPayloads,
313
- deletedBlocks,
375
+ belowFinalizedBlocks,
376
+ agedOutBlocks,
314
377
  unresolvedSlotPayloads,
315
378
  });
316
379
  };
@@ -652,6 +715,115 @@ export class BlockInputSync {
652
715
  this.rateLimitBackoffTimeout = undefined;
653
716
  }
654
717
  }
718
+ /**
719
+ * Start this slot's payload poll: end the previous slot's loop, move roots it never got to
720
+ * into pendingPayloads, then poll from PAYLOAD_DUE to the end of the slot.
721
+ */
722
+ startPayloadPollAtSlot = (slot) => {
723
+ if (!isForkPostGloas(this.config.getForkName(slot))) {
724
+ return;
725
+ }
726
+ // end the previous slot's loop, wherever it is: its sleep is bound to this same controller
727
+ this.payloadPollAbortController?.abort();
728
+ this.payloadPollAbortController = new AbortController();
729
+ // entries from an earlier slot is not polled
730
+ for (const [rootHex, { slot: deferredSlot, source, peer }] of this.deferredPayloadRoots) {
731
+ if (deferredSlot < slot) {
732
+ if (!this.chain.forkChoice.hasPayloadHexUnsafe(rootHex)) {
733
+ this.addDeferredPayloadRoot(rootHex, deferredSlot, source, peer);
734
+ }
735
+ this.deferredPayloadRoots.delete(rootHex);
736
+ }
737
+ }
738
+ this.pollPayloadsAtSlot(slot, this.payloadPollAbortController.signal).catch((e) => {
739
+ if (!isErrorAborted(e)) {
740
+ this.logger.debug("Error polling payloads", { slot }, e);
741
+ }
742
+ });
743
+ };
744
+ /**
745
+ * Poll unknown payloads of the current slot.
746
+ */
747
+ async pollPayloadsAtSlot(slot, signal) {
748
+ // fixed tick count so the loop cannot outlive its slot: for mainnet, it's 6 ticks
749
+ const tickCount = Math.floor((this.config.SLOT_DURATION_MS - this.config.getPayloadDueMs()) / PAYLOAD_POLL_INTERVAL_MS);
750
+ // a root still missing on several ticks is searched on each of them, recorded once
751
+ const searchedRoots = new Set();
752
+ let polls = 0;
753
+ try {
754
+ await sleep(Math.max(0, this.config.getPayloadDueMs() - this.chain.clock.msFromSlot(slot)), signal);
755
+ for (polls = 0; polls < tickCount; polls++) {
756
+ let importedCount = 0;
757
+ for (const [rootHex, { slot: deferredSlot, source, peer }] of this.deferredPayloadRoots) {
758
+ if (this.chain.forkChoice.hasPayloadHexUnsafe(rootHex)) {
759
+ importedCount++;
760
+ continue;
761
+ }
762
+ // copy to the regular pendingPayloads so that we can search
763
+ this.addDeferredPayloadRoot(rootHex, deferredSlot, source, peer);
764
+ searchedRoots.add(rootHex);
765
+ }
766
+ // an empty deferredPayloadRoots means there is no optimistic search comes before PAYLOAD_DUE
767
+ // we have to poll until the payload of current slot is imported or slot end
768
+ if (this.deferredPayloadRoots.size > 0 && importedCount === this.deferredPayloadRoots.size) {
769
+ if (searchedRoots.size > 0) {
770
+ // the backup search was needed
771
+ this.metrics?.blockInputSync.deferredPayloadResult.inc({
772
+ result: DeferredPayloadResult.ImportedAfterSearch,
773
+ });
774
+ this.metrics?.blockInputSync.deferredPayloadPolls.observe(polls);
775
+ this.logger.verbose("Payload imported after unknown sync search", {
776
+ slot,
777
+ roots: Array.from(searchedRoots).join(","),
778
+ polls,
779
+ });
780
+ }
781
+ else {
782
+ // this happens most of the time on devnet
783
+ // gossip delivered everything before PAYLOAD_DUE
784
+ this.metrics?.blockInputSync.deferredPayloadResult.inc({
785
+ result: DeferredPayloadResult.ImportedBeforeSearch,
786
+ });
787
+ }
788
+ return;
789
+ }
790
+ this.triggerUnknownBlockSearch();
791
+ if (polls < tickCount - 1) {
792
+ // no sleep after the last tick: the loop would otherwise end right at the slot boundary,
793
+ // where startPayloadPollAtSlot aborts it
794
+ await sleep(PAYLOAD_POLL_INTERVAL_MS, signal);
795
+ }
796
+ }
797
+ // reaching here means the early return never fired
798
+ if (this.deferredPayloadRoots.size > 0) {
799
+ this.metrics?.blockInputSync.deferredPayloadResult.inc({ result: DeferredPayloadResult.Unresolved });
800
+ this.logger.debug("Deferred payloads still missing at end of slot", {
801
+ slot,
802
+ roots: Array.from(this.deferredPayloadRoots.keys()).join(","),
803
+ });
804
+ }
805
+ else {
806
+ // no optimistic search and no payload import ended the loop, eg a skipped slot
807
+ this.metrics?.blockInputSync.deferredPayloadResult.inc({ result: DeferredPayloadResult.ResolvedNoRoot });
808
+ this.logger.debug("No deferred payloads at slot", {
809
+ slot,
810
+ });
811
+ }
812
+ }
813
+ catch (e) {
814
+ if (!isErrorAborted(e)) {
815
+ throw e;
816
+ }
817
+ this.logger.verbose("Payload poll aborted", { slot, polls, msIntoSlot: this.chain.clock.msFromSlot(slot) });
818
+ }
819
+ }
820
+ addDeferredPayloadRoot(rootHex, slot, source, peer) {
821
+ const isNewRoot = this.addByPayloadRootHex(rootHex, peer, slot);
822
+ if (isNewRoot) {
823
+ this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.DEFERRED_PAYLOAD_BLOCK_ROOT });
824
+ this.metrics?.blockInputSync.payloadSource.inc({ source });
825
+ }
826
+ }
655
827
  async downloadBlock(block) {
656
828
  if (block.status !== PendingBlockInputStatus.pending) {
657
829
  return;
@@ -670,7 +842,12 @@ export class BlockInputSync {
670
842
  if (!res.err) {
671
843
  this.metrics?.blockInputSync.downloadedBlocksSuccess.inc();
672
844
  const pending = res.result;
673
- this.pendingBlocks.set(pending.blockInput.blockRootHex, pending);
845
+ // pruning may have deleted this entry while we were awaiting the network, do not resurrect it via the set below
846
+ if (!this.pendingBlocks.has(rootHex)) {
847
+ this.logger.verbose("Dropping downloaded block, entry pruned during fetch", logCtx);
848
+ return;
849
+ }
850
+ this.pendingBlocks.set(rootHex, pending);
674
851
  const blockSlot = pending.blockInput.slot;
675
852
  const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
676
853
  const delaySec = Date.now() / 1000 - computeTimeAtSlot(this.config, blockSlot, this.chain.genesisTime);
@@ -730,8 +907,11 @@ export class BlockInputSync {
730
907
  return;
731
908
  }
732
909
  this.metrics?.blockInputSync.downloadedBlocksError.inc();
733
- this.logger.debug("Ignoring unknown block root after many failed downloads", logCtx, res.err);
734
- this.removeAndDownScoreAllDescendants(block, DroppedItemReason.unavailable);
910
+ this.logger.debug("Failed to download unknown block root, retained for retry", logCtx, res.err);
911
+ const pendingBlock = this.pendingBlocks.get(rootHex);
912
+ if (pendingBlock && pendingBlock.status === PendingBlockInputStatus.fetching) {
913
+ pendingBlock.status = PendingBlockInputStatus.pending;
914
+ }
735
915
  }
736
916
  }
737
917
  /**
@@ -954,7 +1134,7 @@ export class BlockInputSync {
954
1134
  return;
955
1135
  }
956
1136
  this.metrics?.blockInputSync.downloadedPayloadsResult.inc({ result: DownloadResult.Failed });
957
- this.logger.debug("Ignoring unknown payload root after failed download", logCtx, res.err);
1137
+ this.logger.debug("Failed to download unknown payload root, retained for retry", logCtx, res.err);
958
1138
  if (!isPendingPayloadEnvelope(payload)) {
959
1139
  payload.status = PendingPayloadInputStatus.pending;
960
1140
  }
@@ -1322,7 +1502,11 @@ export class BlockInputSync {
1322
1502
  finally {
1323
1503
  this.peerBalancer.onRequestCompleted(peerId);
1324
1504
  }
1325
- this.pendingBlocks.set(getBlockInputSyncCacheItemRootHex(cacheItem), cacheItem);
1505
+ const cacheItemRootHex = getBlockInputSyncCacheItemRootHex(cacheItem);
1506
+ // pruning may have dropped it mid-fetch
1507
+ if (this.pendingBlocks.has(cacheItemRootHex)) {
1508
+ this.pendingBlocks.set(cacheItemRootHex, cacheItem);
1509
+ }
1326
1510
  if (cacheItem.status === PendingBlockInputStatus.downloaded) {
1327
1511
  // download was successful, no need to go with another peer, return
1328
1512
  const result = this.chain.forkChoice.hasBlockHex(cacheItem.blockInput.blockRootHex)