@lodestar/beacon-node 1.51.0-dev.83da04fef3 → 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 (636) hide show
  1. package/lib/api/impl/api.js +1 -1
  2. package/lib/api/impl/api.js.map +1 -1
  3. package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
  4. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/blocks/index.js +48 -95
  6. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  7. package/lib/api/impl/beacon/index.d.ts +2 -1
  8. package/lib/api/impl/beacon/index.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/index.js +2 -2
  10. package/lib/api/impl/beacon/index.js.map +1 -1
  11. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/pool/index.js +22 -2
  13. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  14. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  15. package/lib/api/impl/beacon/state/index.js +8 -2
  16. package/lib/api/impl/beacon/state/index.js.map +1 -1
  17. package/lib/api/impl/beacon/state/utils.d.ts +3 -2
  18. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  19. package/lib/api/impl/beacon/state/utils.js +17 -9
  20. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  21. package/lib/api/impl/debug/index.d.ts.map +1 -1
  22. package/lib/api/impl/debug/index.js +3 -0
  23. package/lib/api/impl/debug/index.js.map +1 -1
  24. package/lib/api/impl/validator/index.d.ts +6 -0
  25. package/lib/api/impl/validator/index.d.ts.map +1 -1
  26. package/lib/api/impl/validator/index.js +143 -35
  27. package/lib/api/impl/validator/index.js.map +1 -1
  28. package/lib/api/options.d.ts +2 -0
  29. package/lib/api/options.d.ts.map +1 -1
  30. package/lib/api/options.js +1 -0
  31. package/lib/api/options.js.map +1 -1
  32. package/lib/chain/ColumnReconstructionTracker.d.ts +11 -11
  33. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  34. package/lib/chain/ColumnReconstructionTracker.js +46 -40
  35. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  36. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  37. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  38. package/lib/chain/GetBlobsTracker.js +69 -35
  39. package/lib/chain/GetBlobsTracker.js.map +1 -1
  40. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  41. package/lib/chain/archiveStore/archiveStore.js +1 -0
  42. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  43. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  44. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  45. package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
  46. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  47. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  48. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  49. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  50. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  51. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  52. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  53. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  54. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  55. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  56. package/lib/chain/blocks/blockInput/types.js +0 -1
  57. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  58. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  59. package/lib/chain/blocks/importBlock.js +42 -57
  60. package/lib/chain/blocks/importBlock.js.map +1 -1
  61. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  62. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  63. package/lib/chain/blocks/importExecutionPayload.js +82 -20
  64. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  65. package/lib/chain/blocks/index.d.ts.map +1 -1
  66. package/lib/chain/blocks/index.js +4 -4
  67. package/lib/chain/blocks/index.js.map +1 -1
  68. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  69. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  70. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  71. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  72. package/lib/chain/blocks/types.d.ts +7 -19
  73. package/lib/chain/blocks/types.d.ts.map +1 -1
  74. package/lib/chain/blocks/types.js +5 -24
  75. package/lib/chain/blocks/types.js.map +1 -1
  76. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  77. package/lib/chain/blocks/verifyBlock.js +18 -7
  78. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  79. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  80. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  81. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  82. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  83. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  84. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  85. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  86. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  87. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  88. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  89. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  90. package/lib/chain/blocks/verifyBlocksSignatures.js +7 -5
  91. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  92. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  93. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  94. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  95. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  96. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  97. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  98. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  99. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  100. package/lib/chain/bls/interface.d.ts +2 -0
  101. package/lib/chain/bls/interface.d.ts.map +1 -1
  102. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  103. package/lib/chain/bls/multithread/index.js +13 -11
  104. package/lib/chain/bls/multithread/index.js.map +1 -1
  105. package/lib/chain/bls/multithread/types.d.ts +1 -1
  106. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  107. package/lib/chain/bls/multithread/worker.js +1 -1
  108. package/lib/chain/bls/multithread/worker.js.map +1 -1
  109. package/lib/chain/bls/singleThread.js +1 -1
  110. package/lib/chain/bls/singleThread.js.map +1 -1
  111. package/lib/chain/bls/utils.js +1 -1
  112. package/lib/chain/bls/utils.js.map +1 -1
  113. package/lib/chain/chain.d.ts +26 -4
  114. package/lib/chain/chain.d.ts.map +1 -1
  115. package/lib/chain/chain.js +128 -43
  116. package/lib/chain/chain.js.map +1 -1
  117. package/lib/chain/emitter.d.ts +7 -7
  118. package/lib/chain/emitter.d.ts.map +1 -1
  119. package/lib/chain/emitter.js +5 -5
  120. package/lib/chain/emitter.js.map +1 -1
  121. package/lib/chain/errors/blockError.d.ts +1 -1
  122. package/lib/chain/errors/blockError.d.ts.map +1 -1
  123. package/lib/chain/errors/blockError.js +1 -1
  124. package/lib/chain/errors/blockError.js.map +1 -1
  125. package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
  126. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  127. package/lib/chain/errors/executionPayloadBid.js +2 -0
  128. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  129. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  130. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  131. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  132. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  133. package/lib/chain/errors/inclusionList.d.ts +60 -0
  134. package/lib/chain/errors/inclusionList.d.ts.map +1 -0
  135. package/lib/chain/errors/inclusionList.js +19 -0
  136. package/lib/chain/errors/inclusionList.js.map +1 -0
  137. package/lib/chain/errors/index.d.ts +1 -1
  138. package/lib/chain/errors/index.d.ts.map +1 -1
  139. package/lib/chain/errors/index.js +1 -1
  140. package/lib/chain/errors/index.js.map +1 -1
  141. package/lib/chain/forkChoice/index.d.ts +11 -1
  142. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  143. package/lib/chain/forkChoice/index.js +11 -0
  144. package/lib/chain/forkChoice/index.js.map +1 -1
  145. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  146. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  147. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  148. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  149. package/lib/chain/interface.d.ts +10 -7
  150. package/lib/chain/interface.d.ts.map +1 -1
  151. package/lib/chain/interface.js.map +1 -1
  152. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  153. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  154. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  155. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  156. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  157. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  158. package/lib/chain/opPools/attestationPool.js +15 -4
  159. package/lib/chain/opPools/attestationPool.js.map +1 -1
  160. package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
  161. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
  162. package/lib/chain/opPools/inclusionListStore.js +171 -0
  163. package/lib/chain/opPools/inclusionListStore.js.map +1 -0
  164. package/lib/chain/opPools/index.d.ts +2 -0
  165. package/lib/chain/opPools/index.d.ts.map +1 -1
  166. package/lib/chain/opPools/index.js +2 -0
  167. package/lib/chain/opPools/index.js.map +1 -1
  168. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  169. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  170. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  171. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  172. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  173. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  174. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  175. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  176. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  177. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  178. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  179. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  180. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  181. package/lib/chain/opPools/utils.d.ts +1 -1
  182. package/lib/chain/opPools/utils.d.ts.map +1 -1
  183. package/lib/chain/opPools/utils.js +1 -1
  184. package/lib/chain/opPools/utils.js.map +1 -1
  185. package/lib/chain/options.d.ts +5 -3
  186. package/lib/chain/options.d.ts.map +1 -1
  187. package/lib/chain/options.js +0 -1
  188. package/lib/chain/options.js.map +1 -1
  189. package/lib/chain/produceBlock/produceBlockBody.d.ts +6 -3
  190. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  191. package/lib/chain/produceBlock/produceBlockBody.js +32 -11
  192. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  193. package/lib/chain/proposerTracker.d.ts +31 -0
  194. package/lib/chain/proposerTracker.d.ts.map +1 -0
  195. package/lib/chain/proposerTracker.js +75 -0
  196. package/lib/chain/proposerTracker.js.map +1 -0
  197. package/lib/chain/regen/interface.d.ts +2 -2
  198. package/lib/chain/regen/interface.d.ts.map +1 -1
  199. package/lib/chain/regen/interface.js +1 -1
  200. package/lib/chain/regen/interface.js.map +1 -1
  201. package/lib/chain/regen/queued.d.ts +1 -1
  202. package/lib/chain/regen/queued.d.ts.map +1 -1
  203. package/lib/chain/regen/queued.js +5 -3
  204. package/lib/chain/regen/queued.js.map +1 -1
  205. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  206. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  207. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  208. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  209. package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
  210. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  211. package/lib/chain/validation/executionPayloadBid.js +37 -158
  212. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  213. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  214. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  215. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  216. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  217. package/lib/chain/validation/inclusionList.d.ts +14 -0
  218. package/lib/chain/validation/inclusionList.d.ts.map +1 -0
  219. package/lib/chain/validation/inclusionList.js +150 -0
  220. package/lib/chain/validation/inclusionList.js.map +1 -0
  221. package/lib/chain/validation/index.d.ts +1 -0
  222. package/lib/chain/validation/index.d.ts.map +1 -1
  223. package/lib/chain/validation/index.js +1 -0
  224. package/lib/chain/validation/index.js.map +1 -1
  225. package/lib/chain/validatorMonitor.d.ts +1 -2
  226. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  227. package/lib/chain/validatorMonitor.js +0 -3
  228. package/lib/chain/validatorMonitor.js.map +1 -1
  229. package/lib/db/beacon.d.ts +7 -0
  230. package/lib/db/beacon.d.ts.map +1 -1
  231. package/lib/db/beacon.js +34 -0
  232. package/lib/db/beacon.js.map +1 -1
  233. package/lib/db/dataColumnStore.d.ts +1 -1
  234. package/lib/db/dataColumnStore.d.ts.map +1 -1
  235. package/lib/db/dataColumnStore.js +1 -4
  236. package/lib/db/dataColumnStore.js.map +1 -1
  237. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  238. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  239. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  240. package/lib/db/flatFileStore/slotIndex.js +2 -2
  241. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  242. package/lib/db/interface.d.ts +1 -0
  243. package/lib/db/interface.d.ts.map +1 -1
  244. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  245. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  246. package/lib/db/repositories/blobSidecars.js +0 -1
  247. package/lib/db/repositories/blobSidecars.js.map +1 -1
  248. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  249. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  250. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  251. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  252. package/lib/execution/builder/apiClient.d.ts +14 -8
  253. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  254. package/lib/execution/builder/apiClient.js +12 -10
  255. package/lib/execution/builder/apiClient.js.map +1 -1
  256. package/lib/execution/builder/http.d.ts +2 -0
  257. package/lib/execution/builder/http.d.ts.map +1 -1
  258. package/lib/execution/builder/http.js +2 -0
  259. package/lib/execution/builder/http.js.map +1 -1
  260. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  261. package/lib/execution/builder/validateBid.js +14 -1
  262. package/lib/execution/builder/validateBid.js.map +1 -1
  263. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  264. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  265. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  266. package/lib/execution/engine/disabled.d.ts +1 -0
  267. package/lib/execution/engine/disabled.d.ts.map +1 -1
  268. package/lib/execution/engine/disabled.js +3 -0
  269. package/lib/execution/engine/disabled.js.map +1 -1
  270. package/lib/execution/engine/http.d.ts +12 -8
  271. package/lib/execution/engine/http.d.ts.map +1 -1
  272. package/lib/execution/engine/http.js +35 -14
  273. package/lib/execution/engine/http.js.map +1 -1
  274. package/lib/execution/engine/index.d.ts +1 -1
  275. package/lib/execution/engine/index.d.ts.map +1 -1
  276. package/lib/execution/engine/index.js +1 -1
  277. package/lib/execution/engine/index.js.map +1 -1
  278. package/lib/execution/engine/interface.d.ts +29 -8
  279. package/lib/execution/engine/interface.d.ts.map +1 -1
  280. package/lib/execution/engine/interface.js.map +1 -1
  281. package/lib/execution/engine/jsonRpcTransport.d.ts +5 -6
  282. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  283. package/lib/execution/engine/jsonRpcTransport.js +34 -20
  284. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  285. package/lib/execution/engine/mock.d.ts +1 -1
  286. package/lib/execution/engine/mock.d.ts.map +1 -1
  287. package/lib/execution/engine/mock.js +31 -11
  288. package/lib/execution/engine/mock.js.map +1 -1
  289. package/lib/execution/engine/payloadIdCache.d.ts +5 -3
  290. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  291. package/lib/execution/engine/payloadIdCache.js +15 -4
  292. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  293. package/lib/execution/engine/restTransport.d.ts +4 -5
  294. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  295. package/lib/execution/engine/restTransport.js +4 -15
  296. package/lib/execution/engine/restTransport.js.map +1 -1
  297. package/lib/execution/engine/sszTypes.d.ts +38 -47
  298. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  299. package/lib/execution/engine/sszTypes.js +0 -5
  300. package/lib/execution/engine/sszTypes.js.map +1 -1
  301. package/lib/execution/engine/transport.d.ts +4 -14
  302. package/lib/execution/engine/transport.d.ts.map +1 -1
  303. package/lib/execution/engine/types.d.ts +25 -9
  304. package/lib/execution/engine/types.d.ts.map +1 -1
  305. package/lib/execution/engine/types.js +19 -14
  306. package/lib/execution/engine/types.js.map +1 -1
  307. package/lib/execution/engine/utils.d.ts.map +1 -1
  308. package/lib/execution/engine/utils.js +3 -2
  309. package/lib/execution/engine/utils.js.map +1 -1
  310. package/lib/index.d.ts +1 -0
  311. package/lib/index.d.ts.map +1 -1
  312. package/lib/index.js +2 -0
  313. package/lib/index.js.map +1 -1
  314. package/lib/metrics/metrics/beacon.d.ts +16 -9
  315. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  316. package/lib/metrics/metrics/beacon.js +35 -30
  317. package/lib/metrics/metrics/beacon.js.map +1 -1
  318. package/lib/metrics/metrics/lodestar.d.ts +49 -8
  319. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  320. package/lib/metrics/metrics/lodestar.js +128 -18
  321. package/lib/metrics/metrics/lodestar.js.map +1 -1
  322. package/lib/metrics/server/http.js +5 -5
  323. package/lib/metrics/server/http.js.map +1 -1
  324. package/lib/monitoring/service.js +1 -1
  325. package/lib/monitoring/service.js.map +1 -1
  326. package/lib/network/core/networkCore.d.ts +4 -1
  327. package/lib/network/core/networkCore.d.ts.map +1 -1
  328. package/lib/network/core/networkCore.js +7 -0
  329. package/lib/network/core/networkCore.js.map +1 -1
  330. package/lib/network/core/networkCoreWorker.js +2 -0
  331. package/lib/network/core/networkCoreWorker.js.map +1 -1
  332. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  333. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  334. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  335. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  336. package/lib/network/core/types.d.ts +6 -1
  337. package/lib/network/core/types.d.ts.map +1 -1
  338. package/lib/network/gossip/gossipsub.d.ts +1 -0
  339. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  340. package/lib/network/gossip/gossipsub.js +10 -0
  341. package/lib/network/gossip/gossipsub.js.map +1 -1
  342. package/lib/network/gossip/interface.d.ts +8 -9
  343. package/lib/network/gossip/interface.d.ts.map +1 -1
  344. package/lib/network/gossip/interface.js +1 -1
  345. package/lib/network/gossip/interface.js.map +1 -1
  346. package/lib/network/gossip/topic.d.ts +13 -21
  347. package/lib/network/gossip/topic.d.ts.map +1 -1
  348. package/lib/network/gossip/topic.js +13 -24
  349. package/lib/network/gossip/topic.js.map +1 -1
  350. package/lib/network/interface.d.ts +5 -5
  351. package/lib/network/interface.d.ts.map +1 -1
  352. package/lib/network/libp2p/index.d.ts.map +1 -1
  353. package/lib/network/libp2p/index.js +5 -1
  354. package/lib/network/libp2p/index.js.map +1 -1
  355. package/lib/network/network.d.ts +9 -7
  356. package/lib/network/network.d.ts.map +1 -1
  357. package/lib/network/network.js +58 -35
  358. package/lib/network/network.js.map +1 -1
  359. package/lib/network/options.d.ts +2 -0
  360. package/lib/network/options.d.ts.map +1 -1
  361. package/lib/network/options.js +2 -0
  362. package/lib/network/options.js.map +1 -1
  363. package/lib/network/peers/peerManager.d.ts +2 -1
  364. package/lib/network/peers/peerManager.d.ts.map +1 -1
  365. package/lib/network/peers/peerManager.js +28 -1
  366. package/lib/network/peers/peerManager.js.map +1 -1
  367. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  368. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  369. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  370. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  371. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
  372. package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
  373. package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
  374. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  375. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  376. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  377. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  378. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  379. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  380. package/lib/network/peers/utils/subnetMap.js +6 -3
  381. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  382. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  383. package/lib/network/processor/extractSlotRootFns.js +1 -8
  384. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  385. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  386. package/lib/network/processor/gossipHandlers.js +118 -149
  387. package/lib/network/processor/gossipHandlers.js.map +1 -1
  388. package/lib/network/processor/gossipQueues/index.js +6 -6
  389. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  390. package/lib/network/processor/gossipValidatorFn.js +5 -5
  391. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  392. package/lib/network/processor/index.d.ts +11 -0
  393. package/lib/network/processor/index.d.ts.map +1 -1
  394. package/lib/network/processor/index.js +66 -30
  395. package/lib/network/processor/index.js.map +1 -1
  396. package/lib/network/reqresp/ReqRespBeaconNode.js +6 -3
  397. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  398. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  399. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  400. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
  401. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
  402. package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
  403. package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
  404. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  405. package/lib/network/reqresp/handlers/index.js +6 -12
  406. package/lib/network/reqresp/handlers/index.js.map +1 -1
  407. package/lib/network/reqresp/protocols.d.ts +1 -2
  408. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  409. package/lib/network/reqresp/protocols.js +5 -10
  410. package/lib/network/reqresp/protocols.js.map +1 -1
  411. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  412. package/lib/network/reqresp/rateLimit.js +5 -17
  413. package/lib/network/reqresp/rateLimit.js.map +1 -1
  414. package/lib/network/reqresp/types.d.ts +6 -9
  415. package/lib/network/reqresp/types.d.ts.map +1 -1
  416. package/lib/network/reqresp/types.js +4 -7
  417. package/lib/network/reqresp/types.js.map +1 -1
  418. package/lib/network/subnets/attnetsService.d.ts +35 -5
  419. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  420. package/lib/network/subnets/attnetsService.js +84 -6
  421. package/lib/network/subnets/attnetsService.js.map +1 -1
  422. package/lib/network/subnets/interface.d.ts +7 -0
  423. package/lib/network/subnets/interface.d.ts.map +1 -1
  424. package/lib/network/subnets/interface.js.map +1 -1
  425. package/lib/node/nodejs.d.ts +3 -1
  426. package/lib/node/nodejs.d.ts.map +1 -1
  427. package/lib/node/nodejs.js +47 -21
  428. package/lib/node/nodejs.js.map +1 -1
  429. package/lib/node/options.d.ts +3 -1
  430. package/lib/node/options.d.ts.map +1 -1
  431. package/lib/node/options.js +4 -2
  432. package/lib/node/options.js.map +1 -1
  433. package/lib/sync/interface.d.ts.map +1 -1
  434. package/lib/sync/interface.js.map +1 -1
  435. package/lib/sync/range/batch.d.ts +2 -3
  436. package/lib/sync/range/batch.d.ts.map +1 -1
  437. package/lib/sync/range/batch.js +9 -22
  438. package/lib/sync/range/batch.js.map +1 -1
  439. package/lib/sync/range/chain.d.ts.map +1 -1
  440. package/lib/sync/range/chain.js +2 -15
  441. package/lib/sync/range/chain.js.map +1 -1
  442. package/lib/sync/sync.d.ts +7 -0
  443. package/lib/sync/sync.d.ts.map +1 -1
  444. package/lib/sync/sync.js +61 -3
  445. package/lib/sync/sync.js.map +1 -1
  446. package/lib/sync/unknownBlock.d.ts.map +1 -1
  447. package/lib/sync/unknownBlock.js +43 -25
  448. package/lib/sync/unknownBlock.js.map +1 -1
  449. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  450. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  451. package/lib/sync/utils/downloadByRange.js +24 -128
  452. package/lib/sync/utils/downloadByRange.js.map +1 -1
  453. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  454. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  455. package/lib/sync/utils/downloadByRoot.js +14 -99
  456. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  457. package/lib/util/blobs.d.ts +1 -7
  458. package/lib/util/blobs.d.ts.map +1 -1
  459. package/lib/util/blobs.js +0 -19
  460. package/lib/util/blobs.js.map +1 -1
  461. package/lib/util/execution.d.ts +3 -4
  462. package/lib/util/execution.d.ts.map +1 -1
  463. package/lib/util/execution.js +1 -73
  464. package/lib/util/execution.js.map +1 -1
  465. package/lib/util/file.d.ts.map +1 -1
  466. package/lib/util/file.js +8 -9
  467. package/lib/util/file.js.map +1 -1
  468. package/lib/util/queue/itemQueue.js +1 -1
  469. package/lib/util/queue/itemQueue.js.map +1 -1
  470. package/lib/util/sszBytes.d.ts +5 -1
  471. package/lib/util/sszBytes.d.ts.map +1 -1
  472. package/lib/util/sszBytes.js +36 -19
  473. package/lib/util/sszBytes.js.map +1 -1
  474. package/lib/util/types.d.ts +0 -5
  475. package/lib/util/types.d.ts.map +1 -1
  476. package/lib/util/types.js +1 -2
  477. package/lib/util/types.js.map +1 -1
  478. package/package.json +31 -32
  479. package/src/api/impl/api.ts +1 -1
  480. package/src/api/impl/beacon/blocks/index.ts +81 -126
  481. package/src/api/impl/beacon/index.ts +3 -1
  482. package/src/api/impl/beacon/pool/index.ts +31 -1
  483. package/src/api/impl/beacon/state/index.ts +10 -1
  484. package/src/api/impl/beacon/state/utils.ts +20 -10
  485. package/src/api/impl/debug/index.ts +4 -0
  486. package/src/api/impl/validator/index.ts +178 -39
  487. package/src/api/options.ts +3 -0
  488. package/src/chain/ColumnReconstructionTracker.ts +60 -41
  489. package/src/chain/GetBlobsTracker.ts +82 -52
  490. package/src/chain/archiveStore/archiveStore.ts +1 -0
  491. package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
  492. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  493. package/src/chain/blocks/blockInput/errors.ts +1 -2
  494. package/src/chain/blocks/blockInput/types.ts +2 -20
  495. package/src/chain/blocks/importBlock.ts +58 -77
  496. package/src/chain/blocks/importExecutionPayload.ts +123 -36
  497. package/src/chain/blocks/index.ts +11 -4
  498. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  499. package/src/chain/blocks/types.ts +8 -29
  500. package/src/chain/blocks/verifyBlock.ts +31 -16
  501. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  502. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  503. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  504. package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
  505. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  506. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  507. package/src/chain/bls/interface.ts +2 -0
  508. package/src/chain/bls/multithread/index.ts +14 -10
  509. package/src/chain/bls/multithread/types.ts +1 -1
  510. package/src/chain/bls/multithread/worker.ts +1 -5
  511. package/src/chain/bls/singleThread.ts +1 -1
  512. package/src/chain/bls/utils.ts +1 -1
  513. package/src/chain/chain.ts +145 -42
  514. package/src/chain/emitter.ts +8 -8
  515. package/src/chain/errors/blockError.ts +1 -1
  516. package/src/chain/errors/executionPayloadBid.ts +12 -0
  517. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  518. package/src/chain/errors/inclusionList.ts +38 -0
  519. package/src/chain/errors/index.ts +1 -1
  520. package/src/chain/forkChoice/index.ts +11 -0
  521. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  522. package/src/chain/interface.ts +11 -6
  523. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  524. package/src/chain/opPools/attestationPool.ts +16 -4
  525. package/src/chain/opPools/inclusionListStore.ts +208 -0
  526. package/src/chain/opPools/index.ts +2 -0
  527. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  528. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  529. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  530. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  531. package/src/chain/opPools/utils.ts +1 -1
  532. package/src/chain/options.ts +5 -4
  533. package/src/chain/produceBlock/produceBlockBody.ts +67 -22
  534. package/src/chain/proposerTracker.ts +94 -0
  535. package/src/chain/regen/interface.ts +2 -2
  536. package/src/chain/regen/queued.ts +6 -4
  537. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  538. package/src/chain/validation/executionPayloadBid.ts +54 -183
  539. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  540. package/src/chain/validation/inclusionList.ts +192 -0
  541. package/src/chain/validation/index.ts +1 -0
  542. package/src/chain/validatorMonitor.ts +0 -6
  543. package/src/db/beacon.ts +44 -0
  544. package/src/db/dataColumnStore.ts +2 -4
  545. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  546. package/src/db/flatFileStore/slotIndex.ts +4 -3
  547. package/src/db/interface.ts +2 -0
  548. package/src/db/repositories/blobSidecars.ts +0 -1
  549. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  550. package/src/execution/builder/apiClient.ts +16 -13
  551. package/src/execution/builder/http.ts +4 -0
  552. package/src/execution/builder/validateBid.ts +23 -2
  553. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  554. package/src/execution/engine/disabled.ts +4 -0
  555. package/src/execution/engine/http.ts +59 -47
  556. package/src/execution/engine/index.ts +1 -1
  557. package/src/execution/engine/interface.ts +46 -13
  558. package/src/execution/engine/jsonRpcTransport.ts +56 -31
  559. package/src/execution/engine/mock.ts +32 -14
  560. package/src/execution/engine/payloadIdCache.ts +24 -6
  561. package/src/execution/engine/restTransport.ts +18 -23
  562. package/src/execution/engine/sszTypes.ts +0 -9
  563. package/src/execution/engine/transport.ts +13 -17
  564. package/src/execution/engine/types.ts +44 -24
  565. package/src/execution/engine/utils.ts +4 -2
  566. package/src/index.ts +2 -0
  567. package/src/metrics/metrics/beacon.ts +37 -30
  568. package/src/metrics/metrics/lodestar.ts +131 -18
  569. package/src/metrics/server/http.ts +5 -5
  570. package/src/monitoring/service.ts +1 -1
  571. package/src/network/core/networkCore.ts +11 -1
  572. package/src/network/core/networkCoreWorker.ts +2 -0
  573. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  574. package/src/network/core/types.ts +6 -1
  575. package/src/network/gossip/gossipsub.ts +11 -0
  576. package/src/network/gossip/interface.ts +5 -5
  577. package/src/network/gossip/topic.ts +14 -25
  578. package/src/network/interface.ts +4 -5
  579. package/src/network/libp2p/index.ts +5 -1
  580. package/src/network/network.ts +66 -58
  581. package/src/network/options.ts +4 -0
  582. package/src/network/peers/peerManager.ts +28 -3
  583. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  584. package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
  585. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  586. package/src/network/peers/utils/subnetMap.ts +6 -3
  587. package/src/network/processor/extractSlotRootFns.ts +0 -9
  588. package/src/network/processor/gossipHandlers.ts +150 -183
  589. package/src/network/processor/gossipQueues/index.ts +6 -6
  590. package/src/network/processor/gossipValidatorFn.ts +5 -5
  591. package/src/network/processor/index.ts +58 -28
  592. package/src/network/processor/types.ts +1 -1
  593. package/src/network/reqresp/ReqRespBeaconNode.ts +7 -7
  594. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  595. package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
  596. package/src/network/reqresp/handlers/index.ts +5 -17
  597. package/src/network/reqresp/protocols.ts +6 -12
  598. package/src/network/reqresp/rateLimit.ts +5 -17
  599. package/src/network/reqresp/types.ts +6 -13
  600. package/src/network/subnets/attnetsService.ts +94 -6
  601. package/src/network/subnets/interface.ts +7 -0
  602. package/src/node/nodejs.ts +58 -22
  603. package/src/node/options.ts +9 -6
  604. package/src/sync/interface.ts +1 -0
  605. package/src/sync/range/batch.ts +9 -21
  606. package/src/sync/range/chain.ts +2 -14
  607. package/src/sync/sync.ts +65 -4
  608. package/src/sync/unknownBlock.ts +48 -36
  609. package/src/sync/utils/downloadByRange.ts +31 -230
  610. package/src/sync/utils/downloadByRoot.ts +15 -142
  611. package/src/util/blobs.ts +0 -34
  612. package/src/util/execution.ts +8 -102
  613. package/src/util/file.ts +8 -9
  614. package/src/util/queue/itemQueue.ts +1 -1
  615. package/src/util/sszBytes.ts +42 -24
  616. package/src/util/types.ts +1 -8
  617. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  618. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  619. package/lib/chain/errors/blobSidecarError.js +0 -38
  620. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  621. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  622. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  623. package/lib/chain/validation/blobSidecar.js +0 -276
  624. package/lib/chain/validation/blobSidecar.js.map +0 -1
  625. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  626. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  627. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  628. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  629. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  630. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  631. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  632. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  633. package/src/chain/errors/blobSidecarError.ts +0 -70
  634. package/src/chain/validation/blobSidecar.ts +0 -357
  635. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  636. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -1,11 +1,18 @@
