@lodestar/beacon-node 1.51.0-dev.c99cf49add → 1.51.0-dev.cda05d18f1

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 (645) hide show
  1. package/lib/api/impl/api.js +1 -1
  2. package/lib/api/impl/api.js.map +1 -1
  3. package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
  4. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/blocks/index.js +48 -95
  6. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  7. package/lib/api/impl/beacon/index.d.ts +2 -1
  8. package/lib/api/impl/beacon/index.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/index.js +2 -2
  10. package/lib/api/impl/beacon/index.js.map +1 -1
  11. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/pool/index.js +22 -2
  13. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  14. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  15. package/lib/api/impl/beacon/state/index.js +8 -2
  16. package/lib/api/impl/beacon/state/index.js.map +1 -1
  17. package/lib/api/impl/beacon/state/utils.d.ts +3 -2
  18. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  19. package/lib/api/impl/beacon/state/utils.js +17 -9
  20. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  21. package/lib/api/impl/debug/index.d.ts.map +1 -1
  22. package/lib/api/impl/debug/index.js +3 -0
  23. package/lib/api/impl/debug/index.js.map +1 -1
  24. package/lib/api/impl/validator/index.d.ts +6 -0
  25. package/lib/api/impl/validator/index.d.ts.map +1 -1
  26. package/lib/api/impl/validator/index.js +143 -35
  27. package/lib/api/impl/validator/index.js.map +1 -1
  28. package/lib/api/options.d.ts +2 -0
  29. package/lib/api/options.d.ts.map +1 -1
  30. package/lib/api/options.js +1 -0
  31. package/lib/api/options.js.map +1 -1
  32. package/lib/chain/ColumnReconstructionTracker.d.ts +11 -11
  33. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  34. package/lib/chain/ColumnReconstructionTracker.js +46 -40
  35. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  36. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  37. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  38. package/lib/chain/GetBlobsTracker.js +69 -35
  39. package/lib/chain/GetBlobsTracker.js.map +1 -1
  40. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  41. package/lib/chain/archiveStore/archiveStore.js +1 -0
  42. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  43. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  44. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  45. package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
  46. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  47. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  48. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  49. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  50. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  51. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  52. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  53. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  54. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  55. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  56. package/lib/chain/blocks/blockInput/types.js +0 -1
  57. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  58. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  59. package/lib/chain/blocks/importBlock.js +42 -57
  60. package/lib/chain/blocks/importBlock.js.map +1 -1
  61. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  62. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  63. package/lib/chain/blocks/importExecutionPayload.js +82 -20
  64. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  65. package/lib/chain/blocks/index.d.ts.map +1 -1
  66. package/lib/chain/blocks/index.js +4 -4
  67. package/lib/chain/blocks/index.js.map +1 -1
  68. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  69. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  70. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  71. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  72. package/lib/chain/blocks/types.d.ts +7 -19
  73. package/lib/chain/blocks/types.d.ts.map +1 -1
  74. package/lib/chain/blocks/types.js +5 -24
  75. package/lib/chain/blocks/types.js.map +1 -1
  76. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  77. package/lib/chain/blocks/verifyBlock.js +18 -7
  78. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  79. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  80. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  81. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  82. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  83. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  84. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  85. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  86. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  87. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  88. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  89. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  90. package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
  91. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  92. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  93. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  94. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  95. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  96. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  97. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  98. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  99. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  100. package/lib/chain/bls/interface.d.ts +2 -0
  101. package/lib/chain/bls/interface.d.ts.map +1 -1
  102. package/lib/chain/bls/multithread/index.d.ts +1 -1
  103. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  104. package/lib/chain/bls/multithread/index.js +50 -22
  105. package/lib/chain/bls/multithread/index.js.map +1 -1
  106. package/lib/chain/bls/multithread/types.d.ts +1 -1
  107. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  108. package/lib/chain/bls/multithread/worker.js +1 -1
  109. package/lib/chain/bls/multithread/worker.js.map +1 -1
  110. package/lib/chain/bls/singleThread.js +1 -1
  111. package/lib/chain/bls/singleThread.js.map +1 -1
  112. package/lib/chain/bls/utils.js +1 -1
  113. package/lib/chain/bls/utils.js.map +1 -1
  114. package/lib/chain/chain.d.ts +26 -4
  115. package/lib/chain/chain.d.ts.map +1 -1
  116. package/lib/chain/chain.js +128 -43
  117. package/lib/chain/chain.js.map +1 -1
  118. package/lib/chain/emitter.d.ts +7 -7
  119. package/lib/chain/emitter.d.ts.map +1 -1
  120. package/lib/chain/emitter.js +5 -5
  121. package/lib/chain/emitter.js.map +1 -1
  122. package/lib/chain/errors/blockError.d.ts +1 -1
  123. package/lib/chain/errors/blockError.d.ts.map +1 -1
  124. package/lib/chain/errors/blockError.js +1 -1
  125. package/lib/chain/errors/blockError.js.map +1 -1
  126. package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
  127. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  128. package/lib/chain/errors/executionPayloadBid.js +2 -0
  129. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  130. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  131. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  132. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  133. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  134. package/lib/chain/errors/inclusionList.d.ts +60 -0
  135. package/lib/chain/errors/inclusionList.d.ts.map +1 -0
  136. package/lib/chain/errors/inclusionList.js +19 -0
  137. package/lib/chain/errors/inclusionList.js.map +1 -0
  138. package/lib/chain/errors/index.d.ts +1 -1
  139. package/lib/chain/errors/index.d.ts.map +1 -1
  140. package/lib/chain/errors/index.js +1 -1
  141. package/lib/chain/errors/index.js.map +1 -1
  142. package/lib/chain/forkChoice/index.d.ts +11 -1
  143. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  144. package/lib/chain/forkChoice/index.js +11 -0
  145. package/lib/chain/forkChoice/index.js.map +1 -1
  146. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  147. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  148. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  149. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  150. package/lib/chain/interface.d.ts +10 -7
  151. package/lib/chain/interface.d.ts.map +1 -1
  152. package/lib/chain/interface.js.map +1 -1
  153. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  154. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  155. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  156. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  157. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  158. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  159. package/lib/chain/opPools/attestationPool.js +15 -4
  160. package/lib/chain/opPools/attestationPool.js.map +1 -1
  161. package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
  162. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
  163. package/lib/chain/opPools/inclusionListStore.js +171 -0
  164. package/lib/chain/opPools/inclusionListStore.js.map +1 -0
  165. package/lib/chain/opPools/index.d.ts +2 -0
  166. package/lib/chain/opPools/index.d.ts.map +1 -1
  167. package/lib/chain/opPools/index.js +2 -0
  168. package/lib/chain/opPools/index.js.map +1 -1
  169. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  170. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  171. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  172. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  173. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  174. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  175. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  176. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  177. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  178. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  179. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  180. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  181. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  182. package/lib/chain/opPools/utils.d.ts +1 -1
  183. package/lib/chain/opPools/utils.d.ts.map +1 -1
  184. package/lib/chain/opPools/utils.js +1 -1
  185. package/lib/chain/opPools/utils.js.map +1 -1
  186. package/lib/chain/options.d.ts +5 -3
  187. package/lib/chain/options.d.ts.map +1 -1
  188. package/lib/chain/options.js +0 -1
  189. package/lib/chain/options.js.map +1 -1
  190. package/lib/chain/produceBlock/produceBlockBody.d.ts +6 -3
  191. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  192. package/lib/chain/produceBlock/produceBlockBody.js +32 -11
  193. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  194. package/lib/chain/proposerTracker.d.ts +31 -0
  195. package/lib/chain/proposerTracker.d.ts.map +1 -0
  196. package/lib/chain/proposerTracker.js +75 -0
  197. package/lib/chain/proposerTracker.js.map +1 -0
  198. package/lib/chain/regen/interface.d.ts +2 -2
  199. package/lib/chain/regen/interface.d.ts.map +1 -1
  200. package/lib/chain/regen/interface.js +1 -1
  201. package/lib/chain/regen/interface.js.map +1 -1
  202. package/lib/chain/regen/queued.d.ts +1 -1
  203. package/lib/chain/regen/queued.d.ts.map +1 -1
  204. package/lib/chain/regen/queued.js +5 -3
  205. package/lib/chain/regen/queued.js.map +1 -1
  206. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  207. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  208. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  209. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  210. package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
  211. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  212. package/lib/chain/validation/executionPayloadBid.js +37 -158
  213. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  214. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  215. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  216. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  217. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  218. package/lib/chain/validation/inclusionList.d.ts +14 -0
  219. package/lib/chain/validation/inclusionList.d.ts.map +1 -0
  220. package/lib/chain/validation/inclusionList.js +150 -0
  221. package/lib/chain/validation/inclusionList.js.map +1 -0
  222. package/lib/chain/validation/index.d.ts +1 -0
  223. package/lib/chain/validation/index.d.ts.map +1 -1
  224. package/lib/chain/validation/index.js +1 -0
  225. package/lib/chain/validation/index.js.map +1 -1
  226. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  227. package/lib/chain/validation/syncCommittee.js +16 -10
  228. package/lib/chain/validation/syncCommittee.js.map +1 -1
  229. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  230. package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
  231. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  232. package/lib/chain/validatorMonitor.d.ts +1 -2
  233. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  234. package/lib/chain/validatorMonitor.js +0 -3
  235. package/lib/chain/validatorMonitor.js.map +1 -1
  236. package/lib/db/beacon.d.ts +7 -0
  237. package/lib/db/beacon.d.ts.map +1 -1
  238. package/lib/db/beacon.js +34 -0
  239. package/lib/db/beacon.js.map +1 -1
  240. package/lib/db/dataColumnStore.d.ts +1 -1
  241. package/lib/db/dataColumnStore.d.ts.map +1 -1
  242. package/lib/db/dataColumnStore.js +1 -4
  243. package/lib/db/dataColumnStore.js.map +1 -1
  244. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  245. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  246. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  247. package/lib/db/flatFileStore/slotIndex.js +2 -2
  248. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  249. package/lib/db/interface.d.ts +1 -0
  250. package/lib/db/interface.d.ts.map +1 -1
  251. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  252. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  253. package/lib/db/repositories/blobSidecars.js +0 -1
  254. package/lib/db/repositories/blobSidecars.js.map +1 -1
  255. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  256. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  257. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  258. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  259. package/lib/execution/builder/apiClient.d.ts +14 -8
  260. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  261. package/lib/execution/builder/apiClient.js +12 -10
  262. package/lib/execution/builder/apiClient.js.map +1 -1
  263. package/lib/execution/builder/http.d.ts +2 -0
  264. package/lib/execution/builder/http.d.ts.map +1 -1
  265. package/lib/execution/builder/http.js +2 -0
  266. package/lib/execution/builder/http.js.map +1 -1
  267. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  268. package/lib/execution/builder/validateBid.js +14 -1
  269. package/lib/execution/builder/validateBid.js.map +1 -1
  270. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  271. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  272. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  273. package/lib/execution/engine/disabled.d.ts +1 -0
  274. package/lib/execution/engine/disabled.d.ts.map +1 -1
  275. package/lib/execution/engine/disabled.js +3 -0
  276. package/lib/execution/engine/disabled.js.map +1 -1
  277. package/lib/execution/engine/http.d.ts +12 -8
  278. package/lib/execution/engine/http.d.ts.map +1 -1
  279. package/lib/execution/engine/http.js +35 -14
  280. package/lib/execution/engine/http.js.map +1 -1
  281. package/lib/execution/engine/index.d.ts +1 -1
  282. package/lib/execution/engine/index.d.ts.map +1 -1
  283. package/lib/execution/engine/index.js +1 -1
  284. package/lib/execution/engine/index.js.map +1 -1
  285. package/lib/execution/engine/interface.d.ts +29 -8
  286. package/lib/execution/engine/interface.d.ts.map +1 -1
  287. package/lib/execution/engine/interface.js.map +1 -1
  288. package/lib/execution/engine/jsonRpcTransport.d.ts +5 -6
  289. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  290. package/lib/execution/engine/jsonRpcTransport.js +34 -20
  291. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  292. package/lib/execution/engine/mock.d.ts +1 -1
  293. package/lib/execution/engine/mock.d.ts.map +1 -1
  294. package/lib/execution/engine/mock.js +31 -11
  295. package/lib/execution/engine/mock.js.map +1 -1
  296. package/lib/execution/engine/payloadIdCache.d.ts +5 -3
  297. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  298. package/lib/execution/engine/payloadIdCache.js +15 -4
  299. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  300. package/lib/execution/engine/restTransport.d.ts +4 -5
  301. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  302. package/lib/execution/engine/restTransport.js +4 -15
  303. package/lib/execution/engine/restTransport.js.map +1 -1
  304. package/lib/execution/engine/sszTypes.d.ts +38 -47
  305. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  306. package/lib/execution/engine/sszTypes.js +0 -5
  307. package/lib/execution/engine/sszTypes.js.map +1 -1
  308. package/lib/execution/engine/transport.d.ts +4 -14
  309. package/lib/execution/engine/transport.d.ts.map +1 -1
  310. package/lib/execution/engine/types.d.ts +25 -9
  311. package/lib/execution/engine/types.d.ts.map +1 -1
  312. package/lib/execution/engine/types.js +19 -14
  313. package/lib/execution/engine/types.js.map +1 -1
  314. package/lib/execution/engine/utils.d.ts.map +1 -1
  315. package/lib/execution/engine/utils.js +3 -2
  316. package/lib/execution/engine/utils.js.map +1 -1
  317. package/lib/index.d.ts +1 -0
  318. package/lib/index.d.ts.map +1 -1
  319. package/lib/index.js +2 -0
  320. package/lib/index.js.map +1 -1
  321. package/lib/metrics/metrics/beacon.d.ts +16 -9
  322. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  323. package/lib/metrics/metrics/beacon.js +35 -30
  324. package/lib/metrics/metrics/beacon.js.map +1 -1
  325. package/lib/metrics/metrics/lodestar.d.ts +49 -8
  326. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  327. package/lib/metrics/metrics/lodestar.js +128 -18
  328. package/lib/metrics/metrics/lodestar.js.map +1 -1
  329. package/lib/metrics/server/http.js +5 -5
  330. package/lib/metrics/server/http.js.map +1 -1
  331. package/lib/monitoring/service.js +1 -1
  332. package/lib/monitoring/service.js.map +1 -1
  333. package/lib/network/core/networkCore.d.ts +4 -1
  334. package/lib/network/core/networkCore.d.ts.map +1 -1
  335. package/lib/network/core/networkCore.js +7 -0
  336. package/lib/network/core/networkCore.js.map +1 -1
  337. package/lib/network/core/networkCoreWorker.js +2 -0
  338. package/lib/network/core/networkCoreWorker.js.map +1 -1
  339. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  340. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  341. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  342. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  343. package/lib/network/core/types.d.ts +6 -1
  344. package/lib/network/core/types.d.ts.map +1 -1
  345. package/lib/network/gossip/gossipsub.d.ts +1 -0
  346. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  347. package/lib/network/gossip/gossipsub.js +10 -0
  348. package/lib/network/gossip/gossipsub.js.map +1 -1
  349. package/lib/network/gossip/interface.d.ts +8 -9
  350. package/lib/network/gossip/interface.d.ts.map +1 -1
  351. package/lib/network/gossip/interface.js +1 -1
  352. package/lib/network/gossip/interface.js.map +1 -1
  353. package/lib/network/gossip/topic.d.ts +13 -21
  354. package/lib/network/gossip/topic.d.ts.map +1 -1
  355. package/lib/network/gossip/topic.js +13 -24
  356. package/lib/network/gossip/topic.js.map +1 -1
  357. package/lib/network/interface.d.ts +5 -5
  358. package/lib/network/interface.d.ts.map +1 -1
  359. package/lib/network/libp2p/index.d.ts.map +1 -1
  360. package/lib/network/libp2p/index.js +5 -1
  361. package/lib/network/libp2p/index.js.map +1 -1
  362. package/lib/network/network.d.ts +9 -7
  363. package/lib/network/network.d.ts.map +1 -1
  364. package/lib/network/network.js +58 -35
  365. package/lib/network/network.js.map +1 -1
  366. package/lib/network/options.d.ts +2 -0
  367. package/lib/network/options.d.ts.map +1 -1
  368. package/lib/network/options.js +2 -0
  369. package/lib/network/options.js.map +1 -1
  370. package/lib/network/peers/peerManager.d.ts +2 -1
  371. package/lib/network/peers/peerManager.d.ts.map +1 -1
  372. package/lib/network/peers/peerManager.js +28 -1
  373. package/lib/network/peers/peerManager.js.map +1 -1
  374. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  375. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  376. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  377. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  378. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
  379. package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
  380. package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
  381. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  382. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  383. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  384. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  385. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  386. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  387. package/lib/network/peers/utils/subnetMap.js +6 -3
  388. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  389. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  390. package/lib/network/processor/extractSlotRootFns.js +1 -8
  391. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  392. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  393. package/lib/network/processor/gossipHandlers.js +118 -149
  394. package/lib/network/processor/gossipHandlers.js.map +1 -1
  395. package/lib/network/processor/gossipQueues/index.js +6 -6
  396. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  397. package/lib/network/processor/gossipValidatorFn.js +5 -5
  398. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  399. package/lib/network/processor/index.d.ts +11 -0
  400. package/lib/network/processor/index.d.ts.map +1 -1
  401. package/lib/network/processor/index.js +66 -30
  402. package/lib/network/processor/index.js.map +1 -1
  403. package/lib/network/reqresp/ReqRespBeaconNode.js +6 -3
  404. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  405. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  406. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  407. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
  408. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
  409. package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
  410. package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
  411. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  412. package/lib/network/reqresp/handlers/index.js +6 -12
  413. package/lib/network/reqresp/handlers/index.js.map +1 -1
  414. package/lib/network/reqresp/protocols.d.ts +1 -2
  415. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  416. package/lib/network/reqresp/protocols.js +5 -10
  417. package/lib/network/reqresp/protocols.js.map +1 -1
  418. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  419. package/lib/network/reqresp/rateLimit.js +5 -17
  420. package/lib/network/reqresp/rateLimit.js.map +1 -1
  421. package/lib/network/reqresp/types.d.ts +6 -9
  422. package/lib/network/reqresp/types.d.ts.map +1 -1
  423. package/lib/network/reqresp/types.js +4 -7
  424. package/lib/network/reqresp/types.js.map +1 -1
  425. package/lib/network/subnets/attnetsService.d.ts +35 -5
  426. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  427. package/lib/network/subnets/attnetsService.js +84 -6
  428. package/lib/network/subnets/attnetsService.js.map +1 -1
  429. package/lib/network/subnets/interface.d.ts +7 -0
  430. package/lib/network/subnets/interface.d.ts.map +1 -1
  431. package/lib/network/subnets/interface.js.map +1 -1
  432. package/lib/node/nodejs.d.ts +3 -1
  433. package/lib/node/nodejs.d.ts.map +1 -1
  434. package/lib/node/nodejs.js +47 -21
  435. package/lib/node/nodejs.js.map +1 -1
  436. package/lib/node/options.d.ts +3 -1
  437. package/lib/node/options.d.ts.map +1 -1
  438. package/lib/node/options.js +4 -2
  439. package/lib/node/options.js.map +1 -1
  440. package/lib/sync/interface.d.ts.map +1 -1
  441. package/lib/sync/interface.js.map +1 -1
  442. package/lib/sync/range/batch.d.ts +2 -3
  443. package/lib/sync/range/batch.d.ts.map +1 -1
  444. package/lib/sync/range/batch.js +9 -22
  445. package/lib/sync/range/batch.js.map +1 -1
  446. package/lib/sync/range/chain.d.ts.map +1 -1
  447. package/lib/sync/range/chain.js +2 -15
  448. package/lib/sync/range/chain.js.map +1 -1
  449. package/lib/sync/sync.d.ts +15 -0
  450. package/lib/sync/sync.d.ts.map +1 -1
  451. package/lib/sync/sync.js +103 -25
  452. package/lib/sync/sync.js.map +1 -1
  453. package/lib/sync/unknownBlock.d.ts.map +1 -1
  454. package/lib/sync/unknownBlock.js +43 -25
  455. package/lib/sync/unknownBlock.js.map +1 -1
  456. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  457. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  458. package/lib/sync/utils/downloadByRange.js +24 -128
  459. package/lib/sync/utils/downloadByRange.js.map +1 -1
  460. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  461. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  462. package/lib/sync/utils/downloadByRoot.js +14 -99
  463. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  464. package/lib/util/blobs.d.ts +1 -7
  465. package/lib/util/blobs.d.ts.map +1 -1
  466. package/lib/util/blobs.js +0 -19
  467. package/lib/util/blobs.js.map +1 -1
  468. package/lib/util/execution.d.ts +3 -4
  469. package/lib/util/execution.d.ts.map +1 -1
  470. package/lib/util/execution.js +1 -73
  471. package/lib/util/execution.js.map +1 -1
  472. package/lib/util/file.d.ts.map +1 -1
  473. package/lib/util/file.js +8 -9
  474. package/lib/util/file.js.map +1 -1
  475. package/lib/util/queue/itemQueue.js +1 -1
  476. package/lib/util/queue/itemQueue.js.map +1 -1
  477. package/lib/util/sszBytes.d.ts +5 -1
  478. package/lib/util/sszBytes.d.ts.map +1 -1
  479. package/lib/util/sszBytes.js +36 -19
  480. package/lib/util/sszBytes.js.map +1 -1
  481. package/lib/util/types.d.ts +0 -5
  482. package/lib/util/types.d.ts.map +1 -1
  483. package/lib/util/types.js +1 -2
  484. package/lib/util/types.js.map +1 -1
  485. package/package.json +31 -32
  486. package/src/api/impl/api.ts +1 -1
  487. package/src/api/impl/beacon/blocks/index.ts +81 -126
  488. package/src/api/impl/beacon/index.ts +3 -1
  489. package/src/api/impl/beacon/pool/index.ts +31 -1
  490. package/src/api/impl/beacon/state/index.ts +10 -1
  491. package/src/api/impl/beacon/state/utils.ts +20 -10
  492. package/src/api/impl/debug/index.ts +4 -0
  493. package/src/api/impl/validator/index.ts +178 -39
  494. package/src/api/options.ts +3 -0
  495. package/src/chain/ColumnReconstructionTracker.ts +60 -41
  496. package/src/chain/GetBlobsTracker.ts +82 -52
  497. package/src/chain/archiveStore/archiveStore.ts +1 -0
  498. package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
  499. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  500. package/src/chain/blocks/blockInput/errors.ts +1 -2
  501. package/src/chain/blocks/blockInput/types.ts +2 -20
  502. package/src/chain/blocks/importBlock.ts +58 -77
  503. package/src/chain/blocks/importExecutionPayload.ts +123 -36
  504. package/src/chain/blocks/index.ts +11 -4
  505. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  506. package/src/chain/blocks/types.ts +8 -29
  507. package/src/chain/blocks/verifyBlock.ts +31 -16
  508. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  509. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  510. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  511. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
  512. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  513. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  514. package/src/chain/bls/interface.ts +2 -0
  515. package/src/chain/bls/multithread/index.ts +48 -24
  516. package/src/chain/bls/multithread/types.ts +1 -1
  517. package/src/chain/bls/multithread/worker.ts +1 -5
  518. package/src/chain/bls/singleThread.ts +1 -1
  519. package/src/chain/bls/utils.ts +1 -1
  520. package/src/chain/chain.ts +145 -42
  521. package/src/chain/emitter.ts +8 -8
  522. package/src/chain/errors/blockError.ts +1 -1
  523. package/src/chain/errors/executionPayloadBid.ts +12 -0
  524. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  525. package/src/chain/errors/inclusionList.ts +38 -0
  526. package/src/chain/errors/index.ts +1 -1
  527. package/src/chain/forkChoice/index.ts +11 -0
  528. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  529. package/src/chain/interface.ts +11 -6
  530. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  531. package/src/chain/opPools/attestationPool.ts +16 -4
  532. package/src/chain/opPools/inclusionListStore.ts +208 -0
  533. package/src/chain/opPools/index.ts +2 -0
  534. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  535. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  536. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  537. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  538. package/src/chain/opPools/utils.ts +1 -1
  539. package/src/chain/options.ts +5 -4
  540. package/src/chain/produceBlock/produceBlockBody.ts +67 -22
  541. package/src/chain/proposerTracker.ts +94 -0
  542. package/src/chain/regen/interface.ts +2 -2
  543. package/src/chain/regen/queued.ts +6 -4
  544. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  545. package/src/chain/validation/executionPayloadBid.ts +54 -183
  546. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  547. package/src/chain/validation/inclusionList.ts +192 -0
  548. package/src/chain/validation/index.ts +1 -0
  549. package/src/chain/validation/syncCommittee.ts +31 -15
  550. package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
  551. package/src/chain/validatorMonitor.ts +0 -6
  552. package/src/db/beacon.ts +44 -0
  553. package/src/db/dataColumnStore.ts +2 -4
  554. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  555. package/src/db/flatFileStore/slotIndex.ts +4 -3
  556. package/src/db/interface.ts +2 -0
  557. package/src/db/repositories/blobSidecars.ts +0 -1
  558. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  559. package/src/execution/builder/apiClient.ts +16 -13
  560. package/src/execution/builder/http.ts +4 -0
  561. package/src/execution/builder/validateBid.ts +23 -2
  562. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  563. package/src/execution/engine/disabled.ts +4 -0
  564. package/src/execution/engine/http.ts +59 -47
  565. package/src/execution/engine/index.ts +1 -1
  566. package/src/execution/engine/interface.ts +46 -13
  567. package/src/execution/engine/jsonRpcTransport.ts +56 -31
  568. package/src/execution/engine/mock.ts +32 -14
  569. package/src/execution/engine/payloadIdCache.ts +24 -6
  570. package/src/execution/engine/restTransport.ts +18 -23
  571. package/src/execution/engine/sszTypes.ts +0 -9
  572. package/src/execution/engine/transport.ts +13 -17
  573. package/src/execution/engine/types.ts +44 -24
  574. package/src/execution/engine/utils.ts +4 -2
  575. package/src/index.ts +2 -0
  576. package/src/metrics/metrics/beacon.ts +37 -30
  577. package/src/metrics/metrics/lodestar.ts +131 -18
  578. package/src/metrics/server/http.ts +5 -5
  579. package/src/monitoring/service.ts +1 -1
  580. package/src/network/core/networkCore.ts +11 -1
  581. package/src/network/core/networkCoreWorker.ts +2 -0
  582. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  583. package/src/network/core/types.ts +6 -1
  584. package/src/network/gossip/gossipsub.ts +11 -0
  585. package/src/network/gossip/interface.ts +5 -5
  586. package/src/network/gossip/topic.ts +14 -25
  587. package/src/network/interface.ts +4 -5
  588. package/src/network/libp2p/index.ts +5 -1
  589. package/src/network/network.ts +66 -58
  590. package/src/network/options.ts +4 -0
  591. package/src/network/peers/peerManager.ts +28 -3
  592. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  593. package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
  594. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  595. package/src/network/peers/utils/subnetMap.ts +6 -3
  596. package/src/network/processor/extractSlotRootFns.ts +0 -9
  597. package/src/network/processor/gossipHandlers.ts +150 -183
  598. package/src/network/processor/gossipQueues/index.ts +6 -6
  599. package/src/network/processor/gossipValidatorFn.ts +5 -5
  600. package/src/network/processor/index.ts +58 -28
  601. package/src/network/processor/types.ts +1 -1
  602. package/src/network/reqresp/ReqRespBeaconNode.ts +7 -7
  603. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  604. package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
  605. package/src/network/reqresp/handlers/index.ts +5 -17
  606. package/src/network/reqresp/protocols.ts +6 -12
  607. package/src/network/reqresp/rateLimit.ts +5 -17
  608. package/src/network/reqresp/types.ts +6 -13
  609. package/src/network/subnets/attnetsService.ts +94 -6
  610. package/src/network/subnets/interface.ts +7 -0
  611. package/src/node/nodejs.ts +58 -22
  612. package/src/node/options.ts +9 -6
  613. package/src/sync/interface.ts +1 -0
  614. package/src/sync/range/batch.ts +9 -21
  615. package/src/sync/range/chain.ts +2 -14
  616. package/src/sync/sync.ts +108 -26
  617. package/src/sync/unknownBlock.ts +48 -36
  618. package/src/sync/utils/downloadByRange.ts +31 -230
  619. package/src/sync/utils/downloadByRoot.ts +15 -142
  620. package/src/util/blobs.ts +0 -34
  621. package/src/util/execution.ts +8 -102
  622. package/src/util/file.ts +8 -9
  623. package/src/util/queue/itemQueue.ts +1 -1
  624. package/src/util/sszBytes.ts +42 -24
  625. package/src/util/types.ts +1 -8
  626. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  627. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  628. package/lib/chain/errors/blobSidecarError.js +0 -38
  629. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  630. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  631. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  632. package/lib/chain/validation/blobSidecar.js +0 -276
  633. package/lib/chain/validation/blobSidecar.js.map +0 -1
  634. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  635. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  636. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  637. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  638. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  639. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  640. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  641. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  642. package/src/chain/errors/blobSidecarError.ts +0 -70
  643. package/src/chain/validation/blobSidecar.ts +0 -357
  644. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  645. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
