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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) 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/utils.d.ts +1 -1
  15. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  16. package/lib/api/impl/validator/index.d.ts +6 -0
  17. package/lib/api/impl/validator/index.d.ts.map +1 -1
  18. package/lib/api/impl/validator/index.js +49 -31
  19. package/lib/api/impl/validator/index.js.map +1 -1
  20. package/lib/api/options.d.ts +2 -0
  21. package/lib/api/options.d.ts.map +1 -1
  22. package/lib/api/options.js +1 -0
  23. package/lib/api/options.js.map +1 -1
  24. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  25. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  26. package/lib/chain/GetBlobsTracker.js +69 -35
  27. package/lib/chain/GetBlobsTracker.js.map +1 -1
  28. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  29. package/lib/chain/archiveStore/archiveStore.js +1 -0
  30. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  31. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  32. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  33. package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
  34. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  36. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  38. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  39. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  40. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  41. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  42. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  43. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  44. package/lib/chain/blocks/blockInput/types.js +0 -1
  45. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  46. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  47. package/lib/chain/blocks/importBlock.js +40 -56
  48. package/lib/chain/blocks/importBlock.js.map +1 -1
  49. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  50. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  51. package/lib/chain/blocks/importExecutionPayload.js +34 -19
  52. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  53. package/lib/chain/blocks/index.d.ts.map +1 -1
  54. package/lib/chain/blocks/index.js +4 -4
  55. package/lib/chain/blocks/index.js.map +1 -1
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  57. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  58. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  59. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  60. package/lib/chain/blocks/types.d.ts +4 -20
  61. package/lib/chain/blocks/types.d.ts.map +1 -1
  62. package/lib/chain/blocks/types.js +0 -24
  63. package/lib/chain/blocks/types.js.map +1 -1
  64. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  65. package/lib/chain/blocks/verifyBlock.js +18 -7
  66. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  69. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  70. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  71. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  72. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  73. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  74. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  76. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  77. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  78. package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
  79. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  80. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  81. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  82. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  83. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  84. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  85. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  86. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  87. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  88. package/lib/chain/bls/interface.d.ts +2 -0
  89. package/lib/chain/bls/interface.d.ts.map +1 -1
  90. package/lib/chain/bls/multithread/index.d.ts +1 -1
  91. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  92. package/lib/chain/bls/multithread/index.js +50 -22
  93. package/lib/chain/bls/multithread/index.js.map +1 -1
  94. package/lib/chain/bls/multithread/types.d.ts +1 -1
  95. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  96. package/lib/chain/bls/multithread/worker.js +1 -1
  97. package/lib/chain/bls/multithread/worker.js.map +1 -1
  98. package/lib/chain/bls/singleThread.js +1 -1
  99. package/lib/chain/bls/singleThread.js.map +1 -1
  100. package/lib/chain/bls/utils.js +1 -1
  101. package/lib/chain/bls/utils.js.map +1 -1
  102. package/lib/chain/chain.d.ts +25 -4
  103. package/lib/chain/chain.d.ts.map +1 -1
  104. package/lib/chain/chain.js +124 -43
  105. package/lib/chain/chain.js.map +1 -1
  106. package/lib/chain/emitter.d.ts +7 -7
  107. package/lib/chain/emitter.d.ts.map +1 -1
  108. package/lib/chain/emitter.js +5 -5
  109. package/lib/chain/emitter.js.map +1 -1
  110. package/lib/chain/errors/blockError.d.ts +1 -1
  111. package/lib/chain/errors/blockError.d.ts.map +1 -1
  112. package/lib/chain/errors/blockError.js +1 -1
  113. package/lib/chain/errors/blockError.js.map +1 -1
  114. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  115. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  116. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  117. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  118. package/lib/chain/errors/index.d.ts +0 -1
  119. package/lib/chain/errors/index.d.ts.map +1 -1
  120. package/lib/chain/errors/index.js +0 -1
  121. package/lib/chain/errors/index.js.map +1 -1
  122. package/lib/chain/forkChoice/index.d.ts +11 -1
  123. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  124. package/lib/chain/forkChoice/index.js +11 -0
  125. package/lib/chain/forkChoice/index.js.map +1 -1
  126. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  127. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  128. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  129. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  130. package/lib/chain/interface.d.ts +9 -7
  131. package/lib/chain/interface.d.ts.map +1 -1
  132. package/lib/chain/interface.js.map +1 -1
  133. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  134. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  135. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  136. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  137. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  138. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  139. package/lib/chain/opPools/attestationPool.js +15 -4
  140. package/lib/chain/opPools/attestationPool.js.map +1 -1
  141. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -1
  142. package/lib/chain/opPools/inclusionListStore.js +2 -2
  143. package/lib/chain/opPools/inclusionListStore.js.map +1 -1
  144. package/lib/chain/opPools/index.d.ts +1 -0
  145. package/lib/chain/opPools/index.d.ts.map +1 -1
  146. package/lib/chain/opPools/index.js +1 -0
  147. package/lib/chain/opPools/index.js.map +1 -1
  148. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  149. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  150. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  151. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  152. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  153. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  154. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  155. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  156. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  157. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  158. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  159. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  160. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  161. package/lib/chain/opPools/utils.d.ts +1 -1
  162. package/lib/chain/opPools/utils.d.ts.map +1 -1
  163. package/lib/chain/opPools/utils.js +1 -1
  164. package/lib/chain/opPools/utils.js.map +1 -1
  165. package/lib/chain/options.d.ts +5 -3
  166. package/lib/chain/options.d.ts.map +1 -1
  167. package/lib/chain/options.js +0 -1
  168. package/lib/chain/options.js.map +1 -1
  169. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  170. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  171. package/lib/chain/produceBlock/produceBlockBody.js +3 -3
  172. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  173. package/lib/chain/proposerTracker.d.ts +31 -0
  174. package/lib/chain/proposerTracker.d.ts.map +1 -0
  175. package/lib/chain/proposerTracker.js +75 -0
  176. package/lib/chain/proposerTracker.js.map +1 -0
  177. package/lib/chain/regen/interface.d.ts +1 -2
  178. package/lib/chain/regen/interface.d.ts.map +1 -1
  179. package/lib/chain/regen/interface.js +0 -1
  180. package/lib/chain/regen/interface.js.map +1 -1
  181. package/lib/chain/regen/queued.d.ts +1 -1
  182. package/lib/chain/regen/queued.d.ts.map +1 -1
  183. package/lib/chain/regen/queued.js +5 -3
  184. package/lib/chain/regen/queued.js.map +1 -1
  185. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  186. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  187. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  188. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  189. package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
  190. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  191. package/lib/chain/validation/executionPayloadBid.js +13 -166
  192. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  193. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  194. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  195. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  196. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  197. package/lib/chain/validation/inclusionList.d.ts.map +1 -1
  198. package/lib/chain/validation/inclusionList.js +11 -2
  199. package/lib/chain/validation/inclusionList.js.map +1 -1
  200. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  201. package/lib/chain/validation/syncCommittee.js +16 -10
  202. package/lib/chain/validation/syncCommittee.js.map +1 -1
  203. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  204. package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
  205. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  206. package/lib/chain/validatorMonitor.d.ts +1 -2
  207. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  208. package/lib/chain/validatorMonitor.js +0 -3
  209. package/lib/chain/validatorMonitor.js.map +1 -1
  210. package/lib/db/beacon.d.ts +7 -0
  211. package/lib/db/beacon.d.ts.map +1 -1
  212. package/lib/db/beacon.js +34 -0
  213. package/lib/db/beacon.js.map +1 -1
  214. package/lib/db/dataColumnStore.d.ts +1 -1
  215. package/lib/db/dataColumnStore.d.ts.map +1 -1
  216. package/lib/db/dataColumnStore.js +1 -4
  217. package/lib/db/dataColumnStore.js.map +1 -1
  218. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  219. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  220. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  221. package/lib/db/flatFileStore/slotIndex.js +2 -2
  222. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  223. package/lib/db/interface.d.ts +1 -0
  224. package/lib/db/interface.d.ts.map +1 -1
  225. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  226. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  227. package/lib/db/repositories/blobSidecars.js +0 -1
  228. package/lib/db/repositories/blobSidecars.js.map +1 -1
  229. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  230. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  231. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  232. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  233. package/lib/execution/builder/apiClient.d.ts +14 -8
  234. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  235. package/lib/execution/builder/apiClient.js +12 -10
  236. package/lib/execution/builder/apiClient.js.map +1 -1
  237. package/lib/execution/builder/http.d.ts +2 -0
  238. package/lib/execution/builder/http.d.ts.map +1 -1
  239. package/lib/execution/builder/http.js +2 -0
  240. package/lib/execution/builder/http.js.map +1 -1
  241. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  242. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  243. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  244. package/lib/execution/engine/http.d.ts +4 -6
  245. package/lib/execution/engine/http.d.ts.map +1 -1
  246. package/lib/execution/engine/http.js +8 -11
  247. package/lib/execution/engine/http.js.map +1 -1
  248. package/lib/execution/engine/index.d.ts +1 -1
  249. package/lib/execution/engine/index.d.ts.map +1 -1
  250. package/lib/execution/engine/index.js +1 -1
  251. package/lib/execution/engine/index.js.map +1 -1
  252. package/lib/execution/engine/interface.d.ts +18 -6
  253. package/lib/execution/engine/interface.d.ts.map +1 -1
  254. package/lib/execution/engine/interface.js.map +1 -1
  255. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  256. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  257. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  258. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  259. package/lib/execution/engine/mock.d.ts +0 -1
  260. package/lib/execution/engine/mock.d.ts.map +1 -1
  261. package/lib/execution/engine/mock.js +6 -8
  262. package/lib/execution/engine/mock.js.map +1 -1
  263. package/lib/execution/engine/payloadIdCache.d.ts +1 -2
  264. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  265. package/lib/execution/engine/payloadIdCache.js +3 -3
  266. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  267. package/lib/execution/engine/restTransport.d.ts +2 -4
  268. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  269. package/lib/execution/engine/restTransport.js +1 -15
  270. package/lib/execution/engine/restTransport.js.map +1 -1
  271. package/lib/execution/engine/sszTypes.d.ts +38 -47
  272. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  273. package/lib/execution/engine/sszTypes.js +0 -5
  274. package/lib/execution/engine/sszTypes.js.map +1 -1
  275. package/lib/execution/engine/transport.d.ts +1 -14
  276. package/lib/execution/engine/transport.d.ts.map +1 -1
  277. package/lib/execution/engine/types.d.ts +1 -9
  278. package/lib/execution/engine/types.d.ts.map +1 -1
  279. package/lib/execution/engine/types.js +9 -16
  280. package/lib/execution/engine/types.js.map +1 -1
  281. package/lib/execution/engine/utils.d.ts.map +1 -1
  282. package/lib/execution/engine/utils.js +3 -2
  283. package/lib/execution/engine/utils.js.map +1 -1
  284. package/lib/index.d.ts +1 -0
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +2 -0
  287. package/lib/index.js.map +1 -1
  288. package/lib/metrics/metrics/beacon.d.ts +0 -9
  289. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  290. package/lib/metrics/metrics/beacon.js +0 -30
  291. package/lib/metrics/metrics/beacon.js.map +1 -1
  292. package/lib/metrics/metrics/lodestar.d.ts +33 -8
  293. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  294. package/lib/metrics/metrics/lodestar.js +84 -18
  295. package/lib/metrics/metrics/lodestar.js.map +1 -1
  296. package/lib/metrics/server/http.js +5 -5
  297. package/lib/metrics/server/http.js.map +1 -1
  298. package/lib/monitoring/service.js +1 -1
  299. package/lib/monitoring/service.js.map +1 -1
  300. package/lib/network/core/networkCore.d.ts +4 -1
  301. package/lib/network/core/networkCore.d.ts.map +1 -1
  302. package/lib/network/core/networkCore.js +7 -0
  303. package/lib/network/core/networkCore.js.map +1 -1
  304. package/lib/network/core/networkCoreWorker.js +2 -0
  305. package/lib/network/core/networkCoreWorker.js.map +1 -1
  306. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  307. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  308. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  309. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  310. package/lib/network/core/types.d.ts +6 -1
  311. package/lib/network/core/types.d.ts.map +1 -1
  312. package/lib/network/gossip/gossipsub.d.ts +1 -0
  313. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  314. package/lib/network/gossip/gossipsub.js +10 -0
  315. package/lib/network/gossip/gossipsub.js.map +1 -1
  316. package/lib/network/gossip/interface.d.ts +1 -8
  317. package/lib/network/gossip/interface.d.ts.map +1 -1
  318. package/lib/network/gossip/interface.js +0 -1
  319. package/lib/network/gossip/interface.js.map +1 -1
  320. package/lib/network/gossip/topic.d.ts +6 -22
  321. package/lib/network/gossip/topic.d.ts.map +1 -1
  322. package/lib/network/gossip/topic.js +0 -23
  323. package/lib/network/gossip/topic.js.map +1 -1
  324. package/lib/network/interface.d.ts +4 -5
  325. package/lib/network/interface.d.ts.map +1 -1
  326. package/lib/network/libp2p/index.d.ts.map +1 -1
  327. package/lib/network/libp2p/index.js +5 -1
  328. package/lib/network/libp2p/index.js.map +1 -1
  329. package/lib/network/network.d.ts +8 -7
  330. package/lib/network/network.d.ts.map +1 -1
  331. package/lib/network/network.js +53 -35
  332. package/lib/network/network.js.map +1 -1
  333. package/lib/network/options.d.ts +2 -0
  334. package/lib/network/options.d.ts.map +1 -1
  335. package/lib/network/options.js +2 -0
  336. package/lib/network/options.js.map +1 -1
  337. package/lib/network/peers/peerManager.d.ts +2 -1
  338. package/lib/network/peers/peerManager.d.ts.map +1 -1
  339. package/lib/network/peers/peerManager.js +28 -1
  340. package/lib/network/peers/peerManager.js.map +1 -1
  341. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  342. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  343. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  344. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  345. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  346. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  347. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  348. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  349. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  350. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  351. package/lib/network/peers/utils/subnetMap.js +6 -3
  352. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  353. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  354. package/lib/network/processor/extractSlotRootFns.js +1 -8
  355. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  356. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  357. package/lib/network/processor/gossipHandlers.js +79 -149
  358. package/lib/network/processor/gossipHandlers.js.map +1 -1
  359. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  360. package/lib/network/processor/gossipQueues/index.js +0 -6
  361. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  362. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  363. package/lib/network/processor/gossipValidatorFn.js +1 -5
  364. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  365. package/lib/network/processor/index.d.ts +6 -0
  366. package/lib/network/processor/index.d.ts.map +1 -1
  367. package/lib/network/processor/index.js +55 -29
  368. package/lib/network/processor/index.js.map +1 -1
  369. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  370. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  371. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  372. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  373. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  374. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  375. package/lib/network/reqresp/handlers/index.js +1 -12
  376. package/lib/network/reqresp/handlers/index.js.map +1 -1
  377. package/lib/network/reqresp/protocols.d.ts +0 -2
  378. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  379. package/lib/network/reqresp/protocols.js +0 -10
  380. package/lib/network/reqresp/protocols.js.map +1 -1
  381. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  382. package/lib/network/reqresp/rateLimit.js +1 -17
  383. package/lib/network/reqresp/rateLimit.js.map +1 -1
  384. package/lib/network/reqresp/types.d.ts +2 -8
  385. package/lib/network/reqresp/types.d.ts.map +1 -1
  386. package/lib/network/reqresp/types.js +1 -7
  387. package/lib/network/reqresp/types.js.map +1 -1
  388. package/lib/network/subnets/attnetsService.d.ts +35 -5
  389. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  390. package/lib/network/subnets/attnetsService.js +84 -6
  391. package/lib/network/subnets/attnetsService.js.map +1 -1
  392. package/lib/network/subnets/interface.d.ts +7 -0
  393. package/lib/network/subnets/interface.d.ts.map +1 -1
  394. package/lib/network/subnets/interface.js.map +1 -1
  395. package/lib/node/nodejs.d.ts +3 -1
  396. package/lib/node/nodejs.d.ts.map +1 -1
  397. package/lib/node/nodejs.js +47 -21
  398. package/lib/node/nodejs.js.map +1 -1
  399. package/lib/node/options.d.ts +3 -1
  400. package/lib/node/options.d.ts.map +1 -1
  401. package/lib/node/options.js +4 -2
  402. package/lib/node/options.js.map +1 -1
  403. package/lib/sync/interface.d.ts.map +1 -1
  404. package/lib/sync/interface.js.map +1 -1
  405. package/lib/sync/range/batch.d.ts +2 -3
  406. package/lib/sync/range/batch.d.ts.map +1 -1
  407. package/lib/sync/range/batch.js +9 -22
  408. package/lib/sync/range/batch.js.map +1 -1
  409. package/lib/sync/range/chain.d.ts.map +1 -1
  410. package/lib/sync/range/chain.js +2 -15
  411. package/lib/sync/range/chain.js.map +1 -1
  412. package/lib/sync/sync.d.ts +15 -0
  413. package/lib/sync/sync.d.ts.map +1 -1
  414. package/lib/sync/sync.js +103 -25
  415. package/lib/sync/sync.js.map +1 -1
  416. package/lib/sync/unknownBlock.d.ts.map +1 -1
  417. package/lib/sync/unknownBlock.js +43 -25
  418. package/lib/sync/unknownBlock.js.map +1 -1
  419. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  420. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  421. package/lib/sync/utils/downloadByRange.js +24 -128
  422. package/lib/sync/utils/downloadByRange.js.map +1 -1
  423. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  424. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  425. package/lib/sync/utils/downloadByRoot.js +14 -99
  426. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  427. package/lib/util/blobs.d.ts +1 -7
  428. package/lib/util/blobs.d.ts.map +1 -1
  429. package/lib/util/blobs.js +0 -19
  430. package/lib/util/blobs.js.map +1 -1
  431. package/lib/util/execution.d.ts +3 -4
  432. package/lib/util/execution.d.ts.map +1 -1
  433. package/lib/util/execution.js +1 -73
  434. package/lib/util/execution.js.map +1 -1
  435. package/lib/util/file.d.ts.map +1 -1
  436. package/lib/util/file.js +8 -9
  437. package/lib/util/file.js.map +1 -1
  438. package/lib/util/queue/itemQueue.js +1 -1
  439. package/lib/util/queue/itemQueue.js.map +1 -1
  440. package/lib/util/sszBytes.d.ts +5 -1
  441. package/lib/util/sszBytes.d.ts.map +1 -1
  442. package/lib/util/sszBytes.js +36 -19
  443. package/lib/util/sszBytes.js.map +1 -1
  444. package/lib/util/types.d.ts +0 -5
  445. package/lib/util/types.d.ts.map +1 -1
  446. package/lib/util/types.js +1 -2
  447. package/lib/util/types.js.map +1 -1
  448. package/package.json +31 -32
  449. package/src/api/impl/api.ts +1 -1
  450. package/src/api/impl/beacon/blocks/index.ts +81 -126
  451. package/src/api/impl/beacon/index.ts +3 -1
  452. package/src/api/impl/beacon/pool/index.ts +31 -1
  453. package/src/api/impl/beacon/state/utils.ts +1 -1
  454. package/src/api/impl/validator/index.ts +54 -37
  455. package/src/api/options.ts +3 -0
  456. package/src/chain/GetBlobsTracker.ts +82 -52
  457. package/src/chain/archiveStore/archiveStore.ts +1 -0
  458. package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
  459. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  460. package/src/chain/blocks/blockInput/errors.ts +1 -2
  461. package/src/chain/blocks/blockInput/types.ts +2 -20
  462. package/src/chain/blocks/importBlock.ts +61 -76
  463. package/src/chain/blocks/importExecutionPayload.ts +57 -35
  464. package/src/chain/blocks/index.ts +11 -4
  465. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  466. package/src/chain/blocks/types.ts +5 -31
  467. package/src/chain/blocks/verifyBlock.ts +31 -16
  468. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  469. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  470. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  471. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
  472. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  473. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  474. package/src/chain/bls/interface.ts +2 -0
  475. package/src/chain/bls/multithread/index.ts +48 -24
  476. package/src/chain/bls/multithread/types.ts +1 -1
  477. package/src/chain/bls/multithread/worker.ts +1 -5
  478. package/src/chain/bls/singleThread.ts +1 -1
  479. package/src/chain/bls/utils.ts +1 -1
  480. package/src/chain/chain.ts +140 -42
  481. package/src/chain/emitter.ts +8 -8
  482. package/src/chain/errors/blockError.ts +1 -1
  483. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  484. package/src/chain/errors/index.ts +0 -1
  485. package/src/chain/forkChoice/index.ts +11 -0
  486. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  487. package/src/chain/interface.ts +9 -6
  488. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  489. package/src/chain/opPools/attestationPool.ts +16 -4
  490. package/src/chain/opPools/inclusionListStore.ts +3 -3
  491. package/src/chain/opPools/index.ts +1 -0
  492. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  493. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  494. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  495. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  496. package/src/chain/opPools/utils.ts +1 -1
  497. package/src/chain/options.ts +5 -4
  498. package/src/chain/produceBlock/produceBlockBody.ts +7 -4
  499. package/src/chain/proposerTracker.ts +94 -0
  500. package/src/chain/regen/interface.ts +1 -2
  501. package/src/chain/regen/queued.ts +6 -4
  502. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  503. package/src/chain/validation/executionPayloadBid.ts +14 -193
  504. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  505. package/src/chain/validation/inclusionList.ts +11 -2
  506. package/src/chain/validation/syncCommittee.ts +31 -15
  507. package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
  508. package/src/chain/validatorMonitor.ts +0 -6
  509. package/src/db/beacon.ts +44 -0
  510. package/src/db/dataColumnStore.ts +2 -4
  511. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  512. package/src/db/flatFileStore/slotIndex.ts +4 -3
  513. package/src/db/interface.ts +2 -0
  514. package/src/db/repositories/blobSidecars.ts +0 -1
  515. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  516. package/src/execution/builder/apiClient.ts +16 -13
  517. package/src/execution/builder/http.ts +4 -0
  518. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  519. package/src/execution/engine/http.ts +19 -43
  520. package/src/execution/engine/index.ts +1 -1
  521. package/src/execution/engine/interface.ts +19 -10
  522. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  523. package/src/execution/engine/mock.ts +6 -11
  524. package/src/execution/engine/payloadIdCache.ts +6 -7
  525. package/src/execution/engine/restTransport.ts +3 -22
  526. package/src/execution/engine/sszTypes.ts +0 -9
  527. package/src/execution/engine/transport.ts +8 -17
  528. package/src/execution/engine/types.ts +11 -26
  529. package/src/execution/engine/utils.ts +4 -2
  530. package/src/index.ts +2 -0
  531. package/src/metrics/metrics/beacon.ts +0 -30
  532. package/src/metrics/metrics/lodestar.ts +85 -18
  533. package/src/metrics/server/http.ts +5 -5
  534. package/src/monitoring/service.ts +1 -1
  535. package/src/network/core/networkCore.ts +11 -1
  536. package/src/network/core/networkCoreWorker.ts +2 -0
  537. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  538. package/src/network/core/types.ts +6 -1
  539. package/src/network/gossip/gossipsub.ts +11 -0
  540. package/src/network/gossip/interface.ts +0 -5
  541. package/src/network/gossip/topic.ts +0 -25
  542. package/src/network/interface.ts +2 -5
  543. package/src/network/libp2p/index.ts +5 -1
  544. package/src/network/network.ts +55 -58
  545. package/src/network/options.ts +4 -0
  546. package/src/network/peers/peerManager.ts +28 -3
  547. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  548. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  549. package/src/network/peers/utils/subnetMap.ts +6 -3
  550. package/src/network/processor/extractSlotRootFns.ts +0 -9
  551. package/src/network/processor/gossipHandlers.ts +99 -183
  552. package/src/network/processor/gossipQueues/index.ts +0 -6
  553. package/src/network/processor/gossipValidatorFn.ts +0 -5
  554. package/src/network/processor/index.ts +47 -27
  555. package/src/network/processor/types.ts +1 -1
  556. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  557. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  558. package/src/network/reqresp/handlers/index.ts +0 -17
  559. package/src/network/reqresp/protocols.ts +0 -12
  560. package/src/network/reqresp/rateLimit.ts +1 -17
  561. package/src/network/reqresp/types.ts +0 -13
  562. package/src/network/subnets/attnetsService.ts +94 -6
  563. package/src/network/subnets/interface.ts +7 -0
  564. package/src/node/nodejs.ts +58 -22
  565. package/src/node/options.ts +9 -6
  566. package/src/sync/interface.ts +1 -0
  567. package/src/sync/range/batch.ts +9 -21
  568. package/src/sync/range/chain.ts +2 -14
  569. package/src/sync/sync.ts +108 -26
  570. package/src/sync/unknownBlock.ts +48 -36
  571. package/src/sync/utils/downloadByRange.ts +31 -230
  572. package/src/sync/utils/downloadByRoot.ts +15 -142
  573. package/src/util/blobs.ts +0 -34
  574. package/src/util/execution.ts +8 -102
  575. package/src/util/file.ts +8 -9
  576. package/src/util/queue/itemQueue.ts +1 -1
  577. package/src/util/sszBytes.ts +42 -24
  578. package/src/util/types.ts +1 -8
  579. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  580. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  581. package/lib/chain/errors/blobSidecarError.js +0 -38
  582. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  583. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  584. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  585. package/lib/chain/validation/blobSidecar.js +0 -276
  586. package/lib/chain/validation/blobSidecar.js.map +0 -1
  587. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  588. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  589. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  590. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  591. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  592. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  593. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  594. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  595. package/src/chain/errors/blobSidecarError.ts +0 -70
  596. package/src/chain/validation/blobSidecar.ts +0 -357
  597. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  598. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -1,23 +1,29 @@