1
1
  import path from "node:path";
2
2
  import {ChainForkConfig} from "@lodestar/config";
3
3
  import {KeyValue} from "@lodestar/db";
4
- import {CheckpointWithHex, ExecutionStatus, IForkChoice, PayloadStatus, ProtoBlock} from "@lodestar/fork-choice";
4
+ import {
5
+ CheckpointWithHex,
6
+ ExecutionStatus,
7
+ IForkChoice,
8
+ PayloadStatus,
9
+ ProtoBlock,
10
+ isGloasBlock,
11
+ } from "@lodestar/fork-choice";
5
12
  import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params";
6
13
  import {computeEpochAtSlot, computeStartSlotAtEpoch, getBlobDataRetentionStartEpoch} from "@lodestar/state-transition";
7
14
  import {Epoch, Slot} from "@lodestar/types";
8
- import {Logger, fromAsync, fromHex, prettyPrintIndices, toRootHex} from "@lodestar/utils";
15
+ import {Logger, fromHex, prettyPrintIndices, toRootHex} from "@lodestar/utils";
9
16
  import {IBeaconDb} from "../../../db/index.js";
10
17
  import {BlockArchiveBatchPutBinaryItem, encodeArchivedHeaderEnvelope} from "../../../db/repositories/index.js";
11
18
  import {Metrics} from "../../../metrics/metrics.js";