package/src/sync/sync.ts CHANGED
@@ -1,13 +1,17 @@
1
1
  import {SLOTS_PER_EPOCH} from "@lodestar/params";
2
- import {Slot} from "@lodestar/types";
2
+ import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
3
+ import {Slot, Status} from "@lodestar/types";
3
4
  import {Logger, toRootHex} from "@lodestar/utils";
4
5
  import {IBeaconChain} from "../chain/index.js";
5
- import {GENESIS_SLOT} from "../constants/constants.js";
6
+ import {GENESIS_EPOCH, GENESIS_SLOT} from "../constants/constants.js";
7
+ import {GoodByeReasonCode} from "../constants/index.js";
8
+ import {IBeaconDb} from "../db/index.js";
6
9
  import {ExecutionEngineState} from "../execution/index.js";
7
10
  import {Metrics} from "../metrics/index.js";
8
- import {INetwork, NetworkEvent, NetworkEventData} from "../network/index.js";
11
+ import {INetwork, NetworkEvent, NetworkEventData, PeerAction} from "../network/index.js";
9
12
  import {ClockEvent} from "../util/clock.js";
10
13
  import {isOptimisticBlock} from "../util/forkChoice.js";
14
+ import {PeerIdStr} from "../util/peerId.js";
11
15
  import {MIN_EPOCH_TO_START_GOSSIP} from "./constants.js";
