@lodestar/beacon-node 1.51.0-dev.88c15a0731 → 1.51.0-dev.8d5cdd33be

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 (553) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +36 -88
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +22 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +1 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/validator/index.d.ts +6 -0
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +42 -26
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  14. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  15. package/lib/chain/GetBlobsTracker.js +69 -35
  16. package/lib/chain/GetBlobsTracker.js.map +1 -1
  17. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/archiveStore.js +1 -0
  19. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  20. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  21. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  22. package/lib/chain/archiveStore/utils/archiveBlocks.js +7 -1
  23. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  24. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  25. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  26. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  27. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  28. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  29. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  30. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  31. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  32. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  33. package/lib/chain/blocks/blockInput/types.js +0 -1
  34. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  35. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  36. package/lib/chain/blocks/importBlock.js +40 -56
  37. package/lib/chain/blocks/importBlock.js.map +1 -1
  38. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  39. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  40. package/lib/chain/blocks/importExecutionPayload.js +32 -18
  41. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  42. package/lib/chain/blocks/index.d.ts.map +1 -1
  43. package/lib/chain/blocks/index.js +4 -4
  44. package/lib/chain/blocks/index.js.map +1 -1
  45. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  46. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  47. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  48. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  49. package/lib/chain/blocks/types.d.ts +4 -20
  50. package/lib/chain/blocks/types.d.ts.map +1 -1
  51. package/lib/chain/blocks/types.js +0 -24
  52. package/lib/chain/blocks/types.js.map +1 -1
  53. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  54. package/lib/chain/blocks/verifyBlock.js +18 -7
  55. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  56. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  57. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  58. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  59. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  60. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  61. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  62. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  63. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  64. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  65. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  66. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksSignatures.js +7 -5
  68. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  69. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  70. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  71. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  72. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  73. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  74. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  75. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  76. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  77. package/lib/chain/bls/interface.d.ts +2 -0
  78. package/lib/chain/bls/interface.d.ts.map +1 -1
  79. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  80. package/lib/chain/bls/multithread/index.js +13 -11
  81. package/lib/chain/bls/multithread/index.js.map +1 -1
  82. package/lib/chain/bls/multithread/types.d.ts +1 -1
  83. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  84. package/lib/chain/bls/multithread/worker.js +1 -1
  85. package/lib/chain/bls/multithread/worker.js.map +1 -1
  86. package/lib/chain/bls/singleThread.js +1 -1
  87. package/lib/chain/bls/singleThread.js.map +1 -1
  88. package/lib/chain/bls/utils.js +1 -1
  89. package/lib/chain/bls/utils.js.map +1 -1
  90. package/lib/chain/chain.d.ts +25 -4
  91. package/lib/chain/chain.d.ts.map +1 -1
  92. package/lib/chain/chain.js +124 -43
  93. package/lib/chain/chain.js.map +1 -1
  94. package/lib/chain/emitter.d.ts +7 -7
  95. package/lib/chain/emitter.d.ts.map +1 -1
  96. package/lib/chain/emitter.js +5 -5
  97. package/lib/chain/emitter.js.map +1 -1
  98. package/lib/chain/errors/blockError.d.ts +1 -1
  99. package/lib/chain/errors/blockError.d.ts.map +1 -1
  100. package/lib/chain/errors/blockError.js +1 -1
  101. package/lib/chain/errors/blockError.js.map +1 -1
  102. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  103. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  104. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  105. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  106. package/lib/chain/errors/index.d.ts +0 -1
  107. package/lib/chain/errors/index.d.ts.map +1 -1
  108. package/lib/chain/errors/index.js +0 -1
  109. package/lib/chain/errors/index.js.map +1 -1
  110. package/lib/chain/forkChoice/index.d.ts +11 -1
  111. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  112. package/lib/chain/forkChoice/index.js +11 -0
  113. package/lib/chain/forkChoice/index.js.map +1 -1
  114. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  115. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  116. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  117. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  118. package/lib/chain/interface.d.ts +9 -7
  119. package/lib/chain/interface.d.ts.map +1 -1
  120. package/lib/chain/interface.js.map +1 -1
  121. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  122. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  123. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  124. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  125. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  126. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  127. package/lib/chain/opPools/attestationPool.js +15 -4
  128. package/lib/chain/opPools/attestationPool.js.map +1 -1
  129. package/lib/chain/opPools/index.d.ts +1 -0
  130. package/lib/chain/opPools/index.d.ts.map +1 -1
  131. package/lib/chain/opPools/index.js +1 -0
  132. package/lib/chain/opPools/index.js.map +1 -1
  133. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  134. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  135. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  136. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  137. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  138. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  139. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  140. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  141. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  142. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  143. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  144. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  145. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  146. package/lib/chain/opPools/utils.d.ts +1 -1
  147. package/lib/chain/opPools/utils.d.ts.map +1 -1
  148. package/lib/chain/opPools/utils.js +1 -1
  149. package/lib/chain/opPools/utils.js.map +1 -1
  150. package/lib/chain/options.d.ts +5 -3
  151. package/lib/chain/options.d.ts.map +1 -1
  152. package/lib/chain/options.js +0 -1
  153. package/lib/chain/options.js.map +1 -1
  154. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  155. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  156. package/lib/chain/produceBlock/produceBlockBody.js +3 -2
  157. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  158. package/lib/chain/proposerTracker.d.ts +31 -0
  159. package/lib/chain/proposerTracker.d.ts.map +1 -0
  160. package/lib/chain/proposerTracker.js +75 -0
  161. package/lib/chain/proposerTracker.js.map +1 -0
  162. package/lib/chain/regen/interface.d.ts +1 -1
  163. package/lib/chain/regen/interface.d.ts.map +1 -1
  164. package/lib/chain/regen/queued.d.ts +1 -1
  165. package/lib/chain/regen/queued.d.ts.map +1 -1
  166. package/lib/chain/regen/queued.js +5 -3
  167. package/lib/chain/regen/queued.js.map +1 -1
  168. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  169. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  170. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  171. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  172. package/lib/chain/validation/executionPayloadBid.js +13 -13
  173. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  174. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  175. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  176. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  177. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  178. package/lib/chain/validatorMonitor.d.ts +1 -2
  179. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  180. package/lib/chain/validatorMonitor.js +0 -3
  181. package/lib/chain/validatorMonitor.js.map +1 -1
  182. package/lib/db/beacon.d.ts +7 -0
  183. package/lib/db/beacon.d.ts.map +1 -1
  184. package/lib/db/beacon.js +32 -0
  185. package/lib/db/beacon.js.map +1 -1
  186. package/lib/db/dataColumnStore.d.ts +1 -1
  187. package/lib/db/dataColumnStore.d.ts.map +1 -1
  188. package/lib/db/dataColumnStore.js +1 -4
  189. package/lib/db/dataColumnStore.js.map +1 -1
  190. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  191. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  192. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  193. package/lib/db/flatFileStore/slotIndex.js +2 -2
  194. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  195. package/lib/db/interface.d.ts +1 -0
  196. package/lib/db/interface.d.ts.map +1 -1
  197. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  198. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  199. package/lib/db/repositories/blobSidecars.js +0 -1
  200. package/lib/db/repositories/blobSidecars.js.map +1 -1
  201. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  202. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  203. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  204. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  205. package/lib/execution/builder/apiClient.d.ts +14 -8
  206. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  207. package/lib/execution/builder/apiClient.js +12 -10
  208. package/lib/execution/builder/apiClient.js.map +1 -1
  209. package/lib/execution/builder/http.d.ts +2 -0
  210. package/lib/execution/builder/http.d.ts.map +1 -1
  211. package/lib/execution/builder/http.js +2 -0
  212. package/lib/execution/builder/http.js.map +1 -1
  213. package/lib/execution/engine/http.d.ts +4 -6
  214. package/lib/execution/engine/http.d.ts.map +1 -1
  215. package/lib/execution/engine/http.js +8 -10
  216. package/lib/execution/engine/http.js.map +1 -1
  217. package/lib/execution/engine/index.d.ts +1 -1
  218. package/lib/execution/engine/index.d.ts.map +1 -1
  219. package/lib/execution/engine/index.js +1 -1
  220. package/lib/execution/engine/index.js.map +1 -1
  221. package/lib/execution/engine/interface.d.ts +18 -6
  222. package/lib/execution/engine/interface.d.ts.map +1 -1
  223. package/lib/execution/engine/interface.js.map +1 -1
  224. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  225. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  226. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  227. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  228. package/lib/execution/engine/mock.d.ts +0 -1
  229. package/lib/execution/engine/mock.d.ts.map +1 -1
  230. package/lib/execution/engine/mock.js +0 -4
  231. package/lib/execution/engine/mock.js.map +1 -1
  232. package/lib/execution/engine/restTransport.d.ts +2 -4
  233. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  234. package/lib/execution/engine/restTransport.js +1 -15
  235. package/lib/execution/engine/restTransport.js.map +1 -1
  236. package/lib/execution/engine/sszTypes.d.ts +0 -9
  237. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  238. package/lib/execution/engine/sszTypes.js +0 -5
  239. package/lib/execution/engine/sszTypes.js.map +1 -1
  240. package/lib/execution/engine/transport.d.ts +1 -14
  241. package/lib/execution/engine/transport.d.ts.map +1 -1
  242. package/lib/execution/engine/types.d.ts +0 -8
  243. package/lib/execution/engine/types.d.ts.map +1 -1
  244. package/lib/execution/engine/types.js +2 -10
  245. package/lib/execution/engine/types.js.map +1 -1
  246. package/lib/execution/engine/utils.d.ts.map +1 -1
  247. package/lib/execution/engine/utils.js +3 -2
  248. package/lib/execution/engine/utils.js.map +1 -1
  249. package/lib/index.d.ts +1 -1
  250. package/lib/index.d.ts.map +1 -1
  251. package/lib/index.js +1 -1
  252. package/lib/index.js.map +1 -1
  253. package/lib/metrics/metrics/beacon.d.ts +0 -9
  254. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  255. package/lib/metrics/metrics/beacon.js +0 -30
  256. package/lib/metrics/metrics/beacon.js.map +1 -1
  257. package/lib/metrics/metrics/lodestar.d.ts +30 -8
  258. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  259. package/lib/metrics/metrics/lodestar.js +79 -18
  260. package/lib/metrics/metrics/lodestar.js.map +1 -1
  261. package/lib/metrics/server/http.js +5 -5
  262. package/lib/metrics/server/http.js.map +1 -1
  263. package/lib/monitoring/service.js +1 -1
  264. package/lib/monitoring/service.js.map +1 -1
  265. package/lib/network/core/networkCore.d.ts +4 -1
  266. package/lib/network/core/networkCore.d.ts.map +1 -1
  267. package/lib/network/core/networkCore.js +7 -0
  268. package/lib/network/core/networkCore.js.map +1 -1
  269. package/lib/network/core/networkCoreWorker.js +2 -0
  270. package/lib/network/core/networkCoreWorker.js.map +1 -1
  271. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  272. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  273. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  274. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  275. package/lib/network/core/types.d.ts +6 -1
  276. package/lib/network/core/types.d.ts.map +1 -1
  277. package/lib/network/gossip/gossipsub.d.ts +1 -0
  278. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  279. package/lib/network/gossip/gossipsub.js +10 -0
  280. package/lib/network/gossip/gossipsub.js.map +1 -1
  281. package/lib/network/gossip/interface.d.ts +1 -8
  282. package/lib/network/gossip/interface.d.ts.map +1 -1
  283. package/lib/network/gossip/interface.js +0 -1
  284. package/lib/network/gossip/interface.js.map +1 -1
  285. package/lib/network/gossip/topic.d.ts +0 -16
  286. package/lib/network/gossip/topic.d.ts.map +1 -1
  287. package/lib/network/gossip/topic.js +0 -23
  288. package/lib/network/gossip/topic.js.map +1 -1
  289. package/lib/network/interface.d.ts +4 -5
  290. package/lib/network/interface.d.ts.map +1 -1
  291. package/lib/network/libp2p/index.d.ts.map +1 -1
  292. package/lib/network/libp2p/index.js +5 -1
  293. package/lib/network/libp2p/index.js.map +1 -1
  294. package/lib/network/network.d.ts +8 -7
  295. package/lib/network/network.d.ts.map +1 -1
  296. package/lib/network/network.js +53 -35
  297. package/lib/network/network.js.map +1 -1
  298. package/lib/network/options.d.ts +2 -0
  299. package/lib/network/options.d.ts.map +1 -1
  300. package/lib/network/options.js +2 -0
  301. package/lib/network/options.js.map +1 -1
  302. package/lib/network/peers/peerManager.d.ts +2 -1
  303. package/lib/network/peers/peerManager.d.ts.map +1 -1
  304. package/lib/network/peers/peerManager.js +28 -1
  305. package/lib/network/peers/peerManager.js.map +1 -1
  306. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  307. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  308. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  309. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  310. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  311. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  312. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  313. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  314. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  315. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  316. package/lib/network/peers/utils/subnetMap.js +6 -3
  317. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  318. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  319. package/lib/network/processor/extractSlotRootFns.js +1 -8
  320. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  321. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  322. package/lib/network/processor/gossipHandlers.js +52 -131
  323. package/lib/network/processor/gossipHandlers.js.map +1 -1
  324. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  325. package/lib/network/processor/gossipQueues/index.js +0 -6
  326. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  327. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  328. package/lib/network/processor/gossipValidatorFn.js +1 -5
  329. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  330. package/lib/network/processor/index.d.ts +6 -0
  331. package/lib/network/processor/index.d.ts.map +1 -1
  332. package/lib/network/processor/index.js +29 -4
  333. package/lib/network/processor/index.js.map +1 -1
  334. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  335. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  336. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  337. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  338. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  339. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  340. package/lib/network/reqresp/handlers/index.js +1 -12
  341. package/lib/network/reqresp/handlers/index.js.map +1 -1
  342. package/lib/network/reqresp/protocols.d.ts +0 -2
  343. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  344. package/lib/network/reqresp/protocols.js +0 -10
  345. package/lib/network/reqresp/protocols.js.map +1 -1
  346. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  347. package/lib/network/reqresp/rateLimit.js +1 -17
  348. package/lib/network/reqresp/rateLimit.js.map +1 -1
  349. package/lib/network/reqresp/types.d.ts +2 -8
  350. package/lib/network/reqresp/types.d.ts.map +1 -1
  351. package/lib/network/reqresp/types.js +1 -7
  352. package/lib/network/reqresp/types.js.map +1 -1
  353. package/lib/network/subnets/attnetsService.d.ts +35 -5
  354. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  355. package/lib/network/subnets/attnetsService.js +84 -6
  356. package/lib/network/subnets/attnetsService.js.map +1 -1
  357. package/lib/network/subnets/interface.d.ts +7 -0
  358. package/lib/network/subnets/interface.d.ts.map +1 -1
  359. package/lib/network/subnets/interface.js.map +1 -1
  360. package/lib/node/nodejs.d.ts +3 -1
  361. package/lib/node/nodejs.d.ts.map +1 -1
  362. package/lib/node/nodejs.js +47 -21
  363. package/lib/node/nodejs.js.map +1 -1
  364. package/lib/node/options.d.ts +3 -1
  365. package/lib/node/options.d.ts.map +1 -1
  366. package/lib/node/options.js +4 -2
  367. package/lib/node/options.js.map +1 -1
  368. package/lib/sync/interface.d.ts.map +1 -1
  369. package/lib/sync/interface.js.map +1 -1
  370. package/lib/sync/range/batch.d.ts +2 -3
  371. package/lib/sync/range/batch.d.ts.map +1 -1
  372. package/lib/sync/range/batch.js +9 -22
  373. package/lib/sync/range/batch.js.map +1 -1
  374. package/lib/sync/range/chain.d.ts.map +1 -1
  375. package/lib/sync/range/chain.js +2 -15
  376. package/lib/sync/range/chain.js.map +1 -1
  377. package/lib/sync/sync.d.ts +7 -0
  378. package/lib/sync/sync.d.ts.map +1 -1
  379. package/lib/sync/sync.js +61 -3
  380. package/lib/sync/sync.js.map +1 -1
  381. package/lib/sync/unknownBlock.d.ts.map +1 -1
  382. package/lib/sync/unknownBlock.js +1 -7
  383. package/lib/sync/unknownBlock.js.map +1 -1
  384. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  385. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  386. package/lib/sync/utils/downloadByRange.js +24 -128
  387. package/lib/sync/utils/downloadByRange.js.map +1 -1
  388. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  389. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  390. package/lib/sync/utils/downloadByRoot.js +14 -99
  391. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  392. package/lib/util/blobs.d.ts +1 -7
  393. package/lib/util/blobs.d.ts.map +1 -1
  394. package/lib/util/blobs.js +0 -19
  395. package/lib/util/blobs.js.map +1 -1
  396. package/lib/util/execution.d.ts +3 -4
  397. package/lib/util/execution.d.ts.map +1 -1
  398. package/lib/util/execution.js +1 -73
  399. package/lib/util/execution.js.map +1 -1
  400. package/lib/util/file.d.ts.map +1 -1
  401. package/lib/util/file.js +8 -9
  402. package/lib/util/file.js.map +1 -1
  403. package/lib/util/queue/itemQueue.js +1 -1
  404. package/lib/util/queue/itemQueue.js.map +1 -1
  405. package/lib/util/sszBytes.d.ts +5 -1
  406. package/lib/util/sszBytes.d.ts.map +1 -1
  407. package/lib/util/sszBytes.js +36 -19
  408. package/lib/util/sszBytes.js.map +1 -1
  409. package/lib/util/types.d.ts +0 -5
  410. package/lib/util/types.d.ts.map +1 -1
  411. package/lib/util/types.js +1 -2
  412. package/lib/util/types.js.map +1 -1
  413. package/package.json +16 -17
  414. package/src/api/impl/beacon/blocks/index.ts +59 -109
  415. package/src/api/impl/beacon/pool/index.ts +31 -1
  416. package/src/api/impl/beacon/state/utils.ts +1 -1
  417. package/src/api/impl/validator/index.ts +47 -30
  418. package/src/chain/GetBlobsTracker.ts +82 -52
  419. package/src/chain/archiveStore/archiveStore.ts +1 -0
  420. package/src/chain/archiveStore/utils/archiveBlocks.ts +12 -4
  421. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  422. package/src/chain/blocks/blockInput/errors.ts +1 -2
  423. package/src/chain/blocks/blockInput/types.ts +2 -20
  424. package/src/chain/blocks/importBlock.ts +61 -76
  425. package/src/chain/blocks/importExecutionPayload.ts +55 -34
  426. package/src/chain/blocks/index.ts +11 -4
  427. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  428. package/src/chain/blocks/types.ts +5 -31
  429. package/src/chain/blocks/verifyBlock.ts +31 -16
  430. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  431. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  432. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  433. package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
  434. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  435. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  436. package/src/chain/bls/interface.ts +2 -0
  437. package/src/chain/bls/multithread/index.ts +14 -10
  438. package/src/chain/bls/multithread/types.ts +1 -1
  439. package/src/chain/bls/multithread/worker.ts +1 -5
  440. package/src/chain/bls/singleThread.ts +1 -1
  441. package/src/chain/bls/utils.ts +1 -1
  442. package/src/chain/chain.ts +140 -42
  443. package/src/chain/emitter.ts +8 -8
  444. package/src/chain/errors/blockError.ts +1 -1
  445. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  446. package/src/chain/errors/index.ts +0 -1
  447. package/src/chain/forkChoice/index.ts +11 -0
  448. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  449. package/src/chain/interface.ts +9 -6
  450. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  451. package/src/chain/opPools/attestationPool.ts +16 -4
  452. package/src/chain/opPools/index.ts +1 -0
  453. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  454. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  455. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  456. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  457. package/src/chain/opPools/utils.ts +1 -1
  458. package/src/chain/options.ts +5 -4
  459. package/src/chain/produceBlock/produceBlockBody.ts +7 -3
  460. package/src/chain/proposerTracker.ts +94 -0
  461. package/src/chain/regen/interface.ts +1 -1
  462. package/src/chain/regen/queued.ts +6 -4
  463. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  464. package/src/chain/validation/executionPayloadBid.ts +14 -13
  465. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  466. package/src/chain/validatorMonitor.ts +0 -6
  467. package/src/db/beacon.ts +39 -0
  468. package/src/db/dataColumnStore.ts +2 -4
  469. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  470. package/src/db/flatFileStore/slotIndex.ts +4 -3
  471. package/src/db/interface.ts +2 -0
  472. package/src/db/repositories/blobSidecars.ts +0 -1
  473. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  474. package/src/execution/builder/apiClient.ts +16 -13
  475. package/src/execution/builder/http.ts +4 -0
  476. package/src/execution/engine/http.ts +19 -42
  477. package/src/execution/engine/index.ts +1 -1
  478. package/src/execution/engine/interface.ts +19 -10
  479. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  480. package/src/execution/engine/mock.ts +0 -7
  481. package/src/execution/engine/restTransport.ts +3 -22
  482. package/src/execution/engine/sszTypes.ts +0 -9
  483. package/src/execution/engine/transport.ts +8 -17
  484. package/src/execution/engine/types.ts +3 -18
  485. package/src/execution/engine/utils.ts +4 -2
  486. package/src/index.ts +1 -1
  487. package/src/metrics/metrics/beacon.ts +0 -30
  488. package/src/metrics/metrics/lodestar.ts +80 -18
  489. package/src/metrics/server/http.ts +5 -5
  490. package/src/monitoring/service.ts +1 -1
  491. package/src/network/core/networkCore.ts +11 -1
  492. package/src/network/core/networkCoreWorker.ts +2 -0
  493. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  494. package/src/network/core/types.ts +6 -1
  495. package/src/network/gossip/gossipsub.ts +11 -0
  496. package/src/network/gossip/interface.ts +0 -5
  497. package/src/network/gossip/topic.ts +0 -25
  498. package/src/network/interface.ts +2 -5
  499. package/src/network/libp2p/index.ts +5 -1
  500. package/src/network/network.ts +55 -58
  501. package/src/network/options.ts +4 -0
  502. package/src/network/peers/peerManager.ts +28 -3
  503. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  504. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  505. package/src/network/peers/utils/subnetMap.ts +6 -3
  506. package/src/network/processor/extractSlotRootFns.ts +0 -9
  507. package/src/network/processor/gossipHandlers.ts +65 -164
  508. package/src/network/processor/gossipQueues/index.ts +0 -6
  509. package/src/network/processor/gossipValidatorFn.ts +0 -5
  510. package/src/network/processor/index.ts +25 -4
  511. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  512. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  513. package/src/network/reqresp/handlers/index.ts +0 -17
  514. package/src/network/reqresp/protocols.ts +0 -12
  515. package/src/network/reqresp/rateLimit.ts +1 -17
  516. package/src/network/reqresp/types.ts +0 -13
  517. package/src/network/subnets/attnetsService.ts +94 -6
  518. package/src/network/subnets/interface.ts +7 -0
  519. package/src/node/nodejs.ts +58 -22
  520. package/src/node/options.ts +9 -6
  521. package/src/sync/interface.ts +1 -0
  522. package/src/sync/range/batch.ts +9 -21
  523. package/src/sync/range/chain.ts +2 -14
  524. package/src/sync/sync.ts +65 -4
  525. package/src/sync/unknownBlock.ts +1 -8
  526. package/src/sync/utils/downloadByRange.ts +31 -230
  527. package/src/sync/utils/downloadByRoot.ts +15 -142
  528. package/src/util/blobs.ts +0 -34
  529. package/src/util/execution.ts +8 -102
  530. package/src/util/file.ts +8 -9
  531. package/src/util/queue/itemQueue.ts +1 -1
  532. package/src/util/sszBytes.ts +42 -24
  533. package/src/util/types.ts +1 -8
  534. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  535. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  536. package/lib/chain/errors/blobSidecarError.js +0 -38
  537. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  538. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  539. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  540. package/lib/chain/validation/blobSidecar.js +0 -276
  541. package/lib/chain/validation/blobSidecar.js.map +0 -1
  542. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  543. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  544. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  545. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  546. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  547. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  548. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  549. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  550. package/src/chain/errors/blobSidecarError.ts +0 -70
  551. package/src/chain/validation/blobSidecar.ts +0 -357
  552. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  553. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -20,6 +20,7 @@ const gossipType = GossipType.beacon_attestation;