@@ -49,6 +56,17 @@ async function persistOrphanedBlock(
49
56
  await writeIfNotExist(filepath, bytes);
50
57
  }
51
58
 
59
+ /**
60
+ * Oldest epoch for which data column sidecars are kept
61
+ */
62
+ export function getDataColumnSidecarsMinEpoch(
63
+ config: ChainForkConfig,
64
+ currentEpoch: Epoch,
65
+ archiveDataEpochs?: number
66
+ ): Epoch {
67
+ return Math.min(getBlobDataRetentionStartEpoch(config, currentEpoch), currentEpoch - (archiveDataEpochs ?? 0));
68
+ }
69
+
52
70
  /**
53
71
  * Archives finalized blocks from active bucket to archive bucket.
54
72
  *
@@ -136,23 +154,6 @@ export async function archiveBlocks(
136
154
  logger.verbose("Migrated blobSidecars from hot DB to cold DB", {...logCtx, migratedEntries});
137
155
  }
138
156
 
139
- // Keep the normal LevelDB hot-to-cold flow for legacy columns. New columns are written
140
- // directly to flat files, so this only moves fallback data left by older versions.
141
- if (finalizedPostFulu) {
142
- const migratedSlots = await migrateDataColumnSidecarsFromHotToColdDb(
143
- config,
144
- db,
145
- logger,
146
- finalizedCanonicalBlocks,
147
- currentEpoch
148
- );
149
- logger.verbose("Migrated legacy dataColumnSidecars from hot DB to cold DB", {
150
- ...logCtx,
151
- migratedEntries: migratedSlots.length,
152
- slotRange: prettyPrintIndices(migratedSlots),
153
- });
154
- }
155
-
156
157
  if (finalizedPostGloas) {
157
158
  const migratedSlots = await migrateExecutionPayloadEnvelopesFromHotToColdDb(
158
159
  config,
@@ -169,44 +170,34 @@ export async function archiveBlocks(
169
170
  }
170
171
  }
171
172
 
172
- // deleteNonCanonicalBlocks
173
- // loop through forkchoice single time
173
+ const canonicalRoots = new Set(finalizedCanonicalBlocks.map((block) => block.blockRoot));
174
+ const orphanedBlocks: ProtoBlock[] = [];
175
+ const orphanedPayloads: ProtoBlock[] = [];
174
176
 
175
- const nonCanonicalBlockRoots = finalizedNonCanonicalBlocks.map((summary) => fromHex(summary.blockRoot));
176
- if (nonCanonicalBlockRoots.length > 0) {
177
- if (persistOrphanedBlocks) {
178
- // Persist orphaned blocks to disk before deleting them from hot db
179
- await Promise.all(
180
- nonCanonicalBlockRoots.map(async (root, index) => {
181
- const block = finalizedNonCanonicalBlocks[index];
182
- const blockBytes = await db.block.getBinary(root);
183
- const blockLogCtx = {slot: block.slot, root: block.blockRoot};
184
- if (blockBytes) {
185
- await persistOrphanedBlock(block.slot, block.blockRoot, blockBytes, {
186
- persistOrphanedBlocksDir: persistOrphanedBlocksDir ?? "orphaned_blocks",
187
- });
188
- logger.verbose("Persisted orphaned block", {...logCtx, ...blockLogCtx});
189
- } else {
190
- logger.warn("Tried to persist orphaned block but no block found", {...logCtx, ...blockLogCtx});
191
- }
192
- })
193
- );
177
+ for (const block of finalizedNonCanonicalBlocks) {
178
+ if (block.payloadStatus === PayloadStatus.FULL) {
179
+ orphanedPayloads.push(block);
194
180
  }
181
+ // Every Gloas block gets EMPTY before FULL. If only FULL survives pruning, an earlier archive run
182
+ // already handled the root's block-level data.
183
+ const isBlockNode = !isGloasBlock(block) || block.payloadStatus === PayloadStatus.EMPTY;
184
+ if (isBlockNode && !canonicalRoots.has(block.blockRoot)) {
185
+ orphanedBlocks.push(block);
186
+ }
187
+ }
188
+ const orphanedBlockRoots = orphanedBlocks.map((block) => fromHex(block.blockRoot));
195
189
 
196
- const nonCanonicalSlots = finalizedNonCanonicalBlocks.map((summary) => summary.slot).sort((a, b) => a - b);
197
- const nonCanonicalLogCtx = {
190
+ if (orphanedPayloads.length > 0) {
191
+ const orphanedPayloadRoots = orphanedPayloads.map((block) => fromHex(block.blockRoot));
192
+ const orphanedPayloadLogCtx = {
198
193
  ...logCtx,
199
- count: nonCanonicalBlockRoots.length,
200
- slotRange: prettyPrintIndices(nonCanonicalSlots),
194
+ count: orphanedPayloads.length,
195
+ slotRange: prettyPrintIndices(orphanedPayloads.map((block) => block.slot).sort((a, b) => a - b)),
201
196
  };
202
197
 
203
- const columnItems = finalizedNonCanonicalBlocks
204
- // Gloas EMPTY and FULL variants share a block root. EMPTY has no sidecars, so deleting by its root could
205
- // remove the canonical FULL variant's columns. Pre-Gloas blocks are always FULL.
206
- .filter(
207
- (summary) => config.getForkSeq(summary.slot) >= ForkSeq.fulu && summary.payloadStatus === PayloadStatus.FULL
208
- )
209
- .map((summary) => ({slot: summary.slot, blockRoot: summary.blockRoot}));
198
+ const columnItems = orphanedPayloads
199
+ .filter((block) => config.getForkSeq(block.slot) >= ForkSeq.fulu)
200
+ .map((block) => ({slot: block.slot, blockRoot: block.blockRoot}));
210
201
  if (columnItems.length > 0) {
211
202
  // Delete sidecars first so their block roots remain available to retry cleanup after a failure or crash.
212
203
  await db.dataColumns.deleteMany(columnItems);
@@ -217,20 +208,44 @@ export async function archiveBlocks(
217
208
  });
218
209
  }
219
210
 
220
- await db.block.batchDelete(nonCanonicalBlockRoots);
221
- logger.verbose("Deleted non canonical blocks from hot DB", nonCanonicalLogCtx);
222
-
223
211
  if (finalizedPostDeneb) {
224
- await db.blobSidecars.batchDelete(nonCanonicalBlockRoots);
225
- logger.verbose("Deleted non canonical blobSidecars from hot DB", nonCanonicalLogCtx);
212
+ await db.blobSidecars.batchDelete(orphanedPayloadRoots);
213
+ logger.verbose("Deleted non canonical blobSidecars from hot DB", orphanedPayloadLogCtx);
226
214
  }
227
215
 
228
216
  if (finalizedPostGloas) {
229
- await db.executionPayloadEnvelope.batchDelete(nonCanonicalBlockRoots);
230
- logger.verbose("Deleted non canonical executionPayloadEnvelopes from hot DB", nonCanonicalLogCtx);
217
+ await db.executionPayloadEnvelope.batchDelete(orphanedPayloadRoots);
218
+ logger.verbose("Deleted non canonical executionPayloadEnvelopes from hot DB", orphanedPayloadLogCtx);
231
219
  }
232
220
  }
233
221
 
222
+ if (orphanedBlocks.length > 0) {
223
+ if (persistOrphanedBlocks) {
224
+ // Persist orphaned blocks to disk before deleting them from hot db
225
+ await Promise.all(
226
+ orphanedBlocks.map(async (block) => {
227
+ const blockBytes = await db.block.getBinary(fromHex(block.blockRoot));
228
+ const blockLogCtx = {slot: block.slot, root: block.blockRoot};
229
+ if (blockBytes) {
230
+ await persistOrphanedBlock(block.slot, block.blockRoot, blockBytes, {
231
+ persistOrphanedBlocksDir: persistOrphanedBlocksDir ?? "orphaned_blocks",
232
+ });
233
+ logger.verbose("Persisted orphaned block", {...logCtx, ...blockLogCtx});
234
+ } else {
235
+ logger.debug("Tried to persist orphaned block but no block found", {...logCtx, ...blockLogCtx});
236
+ }
237
+ })
238
+ );
239
+ }
240
+
241
+ await db.block.batchDelete(orphanedBlockRoots);
242
+ logger.verbose("Deleted non canonical blocks from hot DB", {
243
+ ...logCtx,
244
+ count: orphanedBlocks.length,
245
+ slotRange: prettyPrintIndices(orphanedBlocks.map((block) => block.slot).sort((a, b) => a - b)),
246
+ });
247
+ }
248
+
234
249
  // Delete expired blobs
235
250
  // Keep only `[current_epoch - max(MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS, archiveDataEpochs)]`
236
251
  // if archiveDataEpochs set to Infinity do not prune`
@@ -256,10 +271,7 @@ export async function archiveBlocks(
256
271
  // Keep only `[min(compute_blob_data_retention_start_epoch(current_epoch), current_epoch - archiveDataEpochs)]`
257
272
  if (finalizedPostFulu) {
258
273
  if (archiveDataEpochs !== Infinity) {
259
- const dataColumnSidecarsMinEpoch = Math.min(
260
- getBlobDataRetentionStartEpoch(config, currentEpoch),
261
- currentEpoch - (archiveDataEpochs ?? 0)
262
- );
274
+ const dataColumnSidecarsMinEpoch = getDataColumnSidecarsMinEpoch(config, currentEpoch, archiveDataEpochs);
263
275
  if (dataColumnSidecarsMinEpoch >= config.FULU_FORK_EPOCH) {
264
276
  const columnsPruneSlot = computeStartSlotAtEpoch(dataColumnSidecarsMinEpoch);
265
277
  const prunedColumnSlots = await db.dataColumns.pruneBefore(columnsPruneSlot);
@@ -283,9 +295,9 @@ export async function archiveBlocks(
283
295
  }
284
296
  }
285
297
 
286
- // Prunning potential checkpoint data
298
+ // Pruning potential checkpoint data
287
299
  const finalizedCanonicalNonCheckpointBlocks = getNonCheckpointBlocks(finalizedCanonicalBlockRoots);
288
- const nonCheckpointBlockRoots: Uint8Array[] = [...nonCanonicalBlockRoots];
300
+ const nonCheckpointBlockRoots: Uint8Array[] = [...orphanedBlockRoots];
289
301
  for (const block of finalizedCanonicalNonCheckpointBlocks) {
290
302
  nonCheckpointBlockRoots.push(block.root);
291
303
  }
@@ -408,72 +420,6 @@ async function migrateBlobSidecarsFromHotToColdDb(
408
420
  return migratedWrappedBlobSidecars;
409
421
  }
410
422
 
411
- // TODO: This function can be simplified further by reducing layers of promises in a loop
412
- /**
413
- * Post-gloas the data columns of a Gloas block are tied to its execution payload envelope.
414
- * Columns only exist once the FULL variant of the block is in the proto-array. Pre-Gloas
415
- * blocks only have a FULL variant, so the payload-status filter passes them all.
416
- */
417
- async function migrateDataColumnSidecarsFromHotToColdDb(
418
- config: ChainForkConfig,
419
- db: IBeaconDb,
420
- logger: Logger,
421
- canonicalBlocks: ProtoBlock[],
422
- currentEpoch: Epoch
423
- ): Promise<Slot[]> {
424
- const columnBlocks = canonicalBlocks.filter(
425
- (block) => config.getForkSeq(block.slot) < ForkSeq.gloas || block.payloadStatus === PayloadStatus.FULL
426
- );
427
- if (columnBlocks.length === 0) return [];
428
- const blocks: BlockRootSlot[] = columnBlocks.map((block) => ({slot: block.slot, root: fromHex(block.blockRoot)}));
429
-
430
- const migratedSlots: Slot[] = [];
431
- for (let i = 0; i < blocks.length; i += BLOB_SIDECAR_BATCH_SIZE) {
432
- const toIdx = Math.min(i + BLOB_SIDECAR_BATCH_SIZE, blocks.length);
433
- const batch = blocks.slice(i, toIdx);
434
- if (batch.length === 0) break;
435
-
436
- const promises: Promise<void>[] = [];
437
- for (const block of batch) {
438
- const blockEpoch = computeEpochAtSlot(block.slot);
439
- if (
440
- config.getForkSeq(block.slot) < ForkSeq.fulu ||
441
- blockEpoch < getBlobDataRetentionStartEpoch(config, currentEpoch)
442
- ) {
443
- continue;
444
- }
445
-
446
- const dataColumnSidecarBytes = await fromAsync(db.dataColumnSidecar.valuesStreamBinary(block.root));
447
- if (dataColumnSidecarBytes.length === 0) {
448
- logger.debug("DataColumnSidecars in forkchoice but missing in hot db, could be already archived", {
449
- slot: block.slot,
450
- root: toRootHex(block.root),
451
- });
452
- continue;
453
- }
454
- logger.verbose("Migrated legacy dataColumnSidecars for block", {
455
- currentEpoch,
456
- slot: block.slot,
457
- root: toRootHex(block.root),
458
- numSidecars: dataColumnSidecarBytes.length,
459
- });
460
- promises.push(
461
- db.dataColumnSidecarArchive.putManyBinary(
462
- block.slot,
463
- dataColumnSidecarBytes.map((entry) => ({key: entry.id, value: entry.value}))
464
- )
465
- );
466
- migratedSlots.push(block.slot);
467
- }
468
-
469
- await Promise.all(promises);
470
- await db.dataColumnSidecar.deleteMany(batch.map((block) => block.root));
471
- }
472
-
473
- // Ancestor walk is newest to oldest; sort ascending so `prettyPrintIndices` renders cleanly.
474
- return migratedSlots.sort((a, b) => a - b);
475
- }
476
-
477
423
  /**
478
424
  * Post-gloas given a finalized checkpoint at a block root, payload of that block root
479
425
  * is not considered finalized, hence they are archived in the next run.
@@ -1,15 +1,12 @@
1
- import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
- import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
3
- import {byteArrayEquals, fromHex, prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
1
+ import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreFulu, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
+ import {BeaconBlockBody, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
3
+ import {prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
4
4
  import {VersionedHashes} from "../../../execution/index.js";
5
5
  import {kzgCommitmentToVersionedHash} from "../../../util/blobs.js";
6
6
  import {BlockInputError, BlockInputErrorCode} from "./errors.js";
7
7
  import {
8
- AddBlob,
9
8
  AddBlock,
10
9
  AddColumn,
11
- BlobMeta,
12
- BlobWithSource,
13
10
  BlockInputInit,
14
11
  ColumnWithSource,
15
12
  CreateBlockInputMeta,
@@ -17,22 +14,17 @@ import {
17
14
  DAType,
18
15
  IBlockInput,
19
16
  LogMetaBasic,
20
- LogMetaBlobs,
21
17
  LogMetaColumns,
22
18
  MissingColumnMeta,
23
19
  PromiseParts,
24
20
  SourceMeta,
25
21
  } from "./types.js";
26
22
 
27
- export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns | BlockInputNoData;
23
+ export type BlockInput = BlockInputPreData | BlockInputColumns | BlockInputNoData;
28
24
 
29
- export function isBlockInputPreDeneb(blockInput: IBlockInput): blockInput is BlockInputPreData {
25
+ export function isBlockInputPreData(blockInput: IBlockInput): blockInput is BlockInputPreData {
30
26
  return blockInput.type === DAType.PreData;
31
27
  }
32
- export function isBlockInputBlobs(blockInput: IBlockInput): blockInput is BlockInputBlobs {
33
- return blockInput.type === DAType.Blobs;
34
- }
35
-
36
28
  export function isBlockInputColumns(blockInput: IBlockInput): blockInput is BlockInputColumns {
37
29
  return blockInput.type === DAType.Columns;
38
30
  }
@@ -189,16 +181,18 @@ abstract class AbstractBlockInput<F extends ForkName = ForkName, TData extends D
189
181
  type BlockInputPreDataState = {
190
182
  hasBlock: true;
191
183
  hasAllData: true;
192
- block: SignedBeaconBlock<ForkPreDeneb>;
184
+ block: SignedBeaconBlock<ForkPreFulu>;
193
185
  source: SourceMeta;
194
186
  timeCompleteSec: number;
195
187
  };
196
188
 
197
189
  /**
198
- * Pre-DA, BlockInput only has a single state.
190
+ * Pre-fulu BlockInput, it only has a single state.
199
191
  * - the block simply exists
192
+ *
193
+ * Legacy deneb..electra blob sidecars are not tracked.
200
194
  */