1
1
  import {setMaxListeners} from "node:events";
2
2
  import {PrivateKey} from "@libp2p/interface";
3
3
  import {Registry} from "prom-client";
4
+ import {hasher} from "@chainsafe/persistent-merkle-tree";
5
+ import {BeaconApiMethods} from "@lodestar/api/beacon/server";
6
+ import {BeaconConfig} from "@lodestar/config";
7
+ import type {LoggerNode} from "@lodestar/logger/node";
4
8
  import {
5
9
  init as initNativeMetrics,
6
10
  registerLocalValidator as registerNativeLocalValidator,
7
11
  scrapeMetrics as scrapeNativeMetrics,
8
12
  unregisterLocalValidator as unregisterNativeLocalValidator,
9
- } from "@chainsafe/lodestar-z/metrics";
10
- import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
11
- import {hasher} from "@chainsafe/persistent-merkle-tree";
12
- import {BeaconApiMethods} from "@lodestar/api/beacon/server";
13
- import {BeaconConfig} from "@lodestar/config";
14
- import type {LoggerNode} from "@lodestar/logger/node";
13
+ } from "@lodestar/native/metrics";
14
+ import {type PubkeyCache} from "@lodestar/native/pubkeys";
15
15
  import {ZERO_HASH_HEX} from "@lodestar/params";