12
16
  import {IBeaconSync, SyncChainDebugState, SyncModules, SyncState, SyncingStatus, syncStateMetric} from "./interface.js";
13
17
  import {SyncOptions} from "./options.js";
@@ -19,6 +23,7 @@ export class BeaconSync implements IBeaconSync {
19
23
  private readonly logger: Logger;
20
24
  private readonly network: INetwork;
21
25
  private readonly chain: IBeaconChain;
26
+ private readonly db: IBeaconDb;
22
27
  private readonly metrics: Metrics | null;
23
28
  private readonly opts: SyncOptions;
24
29
 
@@ -28,12 +33,15 @@ export class BeaconSync implements IBeaconSync {
28
33
  /** For metrics only */
29
34
  private readonly peerSyncType = new Map<string, PeerSyncType>();
30
35
  private readonly slotImportTolerance: Slot;
36
+ /** The requested subscription state, set while a change is being applied */
37
+ private pendingGossipSubscribed: boolean | undefined;
31
38
 
32
39
  constructor(opts: SyncOptions, modules: SyncModules) {
33
- const {config, chain, metrics, network, logger} = modules;
40
+ const {config, chain, db, metrics, network, logger} = modules;
34
41
  this.opts = opts;
35
42
  this.network = network;
36
43
  this.chain = chain;
44
+ this.db = db;
37
45
  this.metrics = metrics;
38
46
  this.logger = logger;
39
47
  this.rangeSync = new RangeSync(modules, opts);
@@ -83,6 +91,7 @@ export class BeaconSync implements IBeaconSync {
83
91
  }
84
92
 
85
93
  close(): void {
94
+ this.pendingGossipSubscribed = undefined;
86
95
  this.network.events.off(NetworkEvent.peerConnected, this.addPeer);
87
96
  this.network.events.off(NetworkEvent.peerDisconnected, this.removePeer);
88
97
  this.chain.clock.off(ClockEvent.epoch, this.onClockEpoch);
@@ -192,6 +201,11 @@ export class BeaconSync implements IBeaconSync {
192
201
  */
193
202
  private addPeer = (data: NetworkEventData[NetworkEvent.peerConnected]): void => {
194
203
  const localStatus = this.chain.getStatus();
204
+ // Genesis and equal finalized epochs are already checked by assertPeerRelevance in the network worker
205
+ if (data.status.finalizedEpoch > GENESIS_EPOCH && data.status.finalizedEpoch < localStatus.finalizedEpoch) {
206
+ void this.verifyPastFinalizedCheckpoint(data.peer, data.status);
207
+ }
208
+
195
209
  const syncType = getPeerSyncType(localStatus, data.status, this.chain.forkChoice, this.slotImportTolerance);
196
210
  this.logger.verbose("Peer sync type classified", {
197
211
  peer: data.peer,
@@ -216,6 +230,56 @@ export class BeaconSync implements IBeaconSync {
216
230
  this.updateSyncState();
217
231
  };
218
232
 
233
+ /**
234
+ * A behind peer's finalized checkpoint must be the canonical block in effect at the start slot of its epoch
235
+ */
236
+ async verifyPastFinalizedCheckpoint(peer: PeerIdStr, remote: Status): Promise<void> {
237
+ const startSlot = computeStartSlotAtEpoch(remote.finalizedEpoch);
238
+ const root = toRootHex(remote.finalizedRoot);
239
+ try {
240
+ let reason: string | null = null;
241
+ // After a finality jump, finalized blocks stay in fork choice until the archiver migrates them.
242
+ // Fork choice is pruned only after archiving, so a miss here means the db already has this range.
243
+ const canonicalBlock = this.chain.forkChoice.getCanonicalBlockClosestLteSlot(startSlot);
244
+ if (canonicalBlock !== null) {
245
+ if (canonicalBlock.blockRoot === root) return;
246
+ reason = "finalized_root_not_canonical";
247
+ } else {
248
+ const slot = await this.db.blockArchive.getSlotByRoot(remote.finalizedRoot);
249
+ if (slot !== null && slot > startSlot) {
250
+ reason = "finalized_root_after_epoch_start";
251
+ } else if (slot !== startSlot) {
252
+ const childSlot = await this.db.blockArchive.getSlotByParentRoot(remote.finalizedRoot);
253
+ if (childSlot !== null) {
254
+ if (childSlot <= startSlot) reason = "finalized_root_not_in_effect_at_epoch_start";
255
+ } else if (slot === null && startSlot > this.chain.earliestAvailableSlot) {
256
+ // childSlot == null too, neither the root nor a child is canonical
257
+ // or they are canonical and both pruned but peer's finalized epoch starts after earliestAvailableSlot
258
+ reason = "unknown_finalized_root";
259
+ }
260
+ }
261
+ }
262
+
263
+ if (reason !== null) {
264
+ this.logger.debug("Peer finalized checkpoint not in our chain", {
265
+ peer,
266
+ finalizedEpoch: remote.finalizedEpoch,
267
+ root,
268
+ reason,
269
+ });
270
+ this.metrics?.syncPeerFinalizedCheckpointMismatch.inc({reason});
271
+ this.network.reportPeer(peer, PeerAction.Fatal, "PeerFinalizedCheckpointMismatch");
272
+ await this.network.goodbyeAndDisconnect(peer, GoodByeReasonCode.IRRELEVANT_NETWORK);
273
+ }
274
+ } catch (e) {
275
+ this.logger.debug(
276
+ "Error verifying peer finalized checkpoint",
277
+ {peer, finalizedEpoch: remote.finalizedEpoch, root},
278
+ e as Error
279
+ );
280
+ }
281
+ }
282
+
219
283
  /**
220
284
  * Must be called by libp2p when a peer is removed from the peer manager
221
285
  */
@@ -235,17 +299,7 @@ export class BeaconSync implements IBeaconSync {
235
299
  if (state === SyncState.Synced && this.chain.clock.currentEpoch >= MIN_EPOCH_TO_START_GOSSIP) {
236
300
  this.chain.forkChoice.resumeFastConfirmation();
237
301
 
238
- if (!this.network.isSubscribedToGossipCoreTopics()) {
239
- this.network
240
- .subscribeGossipCoreTopics()
241
- .then(() => {
242
- this.metrics?.syncSwitchGossipSubscriptions.inc({action: "subscribed"});
243
- this.logger.info("Subscribed gossip core topics");
244
- })
245
- .catch((e) => {
246
- this.logger.error("Error subscribing to gossip core topics", {}, e);
247
- });
248
- }
302
+ this.setGossipSubscription(true);
249
303
 
250
304
  // also start searching for unknown blocks
251
305
  if (!this.unknownBlockSync.isSubscribedToNetwork()) {
@@ -261,17 +315,8 @@ export class BeaconSync implements IBeaconSync {
261
315
  // Same debounce as gossip: transient blips keep the rule running, only a real gap pauses it
262
316
  this.chain.forkChoice.pauseFastConfirmation();
263
317
 
264
- if (this.network.isSubscribedToGossipCoreTopics()) {
265
- this.logger.warn(`Node sync has fallen behind by ${syncDiff} slots`);
266
- this.network
267
- .unsubscribeGossipCoreTopics()
268
- .then(() => {
269
- this.metrics?.syncSwitchGossipSubscriptions.inc({action: "unsubscribed"});
270
- this.logger.info("Un-subscribed gossip core topics");
271
- })
272
- .catch((e) => {
273
- this.logger.error("Error unsubscribing to gossip core topics", {}, e);
274
- });
318
+ if (this.setGossipSubscription(false)) {
319
+ this.logger.warn("Node sync has fallen behind", {slots: syncDiff});
275
320
  }
276
321
 
277
322
  // also stop searching for unknown blocks
@@ -283,6 +328,43 @@ export class BeaconSync implements IBeaconSync {
283
328
  }
284
329
  };
285
330
 
331
+ private setGossipSubscription(subscribe: boolean): boolean {
332
+ if ((this.pendingGossipSubscribed ?? this.network.isSubscribedToGossipCoreTopics()) === subscribe) return false;
333
+ const applying = this.pendingGossipSubscribed !== undefined;
334
+ this.pendingGossipSubscribed = subscribe;
335
+ if (!applying) void this.applyGossipSubscription();
336
+ return true;
337
+ }
338
+
339
+ /**
340
+ * Applies the latest requested state one request at a time. Network skips a subscribe issued while an unsubscribe is
341
+ * in flight, so opposite requests must not overlap.
342
+ */
343
+ private async applyGossipSubscription(): Promise<void> {
344
+ for (;;) {
345
+ const subscribe = this.pendingGossipSubscribed;
346
+ if (subscribe === undefined || subscribe === this.network.isSubscribedToGossipCoreTopics()) break;
347
+ try {
348
+ await (subscribe ? this.network.subscribeGossipCoreTopics() : this.network.unsubscribeGossipCoreTopics());
349
+ } catch (e) {
350
+ this.logger.error(
351
+ subscribe ? "Error subscribing to gossip core topics" : "Error unsubscribing to gossip core topics",
352
+ {},
353
+ e as Error
354
+ );
355
+ // Leave a retry of the same request to the next sync state update
356
+ if (this.pendingGossipSubscribed === subscribe) break;
357
+ continue;
358
+ }
359
+ if (this.pendingGossipSubscribed === undefined || this.network.isSubscribedToGossipCoreTopics() !== subscribe) {
360
+ break;
361
+ }
362
+ this.metrics?.syncSwitchGossipSubscriptions.inc({action: subscribe ? "subscribed" : "unsubscribed"});
363
+ this.logger.info(subscribe ? "Subscribed gossip core topics" : "Un-subscribed gossip core topics");
364
+ }
365
+ this.pendingGossipSubscribed = undefined;
366
+ }
367
+
286
368
  private onClockEpoch = (): void => {
287
369
  // If a node witness the genesis event consider starting gossip
288
370
  // Also, ensure that updateSyncState is run at least once per epoch.
@@ -6,7 +6,7 @@ import {RequestError, RequestErrorCode} from "@lodestar/reqresp";
6
6
  import {computeTimeAtSlot} from "@lodestar/state-transition";
7
7
  import {RootHex, Slot, gloas} from "@lodestar/types";
8
8
  import {Logger, fromHex, isErrorAborted, prettyPrintIndices, pruneSetToMax, sleep, toRootHex} from "@lodestar/utils";
9
- import {isBlockInputBlobs, isBlockInputColumns} from "../chain/blocks/blockInput/blockInput.js";
9
+ import {isBlockInputColumns} from "../chain/blocks/blockInput/blockInput.js";
10
10
  import {BlockInputSource, IBlockInput} from "../chain/blocks/blockInput/types.js";
11
11
  import {PayloadError, PayloadErrorCode} from "../chain/blocks/importExecutionPayload.js";
12
12
  import {PayloadEnvelopeInput, PayloadEnvelopeInputSource} from "../chain/blocks/payloadEnvelopeInput/index.js";
@@ -300,10 +300,19 @@ export class BlockInputSync {
300
300
 
301
301
  private onIncompletePayloadEnvelope = (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]): void => {
302
302
  try {
303
- this.addByPayloadInput(data.payloadInput, data.peer);
304
- this.triggerUnknownBlockSearch();
305
- this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.INCOMPLETE_PAYLOAD_ENVELOPE});
306
- this.metrics?.blockInputSync.payloadSource.inc({source: data.source});
303
+ const isNewRoot = this.addByPayloadInput(data.payloadInput, data.peer);
304
+ const pendingPayload = this.pendingPayloads.get(data.payloadInput.blockRootHex);
305
+ if (
306
+ pendingPayload &&
307
+ pendingPayload.status !== PendingPayloadInputStatus.fetching &&
308
+ pendingPayload.status !== PendingPayloadInputStatus.processing
309
+ ) {
310
+ this.triggerUnknownBlockSearch();
311
+ }
312
+ if (isNewRoot) {
313
+ this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.INCOMPLETE_PAYLOAD_ENVELOPE});
314
+ this.metrics?.blockInputSync.payloadSource.inc({source: data.source});
315
+ }
307
316
  } catch (e) {
308
317
  this.logger.debug("Error handling incompletePayloadEnvelope event", {}, e as Error);
309
318
  }
@@ -599,43 +608,44 @@ export class BlockInputSync {
599
608
  return this.chain.seenPayloadEnvelopeInputCache.get(rootHex)?.slot;
600
609
  }
601
610
 
602
- private addByPayloadInput = (
603
- payloadInput: PayloadEnvelopeInput,
604
- peerIdStr?: PeerIdStr,
605
- envelope?: gloas.SignedExecutionPayloadEnvelope
606
- ): void => {
611
+ private addByPayloadInput = (payloadInput: PayloadEnvelopeInput, peerIdStr?: PeerIdStr): boolean => {
607
612
  if (this.knownBadBlocks.has(payloadInput.blockRootHex)) {
608
613
  this.logger.debug("Ignoring payload input for known bad block root", {
609
614
  slot: payloadInput.slot,
610
615
  root: payloadInput.blockRootHex,
611
616
  peerIdStr,
612
617
  });
613
- return;
618
+ return false;
614
619
  }
615
620
 
616
- const pendingPayload = this.toPendingPayloadInput(
617
- payloadInput,
618
- this.pendingPayloads.get(payloadInput.blockRootHex),
619
- envelope
620
- );
621
+ let pendingPayload = this.pendingPayloads.get(payloadInput.blockRootHex);
622
+ const isNewRoot = pendingPayload === undefined;
623
+ // Envelope-only entries must go through reconciliation to validate their speculative envelope.
624
+ if (
625
+ !pendingPayload ||
626
+ pendingPayload.status === PendingPayloadInputStatus.pending ||
627
+ pendingPayload.status === PendingPayloadInputStatus.downloaded
628
+ ) {
629
+ pendingPayload = this.toPendingPayloadInput(payloadInput, pendingPayload);
630
+ this.pendingPayloads.set(payloadInput.blockRootHex, pendingPayload);
631
+
632
+ this.logger.verbose("Added payloadInput to BlockInputSync.pendingPayloads", {
633
+ slot: payloadInput.slot,
634
+ root: payloadInput.blockRootHex,
635
+ delaySec: this.chain.clock.secFromSlot(payloadInput.slot),
636
+ });
637
+ }
621
638
 
622
639
  if (peerIdStr && pendingPayload.peerIdStrings.size < MAX_PEERS_PER_ROOT) {
623
640
  pendingPayload.peerIdStrings.add(peerIdStr);
624
641
  }
625
642
 
626
- this.pendingPayloads.set(payloadInput.blockRootHex, pendingPayload);
627
-
628
- this.logger.verbose("Added payloadInput to BlockInputSync.pendingPayloads", {
629
- slot: payloadInput.slot,
630
- root: payloadInput.blockRootHex,
631
- delaySec: this.chain.clock.secFromSlot(payloadInput.slot),
632
- });
633
-
634
643
  const prunedItemCount = pruneSetToMax(this.pendingPayloads, this.maxPendingBlocks);
635
644
  if (prunedItemCount > 0) {
636
645
  this.metrics?.blockInputSync.removedPayloads.inc({reason: DroppedItemReason.capacity}, prunedItemCount);
637
646
  this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingPayloads`);
638
647
  }
648
+ return isNewRoot;
639
649
  };
640
650
 
641
651
  private onPeerConnected = (data: NetworkEventData[NetworkEvent.peerConnected]): void => {
@@ -1267,6 +1277,9 @@ export class BlockInputSync {
1267
1277
  }
1268
1278
 
1269
1279
  const payloadInput = await this.chain.seenPayloadEnvelopeInputCache.getOrReload(rootHex);
1280
+ if (this.pendingPayloads.get(rootHex) !== pendingPayload) {
1281
+ return;
1282
+ }
1270
1283
  if (!payloadInput) {
1271
1284
  this.logger.debug("PayloadEnvelopeInput not yet reloadable for imported block, will retry", {
1272
1285
  root: rootHex,
@@ -1278,6 +1291,9 @@ export class BlockInputSync {
1278
1291
  const validationResult = await wrapError(
1279
1292
  validateGossipExecutionPayloadEnvelope(this.chain, pendingPayload.envelope)
1280
1293
  );
1294
+ if (this.pendingPayloads.get(rootHex) !== pendingPayload) {
1295
+ return;
1296
+ }
1281
1297
  if (validationResult.err) {
1282
1298
  this.logger.debug(
1283
1299
  "Pending payload envelope failed validation after block import, refetching by root",
@@ -1345,14 +1361,13 @@ export class BlockInputSync {
1345
1361
  payload.status = PendingPayloadInputStatus.fetching;
1346
1362
 
1347
1363
  const res = await wrapError(this.fetchPayloadInput(payload));
1364
+ if (this.pendingPayloads.get(rootHex) !== payload) {
1365
+ this.logger.verbose("Dropping downloaded payload, entry changed during fetch", logCtx);
1366
+ return;
1367
+ }
1348
1368
  if (!res.err) {
1349
1369
  const pendingPayload = res.result;
1350
1370
  const resultRootHex = getPayloadSyncCacheItemRootHex(pendingPayload);
1351
- // finalization may have deleted this entry while we were awaiting the network, do not resurrect it via the set below
1352
- if (!this.pendingPayloads.has(resultRootHex)) {
1353
- this.logger.verbose("Dropping downloaded payload, entry pruned during fetch", logCtx);
1354
- return;
1355
- }
1356
1371
  this.pendingPayloads.set(resultRootHex, pendingPayload);
1357
1372
  const result = isPendingPayloadEnvelope(pendingPayload)
1358
1373
  ? DownloadResult.WaitingForBlock
@@ -1423,12 +1438,16 @@ export class BlockInputSync {
1423
1438
  this.logger.debug("Processing downloaded payload", logCtx);
1424
1439
 
1425
1440
  const res = await wrapError(this.chain.processExecutionPayload(pendingPayload.payloadInput));
1441
+ // The executionPayload event emitted during import usually removes the entry before this point
1426
1442
  if (!res.err) {
1427
1443
  this.logger.debug("Processed payload from unknown sync", logCtx);
1428
1444
  this.pendingPayloads.delete(rootHex);
1429
1445
  this.triggerUnknownBlockSearch();
1430
1446
  return;
1431
1447
  }
1448
+ if (this.pendingPayloads.get(rootHex) !== pendingPayload) {
1449
+ return;
1450
+ }
1432
1451
 
1433
1452
  if (res.err instanceof PayloadError) {
1434
1453
  switch (res.err.type.code) {
@@ -1891,13 +1910,6 @@ export class BlockInputSync {
1891
1910
  throw new Error(`${message} Block was not found.`);
1892
1911
  }
1893
1912
 
1894
- if (isBlockInputBlobs(cacheItem.blockInput)) {
1895
- const missing = cacheItem.blockInput.getMissingBlobMeta().map((b) => b.index);
1896
- if (missing.length) {
1897
- throw new Error(`${message} Missing blob indices=${prettyPrintIndices(missing)}.`);
1898
- }
1899
- }
1900
-
1901
1913
  if (isBlockInputColumns(cacheItem.blockInput)) {
1902
1914
  const missing = cacheItem.blockInput.getMissingSampledColumnMeta().missing;
1903
1915
  if (missing.length) {