201
- export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
195
+ export class BlockInputPreData extends AbstractBlockInput<ForkPreFulu, null> {
202
196
  type = DAType.PreData as const;
203
197
 
204
198
  state: BlockInputPreDataState;
@@ -210,7 +204,7 @@ export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
210
204
  this.blockPromise.resolve(state.block);
211
205
  }
212
206
 
213
- static createFromBlock(props: AddBlock<ForkPreDeneb> & CreateBlockInputMeta): BlockInputPreData {
207
+ static createFromBlock(props: AddBlock<ForkPreFulu> & CreateBlockInputMeta): BlockInputPreData {
214
208
  const init: BlockInputInit = {
215
209
  daOutOfRange: props.daOutOfRange,
216
210
  timeCreated: props.seenTimestampSec,
@@ -250,332 +244,6 @@ export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
250
244
  }
251
245
  }
252
246
 
253
- // Blobs DA
254
-
255
- export type ForkBlobsDA = ForkName.deneb | ForkName.electra;
256
-
257
- type BlockInputBlobsState =
258
- | {
259
- hasBlock: true;
260
- hasAllData: true;
261
- versionedHashes: VersionedHashes;
262
- block: SignedBeaconBlock<ForkBlobsDA>;
263
- source: SourceMeta;
264
- timeCompleteSec: number;
265
- }
266
- | {
267
- hasBlock: true;
268
- hasAllData: false;
269
- versionedHashes: VersionedHashes;
270
- block: SignedBeaconBlock<ForkBlobsDA>;
271
- source: SourceMeta;
272
- }
273
- | {
274
- hasBlock: false;
275
- hasAllData: false;
276
- };
277
-
278
- /**
279
- * With blobs, BlockInput has several states:
280
- * - The block is seen and all blobs are seen
281
- * - The block is seen and all blobs are not yet seen
282
- * - The block is yet not seen and its unknown if all blobs are seen
283
- */
284
- export class BlockInputBlobs extends AbstractBlockInput<ForkBlobsDA, deneb.BlobSidecars> {
285
- type = DAType.Blobs as const;
286
-
287
- state: BlockInputBlobsState;
288
- private blobsCache = new Map<BlobIndex, BlobWithSource>();
289
-
290
- private constructor(init: BlockInputInit, state: BlockInputBlobsState) {
291
- super(init);
292
- this.state = state;
293
- }
294
-
295
- static createFromBlock(props: AddBlock<ForkBlobsDA> & CreateBlockInputMeta): BlockInputBlobs {
296
- const hasAllData = props.daOutOfRange || props.block.message.body.blobKzgCommitments.length === 0;
297
-
298
- const state = {
299
- hasBlock: true,
300
- hasAllData,
301
- versionedHashes: props.block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
302
- block: props.block,
303
- source: {
304
- source: props.source,
305
- seenTimestampSec: props.seenTimestampSec,
306
- peerIdStr: props.peerIdStr,
307
- },
308
- timeCompleteSec: hasAllData ? props.seenTimestampSec : undefined,
309
- } as BlockInputBlobsState;
310
- const init: BlockInputInit = {
311
- daOutOfRange: props.daOutOfRange,
312
- timeCreated: props.seenTimestampSec,
313
- forkName: props.forkName,
314
- slot: props.block.message.slot,
315
- blockRootHex: props.blockRootHex,
316
- parentRootHex: toRootHex(props.block.message.parentRoot),
317
- };
318
- const blockInput = new BlockInputBlobs(init, state);
319
- blockInput.blockPromise.resolve(props.block);
320
- if (hasAllData) {
321
- blockInput.dataPromise.resolve([]);
322
- }
323
- return blockInput;
324
- }
325
-
326
- static createFromBlob(props: AddBlob & CreateBlockInputMeta): BlockInputBlobs {
327
- const state: BlockInputBlobsState = {
328
- hasBlock: false,
329
- hasAllData: false,
330
- };
331
- const init: BlockInputInit = {
332
- daOutOfRange: props.daOutOfRange,
333
- timeCreated: props.seenTimestampSec,
334
- forkName: props.forkName,
335
- blockRootHex: props.blockRootHex,
336
- parentRootHex: toRootHex(props.blobSidecar.signedBlockHeader.message.parentRoot),
337
- slot: props.blobSidecar.signedBlockHeader.message.slot,
338
- };
339
- const blockInput = new BlockInputBlobs(init, state);
340
- blockInput.blobsCache.set(props.blobSidecar.index, {
341
- blobSidecar: props.blobSidecar,
342
- source: props.source,
343
- seenTimestampSec: props.seenTimestampSec,
344
- peerIdStr: props.peerIdStr,
345
- });
346
- return blockInput;
347
- }
348
-
349
- getLogMeta(): LogMetaBlobs {
350
- return {
351
- slot: this.slot,
352
- blockRoot: prettyBytes(this.blockRootHex),
353
- timeCreatedSec: this.timeCreatedSec,
354
- expectedBlobs: this.state.hasBlock ? this.state.block.message.body.blobKzgCommitments.length : "unknown",
355
- receivedBlobs: this.blobsCache.size,
356
- };
357
- }
358
-
359
- addBlock(
360
- {blockRootHex, block, source, seenTimestampSec, peerIdStr}: AddBlock<ForkBlobsDA>,
361
- opts = {throwOnDuplicateAdd: true}
362
- ): void {
363
- // this check suffices for checking slot, parentRoot, and forkName
364
- if (blockRootHex !== this.blockRootHex) {
365
- throw new BlockInputError(
366
- {
367
- code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
368
- blockInputRoot: this.blockRootHex,
369
- mismatchedRoot: blockRootHex,
370
- source,
371
- peerId: `${peerIdStr}`,
372
- },
373
- "addBlock blockRootHex does not match BlockInput.blockRootHex"
374
- );
375
- }
376
-
377
- if (!opts.throwOnDuplicateAdd) {
378
- return;
379
- }
380
-
381
- if (this.state.hasBlock) {
382
- throw new BlockInputError(
383
- {
384
- code: BlockInputErrorCode.INVALID_CONSTRUCTION,
385
- blockRoot: this.blockRootHex,
386
- },
387
- "Cannot addBlock to BlockInputBlobs after it already has a block"
388
- );
389
- }
390
-
391
- for (const {blobSidecar} of this.blobsCache.values()) {
392
- if (!blockAndBlobArePaired(block, blobSidecar)) {
393
- this.blobsCache.delete(blobSidecar.index);
394
- // TODO: (@matthewkeil) spec says to ignore invalid blobs but should we downscore the peer maybe?
395
- // this.logger?.error(`Removing blobIndex=${blobSidecar.index} from BlockInput`, {}, err);
396
- }
397
- }
398
-
399
- const hasAllData = this.blobsCache.size === block.message.body.blobKzgCommitments.length;
400
-
401
- this.state = {
402
- ...this.state,
403
- hasBlock: true,
404
- hasAllData,
405
- block,
406
- versionedHashes: block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
407
- source: {
408
- source,
409
- seenTimestampSec,
410
- peerIdStr,
411
- },
412
- timeCompleteSec: hasAllData ? seenTimestampSec : undefined,
413
- } as BlockInputBlobsState;
414
- this.blockPromise.resolve(block);
415
- if (hasAllData) {
416
- this.dataPromise.resolve(this.getBlobs());
417
- }
418
- }
419
-
420
- hasBlob(blobIndex: BlobIndex): boolean {
421
- return this.blobsCache.has(blobIndex);
422
- }
423
-
424
- getBlob(blobIndex: BlobIndex): deneb.BlobSidecar | undefined {
425
- return this.blobsCache.get(blobIndex)?.blobSidecar;
426
- }
427
-
428
- addBlob(
429
- {blockRootHex, blobSidecar, source, peerIdStr, seenTimestampSec}: AddBlob,
430
- opts = {throwOnDuplicateAdd: true}
431
- ): void {
432
- // this check suffices for checking slot, parentRoot, and forkName
433
- if (blockRootHex !== this.blockRootHex) {
434
- throw new BlockInputError(
435
- {
436
- code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
437
- blockInputRoot: this.blockRootHex,
438
- mismatchedRoot: blockRootHex,
439
- source: source,
440
- peerId: `${peerIdStr}`,
441
- },
442
- "Blob BeaconBlockHeader blockRootHex does not match BlockInput.blockRootHex"
443
- );
444
- }
445
-
446
- const isDuplicate = this.blobsCache.has(blobSidecar.index);
447
- if (isDuplicate && opts.throwOnDuplicateAdd) {
448
- throw new BlockInputError(
449
- {
450
- code: BlockInputErrorCode.INVALID_CONSTRUCTION,
451
- blockRoot: this.blockRootHex,
452
- },
453
- "Cannot addBlob to BlockInputBlobs with duplicate blobIndex"
454
- );
455
- }
456
-
457
- if (this.state.hasBlock) {
458
- assertBlockAndBlobArePaired(this.blockRootHex, this.state.block, blobSidecar);
459
- }
460
-
461
- if (isDuplicate) {
462
- return;
463
- }
464
-
465
- this.blobsCache.set(blobSidecar.index, {blobSidecar, source, seenTimestampSec, peerIdStr});
466
-
467
- if (this.state.hasBlock && this.blobsCache.size === this.state.block.message.body.blobKzgCommitments.length) {
468
- this.state = {
469
- ...this.state,
470
- hasAllData: true,
471
- timeCompleteSec: seenTimestampSec,
472
- };
473
- this.dataPromise.resolve([...this.blobsCache.values()].map(({blobSidecar}) => blobSidecar));
474
- }
475
- }
476
-
477
- getVersionedHashes(): VersionedHashes {
478
- if (!this.state.hasBlock) {
479
- throw new BlockInputError(
480
- {
481
- code: BlockInputErrorCode.INCOMPLETE_DATA,
482
- ...this.getLogMeta(),
483
- },
484
- "Cannot get versioned hashes. Block is unknown"
485
- );
486
- }
487
- return this.state.versionedHashes;
488
- }
489
-
490
- getMissingBlobMeta(): BlobMeta[] {
491
- if (!this.state.hasBlock) {
492
- throw new BlockInputError(
493
- {
494
- code: BlockInputErrorCode.INCOMPLETE_DATA,
495
- ...this.getLogMeta(),
496
- },
497
- "Cannot get missing blobs. Block is unknown"
498
- );
499
- }
500
- if (this.state.hasAllData) {
501
- return [];
502
- }
503
-
504
- const blobMeta: BlobMeta[] = [];
505
- const versionedHashes = this.state.versionedHashes;
506
- for (let index = 0; index < versionedHashes.length; index++) {
507
- if (!this.blobsCache.has(index)) {
508
- blobMeta.push({
509
- index,
510
- blockRoot: fromHex(this.blockRootHex),
511
- versionedHash: versionedHashes[index],
512
- });
513
- }
514
- }
515
- return blobMeta;
516
- }
517
-
518
- getAllBlobsWithSource(): BlobWithSource[] {
519
- if (!this.state.hasAllData) {
520
- throw new BlockInputError(
521
- {
522
- code: BlockInputErrorCode.INCOMPLETE_DATA,
523
- ...this.getLogMeta(),
524
- },
525
- "Cannot get all blobs. DA status is not complete"
526
- );
527
- }
528
- return [...this.blobsCache.values()];
529
- }
530
-
531
- getBlobs(): deneb.BlobSidecars {
532
- return this.getAllBlobsWithSource().map(({blobSidecar}) => blobSidecar);
533
- }
534
-
535
- getSerializedCacheKeys(): object[] {
536
- const objects: object[] = [];
537
-
538
- if (this.state.hasBlock) {
539
- objects.push(this.state.block);
540
- }
541
-
542
- for (const {blobSidecar} of this.blobsCache.values()) {
543
- objects.push(blobSidecar);
544
- }
545
-
546
- return objects;
547
- }
548
- }
549
-
550
- function blockAndBlobArePaired(block: SignedBeaconBlock<ForkBlobsDA>, blobSidecar: deneb.BlobSidecar): boolean {
551
- const blockCommitment = block.message.body.blobKzgCommitments[blobSidecar.index];
552
- if (!blockCommitment || !blobSidecar.kzgCommitment) {
553
- return false;
554
- }
555
- return byteArrayEquals(blockCommitment, blobSidecar.kzgCommitment);
556
- }
557
-
558
- function assertBlockAndBlobArePaired(
559
- blockRootHex: string,
560
- block: SignedBeaconBlock<ForkBlobsDA>,
561
- blobSidecar: deneb.BlobSidecar
562
- ): void {
563
- if (!blockAndBlobArePaired(block, blobSidecar)) {
564
- // TODO: (@matthewkeil) should this eject the bad blob instead? No way to tell if the blob or the block
565
- // has the invalid commitment. Guessing it would be the blob though because we match via block
566
- // hashTreeRoot and we do not take a hashTreeRoot of the BlobSidecar
567
- throw new BlockInputError(
568
- {
569
- code: BlockInputErrorCode.MISMATCHED_KZG_COMMITMENT,
570
- blockRoot: blockRootHex,
571
- slot: block.message.slot,
572
- sidecarIndex: blobSidecar.index,
573
- },
574
- "BlobSidecar commitment does not match block commitment"
575
- );
576
- }
577
- }
578
-
579
247
  // Columns DA
580
248
 
581
249
  export type ForkColumnsDA = ForkName.fulu;
@@ -1,7 +1,7 @@
1
1
  import {Slot} from "@lodestar/types";
2
2
  import {LodestarError} from "@lodestar/utils";
3
3
  import {PeerIdStr} from "../../../util/peerId.js";
4
- import {BlockInputSource, LogMetaBlobs, LogMetaColumns} from "./types.js";
4
+ import {BlockInputSource, LogMetaColumns} from "./types.js";
5
5
 
6
6
  export enum BlockInputErrorCode {
7
7
  // Bad Arguments
@@ -42,7 +42,6 @@ export type BlockInputErrorType =
42
42
  sidecarIndex: number;
43
43
  commitmentIndex?: number;
44
44
  }
45
- | (LogMetaBlobs & {code: BlockInputErrorCode.INCOMPLETE_DATA})
46
45
  | (LogMetaColumns & {code: BlockInputErrorCode.INCOMPLETE_DATA});
47
46
 
48
47
  export class BlockInputError extends LodestarError<BlockInputErrorType> {}