16
- import {IBeaconStateView, isStatePostBellatrix, isStatePostGloas} from "@lodestar/state-transition";
16
+ import {
17
+ IBeaconStateView,
18
+ computeStartSlotAtEpoch,
19
+ isStatePostBellatrix,
20
+ isStatePostGloas,
21
+ } from "@lodestar/state-transition";
17
22
  import {Slot} from "@lodestar/types";
18
- import {sleep, toRootHex} from "@lodestar/utils";
23
+ import {defer, sleep, toRootHex} from "@lodestar/utils";
19
24
  import {ProcessShutdownCallback} from "@lodestar/validator";
20
25
  import {BeaconRestApiServer, getApi} from "../api/index.js";
26
+ import {getDataColumnSidecarsMinEpoch} from "../chain/archiveStore/utils/archiveBlocks.js";
21
27
  import {BeaconChain, IBeaconChain, initBeaconMetrics} from "../chain/index.js";
22
28
  import {ValidatorMonitor, createValidatorMonitor} from "../chain/validatorMonitor.js";
23
29
  import {IBeaconDb} from "../db/index.js";
@@ -111,6 +117,7 @@ export class BeaconNode {
111
117
 
112
118
  status: BeaconNodeStatus;
113
119
  private controller?: AbortController;
120
+ private closePromise: Promise<void> | undefined;
114
121
 
115
122
  constructor({
116
123
  opts,
@@ -212,6 +219,17 @@ export class BeaconNode {
212
219
 
213
220
  const clock = new Clock({config, genesisTime: anchorState.genesisTime, signal});
214
221
 
222
+ // Before any lookup into the legacy column buckets, which can be slow until compacted
223
+ const columnsMinEpoch =
224
+ opts.chain.archiveDataEpochs === Infinity
225
+ ? null
226
+ : getDataColumnSidecarsMinEpoch(config, clock.currentEpoch, opts.chain.archiveDataEpochs);
227
+ await db.compactLegacyDataColumns(
228
+ columnsMinEpoch !== null && columnsMinEpoch >= config.FULU_FORK_EPOCH
229
+ ? computeStartSlotAtEpoch(columnsMinEpoch)
230
+ : 0
231
+ );
232
+
215
233
  await db.init();
216
234
 
217
235
  // Prune hot db repos
@@ -280,6 +298,7 @@ export class BeaconNode {
280
298
  : undefined,
281
299
  builderApiClientOpts: {
282
300
  timeout: opts.executionBuilder.timeout,
301
+ bidDeadline: opts.executionBuilder.bidDeadline,
283
302
  // Sent with all builder api requests, unless the node runs in private mode
284
303
  userAgent: opts.executionBuilder.userAgent,
285
304
  },
@@ -375,23 +394,40 @@ export class BeaconNode {
375
394
  /**
376
395
  * Stop beacon node and its sub-components.
377
396
  */
378
- async close(): Promise<void> {
379
- if (this.status === BeaconNodeStatus.started) {
380
- this.status = BeaconNodeStatus.closing;
381
- this.sync.close();
382
- if (this.restApi) await this.restApi.close();
383
- await this.network.close();
384
- if (this.metricsServer) await this.metricsServer.close();
385
- if (this.monitoring) await this.monitoring.close();
386
- await this.chain.persistToDisk();
387
- await this.chain.close();
397
+ close(): Promise<void> {
398
+ if (this.closePromise !== undefined) return this.closePromise;
399
+ const completion = defer<void>();
400
+ this.closePromise = completion.promise;
401
+ this.status = BeaconNodeStatus.closing;
402
+ void this.closeInternal().then(completion.resolve, completion.reject);
403
+ return this.closePromise;
404
+ }
405
+
406
+ private async closeInternal(): Promise<void> {
407
+ const errors: unknown[] = [];
408
+ for (const cleanup of [
409
+ () => this.sync.close(),
410
+ () => this.restApi?.close(),
411
+ () => this.network.close(),
412
+ () => this.metricsServer?.close(),
413
+ () => this.monitoring?.close(),
414
+ () => this.chain.persistToDisk(),
415
+ () => this.chain.close(),
388
416
  // Abort signal last: close() calls above clear intervals/timeouts so no new
389
417
  // operations get scheduled. If we aborted first, a still-pending interval could
390
418
  // fire and schedule a new operation after abort, leaving it stuck and delaying shutdown.
391
- if (this.controller) this.controller.abort();
392
- await sleep(DELAY_BEFORE_CLOSING_DB_MS);
393
- await this.db.close();
394
- this.status = BeaconNodeStatus.closed;
419
+ () => this.controller?.abort(),
420
+ () => sleep(DELAY_BEFORE_CLOSING_DB_MS),
421
+ () => this.db.close(),
422
+ ]) {
423
+ try {
424
+ await cleanup();
425
+ } catch (error) {
426
+ errors.push(error);
427
+ }
395
428
  }
429
+ this.status = BeaconNodeStatus.closed;
430
+ if (errors.length === 1) throw errors[0];
431
+ if (errors.length > 1) throw new AggregateError(errors, "Beacon node cleanup failed");
396
432
  }
397
433
  }
@@ -1,7 +1,9 @@
1
+ import {BLOCK_PRODUCTION_RACE_CUTOFF_GLOAS_BPS} from "../api/impl/validator/index.js";
1
2
  import {ApiOptions, defaultApiOptions} from "../api/options.js";
2
3
  import {ArchiveMode, DEFAULT_ARCHIVE_MODE, IChainOptions, defaultChainOptions} from "../chain/options.js";
3
4
  import {ValidatorMonitorOpts, defaultValidatorMonitorOpts} from "../chain/validatorMonitor.js";
4
5
  import {DatabaseOptions, defaultDbOptions} from "../db/options.js";
6
+ import {BUILDER_BID_LAG_BUFFER_MS} from "../execution/builder/apiClient.js";
5
7
  import {
6
8
  EngineApiMode,
7
9
  ExecutionBuilderOpts,
@@ -19,16 +21,17 @@ import {SyncOptions, defaultSyncOptions} from "../sync/options.js";
19
21
 
20
22
  // Re-export so the CLI doesn't need to depend on lodestar-api
21
23
  export {allNamespaces} from "../api/rest/index.js";
22
-
23
- // Re-export to use as default values in CLI args
24
+ export type {EngineApiMode};
25
+ // Re-export to use as default values and for validation in CLI args
24
26
  export {
25
- defaultExecutionEngineHttpOpts,
26
- defaultExecutionBuilderHttpOpts,
27
- engineApiModes,
28
27
  ArchiveMode,
28
+ BLOCK_PRODUCTION_RACE_CUTOFF_GLOAS_BPS,
29
+ BUILDER_BID_LAG_BUFFER_MS,
29
30
  DEFAULT_ARCHIVE_MODE,
31
+ defaultExecutionBuilderHttpOpts,
32
+ defaultExecutionEngineHttpOpts,
33
+ engineApiModes,
30
34
  };
31
- export type {EngineApiMode};
32
35
 
33
36
  export interface IBeaconNodeOptions {
34
37
  api: ApiOptions;
@@ -7,6 +7,7 @@ import {IBeaconDb} from "../db/index.js";
7
7
  import {Metrics} from "../metrics/index.js";
8
8
  import {INetwork} from "../network/index.js";
9
9
  import {SyncChainDebugState} from "./range/chain.js";
10
+
10
11
  export type {SyncChainDebugState};
11
12
 
12
13
  export type SyncingStatus = routes.node.SyncingStatus;
@@ -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.