@lodestar/beacon-node 1.51.0-dev.fa491bf50f → 1.51.0-dev.fb216e169a

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 (531) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +36 -88
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +22 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +1 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/validator/index.d.ts +6 -0
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +38 -25
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  14. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  15. package/lib/chain/GetBlobsTracker.js +69 -35
  16. package/lib/chain/GetBlobsTracker.js.map +1 -1
  17. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/archiveStore.js +1 -0
  19. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  20. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  21. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  22. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  23. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  24. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  25. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  26. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  27. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  28. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  29. package/lib/chain/blocks/blockInput/types.js +0 -1
  30. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  31. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  32. package/lib/chain/blocks/importBlock.js +36 -53
  33. package/lib/chain/blocks/importBlock.js.map +1 -1
  34. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  35. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  36. package/lib/chain/blocks/importExecutionPayload.js +32 -18
  37. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  38. package/lib/chain/blocks/index.d.ts.map +1 -1
  39. package/lib/chain/blocks/index.js +3 -3
  40. package/lib/chain/blocks/index.js.map +1 -1
  41. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  42. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  43. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  44. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  45. package/lib/chain/blocks/types.d.ts +4 -20
  46. package/lib/chain/blocks/types.d.ts.map +1 -1
  47. package/lib/chain/blocks/types.js +0 -24
  48. package/lib/chain/blocks/types.js.map +1 -1
  49. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  50. package/lib/chain/blocks/verifyBlock.js +18 -7
  51. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  52. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  53. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  54. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  55. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  56. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  57. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  58. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  59. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  60. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  61. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  62. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  63. package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
  64. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  65. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  66. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  67. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  68. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  69. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  70. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  71. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  72. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  73. package/lib/chain/bls/interface.d.ts +2 -0
  74. package/lib/chain/bls/interface.d.ts.map +1 -1
  75. package/lib/chain/bls/multithread/index.d.ts +1 -1
  76. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  77. package/lib/chain/bls/multithread/index.js +50 -22
  78. package/lib/chain/bls/multithread/index.js.map +1 -1
  79. package/lib/chain/bls/multithread/types.d.ts +1 -1
  80. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  81. package/lib/chain/bls/multithread/worker.js +1 -1
  82. package/lib/chain/bls/multithread/worker.js.map +1 -1
  83. package/lib/chain/bls/singleThread.js +1 -1
  84. package/lib/chain/bls/singleThread.js.map +1 -1
  85. package/lib/chain/bls/utils.js +1 -1
  86. package/lib/chain/bls/utils.js.map +1 -1
  87. package/lib/chain/chain.d.ts +25 -4
  88. package/lib/chain/chain.d.ts.map +1 -1
  89. package/lib/chain/chain.js +120 -39
  90. package/lib/chain/chain.js.map +1 -1
  91. package/lib/chain/emitter.d.ts +7 -7
  92. package/lib/chain/emitter.d.ts.map +1 -1
  93. package/lib/chain/emitter.js +5 -5
  94. package/lib/chain/emitter.js.map +1 -1
  95. package/lib/chain/errors/blockError.d.ts +1 -1
  96. package/lib/chain/errors/blockError.d.ts.map +1 -1
  97. package/lib/chain/errors/blockError.js +1 -1
  98. package/lib/chain/errors/blockError.js.map +1 -1
  99. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  100. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  101. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  102. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  103. package/lib/chain/errors/index.d.ts +0 -1
  104. package/lib/chain/errors/index.d.ts.map +1 -1
  105. package/lib/chain/errors/index.js +0 -1
  106. package/lib/chain/errors/index.js.map +1 -1
  107. package/lib/chain/forkChoice/index.d.ts +11 -1
  108. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  109. package/lib/chain/forkChoice/index.js +11 -0
  110. package/lib/chain/forkChoice/index.js.map +1 -1
  111. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  112. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  113. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  114. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  115. package/lib/chain/interface.d.ts +9 -7
  116. package/lib/chain/interface.d.ts.map +1 -1
  117. package/lib/chain/interface.js.map +1 -1
  118. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  119. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  120. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  121. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  122. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  123. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  124. package/lib/chain/opPools/attestationPool.js +15 -4
  125. package/lib/chain/opPools/attestationPool.js.map +1 -1
  126. package/lib/chain/opPools/index.d.ts +1 -0
  127. package/lib/chain/opPools/index.d.ts.map +1 -1
  128. package/lib/chain/opPools/index.js +1 -0
  129. package/lib/chain/opPools/index.js.map +1 -1
  130. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  131. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  132. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  133. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  134. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  135. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  136. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  137. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  138. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  139. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  140. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  141. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  142. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  143. package/lib/chain/opPools/utils.d.ts +1 -1
  144. package/lib/chain/opPools/utils.d.ts.map +1 -1
  145. package/lib/chain/opPools/utils.js +1 -1
  146. package/lib/chain/opPools/utils.js.map +1 -1
  147. package/lib/chain/options.d.ts +5 -3
  148. package/lib/chain/options.d.ts.map +1 -1
  149. package/lib/chain/options.js +0 -1
  150. package/lib/chain/options.js.map +1 -1
  151. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  152. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  153. package/lib/chain/produceBlock/produceBlockBody.js +3 -2
  154. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  155. package/lib/chain/proposerTracker.d.ts +31 -0
  156. package/lib/chain/proposerTracker.d.ts.map +1 -0
  157. package/lib/chain/proposerTracker.js +75 -0
  158. package/lib/chain/proposerTracker.js.map +1 -0
  159. package/lib/chain/regen/interface.d.ts +1 -1
  160. package/lib/chain/regen/interface.d.ts.map +1 -1
  161. package/lib/chain/regen/queued.d.ts +1 -1
  162. package/lib/chain/regen/queued.d.ts.map +1 -1
  163. package/lib/chain/regen/queued.js +5 -3
  164. package/lib/chain/regen/queued.js.map +1 -1
  165. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  166. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  167. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  168. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  169. package/lib/chain/validation/executionPayloadBid.js +13 -13
  170. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  171. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  172. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  173. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  174. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  175. package/lib/chain/validatorMonitor.d.ts +1 -2
  176. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  177. package/lib/chain/validatorMonitor.js +0 -3
  178. package/lib/chain/validatorMonitor.js.map +1 -1
  179. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  180. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  181. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  182. package/lib/db/flatFileStore/slotIndex.js +2 -2
  183. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  184. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  185. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  186. package/lib/db/repositories/blobSidecars.js +0 -1
  187. package/lib/db/repositories/blobSidecars.js.map +1 -1
  188. package/lib/execution/builder/apiClient.d.ts +14 -8
  189. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  190. package/lib/execution/builder/apiClient.js +12 -10
  191. package/lib/execution/builder/apiClient.js.map +1 -1
  192. package/lib/execution/builder/http.d.ts +2 -0
  193. package/lib/execution/builder/http.d.ts.map +1 -1
  194. package/lib/execution/builder/http.js +2 -0
  195. package/lib/execution/builder/http.js.map +1 -1
  196. package/lib/execution/engine/http.d.ts +4 -6
  197. package/lib/execution/engine/http.d.ts.map +1 -1
  198. package/lib/execution/engine/http.js +8 -10
  199. package/lib/execution/engine/http.js.map +1 -1
  200. package/lib/execution/engine/index.d.ts +1 -1
  201. package/lib/execution/engine/index.d.ts.map +1 -1
  202. package/lib/execution/engine/index.js +1 -1
  203. package/lib/execution/engine/index.js.map +1 -1
  204. package/lib/execution/engine/interface.d.ts +18 -6
  205. package/lib/execution/engine/interface.d.ts.map +1 -1
  206. package/lib/execution/engine/interface.js.map +1 -1
  207. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  208. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  209. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  210. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  211. package/lib/execution/engine/mock.d.ts +0 -1
  212. package/lib/execution/engine/mock.d.ts.map +1 -1
  213. package/lib/execution/engine/mock.js +0 -4
  214. package/lib/execution/engine/mock.js.map +1 -1
  215. package/lib/execution/engine/restTransport.d.ts +2 -4
  216. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  217. package/lib/execution/engine/restTransport.js +1 -15
  218. package/lib/execution/engine/restTransport.js.map +1 -1
  219. package/lib/execution/engine/sszTypes.d.ts +0 -9
  220. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  221. package/lib/execution/engine/sszTypes.js +0 -5
  222. package/lib/execution/engine/sszTypes.js.map +1 -1
  223. package/lib/execution/engine/transport.d.ts +1 -14
  224. package/lib/execution/engine/transport.d.ts.map +1 -1
  225. package/lib/execution/engine/types.d.ts +0 -8
  226. package/lib/execution/engine/types.d.ts.map +1 -1
  227. package/lib/execution/engine/types.js +2 -10
  228. package/lib/execution/engine/types.js.map +1 -1
  229. package/lib/execution/engine/utils.d.ts.map +1 -1
  230. package/lib/execution/engine/utils.js +3 -2
  231. package/lib/execution/engine/utils.js.map +1 -1
  232. package/lib/index.d.ts +1 -1
  233. package/lib/index.d.ts.map +1 -1
  234. package/lib/index.js +1 -1
  235. package/lib/index.js.map +1 -1
  236. package/lib/metrics/metrics/beacon.d.ts +0 -9
  237. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  238. package/lib/metrics/metrics/beacon.js +0 -30
  239. package/lib/metrics/metrics/beacon.js.map +1 -1
  240. package/lib/metrics/metrics/lodestar.d.ts +30 -8
  241. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  242. package/lib/metrics/metrics/lodestar.js +79 -18
  243. package/lib/metrics/metrics/lodestar.js.map +1 -1
  244. package/lib/metrics/server/http.js +5 -5
  245. package/lib/metrics/server/http.js.map +1 -1
  246. package/lib/monitoring/service.js +1 -1
  247. package/lib/monitoring/service.js.map +1 -1
  248. package/lib/network/core/networkCore.d.ts +4 -1
  249. package/lib/network/core/networkCore.d.ts.map +1 -1
  250. package/lib/network/core/networkCore.js +7 -0
  251. package/lib/network/core/networkCore.js.map +1 -1
  252. package/lib/network/core/networkCoreWorker.js +2 -0
  253. package/lib/network/core/networkCoreWorker.js.map +1 -1
  254. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  255. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  256. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  257. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  258. package/lib/network/core/types.d.ts +6 -1
  259. package/lib/network/core/types.d.ts.map +1 -1
  260. package/lib/network/gossip/gossipsub.d.ts +1 -0
  261. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  262. package/lib/network/gossip/gossipsub.js +10 -0
  263. package/lib/network/gossip/gossipsub.js.map +1 -1
  264. package/lib/network/gossip/interface.d.ts +1 -8
  265. package/lib/network/gossip/interface.d.ts.map +1 -1
  266. package/lib/network/gossip/interface.js +0 -1
  267. package/lib/network/gossip/interface.js.map +1 -1
  268. package/lib/network/gossip/topic.d.ts +0 -16
  269. package/lib/network/gossip/topic.d.ts.map +1 -1
  270. package/lib/network/gossip/topic.js +0 -23
  271. package/lib/network/gossip/topic.js.map +1 -1
  272. package/lib/network/interface.d.ts +4 -5
  273. package/lib/network/interface.d.ts.map +1 -1
  274. package/lib/network/libp2p/index.d.ts.map +1 -1
  275. package/lib/network/libp2p/index.js +5 -1
  276. package/lib/network/libp2p/index.js.map +1 -1
  277. package/lib/network/network.d.ts +8 -7
  278. package/lib/network/network.d.ts.map +1 -1
  279. package/lib/network/network.js +53 -35
  280. package/lib/network/network.js.map +1 -1
  281. package/lib/network/options.d.ts +2 -0
  282. package/lib/network/options.d.ts.map +1 -1
  283. package/lib/network/options.js +2 -0
  284. package/lib/network/options.js.map +1 -1
  285. package/lib/network/peers/peerManager.d.ts +2 -1
  286. package/lib/network/peers/peerManager.d.ts.map +1 -1
  287. package/lib/network/peers/peerManager.js +28 -1
  288. package/lib/network/peers/peerManager.js.map +1 -1
  289. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  290. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  291. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  292. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  293. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  294. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  295. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  296. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  297. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  298. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  299. package/lib/network/peers/utils/subnetMap.js +6 -3
  300. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  301. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  302. package/lib/network/processor/extractSlotRootFns.js +1 -8
  303. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  304. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  305. package/lib/network/processor/gossipHandlers.js +52 -131
  306. package/lib/network/processor/gossipHandlers.js.map +1 -1
  307. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  308. package/lib/network/processor/gossipQueues/index.js +0 -6
  309. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  310. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  311. package/lib/network/processor/gossipValidatorFn.js +1 -5
  312. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  313. package/lib/network/processor/index.d.ts +6 -0
  314. package/lib/network/processor/index.d.ts.map +1 -1
  315. package/lib/network/processor/index.js +29 -4
  316. package/lib/network/processor/index.js.map +1 -1
  317. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  318. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  319. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  320. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  321. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  322. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  323. package/lib/network/reqresp/handlers/index.js +1 -12
  324. package/lib/network/reqresp/handlers/index.js.map +1 -1
  325. package/lib/network/reqresp/protocols.d.ts +0 -2
  326. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  327. package/lib/network/reqresp/protocols.js +0 -10
  328. package/lib/network/reqresp/protocols.js.map +1 -1
  329. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  330. package/lib/network/reqresp/rateLimit.js +1 -17
  331. package/lib/network/reqresp/rateLimit.js.map +1 -1
  332. package/lib/network/reqresp/types.d.ts +2 -8
  333. package/lib/network/reqresp/types.d.ts.map +1 -1
  334. package/lib/network/reqresp/types.js +1 -7
  335. package/lib/network/reqresp/types.js.map +1 -1
  336. package/lib/network/subnets/attnetsService.d.ts +35 -5
  337. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  338. package/lib/network/subnets/attnetsService.js +84 -6
  339. package/lib/network/subnets/attnetsService.js.map +1 -1
  340. package/lib/network/subnets/interface.d.ts +7 -0
  341. package/lib/network/subnets/interface.d.ts.map +1 -1
  342. package/lib/network/subnets/interface.js.map +1 -1
  343. package/lib/node/nodejs.d.ts +3 -1
  344. package/lib/node/nodejs.d.ts.map +1 -1
  345. package/lib/node/nodejs.js +38 -20
  346. package/lib/node/nodejs.js.map +1 -1
  347. package/lib/node/options.d.ts +3 -1
  348. package/lib/node/options.d.ts.map +1 -1
  349. package/lib/node/options.js +4 -2
  350. package/lib/node/options.js.map +1 -1
  351. package/lib/sync/interface.d.ts.map +1 -1
  352. package/lib/sync/interface.js.map +1 -1
  353. package/lib/sync/range/batch.d.ts +2 -3
  354. package/lib/sync/range/batch.d.ts.map +1 -1
  355. package/lib/sync/range/batch.js +9 -22
  356. package/lib/sync/range/batch.js.map +1 -1
  357. package/lib/sync/range/chain.d.ts.map +1 -1
  358. package/lib/sync/range/chain.js +2 -15
  359. package/lib/sync/range/chain.js.map +1 -1
  360. package/lib/sync/sync.d.ts +15 -0
  361. package/lib/sync/sync.d.ts.map +1 -1
  362. package/lib/sync/sync.js +103 -25
  363. package/lib/sync/sync.js.map +1 -1
  364. package/lib/sync/unknownBlock.d.ts.map +1 -1
  365. package/lib/sync/unknownBlock.js +1 -7
  366. package/lib/sync/unknownBlock.js.map +1 -1
  367. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  368. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  369. package/lib/sync/utils/downloadByRange.js +24 -128
  370. package/lib/sync/utils/downloadByRange.js.map +1 -1
  371. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  372. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  373. package/lib/sync/utils/downloadByRoot.js +14 -99
  374. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  375. package/lib/util/blobs.d.ts +1 -7
  376. package/lib/util/blobs.d.ts.map +1 -1
  377. package/lib/util/blobs.js +0 -19
  378. package/lib/util/blobs.js.map +1 -1
  379. package/lib/util/execution.d.ts +3 -4
  380. package/lib/util/execution.d.ts.map +1 -1
  381. package/lib/util/execution.js +1 -73
  382. package/lib/util/execution.js.map +1 -1
  383. package/lib/util/file.d.ts.map +1 -1
  384. package/lib/util/file.js +8 -9
  385. package/lib/util/file.js.map +1 -1
  386. package/lib/util/queue/itemQueue.js +1 -1
  387. package/lib/util/queue/itemQueue.js.map +1 -1
  388. package/lib/util/sszBytes.d.ts +5 -1
  389. package/lib/util/sszBytes.d.ts.map +1 -1
  390. package/lib/util/sszBytes.js +36 -19
  391. package/lib/util/sszBytes.js.map +1 -1
  392. package/lib/util/types.d.ts +0 -5
  393. package/lib/util/types.d.ts.map +1 -1
  394. package/lib/util/types.js +1 -2
  395. package/lib/util/types.js.map +1 -1
  396. package/package.json +16 -17
  397. package/src/api/impl/beacon/blocks/index.ts +59 -109
  398. package/src/api/impl/beacon/pool/index.ts +31 -1
  399. package/src/api/impl/beacon/state/utils.ts +1 -1
  400. package/src/api/impl/validator/index.ts +43 -29
  401. package/src/chain/GetBlobsTracker.ts +82 -52
  402. package/src/chain/archiveStore/archiveStore.ts +1 -0
  403. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  404. package/src/chain/blocks/blockInput/errors.ts +1 -2
  405. package/src/chain/blocks/blockInput/types.ts +2 -20
  406. package/src/chain/blocks/importBlock.ts +56 -72
  407. package/src/chain/blocks/importExecutionPayload.ts +55 -34
  408. package/src/chain/blocks/index.ts +10 -3
  409. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  410. package/src/chain/blocks/types.ts +5 -31
  411. package/src/chain/blocks/verifyBlock.ts +31 -16
  412. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  413. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  414. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  415. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
  416. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  417. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  418. package/src/chain/bls/interface.ts +2 -0
  419. package/src/chain/bls/multithread/index.ts +48 -24
  420. package/src/chain/bls/multithread/types.ts +1 -1
  421. package/src/chain/bls/multithread/worker.ts +1 -5
  422. package/src/chain/bls/singleThread.ts +1 -1
  423. package/src/chain/bls/utils.ts +1 -1
  424. package/src/chain/chain.ts +136 -38
  425. package/src/chain/emitter.ts +8 -8
  426. package/src/chain/errors/blockError.ts +1 -1
  427. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  428. package/src/chain/errors/index.ts +0 -1
  429. package/src/chain/forkChoice/index.ts +11 -0
  430. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  431. package/src/chain/interface.ts +9 -6
  432. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  433. package/src/chain/opPools/attestationPool.ts +16 -4
  434. package/src/chain/opPools/index.ts +1 -0
  435. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  436. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  437. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  438. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  439. package/src/chain/opPools/utils.ts +1 -1
  440. package/src/chain/options.ts +5 -4
  441. package/src/chain/produceBlock/produceBlockBody.ts +7 -3
  442. package/src/chain/proposerTracker.ts +94 -0
  443. package/src/chain/regen/interface.ts +1 -1
  444. package/src/chain/regen/queued.ts +6 -4
  445. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  446. package/src/chain/validation/executionPayloadBid.ts +14 -13
  447. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  448. package/src/chain/validatorMonitor.ts +0 -6
  449. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  450. package/src/db/flatFileStore/slotIndex.ts +4 -3
  451. package/src/db/repositories/blobSidecars.ts +0 -1
  452. package/src/execution/builder/apiClient.ts +16 -13
  453. package/src/execution/builder/http.ts +4 -0
  454. package/src/execution/engine/http.ts +19 -42
  455. package/src/execution/engine/index.ts +1 -1
  456. package/src/execution/engine/interface.ts +19 -10
  457. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  458. package/src/execution/engine/mock.ts +0 -7
  459. package/src/execution/engine/restTransport.ts +3 -22
  460. package/src/execution/engine/sszTypes.ts +0 -9
  461. package/src/execution/engine/transport.ts +8 -17
  462. package/src/execution/engine/types.ts +3 -18
  463. package/src/execution/engine/utils.ts +4 -2
  464. package/src/index.ts +1 -1
  465. package/src/metrics/metrics/beacon.ts +0 -30
  466. package/src/metrics/metrics/lodestar.ts +80 -18
  467. package/src/metrics/server/http.ts +5 -5
  468. package/src/monitoring/service.ts +1 -1
  469. package/src/network/core/networkCore.ts +11 -1
  470. package/src/network/core/networkCoreWorker.ts +2 -0
  471. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  472. package/src/network/core/types.ts +6 -1
  473. package/src/network/gossip/gossipsub.ts +11 -0
  474. package/src/network/gossip/interface.ts +0 -5
  475. package/src/network/gossip/topic.ts +0 -25
  476. package/src/network/interface.ts +2 -5
  477. package/src/network/libp2p/index.ts +5 -1
  478. package/src/network/network.ts +55 -58
  479. package/src/network/options.ts +4 -0
  480. package/src/network/peers/peerManager.ts +28 -3
  481. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  482. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  483. package/src/network/peers/utils/subnetMap.ts +6 -3
  484. package/src/network/processor/extractSlotRootFns.ts +0 -9
  485. package/src/network/processor/gossipHandlers.ts +65 -164
  486. package/src/network/processor/gossipQueues/index.ts +0 -6
  487. package/src/network/processor/gossipValidatorFn.ts +0 -5
  488. package/src/network/processor/index.ts +25 -4
  489. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  490. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  491. package/src/network/reqresp/handlers/index.ts +0 -17
  492. package/src/network/reqresp/protocols.ts +0 -12
  493. package/src/network/reqresp/rateLimit.ts +1 -17
  494. package/src/network/reqresp/types.ts +0 -13
  495. package/src/network/subnets/attnetsService.ts +94 -6
  496. package/src/network/subnets/interface.ts +7 -0
  497. package/src/node/nodejs.ts +40 -21
  498. package/src/node/options.ts +9 -6
  499. package/src/sync/interface.ts +1 -0
  500. package/src/sync/range/batch.ts +9 -21
  501. package/src/sync/range/chain.ts +2 -14
  502. package/src/sync/sync.ts +108 -26
  503. package/src/sync/unknownBlock.ts +1 -8
  504. package/src/sync/utils/downloadByRange.ts +31 -230
  505. package/src/sync/utils/downloadByRoot.ts +15 -142
  506. package/src/util/blobs.ts +0 -34
  507. package/src/util/execution.ts +8 -102
  508. package/src/util/file.ts +8 -9
  509. package/src/util/queue/itemQueue.ts +1 -1
  510. package/src/util/sszBytes.ts +42 -24
  511. package/src/util/types.ts +1 -8
  512. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  513. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  514. package/lib/chain/errors/blobSidecarError.js +0 -38
  515. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  516. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  517. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  518. package/lib/chain/validation/blobSidecar.js +0 -276
  519. package/lib/chain/validation/blobSidecar.js.map +0 -1
  520. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  521. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  522. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  523. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  524. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  525. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  526. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  527. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  528. package/src/chain/errors/blobSidecarError.ts +0 -70
  529. package/src/chain/validation/blobSidecar.ts +0 -357
  530. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  531. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -1,5 +1,5 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
