@lodestar/beacon-node 1.51.0-dev.f8eff664d2 → 1.51.0-dev.f921fbf6b7

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 (632) 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/GetBlobsTracker.d.ts +13 -2
  33. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  34. package/lib/chain/GetBlobsTracker.js +69 -35
  35. package/lib/chain/GetBlobsTracker.js.map +1 -1
  36. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  37. package/lib/chain/archiveStore/archiveStore.js +1 -0
  38. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  39. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  40. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  41. package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
  42. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  43. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  44. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  45. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  46. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  47. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  48. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  49. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  50. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  51. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  52. package/lib/chain/blocks/blockInput/types.js +0 -1
  53. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  54. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  55. package/lib/chain/blocks/importBlock.js +42 -57
  56. package/lib/chain/blocks/importBlock.js.map +1 -1
  57. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  58. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  59. package/lib/chain/blocks/importExecutionPayload.js +82 -20
  60. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  61. package/lib/chain/blocks/index.d.ts.map +1 -1
  62. package/lib/chain/blocks/index.js +4 -4
  63. package/lib/chain/blocks/index.js.map +1 -1
  64. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  65. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  66. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  67. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  68. package/lib/chain/blocks/types.d.ts +7 -19
  69. package/lib/chain/blocks/types.d.ts.map +1 -1
  70. package/lib/chain/blocks/types.js +5 -24
  71. package/lib/chain/blocks/types.js.map +1 -1
  72. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  73. package/lib/chain/blocks/verifyBlock.js +18 -7
  74. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  76. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  77. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  78. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  79. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  80. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  81. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  82. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  83. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  84. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  85. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  86. package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
  87. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  88. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  89. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  90. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  91. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  92. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  93. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  94. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  95. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  96. package/lib/chain/bls/interface.d.ts +2 -0
  97. package/lib/chain/bls/interface.d.ts.map +1 -1
  98. package/lib/chain/bls/multithread/index.d.ts +1 -1
  99. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  100. package/lib/chain/bls/multithread/index.js +50 -22
  101. package/lib/chain/bls/multithread/index.js.map +1 -1
  102. package/lib/chain/bls/multithread/types.d.ts +1 -1
  103. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  104. package/lib/chain/bls/multithread/worker.js +1 -1
  105. package/lib/chain/bls/multithread/worker.js.map +1 -1
  106. package/lib/chain/bls/singleThread.js +1 -1
  107. package/lib/chain/bls/singleThread.js.map +1 -1
  108. package/lib/chain/bls/utils.js +1 -1
  109. package/lib/chain/bls/utils.js.map +1 -1
  110. package/lib/chain/chain.d.ts +26 -4
  111. package/lib/chain/chain.d.ts.map +1 -1
  112. package/lib/chain/chain.js +127 -43
  113. package/lib/chain/chain.js.map +1 -1
  114. package/lib/chain/emitter.d.ts +7 -7
  115. package/lib/chain/emitter.d.ts.map +1 -1
  116. package/lib/chain/emitter.js +5 -5
  117. package/lib/chain/emitter.js.map +1 -1
  118. package/lib/chain/errors/blockError.d.ts +1 -1
  119. package/lib/chain/errors/blockError.d.ts.map +1 -1
  120. package/lib/chain/errors/blockError.js +1 -1
  121. package/lib/chain/errors/blockError.js.map +1 -1
  122. package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
  123. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  124. package/lib/chain/errors/executionPayloadBid.js +2 -0
  125. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  126. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  127. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  128. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  129. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  130. package/lib/chain/errors/inclusionList.d.ts +60 -0
  131. package/lib/chain/errors/inclusionList.d.ts.map +1 -0
  132. package/lib/chain/errors/inclusionList.js +19 -0
  133. package/lib/chain/errors/inclusionList.js.map +1 -0
  134. package/lib/chain/errors/index.d.ts +1 -1
  135. package/lib/chain/errors/index.d.ts.map +1 -1
  136. package/lib/chain/errors/index.js +1 -1
  137. package/lib/chain/errors/index.js.map +1 -1
  138. package/lib/chain/forkChoice/index.d.ts +11 -1
  139. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  140. package/lib/chain/forkChoice/index.js +11 -0
  141. package/lib/chain/forkChoice/index.js.map +1 -1
  142. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  143. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  144. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  145. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  146. package/lib/chain/interface.d.ts +10 -7
  147. package/lib/chain/interface.d.ts.map +1 -1
  148. package/lib/chain/interface.js.map +1 -1
  149. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  150. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  151. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  152. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  153. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  154. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  155. package/lib/chain/opPools/attestationPool.js +15 -4
  156. package/lib/chain/opPools/attestationPool.js.map +1 -1
  157. package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
  158. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
  159. package/lib/chain/opPools/inclusionListStore.js +171 -0
  160. package/lib/chain/opPools/inclusionListStore.js.map +1 -0
  161. package/lib/chain/opPools/index.d.ts +2 -0
  162. package/lib/chain/opPools/index.d.ts.map +1 -1
  163. package/lib/chain/opPools/index.js +2 -0
  164. package/lib/chain/opPools/index.js.map +1 -1
  165. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  166. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  167. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  168. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  169. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  170. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  171. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  172. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  173. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  174. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  175. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  176. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  177. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  178. package/lib/chain/opPools/utils.d.ts +1 -1
  179. package/lib/chain/opPools/utils.d.ts.map +1 -1
  180. package/lib/chain/opPools/utils.js +1 -1
  181. package/lib/chain/opPools/utils.js.map +1 -1
  182. package/lib/chain/options.d.ts +5 -3
  183. package/lib/chain/options.d.ts.map +1 -1
  184. package/lib/chain/options.js +0 -1
  185. package/lib/chain/options.js.map +1 -1
  186. package/lib/chain/produceBlock/produceBlockBody.d.ts +6 -3
  187. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  188. package/lib/chain/produceBlock/produceBlockBody.js +32 -11
  189. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  190. package/lib/chain/proposerTracker.d.ts +31 -0
  191. package/lib/chain/proposerTracker.d.ts.map +1 -0
  192. package/lib/chain/proposerTracker.js +75 -0
  193. package/lib/chain/proposerTracker.js.map +1 -0
  194. package/lib/chain/regen/interface.d.ts +2 -2
  195. package/lib/chain/regen/interface.d.ts.map +1 -1
  196. package/lib/chain/regen/interface.js +1 -1
  197. package/lib/chain/regen/interface.js.map +1 -1
  198. package/lib/chain/regen/queued.d.ts +1 -1
  199. package/lib/chain/regen/queued.d.ts.map +1 -1
  200. package/lib/chain/regen/queued.js +5 -3
  201. package/lib/chain/regen/queued.js.map +1 -1
  202. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  203. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  204. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  205. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  206. package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
  207. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  208. package/lib/chain/validation/executionPayloadBid.js +37 -158
  209. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  210. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  211. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  212. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  213. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  214. package/lib/chain/validation/inclusionList.d.ts +14 -0
  215. package/lib/chain/validation/inclusionList.d.ts.map +1 -0
  216. package/lib/chain/validation/inclusionList.js +150 -0
  217. package/lib/chain/validation/inclusionList.js.map +1 -0
  218. package/lib/chain/validation/index.d.ts +1 -0
  219. package/lib/chain/validation/index.d.ts.map +1 -1
  220. package/lib/chain/validation/index.js +1 -0
  221. package/lib/chain/validation/index.js.map +1 -1
  222. package/lib/chain/validatorMonitor.d.ts +1 -2
  223. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  224. package/lib/chain/validatorMonitor.js +0 -3
  225. package/lib/chain/validatorMonitor.js.map +1 -1
  226. package/lib/db/beacon.d.ts +7 -0
  227. package/lib/db/beacon.d.ts.map +1 -1
  228. package/lib/db/beacon.js +34 -0
  229. package/lib/db/beacon.js.map +1 -1
  230. package/lib/db/dataColumnStore.d.ts +1 -1
  231. package/lib/db/dataColumnStore.d.ts.map +1 -1
  232. package/lib/db/dataColumnStore.js +1 -4
  233. package/lib/db/dataColumnStore.js.map +1 -1
  234. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  235. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  236. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  237. package/lib/db/flatFileStore/slotIndex.js +2 -2
  238. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  239. package/lib/db/interface.d.ts +1 -0
  240. package/lib/db/interface.d.ts.map +1 -1
  241. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  242. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  243. package/lib/db/repositories/blobSidecars.js +0 -1
  244. package/lib/db/repositories/blobSidecars.js.map +1 -1
  245. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  246. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  247. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  248. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  249. package/lib/execution/builder/apiClient.d.ts +14 -8
  250. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  251. package/lib/execution/builder/apiClient.js +12 -10
  252. package/lib/execution/builder/apiClient.js.map +1 -1
  253. package/lib/execution/builder/http.d.ts +2 -0
  254. package/lib/execution/builder/http.d.ts.map +1 -1
  255. package/lib/execution/builder/http.js +2 -0
  256. package/lib/execution/builder/http.js.map +1 -1
  257. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  258. package/lib/execution/builder/validateBid.js +14 -1
  259. package/lib/execution/builder/validateBid.js.map +1 -1
  260. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  261. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  262. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  263. package/lib/execution/engine/disabled.d.ts +1 -0
  264. package/lib/execution/engine/disabled.d.ts.map +1 -1
  265. package/lib/execution/engine/disabled.js +3 -0
  266. package/lib/execution/engine/disabled.js.map +1 -1
  267. package/lib/execution/engine/http.d.ts +12 -8
  268. package/lib/execution/engine/http.d.ts.map +1 -1
  269. package/lib/execution/engine/http.js +35 -14
  270. package/lib/execution/engine/http.js.map +1 -1
  271. package/lib/execution/engine/index.d.ts +1 -1
  272. package/lib/execution/engine/index.d.ts.map +1 -1
  273. package/lib/execution/engine/index.js +1 -1
  274. package/lib/execution/engine/index.js.map +1 -1
  275. package/lib/execution/engine/interface.d.ts +29 -8
  276. package/lib/execution/engine/interface.d.ts.map +1 -1
  277. package/lib/execution/engine/interface.js.map +1 -1
  278. package/lib/execution/engine/jsonRpcTransport.d.ts +5 -6
  279. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  280. package/lib/execution/engine/jsonRpcTransport.js +34 -20
  281. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  282. package/lib/execution/engine/mock.d.ts +1 -1
  283. package/lib/execution/engine/mock.d.ts.map +1 -1
  284. package/lib/execution/engine/mock.js +31 -11
  285. package/lib/execution/engine/mock.js.map +1 -1
  286. package/lib/execution/engine/payloadIdCache.d.ts +5 -3
  287. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  288. package/lib/execution/engine/payloadIdCache.js +15 -4
  289. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  290. package/lib/execution/engine/restTransport.d.ts +4 -5
  291. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  292. package/lib/execution/engine/restTransport.js +4 -15
  293. package/lib/execution/engine/restTransport.js.map +1 -1
  294. package/lib/execution/engine/sszTypes.d.ts +38 -47
  295. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  296. package/lib/execution/engine/sszTypes.js +0 -5
  297. package/lib/execution/engine/sszTypes.js.map +1 -1
  298. package/lib/execution/engine/transport.d.ts +4 -14
  299. package/lib/execution/engine/transport.d.ts.map +1 -1
  300. package/lib/execution/engine/types.d.ts +25 -9
  301. package/lib/execution/engine/types.d.ts.map +1 -1
  302. package/lib/execution/engine/types.js +19 -14
  303. package/lib/execution/engine/types.js.map +1 -1
  304. package/lib/execution/engine/utils.d.ts.map +1 -1
  305. package/lib/execution/engine/utils.js +3 -2
  306. package/lib/execution/engine/utils.js.map +1 -1
  307. package/lib/index.d.ts +1 -0
  308. package/lib/index.d.ts.map +1 -1
  309. package/lib/index.js +2 -0
  310. package/lib/index.js.map +1 -1
  311. package/lib/metrics/metrics/beacon.d.ts +16 -9
  312. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  313. package/lib/metrics/metrics/beacon.js +35 -30
  314. package/lib/metrics/metrics/beacon.js.map +1 -1
  315. package/lib/metrics/metrics/lodestar.d.ts +42 -8
  316. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  317. package/lib/metrics/metrics/lodestar.js +104 -18
  318. package/lib/metrics/metrics/lodestar.js.map +1 -1
  319. package/lib/metrics/server/http.js +5 -5
  320. package/lib/metrics/server/http.js.map +1 -1
  321. package/lib/monitoring/service.js +1 -1
  322. package/lib/monitoring/service.js.map +1 -1
  323. package/lib/network/core/networkCore.d.ts +4 -1
  324. package/lib/network/core/networkCore.d.ts.map +1 -1
  325. package/lib/network/core/networkCore.js +7 -0
  326. package/lib/network/core/networkCore.js.map +1 -1
  327. package/lib/network/core/networkCoreWorker.js +2 -0
  328. package/lib/network/core/networkCoreWorker.js.map +1 -1
  329. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  330. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  331. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  332. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  333. package/lib/network/core/types.d.ts +6 -1
  334. package/lib/network/core/types.d.ts.map +1 -1
  335. package/lib/network/gossip/gossipsub.d.ts +1 -0
  336. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  337. package/lib/network/gossip/gossipsub.js +10 -0
  338. package/lib/network/gossip/gossipsub.js.map +1 -1
  339. package/lib/network/gossip/interface.d.ts +8 -9
  340. package/lib/network/gossip/interface.d.ts.map +1 -1
  341. package/lib/network/gossip/interface.js +1 -1
  342. package/lib/network/gossip/interface.js.map +1 -1
  343. package/lib/network/gossip/topic.d.ts +13 -21
  344. package/lib/network/gossip/topic.d.ts.map +1 -1
  345. package/lib/network/gossip/topic.js +13 -24
  346. package/lib/network/gossip/topic.js.map +1 -1
  347. package/lib/network/interface.d.ts +5 -5
  348. package/lib/network/interface.d.ts.map +1 -1
  349. package/lib/network/libp2p/index.d.ts.map +1 -1
  350. package/lib/network/libp2p/index.js +5 -1
  351. package/lib/network/libp2p/index.js.map +1 -1
  352. package/lib/network/network.d.ts +9 -7
  353. package/lib/network/network.d.ts.map +1 -1
  354. package/lib/network/network.js +58 -35
  355. package/lib/network/network.js.map +1 -1
  356. package/lib/network/options.d.ts +2 -0
  357. package/lib/network/options.d.ts.map +1 -1
  358. package/lib/network/options.js +2 -0
  359. package/lib/network/options.js.map +1 -1
  360. package/lib/network/peers/peerManager.d.ts +2 -1
  361. package/lib/network/peers/peerManager.d.ts.map +1 -1
  362. package/lib/network/peers/peerManager.js +28 -1
  363. package/lib/network/peers/peerManager.js.map +1 -1
  364. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  365. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  366. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  367. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  368. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
  369. package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
  370. package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
  371. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  372. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  373. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  374. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  375. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  376. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  377. package/lib/network/peers/utils/subnetMap.js +6 -3
  378. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  379. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  380. package/lib/network/processor/extractSlotRootFns.js +1 -8
  381. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  382. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  383. package/lib/network/processor/gossipHandlers.js +118 -149
  384. package/lib/network/processor/gossipHandlers.js.map +1 -1
  385. package/lib/network/processor/gossipQueues/index.js +6 -6
  386. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  387. package/lib/network/processor/gossipValidatorFn.js +5 -5
  388. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  389. package/lib/network/processor/index.d.ts +11 -0
  390. package/lib/network/processor/index.d.ts.map +1 -1
  391. package/lib/network/processor/index.js +66 -30
  392. package/lib/network/processor/index.js.map +1 -1
  393. package/lib/network/reqresp/ReqRespBeaconNode.js +6 -3
  394. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  395. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  396. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  397. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
  398. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
  399. package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
  400. package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
  401. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  402. package/lib/network/reqresp/handlers/index.js +6 -12
  403. package/lib/network/reqresp/handlers/index.js.map +1 -1
  404. package/lib/network/reqresp/protocols.d.ts +1 -2
  405. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  406. package/lib/network/reqresp/protocols.js +5 -10
  407. package/lib/network/reqresp/protocols.js.map +1 -1
  408. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  409. package/lib/network/reqresp/rateLimit.js +5 -17
  410. package/lib/network/reqresp/rateLimit.js.map +1 -1
  411. package/lib/network/reqresp/types.d.ts +6 -9
  412. package/lib/network/reqresp/types.d.ts.map +1 -1
  413. package/lib/network/reqresp/types.js +4 -7
  414. package/lib/network/reqresp/types.js.map +1 -1
  415. package/lib/network/subnets/attnetsService.d.ts +35 -5
  416. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  417. package/lib/network/subnets/attnetsService.js +84 -6
  418. package/lib/network/subnets/attnetsService.js.map +1 -1
  419. package/lib/network/subnets/interface.d.ts +7 -0
  420. package/lib/network/subnets/interface.d.ts.map +1 -1
  421. package/lib/network/subnets/interface.js.map +1 -1
  422. package/lib/node/nodejs.d.ts +3 -1
  423. package/lib/node/nodejs.d.ts.map +1 -1
  424. package/lib/node/nodejs.js +47 -21
  425. package/lib/node/nodejs.js.map +1 -1
  426. package/lib/node/options.d.ts +3 -1
  427. package/lib/node/options.d.ts.map +1 -1
  428. package/lib/node/options.js +4 -2
  429. package/lib/node/options.js.map +1 -1
  430. package/lib/sync/interface.d.ts.map +1 -1
  431. package/lib/sync/interface.js.map +1 -1
  432. package/lib/sync/range/batch.d.ts +2 -3
  433. package/lib/sync/range/batch.d.ts.map +1 -1
  434. package/lib/sync/range/batch.js +9 -22
  435. package/lib/sync/range/batch.js.map +1 -1
  436. package/lib/sync/range/chain.d.ts.map +1 -1
  437. package/lib/sync/range/chain.js +2 -15
  438. package/lib/sync/range/chain.js.map +1 -1
  439. package/lib/sync/sync.d.ts +7 -0
  440. package/lib/sync/sync.d.ts.map +1 -1
  441. package/lib/sync/sync.js +61 -3
  442. package/lib/sync/sync.js.map +1 -1
  443. package/lib/sync/unknownBlock.d.ts.map +1 -1
  444. package/lib/sync/unknownBlock.js +43 -25
  445. package/lib/sync/unknownBlock.js.map +1 -1
  446. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  447. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  448. package/lib/sync/utils/downloadByRange.js +24 -128
  449. package/lib/sync/utils/downloadByRange.js.map +1 -1
  450. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  451. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  452. package/lib/sync/utils/downloadByRoot.js +14 -99
  453. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  454. package/lib/util/blobs.d.ts +1 -7
  455. package/lib/util/blobs.d.ts.map +1 -1
  456. package/lib/util/blobs.js +0 -19
  457. package/lib/util/blobs.js.map +1 -1
  458. package/lib/util/execution.d.ts +3 -4
  459. package/lib/util/execution.d.ts.map +1 -1
  460. package/lib/util/execution.js +1 -73
  461. package/lib/util/execution.js.map +1 -1
  462. package/lib/util/file.d.ts.map +1 -1
  463. package/lib/util/file.js +8 -9
  464. package/lib/util/file.js.map +1 -1
  465. package/lib/util/queue/itemQueue.js +1 -1
  466. package/lib/util/queue/itemQueue.js.map +1 -1
  467. package/lib/util/sszBytes.d.ts +5 -1
  468. package/lib/util/sszBytes.d.ts.map +1 -1
  469. package/lib/util/sszBytes.js +36 -19
  470. package/lib/util/sszBytes.js.map +1 -1
  471. package/lib/util/types.d.ts +0 -5
  472. package/lib/util/types.d.ts.map +1 -1
  473. package/lib/util/types.js +1 -2
  474. package/lib/util/types.js.map +1 -1
  475. package/package.json +31 -32
  476. package/src/api/impl/api.ts +1 -1
  477. package/src/api/impl/beacon/blocks/index.ts +81 -126
  478. package/src/api/impl/beacon/index.ts +3 -1
  479. package/src/api/impl/beacon/pool/index.ts +31 -1
  480. package/src/api/impl/beacon/state/index.ts +10 -1
  481. package/src/api/impl/beacon/state/utils.ts +20 -10
  482. package/src/api/impl/debug/index.ts +4 -0
  483. package/src/api/impl/validator/index.ts +178 -39
  484. package/src/api/options.ts +3 -0
  485. package/src/chain/GetBlobsTracker.ts +82 -52
  486. package/src/chain/archiveStore/archiveStore.ts +1 -0
  487. package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
  488. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  489. package/src/chain/blocks/blockInput/errors.ts +1 -2
  490. package/src/chain/blocks/blockInput/types.ts +2 -20
  491. package/src/chain/blocks/importBlock.ts +58 -77
  492. package/src/chain/blocks/importExecutionPayload.ts +123 -36
  493. package/src/chain/blocks/index.ts +11 -4
  494. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  495. package/src/chain/blocks/types.ts +8 -29
  496. package/src/chain/blocks/verifyBlock.ts +31 -16
  497. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  498. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  499. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  500. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
  501. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  502. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  503. package/src/chain/bls/interface.ts +2 -0
  504. package/src/chain/bls/multithread/index.ts +48 -24
  505. package/src/chain/bls/multithread/types.ts +1 -1
  506. package/src/chain/bls/multithread/worker.ts +1 -5
  507. package/src/chain/bls/singleThread.ts +1 -1
  508. package/src/chain/bls/utils.ts +1 -1
  509. package/src/chain/chain.ts +144 -42
  510. package/src/chain/emitter.ts +8 -8
  511. package/src/chain/errors/blockError.ts +1 -1
  512. package/src/chain/errors/executionPayloadBid.ts +12 -0
  513. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  514. package/src/chain/errors/inclusionList.ts +38 -0
  515. package/src/chain/errors/index.ts +1 -1
  516. package/src/chain/forkChoice/index.ts +11 -0
  517. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  518. package/src/chain/interface.ts +11 -6
  519. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  520. package/src/chain/opPools/attestationPool.ts +16 -4
  521. package/src/chain/opPools/inclusionListStore.ts +208 -0
  522. package/src/chain/opPools/index.ts +2 -0
  523. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  524. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  525. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  526. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  527. package/src/chain/opPools/utils.ts +1 -1
  528. package/src/chain/options.ts +5 -4
  529. package/src/chain/produceBlock/produceBlockBody.ts +67 -22
  530. package/src/chain/proposerTracker.ts +94 -0
  531. package/src/chain/regen/interface.ts +2 -2
  532. package/src/chain/regen/queued.ts +6 -4
  533. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  534. package/src/chain/validation/executionPayloadBid.ts +54 -183
  535. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  536. package/src/chain/validation/inclusionList.ts +192 -0
  537. package/src/chain/validation/index.ts +1 -0
  538. package/src/chain/validatorMonitor.ts +0 -6
  539. package/src/db/beacon.ts +44 -0
  540. package/src/db/dataColumnStore.ts +2 -4
  541. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  542. package/src/db/flatFileStore/slotIndex.ts +4 -3
  543. package/src/db/interface.ts +2 -0
  544. package/src/db/repositories/blobSidecars.ts +0 -1
  545. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  546. package/src/execution/builder/apiClient.ts +16 -13
  547. package/src/execution/builder/http.ts +4 -0
  548. package/src/execution/builder/validateBid.ts +23 -2
  549. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  550. package/src/execution/engine/disabled.ts +4 -0
  551. package/src/execution/engine/http.ts +59 -47
  552. package/src/execution/engine/index.ts +1 -1
  553. package/src/execution/engine/interface.ts +46 -13
  554. package/src/execution/engine/jsonRpcTransport.ts +56 -31
  555. package/src/execution/engine/mock.ts +32 -14
  556. package/src/execution/engine/payloadIdCache.ts +24 -6
  557. package/src/execution/engine/restTransport.ts +18 -23
  558. package/src/execution/engine/sszTypes.ts +0 -9
  559. package/src/execution/engine/transport.ts +13 -17
  560. package/src/execution/engine/types.ts +44 -24
  561. package/src/execution/engine/utils.ts +4 -2
  562. package/src/index.ts +2 -0
  563. package/src/metrics/metrics/beacon.ts +37 -30
  564. package/src/metrics/metrics/lodestar.ts +106 -18
  565. package/src/metrics/server/http.ts +5 -5
  566. package/src/monitoring/service.ts +1 -1
  567. package/src/network/core/networkCore.ts +11 -1
  568. package/src/network/core/networkCoreWorker.ts +2 -0
  569. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  570. package/src/network/core/types.ts +6 -1
  571. package/src/network/gossip/gossipsub.ts +11 -0
  572. package/src/network/gossip/interface.ts +5 -5
  573. package/src/network/gossip/topic.ts +14 -25
  574. package/src/network/interface.ts +4 -5
  575. package/src/network/libp2p/index.ts +5 -1
  576. package/src/network/network.ts +66 -58
  577. package/src/network/options.ts +4 -0
  578. package/src/network/peers/peerManager.ts +28 -3
  579. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  580. package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
  581. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  582. package/src/network/peers/utils/subnetMap.ts +6 -3
  583. package/src/network/processor/extractSlotRootFns.ts +0 -9
  584. package/src/network/processor/gossipHandlers.ts +150 -183
  585. package/src/network/processor/gossipQueues/index.ts +6 -6
  586. package/src/network/processor/gossipValidatorFn.ts +5 -5
  587. package/src/network/processor/index.ts +58 -28
  588. package/src/network/processor/types.ts +1 -1
  589. package/src/network/reqresp/ReqRespBeaconNode.ts +7 -7
  590. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  591. package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
  592. package/src/network/reqresp/handlers/index.ts +5 -17
  593. package/src/network/reqresp/protocols.ts +6 -12
  594. package/src/network/reqresp/rateLimit.ts +5 -17
  595. package/src/network/reqresp/types.ts +6 -13
  596. package/src/network/subnets/attnetsService.ts +94 -6
  597. package/src/network/subnets/interface.ts +7 -0
  598. package/src/node/nodejs.ts +58 -22
  599. package/src/node/options.ts +9 -6
  600. package/src/sync/interface.ts +1 -0
  601. package/src/sync/range/batch.ts +9 -21
  602. package/src/sync/range/chain.ts +2 -14
  603. package/src/sync/sync.ts +65 -4
  604. package/src/sync/unknownBlock.ts +48 -36
  605. package/src/sync/utils/downloadByRange.ts +31 -230
  606. package/src/sync/utils/downloadByRoot.ts +15 -142
  607. package/src/util/blobs.ts +0 -34
  608. package/src/util/execution.ts +8 -102
  609. package/src/util/file.ts +8 -9
  610. package/src/util/queue/itemQueue.ts +1 -1
  611. package/src/util/sszBytes.ts +42 -24
  612. package/src/util/types.ts +1 -8
  613. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  614. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  615. package/lib/chain/errors/blobSidecarError.js +0 -38
  616. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  617. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  618. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  619. package/lib/chain/validation/blobSidecar.js +0 -276
  620. package/lib/chain/validation/blobSidecar.js.map +0 -1
  621. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  622. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  623. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  624. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  625. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  626. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  627. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  628. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  629. package/src/chain/errors/blobSidecarError.ts +0 -70
  630. package/src/chain/validation/blobSidecar.ts +0 -357
  631. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  632. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -7,7 +7,7 @@ import {Worker, spawn} from "@chainsafe/threads";