20
20
  export enum SubnetSource {
21
21
  committee = "committee",
22
22
  longLived = "long_lived",
23
+ beforeProposal = "before_proposal",
23
24
  }
24
25
 
25
26
  // map of subnet to time to form stable mesh as seconds, null if not yet formed
@@ -40,7 +41,7 @@ export class AttnetsService implements IAttnetsService {
40
41
  /** Committee subnets - PeerManager must find peers for those */
41
42
  private committeeSubnets = new SubnetMap();
42
43
  /**
43
- * All currently subscribed short-lived subnets, for attestation aggregation
44
+ * All currently subscribed short-lived subnets, for attestation aggregation and before local block proposals
44
45
  * This class will tell gossip to subscribe and un-subscribe
45
46
  * If a value exists for `SubscriptionId` it means that gossip subscription is active in network.gossip
46
47
  */
@@ -52,6 +53,11 @@ export class AttnetsService implements IAttnetsService {
52
53
  * Used to determine if we should process an attestation.
53
54
  */
54
55
  private aggregatorSlotSubnet = new MapDef<Slot, AggregatorDutyInfo>(() => new Map());
56
+ /**
57
+ * Block proposal slots of validators connected to this node.
58
+ * Used to subscribe to all subnets `slotsToSubscribeBeforeProposalDuty` slots before, see onSlot
59
+ */
60
+ private localProposalSlots = new Set<Slot>();
55
61
 
56
62
  constructor(
57
63
  private readonly config: BeaconConfig,
@@ -119,6 +125,22 @@ export class AttnetsService implements IAttnetsService {
119
125
  }
120
126
  }
121
127
 
128
+ /**
129
+ * Called from the main thread with upcoming block proposal slots of connected validators.
130
+ * Tracked here, the subscription happens in onSlot like aggregator duties, or right away for a proposal learned
131
+ * after its subscription slot (node restart, newly connected validator)
132
+ */
133
+ addLocalProposalSlots(slots: Slot[]): void {
134
+ const clockSlot = this.clock.currentSlot;
135
+ for (const proposalSlot of slots) {
136
+ this.localProposalSlots.add(proposalSlot);
137
+ // not from the slot before the proposal, its votes are published before a mesh could form
138
+ if (proposalSlot - this.opts.slotsToSubscribeBeforeProposalDuty <= clockSlot && clockSlot < proposalSlot - 1) {
139
+ this.subscribeAllSubnetsUntilProposal(proposalSlot);
140
+ }
141
+ }
142
+ }
143
+
122
144
  /**
123
145
  * Check if a subscription is still active before handling a gossip object
124
146
  */
@@ -158,7 +180,8 @@ export class AttnetsService implements IAttnetsService {
158
180
 
159
181
  /**
160
182
  * Run per slot.
161
- * - Subscribe to gossip subnets 2 slots in advance
183
+ * - Subscribe to gossip subnets 2 slots in advance of aggregator duties
184
+ * - Subscribe to all subnets `slotsToSubscribeBeforeProposalDuty` slots in advance of local block proposals
162
185
  * - Unsubscribe from expired subnets
163
186
  * - Track time to stable mesh if not yet formed
164
187
  */
@@ -186,19 +209,76 @@ export class AttnetsService implements IAttnetsService {
186
209
  this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
187
210
  }
188
211
 
212
+ // Must run before unsubscribeExpiredCommitteeSubnets so that a subnet whose subscription expires in this slot
213
+ // gets its ttl extended instead of being unsubscribed and subscribed again
214
+ this.subscribeAllSubnetsBeforeProposal(clockSlot);
215
+
189
216
  this.unsubscribeExpiredCommitteeSubnets(clockSlot);
190
217
  this.pruneExpiredAggregator(clockSlot);
218
+ this.pruneExpiredLocalProposals(clockSlot);
191
219
  } catch (e) {
192
220
  this.logger.error("Error on AttnetsService.onSlot", {slot: clockSlot}, e as Error);
193
221
  }
194
222
  };
195
223
 
196
224
  private onHalfSlot = (clockSlot: Slot): void => {
197
- for (const [dutiedSlot, dutiedInfo] of this.aggregatorSlotSubnet.entries()) {
198
- this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
225
+ try {
226
+ for (const [dutiedSlot, dutiedInfo] of this.aggregatorSlotSubnet.entries()) {
227
+ this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
228
+ }
229
+
230
+ this.unsubscribeAllSubnetsBeforeProposal(clockSlot);
231
+ } catch (e) {
232
+ this.logger.error("Error on AttnetsService.onHalfSlot", {slot: clockSlot}, e as Error);
199
233
  }
200
234
  };
201
235
 
236
+ /**
237
+ * Subscribe to all subnets `slotsToSubscribeBeforeProposalDuty` slots before a block proposal of a connected
238
+ * validator, so that single attestations of those slots can be packed into the block. The subscription expires in
239
+ * the slot before the proposal, see unsubscribeAllSubnetsBeforeProposal
240
+ */
241
+ private subscribeAllSubnetsBeforeProposal(clockSlot: Slot): void {
242
+ for (const proposalSlot of this.localProposalSlots) {
243
+ if (proposalSlot === clockSlot + this.opts.slotsToSubscribeBeforeProposalDuty) {
244
+ this.subscribeAllSubnetsUntilProposal(proposalSlot);
245
+ }
246
+ }
247
+ }
248
+
249
+ private subscribeAllSubnetsUntilProposal(proposalSlot: Slot): void {
250
+ if (this.opts.slotsToSubscribeBeforeProposalDuty === 0 || this.opts.subscribeAllSubnets) {
251
+ return;
252
+ }
253
+
254
+ const subnets = Array.from({length: ATTESTATION_SUBNET_COUNT}, (_, subnet) => subnet);
255
+ // Same as aggregator duties: trigger gossip subscription first, then register the subscriptions.
256
+ // Do not add to committeeSubnets: it drives peer discovery, we only use the peers we already have
257
+ this.subscribeToSubnets(subnets, SubnetSource.beforeProposal);
258
+ for (const subnet of subnets) {
259
+ this.shortLivedSubscriptions.request({subnet, toSlot: proposalSlot - 1});
260
+ }
261
+ }
262
+
263
+ /**
264
+ * Unsubscribe from subnets of subscribeAllSubnetsBeforeProposal at half of the slot before the proposal instead of
265
+ * the proposal slot start, so the proposal slot does not carry their traffic. Single attestations are published at
266
+ * 1/3 of the slot so they have arrived by then.
267
+ * Short-lived subscriptions are either aggregator duties or these, an aggregator duty ends in its dutied slot and is
268
+ * kept here (aggregates are due later), it expires at the next slot start in onSlot as before. So only subnets of
269
+ * subscribeAllSubnetsBeforeProposal are unsubscribed here.
270
+ */
271
+ private unsubscribeAllSubnetsBeforeProposal(clockSlot: Slot): void {
272
+ const aggregatorSubnets = this.aggregatorSlotSubnet.get(clockSlot);
273
+ const expiring = this.shortLivedSubscriptions.getExpired(
274
+ clockSlot + 1,
275
+ (subnet) => aggregatorSubnets?.has(subnet) === true
276
+ );
277
+ if (expiring.length > 0) {
278
+ this.unsubscribeSubnets(expiring, clockSlot + 1, SubnetSource.beforeProposal);
279
+ }
280
+ }
281
+
202
282
  /**
203
283
  * Track time to form stable mesh if not yet formed
204
284
  */
@@ -291,8 +371,8 @@ export class AttnetsService implements IAttnetsService {
291
371
  }
292
372
 
293
373
  /**
294
- * Unsubscribe to a committee subnet from subscribedCommitteeSubnets.
295
- * If a random subnet is present, we do not unsubscribe from it.
374
+ * Unsubscribe from short-lived subnets whose subscription expired.
375
+ * If a long-lived subnet is present, we do not unsubscribe from it.
296
376
  */
297
377
  private unsubscribeExpiredCommitteeSubnets(slot: Slot): void {
298
378
  const expired = this.shortLivedSubscriptions.getExpired(slot);
@@ -313,6 +393,14 @@ export class AttnetsService implements IAttnetsService {
313
393
  }
314
394
  }
315
395
 
396
+ private pruneExpiredLocalProposals(currentSlot: Slot): void {
397
+ for (const proposalSlot of this.localProposalSlots) {
398
+ if (currentSlot > proposalSlot) {
399
+ this.localProposalSlots.delete(proposalSlot);
400
+ }
401
+ }
402
+ }
403
+
316
404
  /** Update ENR */
317
405
  private updateMetadata(): void {
318
406
  const subnets = ssz.phase0.AttestationSubnets.defaultValue();
@@ -25,6 +25,8 @@ export type SubnetsService = {
25
25
 
26
26
  export interface IAttnetsService extends SubnetsService {
27
27
  shouldProcess(subnet: SubnetID, slot: Slot): boolean;
28
+ /** Block proposal slots of validators connected to this node, see `slotsToSubscribeBeforeProposalDuty` */
29
+ addLocalProposalSlots(slots: Slot[]): void;
28
30
  }
29
31
 
30
32
  export type RandBetweenFn = (min: number, max: number) => number;
@@ -33,6 +35,11 @@ export type ShuffleFn = <T>(arr: T[]) => T[];
33
35
  export type SubnetsServiceOpts = {
34
36
  subscribeAllSubnets?: boolean;
35
37
  slotsToSubscribeBeforeAggregatorDuty: number;
38
+ /**
39
+ * Subscribe to all attestation subnets this many slots before a block proposal of a connected validator, so that
40
+ * its single attestations can be packed into the block. In `[0, SLOTS_PER_EPOCH]`, 0 disables
41
+ */
42
+ slotsToSubscribeBeforeProposalDuty: number;
36
43
  };
37
44
 
38
45
  export type SubnetsServiceTestOpts = {
@@ -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
 
@@ -30,10 +35,11 @@ export class BeaconSync implements IBeaconSync {
30
35
  private readonly slotImportTolerance: Slot;
31
36
 
32
37
  constructor(opts: SyncOptions, modules: SyncModules) {
33
- const {config, chain, metrics, network, logger} = modules;
38
+ const {config, chain, db, metrics, network, logger} = modules;
34
39
  this.opts = opts;
35
40
  this.network = network;
36
41
  this.chain = chain;
42
+ this.db = db;
37
43
  this.metrics = metrics;
38
44
  this.logger = logger;
39
45
  this.rangeSync = new RangeSync(modules, opts);
@@ -192,6 +198,11 @@ export class BeaconSync implements IBeaconSync {
192
198
  */
193
199
  private addPeer = (data: NetworkEventData[NetworkEvent.peerConnected]): void => {
194
200
  const localStatus = this.chain.getStatus();
201
+ // Genesis and equal finalized epochs are already checked by assertPeerRelevance in the network worker
202
+ if (data.status.finalizedEpoch > GENESIS_EPOCH && data.status.finalizedEpoch < localStatus.finalizedEpoch) {
203
+ void this.verifyPastFinalizedCheckpoint(data.peer, data.status);
204
+ }
205
+
195
206
  const syncType = getPeerSyncType(localStatus, data.status, this.chain.forkChoice, this.slotImportTolerance);
196
207
  this.logger.verbose("Peer sync type classified", {
197
208
  peer: data.peer,
@@ -216,6 +227,56 @@ export class BeaconSync implements IBeaconSync {
216
227
  this.updateSyncState();
217
228
  };
218
229
 
230
+ /**
231
+ * A behind peer's finalized checkpoint must be the canonical block in effect at the start slot of its epoch
232
+ */
233
+ async verifyPastFinalizedCheckpoint(peer: PeerIdStr, remote: Status): Promise<void> {
234
+ const startSlot = computeStartSlotAtEpoch(remote.finalizedEpoch);
235
+ const root = toRootHex(remote.finalizedRoot);
236
+ try {
237
+ let reason: string | null = null;
238
+ // After a finality jump, finalized blocks stay in fork choice until the archiver migrates them.
239
+ // Fork choice is pruned only after archiving, so a miss here means the db already has this range.
240
+ const canonicalBlock = this.chain.forkChoice.getCanonicalBlockClosestLteSlot(startSlot);
241
+ if (canonicalBlock !== null) {
242
+ if (canonicalBlock.blockRoot === root) return;
243
+ reason = "finalized_root_not_canonical";
244
+ } else {
245
+ const slot = await this.db.blockArchive.getSlotByRoot(remote.finalizedRoot);
246
+ if (slot !== null && slot > startSlot) {
247
+ reason = "finalized_root_after_epoch_start";
248
+ } else if (slot !== startSlot) {
249
+ const childSlot = await this.db.blockArchive.getSlotByParentRoot(remote.finalizedRoot);
250
+ if (childSlot !== null) {
251
+ if (childSlot <= startSlot) reason = "finalized_root_not_in_effect_at_epoch_start";
252
+ } else if (slot === null && startSlot > this.chain.earliestAvailableSlot) {
253
+ // childSlot == null too, neither the root nor a child is canonical
254
+ // or they are canonical and both pruned but peer's finalized epoch starts after earliestAvailableSlot
255
+ reason = "unknown_finalized_root";
256
+ }
257
+ }
258
+ }
259
+
260
+ if (reason !== null) {
261
+ this.logger.debug("Peer finalized checkpoint not in our chain", {
262
+ peer,
263
+ finalizedEpoch: remote.finalizedEpoch,
264
+ root,
265
+ reason,
266
+ });
267
+ this.metrics?.syncPeerFinalizedCheckpointMismatch.inc({reason});
268
+ this.network.reportPeer(peer, PeerAction.Fatal, "PeerFinalizedCheckpointMismatch");
269
+ await this.network.goodbyeAndDisconnect(peer, GoodByeReasonCode.IRRELEVANT_NETWORK);
270
+ }
271
+ } catch (e) {
272
+ this.logger.debug(
273
+ "Error verifying peer finalized checkpoint",
274
+ {peer, finalizedEpoch: remote.finalizedEpoch, root},
275
+ e as Error
276
+ );
277
+ }
278
+ }
279
+
219
280
  /**
220
281
  * Must be called by libp2p when a peer is removed from the peer manager
221
282
  */
@@ -6,7 +6,7 @@ import {RequestError, RequestErrorCode} from "@lodestar/reqresp";
6
6
  import {computeTimeAtSlot} from "@lodestar/state-transition";
7
7
  import {RootHex, Slot, gloas} from "@lodestar/types";
8
8
  import {Logger, fromHex, isErrorAborted, prettyPrintIndices, pruneSetToMax, sleep, toRootHex} from "@lodestar/utils";
9
- import {isBlockInputBlobs, isBlockInputColumns} from "../chain/blocks/blockInput/blockInput.js";
9
+ import {isBlockInputColumns} from "../chain/blocks/blockInput/blockInput.js";
10
10
  import {BlockInputSource, IBlockInput} from "../chain/blocks/blockInput/types.js";
11
11
  import {PayloadError, PayloadErrorCode} from "../chain/blocks/importExecutionPayload.js";
12
12
  import {PayloadEnvelopeInput, PayloadEnvelopeInputSource} from "../chain/blocks/payloadEnvelopeInput/index.js";
@@ -1910,13 +1910,6 @@ export class BlockInputSync {
1910
1910
  throw new Error(`${message} Block was not found.`);
1911
1911
  }
1912
1912
 
1913
- if (isBlockInputBlobs(cacheItem.blockInput)) {
1914
- const missing = cacheItem.blockInput.getMissingBlobMeta().map((b) => b.index);
1915
- if (missing.length) {
1916
- throw new Error(`${message} Missing blob indices=${prettyPrintIndices(missing)}.`);
1917
- }
1918
- }
1919
-
1920
1913
  if (isBlockInputColumns(cacheItem.blockInput)) {
1921
1914
  const missing = cacheItem.blockInput.getMissingSampledColumnMeta().missing;
1922
1915
  if (missing.length) {