- import {ForkName, isForkPostDeneb, isForkPostFulu, isForkPostGloas} from "@lodestar/params";
2
+ import {ForkName, isForkPostFulu, isForkPostGloas} from "@lodestar/params";
3
3
  import {Epoch, RootHex, SignedBeaconBlock, Slot, gloas, phase0} from "@lodestar/types";
4
4
  import {LodestarError, byteArrayEquals, prettyPrintIndices, toRootHex} from "@lodestar/utils";
5
5
  import {isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
@@ -112,7 +112,6 @@ export type BatchMetadata = {
112
112
  // Per-type outstanding request shapes; only present when that sub-request exists.
113
113
  // Format: "startSlot=<n>,count=<n>" (plus ",cols=<indices>" for columns).
114
114
  blocksReq?: string;
115
- blobsReq?: string;
116
115
  columnsReq?: string;
117
116
  envelopesReq?: string;
118
117
 
@@ -159,7 +158,7 @@ export class Batch {
159
158
  readonly startSlot: Slot;
160
159
  readonly count: number;
161
160
 
162
- /** Block, blob and column requests that are used to determine the best peer and are used in downloadByRange */
161
+ /** Block, column and envelope requests that are used to determine the best peer and are used in downloadByRange */
163
162
  requests: DownloadByRangeRequests;
164
163
  /** State of the batch. */
165
164
  state: BatchState = {status: BatchStatus.AwaitingDownload, blocks: [], payloadEnvelopes: null};
@@ -224,7 +223,7 @@ export class Batch {
224
223
  }
225
224
 
226
225
  /**
227
- * Builds ByRange requests for block, blobs and columns
226
+ * Builds ByRange requests for block, columns and envelopes
228
227
  */
229
228
  private getRequests(blocks: IBlockInput[]): DownloadByRangeRequests {
230
229
  const withinValidRequestWindow = !isDaOutOfRange(
@@ -254,8 +253,6 @@ export class Batch {
254
253
  count: this.count,
255
254
  columns: this.custodyConfig.sampledColumns,
256
255
  };
257
- } else if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
258
- requests.blobsRequest = {startSlot: this.startSlot, count: this.count};
259
256
  }
260
257
 
261
258
  return requests;
@@ -334,23 +331,15 @@ export class Batch {
334
331
  if (dataStartSlot <= endSlot) {
335
332
  // range of 40 - 63, startSlot will be inclusive but subtraction will exclusive so need to + 1
336
333
  const count = endSlot - dataStartSlot + 1;
337
- if (isForkPostFulu(this.forkName) && withinValidRequestWindow) {
338
- // Skip the column re-request when we have no specific column indices outstanding.
339
- // Peer rejects an empty `columns` list
340
- if (neededColumns.size > 0) {
341
- requests.columnsRequest = {
342
- count,
343
- startSlot: dataStartSlot,
344
- columns: Array.from(neededColumns),
345
- };
346
- }
347
- } else if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
348
- requests.blobsRequest = {
334
+ // Peer rejects an empty `columns` list
335
+ if (isForkPostFulu(this.forkName) && withinValidRequestWindow && neededColumns.size > 0) {
336
+ requests.columnsRequest = {
349
337
  count,
350
338
  startSlot: dataStartSlot,
339
+ columns: Array.from(neededColumns),
351
340
  };
352
341
  }
353
- // dataSlot will still have a value but do not create a request for preDeneb forks
342
+ // dataSlot will still have a value but do not create a request for pre-fulu forks
354
343
  }
355
344
 
356
345
  if (isForkPostGloas(this.forkName) && envelopeStartSlot <= endSlot) {
@@ -471,7 +460,7 @@ export class Batch {
471
460
  }
472
461
 
473
462
  getMetadata(): BatchMetadata {
474
- const {blocksRequest, blobsRequest, columnsRequest, envelopesRequest} = this.requests;
463
+ const {blocksRequest, columnsRequest, envelopesRequest} = this.requests;
475
464
  const failedProcessingPeerList = this.failedProcessingAttempts.flatMap((a) => a.peers);
476
465
  const executionErrorPeerList = this.executionErrorAttempts.flatMap((a) => a.peers);
477
466
  return {
@@ -480,7 +469,6 @@ export class Batch {
480
469
  count: this.count,
481
470
  status: this.state.status,
482
471
  ...(blocksRequest && {blocksReq: formatRangeReq(blocksRequest)}),
483
- ...(blobsRequest && {blobsReq: formatRangeReq(blobsRequest)}),
484
472
  ...(columnsRequest && {columnsReq: formatColumnsReq(columnsRequest)}),
485
473
  ...(envelopesRequest && {envelopesReq: formatRangeReq(envelopesRequest)}),
486
474
  downloadAttempts: this.failedDownloadAttempts.length,
@@ -1,11 +1,10 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {Epoch, Root, Slot} from "@lodestar/types";
3
3
  import {ErrorAborted, LodestarError, Logger, prettyPrintIndices, toRootHex} from "@lodestar/utils";
4
- import {isBlockInputBlobs, isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
4
+ import {isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
5
5
  import {BlockInputErrorCode} from "../../chain/blocks/blockInput/errors.js";
6
6
  import {IBlockInput} from "../../chain/blocks/blockInput/types.js";
7
7
  import {PayloadEnvelopeInput} from "../../chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
8
- import {BlobSidecarErrorCode} from "../../chain/errors/blobSidecarError.js";
9
8
  import {DataColumnSidecarErrorCode} from "../../chain/errors/dataColumnSidecarError.js";
10
9
  import {Metrics} from "../../metrics/metrics.js";
11
10
  import {PeerAction, prettyPrintPeerIdStr} from "../../network/index.js";
@@ -569,12 +568,8 @@ export class SyncChain {
569
568
  // The below cases indicate the peer may be on a different chain, so are not penalized during head sync.
570
569
  switch (errCode) {
571
570
  case BlockInputErrorCode.MISMATCHED_ROOT_HEX:
572
- case DownloadByRangeErrorCode.MISSING_BLOBS:
573
- case DownloadByRangeErrorCode.EXTRA_BLOBS:
574
571
  case DownloadByRangeErrorCode.MISSING_COLUMNS:
575
572
  case DownloadByRangeErrorCode.EXTRA_COLUMNS:
576
- case BlobSidecarErrorCode.INCORRECT_SIDECAR_COUNT:
577
- case BlobSidecarErrorCode.INCORRECT_BLOCK:
578
573
  case DataColumnSidecarErrorCode.INCORRECT_SIDECAR_COUNT:
579
574
  case DataColumnSidecarErrorCode.INCORRECT_BLOCK:
580
575
  this.reportPeer(peer.peerId, PeerAction.LowToleranceError, res.err.message);
@@ -589,8 +584,6 @@ export class SyncChain {
589
584
  case DownloadByRangeErrorCode.INVALID_ENVELOPE_BLOCK_HASH:
590
585
  case DownloadByRangeErrorCode.INVALID_ENVELOPE_SLOT:
591
586
  case DownloadByRangeErrorCode.INVALID_CHAIN_SEGMENT:
592
- case BlobSidecarErrorCode.INCLUSION_PROOF_INVALID:
593
- case BlobSidecarErrorCode.INVALID_KZG_PROOF_BATCH:
594
587
  case DataColumnSidecarErrorCode.INCORRECT_KZG_COMMITMENTS_COUNT:
595
588
  case DataColumnSidecarErrorCode.INCORRECT_KZG_PROOF_COUNT:
596
589
  case DataColumnSidecarErrorCode.INVALID_KZG_PROOF_BATCH:
@@ -638,12 +631,7 @@ export class SyncChain {
638
631
  }
639
632
 
640
633
  for (const block of downloadSuccessOutput.blocks) {
641
- if (isBlockInputBlobs(block)) {
642
- const blockLogMeta = block.getLogMeta();
643
- const expectedBlobs = typeof blockLogMeta.expectedBlobs === "number" ? blockLogMeta.expectedBlobs : 0;
644
- logMeta.expectedBlobCount = (logMeta.expectedBlobCount ?? 0) + expectedBlobs;
645
- logMeta.receivedBlobCount = (logMeta.receivedBlobCount ?? 0) + blockLogMeta.receivedBlobs;
646
- } else if (isBlockInputColumns(block)) {
634
+ if (isBlockInputColumns(block)) {
647
635
  logMeta.columnCount = (logMeta.columnCount ?? 0) + block.getLogMeta().receivedColumns;
648
636
  }
649
637
  }
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";
@@ -1910,13 +1910,6 @@ export class BlockInputSync {
1910
1910
  throw new Error(`${message} Block was not found.`);
1911
1911
  }
1912
1912
 
1913
- if (isBlockInputBlobs(cacheItem.blockInput)) {
1914
- const missing = cacheItem.blockInput.getMissingBlobMeta().map((b) => b.index);
1915
- if (missing.length) {
1916
- throw new Error(`${message} Missing blob indices=${prettyPrintIndices(missing)}.`);
1917
- }
1918
- }
1919
-
1920
1913
  if (isBlockInputColumns(cacheItem.blockInput)) {
1921
1914
  const missing = cacheItem.blockInput.getMissingSampledColumnMeta().missing;
1922
1915
  if (missing.length) {