7
7
  self = undefined;
8
8
 
9
9
  import {ISignatureSet} from "@lodestar/state-transition";
10
- import {Logger} from "@lodestar/utils";
10
+ import {Logger, defer} from "@lodestar/utils";
11
11
  import {Metrics} from "../../../metrics/index.js";
12
12
  import {LinkedList} from "../../../util/array.js";
13
13
  import {callInNextEventLoop} from "../../../util/eventLoop.js";
@@ -94,7 +94,7 @@ type WorkerStatus =
94
94
  | {code: WorkerStatusCode.initializing; initPromise: Promise<WorkerApi>}
95
95
  | {code: WorkerStatusCode.initializationError; error: Error}
96
96
  | {code: WorkerStatusCode.idle; workerApi: WorkerApi}
97
- | {code: WorkerStatusCode.running; workerApi: WorkerApi};
97
+ | {code: WorkerStatusCode.running; workerApi: WorkerApi; abort: () => void};
98
98
 
99
99
  type WorkerDescriptor = {
100
100
  worker: Worker;
@@ -126,7 +126,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
126
126
  timeout: NodeJS.Timeout;
127
127
  } | null = null;
128
128
  private blsVerifyAllMultiThread: boolean;
129
- private closed = false;
129
+ private closePromise: Promise<void> | undefined;
130
130
  private workersBusy = 0;
131
131
 
132
132
  constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules) {
@@ -149,6 +149,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
149
149
 
150
150
  canAcceptWork(): boolean {
151
151
  return (
152
+ this.closePromise === undefined &&
152
153
  this.workersBusy < blsPoolSize &&
153
154
  // TODO: Should also bound the jobs queue?
154
155
  this.jobs.length < MAX_JOBS_CAN_ACCEPT_WORK
@@ -156,6 +157,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
156
157
  }
157
158
 
158
159
  async verifySignatureSets(sets: ISignatureSet[], opts: VerifySignatureOpts = {}): Promise<boolean> {
160
+ if (this.closePromise !== undefined) throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
159
161
  this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
160
162
  this.metrics?.blsThreadPool.totalSigSets.inc(sets.length);
161
163
  if (opts.priority) {
@@ -208,6 +210,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
208
210
  message: Uint8Array,
209
211
  opts: Omit<VerifySignatureOpts, "verifyOnMainThread"> = {}
210
212
  ): Promise<boolean[]> {
213
+ if (this.closePromise !== undefined) throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
211
214
  const promises: Promise<boolean[]>[] = [];
212
215
  for (const setsChunk of chunkSameMessageSignatureSets(sets)) {
213
216
  promises.push(
@@ -229,9 +232,14 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
229
232
  return results.flat();
230
233
  }
231
234
 
232
- async close(): Promise<void> {
235
+ close(): Promise<void> {
236
+ if (this.closePromise !== undefined) return this.closePromise;
233
237
  if (this.bufferedJobs) {
234
238
  clearTimeout(this.bufferedJobs.timeout);
239
+ for (const jobs of [this.bufferedJobs.jobs, this.bufferedJobs.prioritizedJobs]) {
240
+ for (const job of jobs) job.reject(new QueueError({code: QueueErrorCode.QUEUE_ABORTED}));
241
+ }
242
+ this.bufferedJobs = null;
235
243
  }
236
244
 
237
245
  // Abort all jobs
@@ -241,15 +249,21 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
241
249
  this.jobs.clear();
242
250
 
243
251
  // Terminate all workers. await to ensure no workers are left hanging
244
- await Promise.all(
252
+ this.closePromise = Promise.all(
245
253
  Array.from(this.workers.entries()).map(([id, worker]) =>
246
254
  // NOTE: 'threads' has not yet updated types, and NodeJS complains with
247
255
  // [DEP0132] DeprecationWarning: Passing a callback to worker.terminate() is deprecated. It returns a Promise instead.
248
- (worker.worker.terminate() as unknown as Promise<void>).catch((e: Error) => {
249
- this.logger.error("Error terminating worker", {id}, e);
250
- })
256
+ (worker.worker.terminate() as unknown as Promise<void>)
257
+ .catch((e: Error) => {
258
+ this.logger.error("Error terminating worker", {id}, e);
259
+ })
260
+ .finally(() => {
261
+ // threads does not settle outstanding RPC calls when its worker exits.
262
+ if (worker.status.code === WorkerStatusCode.running) worker.status.abort();
263
+ })
251
264
  )
252
- );
265
+ ).then(() => {});
266
+ return this.closePromise;
253
267
  }
254
268
 
255
269
  private createWorkers(poolSize: number): WorkerDescriptor[] {
@@ -295,7 +309,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
295
309
  * Register BLS work to be done eventually in a worker
296
310
  */
297
311
  private queueBlsWork(job: JobQueueItem): void {
298
- if (this.closed) {
312
+ if (this.closePromise !== undefined) {
299
313
  throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
300
314
  }
301
315
 
@@ -333,16 +347,20 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
333
347
  }
334
348
  }
335
349
 
350
+ // First hand work to an idle worker before returning to the caller.
351
+ // Deferring the post to the next macrotask would make the worker
352
+ // sit idle while waiting for the next synchronous work
353
+ else if (job.opts.priority) {
354
+ this.jobs.unshift(job);
355
+ void this.runJob();
356
+ }
357
+
336
358
  // Push job and schedule to call `runJob` in the next macro event loop cycle.
337
359
  // This is useful to allow batching job submitted from a synchronous for loop,
338
360
  // and to prevent large stacks since runJob may be called recursively.
339
361
  else {
340
- if (job.opts.priority) {
341
- this.jobs.unshift(job);
342
- } else {
343
- this.jobs.push(job);
344
- }
345
- callInNextEventLoop(this.runJob);
362
+ this.jobs.push(job);
363
+ callInNextEventLoop(() => void this.runJob());
346
364
  }
347
365
  }
348
366
 
@@ -350,7 +368,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
350
368
  * Potentially submit jobs to an idle worker, only if there's a worker and jobs
351
369
  */
352
370
  private runJob = async (): Promise<void> => {
353
- if (this.closed) {
371
+ if (this.closePromise !== undefined) {
354
372
  return;
355
373
  }
356
374
 
@@ -371,13 +389,18 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
371
389
  // Maybe it's not useful since all data referenced in jobs is likely referenced by others
372
390
 
373
391
  const workerApi = worker.status.workerApi;
374
- worker.status = {code: WorkerStatusCode.running, workerApi};
392
+ const completion = defer<BlsWorkResult>();
393
+ worker.status = {
394
+ code: WorkerStatusCode.running,
395
+ workerApi,
396
+ abort: () => completion.reject(new QueueError({code: QueueErrorCode.QUEUE_ABORTED})),
397
+ };
375
398
  this.workersBusy++;
376
399
  const jobsStarted: JobQueueItem[] = [];
377
400
  let completedJobsCount = 0;
378
401
 
379
402
  if (this.jobs.length > 0) {
380
- callInNextEventLoop(this.runJob);
403
+ callInNextEventLoop(() => void this.runJob());
381
404
  }
382
405
 
383
406
  try {
@@ -423,7 +446,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
423
446
  if (workReqs.length === 0) {
424
447
  worker.status = {code: WorkerStatusCode.idle, workerApi};
425
448
  this.workersBusy--;
426
- callInNextEventLoop(this.runJob);
449
+ callInNextEventLoop(() => void this.runJob());
427
450
  return;
428
451
  }
429
452
 
@@ -437,7 +460,8 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
437
460
  // If worker communication or result processing throws, all unresolved jobs are rejected.
438
461
 
439
462
  const [jobStartSec, jobStartNs] = process.hrtime();
440
- const workResult = await workerApi.verifyManySignatureSets(workReqs);
463
+ void workerApi.verifyManySignatureSets(workReqs).then(completion.resolve, completion.reject);
464
+ const workResult = await completion.promise;
441
465
  const [jobEndSec, jobEndNs] = process.hrtime();
442
466
  const {workerId, batchRetries, batchSigsSuccess, verificationCalls, workerStartTime, workerEndTime, results} =
443
467
  workResult;
@@ -481,7 +505,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
481
505
  }
482
506
  } catch (e) {
483
507
  // Worker communications should never reject
484
- if (!this.closed) {
508
+ if (this.closePromise === undefined) {
485
509
  this.logger.error("BlsMultiThreadWorkerPool error", {}, e as Error);
486
510
  }
487
511
  // Reject jobs that were not already completed
@@ -499,7 +523,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
499
523
  this.workersBusy--;
500
524
 
501
525
  // Potentially run a new job
502
- callInNextEventLoop(this.runJob);
526
+ callInNextEventLoop(() => void this.runJob());
503
527
  };
504
528
 
505
529
  /**
@@ -542,7 +566,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
542
566
  this.jobs.unshift(job);
543
567
  }
544
568
  this.bufferedJobs = null;
545
- callInNextEventLoop(this.runJob);
569
+ callInNextEventLoop(() => void this.runJob());
546
570
  }
547
571
  };
548
572
 
@@ -1,4 +1,4 @@
1
- import {type BlsSignatureSet} from "@chainsafe/lodestar-z/bls-verifier";
1
+ import {type BlsSignatureSet} from "@lodestar/native/bls-verifier";
2
2
  import {SameMessageSignatureSet, VerifySignatureOpts} from "../interface.js";
3
3
 
4
4
  export type WorkerData = {
@@ -1,10 +1,6 @@
1
1
  import worker from "node:worker_threads";
2
- import {
3
- type BlsSignatureSet,
4
- verifySignatureSets,
5
- verifySignatureSetsSameMessage,
6
- } from "@chainsafe/lodestar-z/bls-verifier";
7
2
  import {expose} from "@chainsafe/threads/worker";
3
+ import {type BlsSignatureSet, verifySignatureSets, verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
8
4
  import {
9
5
  BlsWorkReq,
10
6
  BlsWorkResult,
@@ -1,4 +1,4 @@
1
- import {verifySignatureSetsSameMessage} from "@chainsafe/lodestar-z/bls-verifier";
1
+ import {verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
2
2
  import {ISignatureSet} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../metrics/index.js";
4
4
  import {IBlsVerifier, SameMessageSignatureSet} from "./interface.js";
@@ -2,7 +2,7 @@ import {
2
2
  BLS_VERIFIER_MAX_BATCH_SIZE,
3
3
  BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE,
4
4
  verifySignatureSets,
5
- } from "@chainsafe/lodestar-z/bls-verifier";
5
+ } from "@lodestar/native/bls-verifier";
6
6
  import {ISignatureSet, SignatureSetType, toBlsSignatureSet} from "@lodestar/state-transition";
7
7
  import {SameMessageSignatureSet} from "./interface.js";
8
8
 
@@ -1,10 +1,10 @@
1
1
  import path from "node:path";
2
2
  import {PrivateKey} from "@libp2p/interface";
3
- import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
4
3
  import {Type} from "@chainsafe/ssz";
5
4
  import {routes} from "@lodestar/api";
6
5
  import {BeaconConfig} from "@lodestar/config";
7
6
  import {
7
+ AncestorStatus,
8
8
  CheckpointWithHex,
9
9
  EpochDifference,
10
10
  ForkChoiceStateGetter,
@@ -14,12 +14,14 @@ import {
14
14
  UpdateHeadOpt,
15
15
  } from "@lodestar/fork-choice";
16
16
  import {LoggerNode} from "@lodestar/logger/node";
17
+ import {type PubkeyCache} from "@lodestar/native/pubkeys";
17
18
  import {
18
19
  EFFECTIVE_BALANCE_INCREMENT,
19
20
  type ForkPostFulu,
20
21
  type ForkPostGloas,
21
22
  GENESIS_SLOT,
22
23
  SLOTS_PER_EPOCH,
24
+ isForkPostFulu,
23
25
  isForkPostGloas,
24
26
  } from "@lodestar/params";
25
27
  import {
@@ -33,6 +35,7 @@ import {
33
35
  isStatePostAltair,
34
36
  isStatePostElectra,
35
37
  isStatePostGloas,
38
+ proposerShufflingDecisionRoot,
36
39
  } from "@lodestar/state-transition";
37
40
  import {
38
41
  BeaconBlock,
@@ -60,7 +63,6 @@ import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRoot
60
63
  import {ProcessShutdownCallback} from "@lodestar/validator";
61
64
  import {GENESIS_EPOCH, HALF_SLOT_BPS, ZERO_HASH} from "../constants/index.js";
62
65
  import {IBeaconDb} from "../db/index.js";
63
- import {BLOB_SIDECARS_IN_WRAPPER_INDEX} from "../db/repositories/blobSidecars.js";
64
66
  import {decodeArchivedEnvelope} from "../db/repositories/index.js";
65
67
  import {BuilderApiClient, BuilderApiClientOpts} from "../execution/builder/apiClient.js";
66
68
  import {BuilderStatus} from "../execution/builder/http.js";
@@ -80,7 +82,7 @@ import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.js";
80
82
  import {ArchiveStore} from "./archiveStore/archiveStore.js";
81
83
  import {CheckpointBalancesCache} from "./balancesCache.js";
82
84
  import {BeaconProposerCache} from "./beaconProposerCache.js";
83
- import {IBlockInput, isBlockInputBlobs, isBlockInputColumns} from "./blocks/blockInput/index.js";
85
+ import {IBlockInput, isBlockInputColumns} from "./blocks/blockInput/index.js";
84
86
  import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
85
87
  import {PayloadEnvelopeInputSource} from "./blocks/payloadEnvelopeInput/index.js";
86
88
  import {PayloadEnvelopeProcessor} from "./blocks/payloadEnvelopeProcessor.js";
@@ -90,8 +92,9 @@ import {persistPayloadEnvelopeInput} from "./blocks/writePayloadEnvelopeInputToD
90
92
  import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
91
93
  import {BuilderCircuitBreaker} from "./builderCircuitBreaker.js";
92
94
  import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
93
- import {ChainEvent, ChainEventEmitter} from "./emitter.js";
95
+ import {ChainEvent, ChainEventEmitter, ReorgEventData} from "./emitter.js";
94
96
  import {ForkchoiceCaller, initializeForkChoice} from "./forkChoice/index.js";
97
+ import {ForkChoiceExecutionEngine} from "./forkChoiceExecutionEngine.js";
95
98
  import {GetBlobsTracker} from "./GetBlobsTracker.js";
96
99
  import {CommonBlockBody, FindHeadFnName, IBeaconChain, ProposerPreparationData, StateGetOpts} from "./interface.js";
97
100
  import {LightClientServer} from "./lightClient/index.js";
@@ -100,9 +103,11 @@ import {
100
103
  AttestationPool,
101
104
  DeferredVoluntaryExitPool,
102
105
  ExecutionPayloadBidPool,
106
+ InclusionListStore,
103
107
  OpPool,
104
108
  PayloadAttestationPool,
105
109
  ProposerPreferencesPool,
110
+ SingleAttestationPool,
106
111
  SyncCommitteeMessagePool,
107
112
  SyncContributionAndProofPool,
108
113
  } from "./opPools/index.js";
@@ -111,6 +116,7 @@ import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
111
116
  import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
112
117
  import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
113
118
  import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
119
+ import {ProposerTracker} from "./proposerTracker.js";
114
120
  import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
115
121
  import {ReprocessController} from "./reprocess.js";
116
122
  import {
@@ -165,7 +171,7 @@ const DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES = 16;
165
171
  export class BeaconChain implements IBeaconChain {
166
172
  readonly genesisTime: UintNum64;
167
173
  readonly genesisValidatorsRoot: Root;
168
- readonly executionEngine: IExecutionEngine;
174
+ readonly executionEngine: ForkChoiceExecutionEngine;
169
175
  readonly executionBuilder?: IExecutionBuilder;
170
176
  readonly builderCircuitBreaker: BuilderCircuitBreaker;
171
177
  readonly builderApiClient: BuilderApiClient;
@@ -193,11 +199,19 @@ export class BeaconChain implements IBeaconChain {
193
199
  // Ops pool
194
200
  readonly attestationPool: AttestationPool;
195
201
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
202
+ readonly singleAttestationPool: SingleAttestationPool;
203
+ readonly proposerTracker: ProposerTracker;
204
+ /**
205
+ * Head state epoch and decision root of its next epoch proposers when local proposals were last refreshed. The root
206
+ * alone is not enough: a reorg onto a branch without blocks in a whole epoch keeps the root but moves the epoch
207
+ */
208
+ private localProposalsKey: string | null = null;
196
209
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
197
210
  readonly syncContributionAndProofPool;
198
211
  readonly executionPayloadBidPool: ExecutionPayloadBidPool;
199
212
  readonly payloadAttestationPool: PayloadAttestationPool;
200
213
  readonly proposerPreferencesPool = new ProposerPreferencesPool();
214
+ readonly inclusionListStore: InclusionListStore;
201
215
  readonly opPool: OpPool;
202
216
  readonly deferredVoluntaryExitPool: DeferredVoluntaryExitPool;
203
217
 
@@ -315,7 +329,6 @@ export class BeaconChain implements IBeaconChain {
315
329
  this.genesisTime = anchorState.genesisTime;
316
330
  this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
317
331
  this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
318
- this.executionEngine = executionEngine;
319
332
  this.executionBuilder = executionBuilder;
320
333
  const signal = this.abortController.signal;
321
334
  const emitter = new ChainEventEmitter();
@@ -329,12 +342,15 @@ export class BeaconChain implements IBeaconChain {
329
342
  this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
330
343
  this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
331
344
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics, logger);
345
+ this.singleAttestationPool = new SingleAttestationPool(metrics);
346
+ this.proposerTracker = new ProposerTracker(this.opts.singleAttestationIgnoreProposalDuty ?? false, metrics);
332
347
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
333
348
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
334
349
  this.executionPayloadBidPool = new ExecutionPayloadBidPool();
335
350
  this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
336
351
  this.opPool = new OpPool(config);
337
352
  this.deferredVoluntaryExitPool = new DeferredVoluntaryExitPool(logger);
353
+ this.inclusionListStore = new InclusionListStore(config);
338
354
 
339
355
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
340
356
  this.seenContributionAndProof = new SeenContributionAndProof(metrics);
@@ -454,6 +470,12 @@ export class BeaconChain implements IBeaconChain {
454
470
  this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
455
471
 
456
472
  this.forkChoice = forkChoice;
473
+ this.executionEngine = new ForkChoiceExecutionEngine(executionEngine, {
474
+ forkChoice,
475
+ recomputeHeadAfterELInvalidResponse: () => this.recomputeHeadAfterELInvalidResponse(),
476
+ logger,
477
+ metrics,
478
+ });
457
479
 
458
480
  this.builderCircuitBreaker = new BuilderCircuitBreaker(
459
481
  {faultInspectionWindow: opts.faultInspectionWindow, allowedFaults: opts.allowedFaults},
@@ -930,16 +952,6 @@ export class BeaconChain implements IBeaconChain {
930
952
  }
931
953
 
932
954
  async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
933
- const blockInput = this.seenBlockInputCache.get(blockRootHex);
934
- if (blockInput) {
935
- if (!isBlockInputBlobs(blockInput)) {
936
- throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
937
- }
938
- if (!blockInput.hasAllData()) {
939
- return null;
940
- }
941
- return blockInput.getBlobs();
942
- }
943
955
  const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
944
956
  if (unfinalizedBlobSidecars) {
945
957
  return unfinalizedBlobSidecars;
@@ -947,28 +959,6 @@ export class BeaconChain implements IBeaconChain {
947
959
  return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
948
960
  }
949
961
 
950
- async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
951
- const blockInput = this.seenBlockInputCache.get(blockRootHex);
952
- if (blockInput) {
953
- if (!isBlockInputBlobs(blockInput)) {
954
- throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
955
- }
956
- if (!blockInput.hasAllData()) {
957
- return null;
958
- }
959
- return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
960
- }
961
- const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
962
- if (unfinalizedBlobSidecarsWrapper) {
963
- return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
964
- }
965
- const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
966
- if (finalizedBlobSidecarsWrapper) {
967
- return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
968
- }
969
- return null;
970
- }
971
-
972
962
  async getSerializedExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
973
963
  const [bytes] = await this.getSerializedExecutionPayloadEnvelopes([{blockSlot, blockRootHex}]);
974
964
  return bytes;
@@ -1427,6 +1417,58 @@ export class BeaconChain implements IBeaconChain {
1427
1417
  }
1428
1418
  }
1429
1419
 
1420
+ /**
1421
+ * Apply chain side effects of a fork choice head change: head state, head metrics, and reorg detection
1422
+ */
1423
+ onHeadChanged(oldHead: ProtoBlock, newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void {
1424
+ // Set head state as strong reference
1425
+ this.regen.updateHeadState(newHead, maybeHeadState);
1426
+
1427
+ const delaySec = this.clock.secFromSlot(newHead.slot);
1428
+ this.logger.verbose("New chain head", {
1429
+ slot: newHead.slot,
1430
+ root: newHead.blockRoot,
1431
+ payloadStatus: newHead.payloadStatus,
1432
+ delaySec,
1433
+ });
1434
+ this.metrics?.headSlot.set(newHead.slot);
1435
+
1436
+ this.onNewHead(newHead);
1437
+ this.metrics?.forkChoice.changedHead.inc();
1438
+
1439
+ const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
1440
+ if (ancestorResult.code === AncestorStatus.CommonAncestor) {
1441
+ // CommonAncestor = chain reorg, old head and new head not direct descendants
1442
+
1443
+ const forkChoiceReorgEventData: ReorgEventData = {
1444
+ depth: ancestorResult.depth,
1445
+ epoch: computeEpochAtSlot(newHead.slot),
1446
+ slot: newHead.slot,
1447
+ newHeadBlock: newHead.blockRoot,
1448
+ oldHeadBlock: oldHead.blockRoot,
1449
+ newHeadState: newHead.stateRoot,
1450
+ oldHeadState: oldHead.stateRoot,
1451
+ executionOptimistic: isOptimisticBlock(newHead),
1452
+ };
1453
+
1454
+ this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
1455
+ this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
1456
+
1457
+ this.metrics?.forkChoice.reorg.inc();
1458
+ this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
1459
+ }
1460
+ }
1461
+
1462
+ private recomputeHeadAfterELInvalidResponse(): void {
1463
+ // validateLatestHash only re-scores proto-array, the cached head is still the old one
1464
+ const oldHead = this.forkChoice.getHead();
1465
+ const newHead = this.recomputeForkChoiceHead(ForkchoiceCaller.executionInvalid);
1466
+ if (newHead.blockRoot === oldHead.blockRoot && newHead.payloadStatus === oldHead.payloadStatus) {
1467
+ return;
1468
+ }
1469
+ this.onHeadChanged(oldHead, newHead);
1470
+ }
1471
+
1430
1472
  /**
1431
1473
  * Emit `head` and `head_v2` when the fork choice head differs between two observations. Every caller that
1432
1474
  * can move the head, `updateAndGetHead()` and `updateTime()`, must capture the head before and pass both.
@@ -1483,10 +1525,10 @@ export class BeaconChain implements IBeaconChain {
1483
1525
  this.metrics?.forkChoice.requests.inc();
1484
1526
  const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.predictProposerHead});
1485
1527
  const slot = this.clock.currentSlot;
1486
- const secFromSlot = this.clock.secFromSlot(slot);
1528
+ const msFromSlot = this.clock.msFromSlot(slot);
1487
1529
 
1488
1530
  try {
1489
- return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, secFromSlot, slot}).head;
1531
+ return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, msFromSlot, slot}).head;
1490
1532
  } catch (e) {
1491
1533
  this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetPredictedProposerHead});
1492
1534
  throw e;
@@ -1498,13 +1540,13 @@ export class BeaconChain implements IBeaconChain {
1498
1540
  getProposerHead(slot: Slot): ProtoBlock {
1499
1541
  this.metrics?.forkChoice.requests.inc();
1500
1542
  const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.getProposerHead});
1501
- const secFromSlot = this.clock.secFromSlot(slot);
1543
+ const msFromSlot = this.clock.msFromSlot(slot);
1502
1544
 
1503
1545
  try {
1504
1546
  // Do not emit head event here, when proposing we rely on the one emitted when importing our own block
1505
1547
  const {head, isHeadTimely, notReorgedReason} = this.forkChoice.updateAndGetHead({
1506
1548
  mode: UpdateHeadOpt.GetProposerHead,
1507
- secFromSlot,
1549
+ msFromSlot,
1508
1550
  slot,
1509
1551
  });
1510
1552
 
@@ -1826,12 +1868,15 @@ export class BeaconChain implements IBeaconChain {
1826
1868
 
1827
1869
  this.attestationPool.prune(slot);
1828
1870
  this.aggregatedAttestationPool.prune(slot);
1871
+ this.proposerTracker.prune(slot);
1872
+ this.singleAttestationPool.prune(this.proposerTracker);
1829
1873
  this.syncCommitteeMessagePool.prune(slot);
1830
1874
  this.seenSyncCommitteeMessages.prune(slot);
1831
1875
  this.payloadAttestationPool.prune(slot);
1832
1876
  this.executionPayloadBidPool.prune(slot);
1833
1877
  this.seenExecutionPayloadBids.prune(slot);
1834
1878
  this.proposerPreferencesPool.prune(slot);
1879
+ this.inclusionListStore.prune(slot);
1835
1880
  this.seenAttestationDatas.onSlot(slot);
1836
1881
  this.reprocessController.onSlot(slot);
1837
1882
 
@@ -1851,6 +1896,55 @@ export class BeaconChain implements IBeaconChain {
1851
1896
  }
1852
1897
  }
1853
1898
 
1899
+ /**
1900
+ * Track upcoming proposals of validators connected to this node, so that SingleAttestationPool only collects and
1901
+ * the network only subscribes to all attestation subnets before them. Proposals only change when the decision block
1902
+ * of next epoch proposers changes (the head enters a new epoch or reorgs that block) or a new validator connects,
1903
+ * set localProposalsKey to null before calling for the latter.
1904
+ * Never throws, it runs during block import.
1905
+ */
1906
+ private refreshLocalProposals(): void {
1907
+ const clockSlot = this.clock.currentSlot;
1908
+ try {
1909
+ const headState = this.getHeadState();
1910
+ const headFork = this.config.getForkName(headState.slot);
1911
+ // post-fulu, the head state knows proposers of its epoch and the next one thanks to the proposer lookahead,
1912
+ // a pre-fulu state only predicts next epoch proposers
1913
+ if (!isForkPostFulu(headFork) || headState.epoch < computeEpochAtSlot(clockSlot) - 1) {
1914
+ return;
1915
+ }
1916
+
1917
+ const decisionRoot = proposerShufflingDecisionRoot(headFork, headState, headState.epoch + 1);
1918
+ if (decisionRoot === null) {
1919
+ return;
1920
+ }
1921
+ const localProposalsKey = `${headState.epoch}_${toRootHex(decisionRoot)}`;
1922
+ if (localProposalsKey === this.localProposalsKey) {
1923
+ return;
1924
+ }
1925
+ this.localProposalsKey = localProposalsKey;
1926
+
1927
+ const startSlot = computeStartSlotAtEpoch(headState.epoch);
1928
+ const newProposalSlots: Slot[] = [];
1929
+ for (const [i, proposerIndex] of [...headState.currentProposers, ...headState.nextProposers].entries()) {
1930
+ const proposalSlot = startSlot + i;
1931
+ if (
1932
+ proposalSlot >= clockSlot &&
1933
+ this.beaconProposerCache.has(proposerIndex) &&
1934
+ this.proposerTracker.addProposal(proposalSlot)
1935
+ ) {
1936
+ newProposalSlots.push(proposalSlot);
1937
+ }
1938
+ }
1939
+
1940
+ if (newProposalSlots.length > 0) {
1941
+ this.emitter.emit(ChainEvent.localProposalSlots, newProposalSlots);
1942
+ }
1943
+ } catch (e) {
1944
+ this.logger.debug("Error refreshing local proposals", {slot: clockSlot}, e as Error);
1945
+ }
1946
+ }
1947
+
1854
1948
  private onClockEpoch(epoch: Epoch): void {
1855
1949
  this.metrics?.clockEpoch.set(epoch);
1856
1950
 
@@ -1865,6 +1959,8 @@ export class BeaconChain implements IBeaconChain {
1865
1959
  protected onNewHead(head: ProtoBlock): void {
1866
1960
  this.syncContributionAndProofPool.prune(head.slot);
1867
1961
  this.seenContributionAndProof.prune(head.slot);
1962
+
1963
+ this.refreshLocalProposals();
1868
1964
  }
1869
1965
 
1870
1966
  private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
@@ -1933,6 +2029,9 @@ export class BeaconChain implements IBeaconChain {
1933
2029
 
1934
2030
  // Only update validator custody if we discovered new validators
1935
2031
  if (newValidatorCount > previousValidatorCount) {
2032
+ // new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
2033
+ this.localProposalsKey = null;
2034
+ this.refreshLocalProposals();
1936
2035
  const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
1937
2036
  await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
1938
2037
  }
@@ -1948,6 +2047,9 @@ export class BeaconChain implements IBeaconChain {
1948
2047
 
1949
2048
  // Only update validator custody if we discovered new validators
1950
2049
  if (hasNewValidators) {
2050
+ // new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
2051
+ this.localProposalsKey = null;
2052
+ this.refreshLocalProposals();
1951
2053
  const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
1952
2054
  await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
1953
2055
  }
@@ -3,7 +3,7 @@ import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
4
  import {CheckpointWithHex, PtcQuorumEvent} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
- import {DataColumnSidecar, RootHex, Slot, deneb, phase0} from "@lodestar/types";
6
+ import {DataColumnSidecar, RootHex, Slot, phase0} from "@lodestar/types";
7
7
  import {PeerIdStr} from "../util/peerId.js";
8
8
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
9
9
  import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
@@ -50,16 +50,16 @@ export enum ChainEvent {
50
50
  * and are ready to be published.
51
51
  */
52
52
  publishDataColumns = "publishDataColumns",
53
- /**
54
- * This event signals that blobs have been fetched from the execution engine
55
- * and are ready to be published.
56
- */
57
- publishBlobSidecars = "publishBlobSidecars",
58
53
  /**
59
54
  * This event signals that a proposer slashing has been produced from an observed equivocation
60
55
  * and is ready to be published.
61
56
  */
62
57
  publishProposerSlashing = "publishProposerSlashing",
58
+ /**
59
+ * New block proposal slots of validators connected to this node, the network subscribes to all attestation
60
+ * subnets before them, see `slotsToSubscribeBeforeProposalDuty`
61
+ */
62
+ localProposalSlots = "localProposalSlots",
63
63
  /**
64
64
  * Trigger an update of status so reqresp by peers have current earliestAvailableSlot
65
65
  */
@@ -123,10 +123,10 @@ export type IChainEvents = ApiEvents & {
123
123
 
124
124
  [ChainEvent.publishDataColumns]: (sidecars: DataColumnSidecar[]) => void;
125
125
 
126
- [ChainEvent.publishBlobSidecars]: (sidecars: deneb.BlobSidecar[]) => void;
127
-
128
126
  [ChainEvent.publishProposerSlashing]: (proposerSlashing: phase0.ProposerSlashing) => void;
129
127
 
128
+ [ChainEvent.localProposalSlots]: (proposalSlots: Slot[]) => void;
129
+
130
130
  [ChainEvent.updateStatus]: () => void;
131
131
 
132
132
  // Sync events that are chain->chain. Initiated from network requests but do not cross the network
@@ -72,7 +72,7 @@ export enum BlockErrorCode {
72
72
  * whoever served the block MAY be downscored. Mirrors PayloadErrorCode.EXECUTION_ENGINE_INVALID.
73
73
  */
74
74
  EXECUTION_ENGINE_INVALID = "BLOCK_ERROR_EXECUTION_INVALID",
75
- /** The blobs are unavailable */
75
+ /** The blob or column data did not arrive within the availability wait */
76
76
  DATA_UNAVAILABLE = "BLOCK_ERROR_DATA_UNAVAILABLE",
77
77
  /** Block contains too many kzg commitments */
78
78
  TOO_MANY_KZG_COMMITMENTS = "BLOCK_ERROR_TOO_MANY_KZG_COMMITMENTS",