@lodestar/beacon-node 1.41.0 → 1.42.0-dev.04e52d162f

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 (474) 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 -17
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.js +1 -1
  5. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  6. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  7. package/lib/api/impl/beacon/state/index.js +27 -32
  8. package/lib/api/impl/beacon/state/index.js.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.d.ts +6 -6
  10. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  11. package/lib/api/impl/beacon/state/utils.js +7 -10
  12. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  13. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  14. package/lib/api/impl/lodestar/index.js +4 -6
  15. package/lib/api/impl/lodestar/index.js.map +1 -1
  16. package/lib/api/impl/proof/index.d.ts.map +1 -1
  17. package/lib/api/impl/proof/index.js +2 -6
  18. package/lib/api/impl/proof/index.js.map +1 -1
  19. package/lib/api/impl/validator/index.d.ts.map +1 -1
  20. package/lib/api/impl/validator/index.js +32 -28
  21. package/lib/api/impl/validator/index.js.map +1 -1
  22. package/lib/api/impl/validator/utils.d.ts +2 -2
  23. package/lib/api/impl/validator/utils.d.ts.map +1 -1
  24. package/lib/api/impl/validator/utils.js +3 -3
  25. package/lib/api/impl/validator/utils.js.map +1 -1
  26. package/lib/chain/archiveStore/archiveStore.d.ts +0 -1
  27. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  28. package/lib/chain/archiveStore/archiveStore.js +1 -9
  29. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  32. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
  33. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  34. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
  35. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  36. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  37. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  38. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  39. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  40. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  41. package/lib/chain/archiveStore/historicalState/worker.js +1 -3
  42. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  43. package/lib/chain/archiveStore/interface.d.ts +5 -4
  44. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  45. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  46. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  47. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +4 -1
  48. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  49. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  50. package/lib/chain/archiveStore/utils/archiveBlocks.js +38 -0
  51. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  52. package/lib/chain/balancesCache.d.ts +2 -2
  53. package/lib/chain/balancesCache.d.ts.map +1 -1
  54. package/lib/chain/balancesCache.js +4 -4
  55. package/lib/chain/balancesCache.js.map +1 -1
  56. package/lib/chain/blocks/blockInput/types.d.ts +4 -3
  57. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  58. package/lib/chain/blocks/blockInput/types.js +1 -0
  59. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  60. package/lib/chain/blocks/importBlock.d.ts +3 -3
  61. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  62. package/lib/chain/blocks/importBlock.js +48 -28
  63. package/lib/chain/blocks/importBlock.js.map +1 -1
  64. package/lib/chain/blocks/importExecutionPayload.d.ts +48 -0
  65. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -0
  66. package/lib/chain/blocks/importExecutionPayload.js +167 -0
  67. package/lib/chain/blocks/importExecutionPayload.js.map +1 -0
  68. package/lib/chain/blocks/index.d.ts.map +1 -1
  69. package/lib/chain/blocks/index.js +3 -2
  70. package/lib/chain/blocks/index.js.map +1 -1
  71. package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts +3 -0
  72. package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts.map +1 -0
  73. package/lib/chain/blocks/payloadEnvelopeInput/index.js +3 -0
  74. package/lib/chain/blocks/payloadEnvelopeInput/index.js.map +1 -0
  75. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +80 -0
  76. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -0
  77. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +248 -0
  78. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -0
  79. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +29 -0
  80. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -0
  81. package/lib/chain/blocks/payloadEnvelopeInput/types.js +11 -0
  82. package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -0
  83. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +15 -0
  84. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -0
  85. package/lib/chain/blocks/payloadEnvelopeProcessor.js +46 -0
  86. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -0
  87. package/lib/chain/blocks/types.d.ts +28 -15
  88. package/lib/chain/blocks/types.d.ts.map +1 -1
  89. package/lib/chain/blocks/types.js.map +1 -1
  90. package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
  91. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
  92. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  93. package/lib/chain/blocks/verifyBlock.d.ts +2 -2
  94. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  95. package/lib/chain/blocks/verifyBlock.js +4 -4
  96. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  97. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
  98. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  99. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +4 -4
  100. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  101. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  102. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  103. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  104. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  105. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
  106. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  107. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
  108. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  109. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +12 -0
  110. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -0
  111. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +40 -0
  112. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -0
  113. package/lib/chain/chain.d.ts +22 -17
  114. package/lib/chain/chain.d.ts.map +1 -1
  115. package/lib/chain/chain.js +90 -48
  116. package/lib/chain/chain.js.map +1 -1
  117. package/lib/chain/emitter.d.ts +2 -2
  118. package/lib/chain/emitter.d.ts.map +1 -1
  119. package/lib/chain/errors/blockError.d.ts +4 -4
  120. package/lib/chain/errors/blockError.d.ts.map +1 -1
  121. package/lib/chain/errors/executionPayloadEnvelope.d.ts +12 -2
  122. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  123. package/lib/chain/errors/executionPayloadEnvelope.js +3 -1
  124. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  125. package/lib/chain/forkChoice/index.d.ts +4 -4
  126. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  127. package/lib/chain/forkChoice/index.js +27 -33
  128. package/lib/chain/forkChoice/index.js.map +1 -1
  129. package/lib/chain/initState.d.ts +2 -2
  130. package/lib/chain/initState.d.ts.map +1 -1
  131. package/lib/chain/initState.js +1 -1
  132. package/lib/chain/initState.js.map +1 -1
  133. package/lib/chain/interface.d.ts +19 -17
  134. package/lib/chain/interface.d.ts.map +1 -1
  135. package/lib/chain/lightClient/index.d.ts +2 -2
  136. package/lib/chain/lightClient/index.d.ts.map +1 -1
  137. package/lib/chain/lightClient/index.js +4 -4
  138. package/lib/chain/lightClient/index.js.map +1 -1
  139. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
  140. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  141. package/lib/chain/opPools/aggregatedAttestationPool.js +10 -13
  142. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  143. package/lib/chain/opPools/opPool.d.ts +3 -3
  144. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  145. package/lib/chain/opPools/opPool.js +7 -7
  146. package/lib/chain/opPools/opPool.js.map +1 -1
  147. package/lib/chain/opPools/utils.d.ts +2 -2
  148. package/lib/chain/opPools/utils.d.ts.map +1 -1
  149. package/lib/chain/opPools/utils.js +2 -2
  150. package/lib/chain/opPools/utils.js.map +1 -1
  151. package/lib/chain/options.d.ts +1 -0
  152. package/lib/chain/options.d.ts.map +1 -1
  153. package/lib/chain/options.js +1 -0
  154. package/lib/chain/options.js.map +1 -1
  155. package/lib/chain/prepareNextSlot.d.ts +2 -2
  156. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  157. package/lib/chain/prepareNextSlot.js +9 -5
  158. package/lib/chain/prepareNextSlot.js.map +1 -1
  159. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
  160. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  161. package/lib/chain/produceBlock/computeNewStateRoot.js +8 -4
  162. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  163. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
  164. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  165. package/lib/chain/produceBlock/produceBlockBody.js +13 -17
  166. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  167. package/lib/chain/regen/errors.d.ts +11 -1
  168. package/lib/chain/regen/errors.d.ts.map +1 -1
  169. package/lib/chain/regen/errors.js +2 -0
  170. package/lib/chain/regen/errors.js.map +1 -1
  171. package/lib/chain/regen/interface.d.ts +22 -14
  172. package/lib/chain/regen/interface.d.ts.map +1 -1
  173. package/lib/chain/regen/interface.js +2 -0
  174. package/lib/chain/regen/interface.js.map +1 -1
  175. package/lib/chain/regen/queued.d.ts +20 -15
  176. package/lib/chain/regen/queued.d.ts.map +1 -1
  177. package/lib/chain/regen/queued.js +40 -8
  178. package/lib/chain/regen/queued.js.map +1 -1
  179. package/lib/chain/regen/regen.d.ts +11 -5
  180. package/lib/chain/regen/regen.d.ts.map +1 -1
  181. package/lib/chain/regen/regen.js +38 -11
  182. package/lib/chain/regen/regen.js.map +1 -1
  183. package/lib/chain/seenCache/index.d.ts +1 -1
  184. package/lib/chain/seenCache/index.d.ts.map +1 -1
  185. package/lib/chain/seenCache/index.js +1 -1
  186. package/lib/chain/seenCache/index.js.map +1 -1
  187. package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
  188. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  189. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +38 -0
  190. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -0
  191. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +76 -0
  192. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -0
  193. package/lib/chain/serializeState.d.ts +2 -2
  194. package/lib/chain/serializeState.d.ts.map +1 -1
  195. package/lib/chain/serializeState.js +1 -1
  196. package/lib/chain/serializeState.js.map +1 -1
  197. package/lib/chain/shufflingCache.d.ts +2 -2
  198. package/lib/chain/shufflingCache.d.ts.map +1 -1
  199. package/lib/chain/shufflingCache.js +3 -4
  200. package/lib/chain/shufflingCache.js.map +1 -1
  201. package/lib/chain/stateCache/datastore/db.d.ts +4 -5
  202. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
  203. package/lib/chain/stateCache/datastore/db.js +32 -10
  204. package/lib/chain/stateCache/datastore/db.js.map +1 -1
  205. package/lib/chain/stateCache/datastore/file.d.ts +1 -1
  206. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
  207. package/lib/chain/stateCache/datastore/file.js +5 -5
  208. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  209. package/lib/chain/stateCache/datastore/types.d.ts +1 -1
  210. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
  211. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +13 -10
  212. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  213. package/lib/chain/stateCache/fifoBlockStateCache.js +8 -3
  214. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  215. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +36 -17
  216. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  217. package/lib/chain/stateCache/persistentCheckpointsCache.js +228 -134
  218. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  219. package/lib/chain/stateCache/types.d.ts +23 -16
  220. package/lib/chain/stateCache/types.d.ts.map +1 -1
  221. package/lib/chain/stateCache/types.js.map +1 -1
  222. package/lib/chain/validation/attesterSlashing.js +3 -3
  223. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  224. package/lib/chain/validation/blobSidecar.js +1 -1
  225. package/lib/chain/validation/blobSidecar.js.map +1 -1
  226. package/lib/chain/validation/block.d.ts.map +1 -1
  227. package/lib/chain/validation/block.js +3 -3
  228. package/lib/chain/validation/block.js.map +1 -1
  229. package/lib/chain/validation/blsToExecutionChange.js +2 -2
  230. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  231. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  232. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  233. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  234. package/lib/chain/validation/executionPayloadBid.js +4 -4
  235. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  236. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  237. package/lib/chain/validation/executionPayloadEnvelope.js +29 -19
  238. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  239. package/lib/chain/validation/lightClientFinalityUpdate.js +1 -1
  240. package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
  241. package/lib/chain/validation/lightClientOptimisticUpdate.js +1 -1
  242. package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
  243. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  244. package/lib/chain/validation/payloadAttestationMessage.js +1 -2
  245. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  246. package/lib/chain/validation/proposerSlashing.js +1 -1
  247. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  248. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  249. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  250. package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
  251. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  252. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  253. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  254. package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
  255. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  256. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
  257. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  258. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  259. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  260. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  261. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
  262. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  263. package/lib/chain/validation/syncCommittee.d.ts +4 -4
  264. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  265. package/lib/chain/validation/syncCommittee.js +13 -12
  266. package/lib/chain/validation/syncCommittee.js.map +1 -1
  267. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  268. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  269. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  270. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  271. package/lib/chain/validation/voluntaryExit.js +3 -3
  272. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  273. package/lib/chain/validatorMonitor.d.ts +5 -4
  274. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  275. package/lib/chain/validatorMonitor.js +13 -8
  276. package/lib/chain/validatorMonitor.js.map +1 -1
  277. package/lib/execution/engine/interface.d.ts +2 -2
  278. package/lib/metrics/metrics/lodestar.d.ts +40 -4
  279. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  280. package/lib/metrics/metrics/lodestar.js +93 -15
  281. package/lib/metrics/metrics/lodestar.js.map +1 -1
  282. package/lib/network/gossip/encoding.d.ts.map +1 -1
  283. package/lib/network/gossip/encoding.js +15 -0
  284. package/lib/network/gossip/encoding.js.map +1 -1
  285. package/lib/network/interface.d.ts +4 -2
  286. package/lib/network/interface.d.ts.map +1 -1
  287. package/lib/network/libp2p/index.d.ts.map +1 -1
  288. package/lib/network/libp2p/index.js +5 -0
  289. package/lib/network/libp2p/index.js.map +1 -1
  290. package/lib/network/network.d.ts +4 -2
  291. package/lib/network/network.d.ts.map +1 -1
  292. package/lib/network/network.js +11 -5
  293. package/lib/network/network.js.map +1 -1
  294. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  295. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  296. package/lib/network/processor/extractSlotRootFns.js +15 -5
  297. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  298. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  299. package/lib/network/processor/gossipHandlers.js +39 -9
  300. package/lib/network/processor/gossipHandlers.js.map +1 -1
  301. package/lib/network/processor/index.d.ts +12 -7
  302. package/lib/network/processor/index.d.ts.map +1 -1
  303. package/lib/network/processor/index.js +99 -78
  304. package/lib/network/processor/index.js.map +1 -1
  305. package/lib/network/reqresp/ReqRespBeaconNode.d.ts +1 -1
  306. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  307. package/lib/network/reqresp/ReqRespBeaconNode.js +10 -1
  308. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  309. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
  310. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
  311. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
  312. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
  313. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
  314. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
  315. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
  316. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
  317. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  318. package/lib/network/reqresp/handlers/index.js +11 -1
  319. package/lib/network/reqresp/handlers/index.js.map +1 -1
  320. package/lib/network/reqresp/protocols.d.ts +2 -0
  321. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  322. package/lib/network/reqresp/protocols.js +10 -0
  323. package/lib/network/reqresp/protocols.js.map +1 -1
  324. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  325. package/lib/network/reqresp/rateLimit.js +8 -0
  326. package/lib/network/reqresp/rateLimit.js.map +1 -1
  327. package/lib/network/reqresp/score.d.ts.map +1 -1
  328. package/lib/network/reqresp/score.js +2 -0
  329. package/lib/network/reqresp/score.js.map +1 -1
  330. package/lib/network/reqresp/types.d.ts +8 -2
  331. package/lib/network/reqresp/types.d.ts.map +1 -1
  332. package/lib/network/reqresp/types.js +7 -1
  333. package/lib/network/reqresp/types.js.map +1 -1
  334. package/lib/node/nodejs.d.ts +2 -2
  335. package/lib/node/nodejs.d.ts.map +1 -1
  336. package/lib/node/nodejs.js +1 -4
  337. package/lib/node/nodejs.js.map +1 -1
  338. package/lib/node/notifier.d.ts.map +1 -1
  339. package/lib/node/notifier.js +3 -3
  340. package/lib/node/notifier.js.map +1 -1
  341. package/lib/sync/backfill/backfill.d.ts +3 -3
  342. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  343. package/lib/sync/backfill/backfill.js +3 -3
  344. package/lib/sync/backfill/backfill.js.map +1 -1
  345. package/lib/sync/constants.d.ts +1 -1
  346. package/lib/sync/constants.js +1 -1
  347. package/lib/sync/unknownBlock.d.ts +3 -9
  348. package/lib/sync/unknownBlock.d.ts.map +1 -1
  349. package/lib/sync/unknownBlock.js +8 -41
  350. package/lib/sync/unknownBlock.js.map +1 -1
  351. package/lib/util/sszBytes.d.ts +4 -1
  352. package/lib/util/sszBytes.d.ts.map +1 -1
  353. package/lib/util/sszBytes.js +69 -12
  354. package/lib/util/sszBytes.js.map +1 -1
  355. package/lib/util/types.d.ts +2 -0
  356. package/lib/util/types.d.ts.map +1 -1
  357. package/lib/util/types.js +1 -0
  358. package/lib/util/types.js.map +1 -1
  359. package/package.json +16 -16
  360. package/src/api/impl/beacon/blocks/index.ts +37 -18
  361. package/src/api/impl/beacon/pool/index.ts +1 -1
  362. package/src/api/impl/beacon/state/index.ts +29 -41
  363. package/src/api/impl/beacon/state/utils.ts +13 -27
  364. package/src/api/impl/lodestar/index.ts +4 -8
  365. package/src/api/impl/proof/index.ts +2 -9
  366. package/src/api/impl/validator/index.ts +35 -43
  367. package/src/api/impl/validator/utils.ts +4 -7
  368. package/src/chain/archiveStore/archiveStore.ts +1 -10
  369. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
  370. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  371. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  372. package/src/chain/archiveStore/historicalState/worker.ts +1 -4
  373. package/src/chain/archiveStore/interface.ts +5 -4
  374. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +8 -5
  375. package/src/chain/archiveStore/utils/archiveBlocks.ts +59 -1
  376. package/src/chain/balancesCache.ts +5 -11
  377. package/src/chain/blocks/blockInput/types.ts +4 -3
  378. package/src/chain/blocks/importBlock.ts +69 -32
  379. package/src/chain/blocks/importExecutionPayload.ts +247 -0
  380. package/src/chain/blocks/index.ts +3 -2
  381. package/src/chain/blocks/payloadEnvelopeInput/index.ts +2 -0
  382. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +336 -0
  383. package/src/chain/blocks/payloadEnvelopeInput/types.ts +33 -0
  384. package/src/chain/blocks/payloadEnvelopeProcessor.ts +61 -0
  385. package/src/chain/blocks/types.ts +34 -15
  386. package/src/chain/blocks/utils/checkpoint.ts +2 -2
  387. package/src/chain/blocks/verifyBlock.ts +5 -10
  388. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -14
  389. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -4
  390. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
  391. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +55 -0
  392. package/src/chain/chain.ts +134 -81
  393. package/src/chain/emitter.ts +2 -2
  394. package/src/chain/errors/blockError.ts +4 -4
  395. package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
  396. package/src/chain/forkChoice/index.ts +33 -52
  397. package/src/chain/initState.ts +7 -2
  398. package/src/chain/interface.ts +20 -18
  399. package/src/chain/lightClient/index.ts +9 -22
  400. package/src/chain/opPools/aggregatedAttestationPool.ts +15 -21
  401. package/src/chain/opPools/opPool.ts +13 -14
  402. package/src/chain/opPools/utils.ts +4 -4
  403. package/src/chain/options.ts +2 -0
  404. package/src/chain/prepareNextSlot.ts +12 -10
  405. package/src/chain/produceBlock/computeNewStateRoot.ts +11 -10
  406. package/src/chain/produceBlock/produceBlockBody.ts +23 -50
  407. package/src/chain/regen/errors.ts +6 -1
  408. package/src/chain/regen/interface.ts +22 -18
  409. package/src/chain/regen/queued.ts +59 -27
  410. package/src/chain/regen/regen.ts +52 -23
  411. package/src/chain/seenCache/index.ts +1 -1
  412. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
  413. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +106 -0
  414. package/src/chain/serializeState.ts +3 -3
  415. package/src/chain/shufflingCache.ts +5 -7
  416. package/src/chain/stateCache/datastore/db.ts +33 -10
  417. package/src/chain/stateCache/datastore/file.ts +6 -5
  418. package/src/chain/stateCache/datastore/types.ts +3 -2
  419. package/src/chain/stateCache/fifoBlockStateCache.ts +17 -11
  420. package/src/chain/stateCache/persistentCheckpointsCache.ts +266 -172
  421. package/src/chain/stateCache/types.ts +22 -16
  422. package/src/chain/validation/attesterSlashing.ts +3 -3
  423. package/src/chain/validation/blobSidecar.ts +1 -1
  424. package/src/chain/validation/block.ts +2 -4
  425. package/src/chain/validation/blsToExecutionChange.ts +2 -2
  426. package/src/chain/validation/dataColumnSidecar.ts +1 -1
  427. package/src/chain/validation/executionPayloadBid.ts +3 -7
  428. package/src/chain/validation/executionPayloadEnvelope.ts +36 -29
  429. package/src/chain/validation/lightClientFinalityUpdate.ts +1 -1
  430. package/src/chain/validation/lightClientOptimisticUpdate.ts +1 -1
  431. package/src/chain/validation/payloadAttestationMessage.ts +2 -4
  432. package/src/chain/validation/proposerSlashing.ts +1 -1
  433. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
  434. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
  435. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
  436. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
  437. package/src/chain/validation/syncCommittee.ts +21 -20
  438. package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -10
  439. package/src/chain/validation/voluntaryExit.ts +3 -7
  440. package/src/chain/validatorMonitor.ts +23 -12
  441. package/src/execution/engine/interface.ts +2 -2
  442. package/src/metrics/metrics/lodestar.ts +100 -19
  443. package/src/network/gossip/encoding.ts +16 -0
  444. package/src/network/interface.ts +15 -2
  445. package/src/network/libp2p/index.ts +5 -0
  446. package/src/network/network.ts +34 -6
  447. package/src/network/processor/extractSlotRootFns.ts +19 -6
  448. package/src/network/processor/gossipHandlers.ts +45 -8
  449. package/src/network/processor/index.ts +110 -89
  450. package/src/network/reqresp/ReqRespBeaconNode.ts +14 -1
  451. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
  452. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
  453. package/src/network/reqresp/handlers/index.ts +12 -0
  454. package/src/network/reqresp/protocols.ts +12 -0
  455. package/src/network/reqresp/rateLimit.ts +18 -0
  456. package/src/network/reqresp/score.ts +2 -0
  457. package/src/network/reqresp/types.ts +13 -0
  458. package/src/node/nodejs.ts +3 -5
  459. package/src/node/notifier.ts +4 -10
  460. package/src/sync/backfill/backfill.ts +4 -4
  461. package/src/sync/constants.ts +1 -1
  462. package/src/sync/unknownBlock.ts +10 -50
  463. package/src/util/sszBytes.ts +90 -10
  464. package/src/util/types.ts +6 -0
  465. package/lib/chain/archiveStore/utils/archivePayloads.d.ts +0 -7
  466. package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +0 -1
  467. package/lib/chain/archiveStore/utils/archivePayloads.js +0 -10
  468. package/lib/chain/archiveStore/utils/archivePayloads.js.map +0 -1
  469. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +0 -15
  470. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +0 -1
  471. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +0 -28
  472. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +0 -1
  473. package/src/chain/archiveStore/utils/archivePayloads.ts +0 -15
  474. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +0 -34
@@ -1,5 +1,5 @@
1
1
  import {ForkName} from "@lodestar/params";
2
- import {ColumnIndex, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
2
+ import {ColumnIndex, DataColumnSidecars, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
3
3
  import {VersionedHashes} from "../../../execution/index.js";
4
4
 
5
5
  export enum DAType {
@@ -16,6 +16,7 @@ export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecars;
16
16
  * sources so each should be labelled individually.
17
17
  */
18
18
  export enum BlockInputSource {
19
+ network_processor = "network_processor",
19
20
  gossip = "gossip",
20
21
  api = "api",
21
22
  engine = "engine",
@@ -107,9 +108,9 @@ export type MissingColumnMeta = {
107
108
  export interface IDataColumnsInput {
108
109
  readonly slot: Slot;
109
110
  readonly blockRootHex: string;
110
- getCustodyColumns(): fulu.DataColumnSidecars;
111
+ getCustodyColumns(): DataColumnSidecars;
111
112
  hasComputedAllData(): boolean;
112
- waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<fulu.DataColumnSidecars>;
113
+ waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<DataColumnSidecars>;
113
114
  }
114
115
 
115
116
  /**
@@ -3,24 +3,40 @@ import {routes} from "@lodestar/api";
3
3
  import {
4
4
  AncestorStatus,
5
5
  EpochDifference,
6
+ ExecutionStatus,
6
7
  ForkChoiceError,
7
8
  ForkChoiceErrorCode,
8
9
  NotReorgedReason,
9
10
  getSafeExecutionBlockHash,
11
+ isGloasBlock,
10
12
  } from "@lodestar/fork-choice";
11
- import {ForkPostAltair, ForkPostElectra, ForkSeq, MAX_SEED_LOOKAHEAD, SLOTS_PER_EPOCH} from "@lodestar/params";
12
13
  import {
13
- CachedBeaconStateAltair,
14
- EpochCache,
14
+ ForkPostAltair,
15
+ ForkPostElectra,
16
+ ForkPostGloas,
17
+ ForkSeq,
18
+ MAX_SEED_LOOKAHEAD,
19
+ SLOTS_PER_EPOCH,
20
+ } from "@lodestar/params";
21
+ import {
22
+ IBeaconStateView,
15
23
  RootCache,
16
24
  computeEpochAtSlot,
17
25
  computeStartSlotAtEpoch,
18
26
  computeTimeAtSlot,
19
- isExecutionStateType,
20
27
  isStartSlotOfEpoch,
21
- isStateValidatorsNodesPopulated,
22
28
  } from "@lodestar/state-transition";
23
- import {Attestation, BeaconBlock, altair, capella, electra, isGloasBeaconBlock, phase0, ssz} from "@lodestar/types";
29
+ import {
30
+ Attestation,
31
+ BeaconBlock,
32
+ SignedBeaconBlock,
33
+ altair,
34
+ capella,
35
+ electra,
36
+ isGloasBeaconBlock,
37
+ phase0,
38
+ ssz,
39
+ } from "@lodestar/types";
24
40
  import {isErrorAborted, toRootHex} from "@lodestar/utils";
25
41
  import {ZERO_HASH_HEX} from "../../constants/index.js";
26
42
  import {callInNextEventLoop} from "../../util/eventLoop.js";
@@ -30,7 +46,7 @@ import type {BeaconChain} from "../chain.js";
30
46
  import {ChainEvent, ReorgEventData} from "../emitter.js";
31
47
  import {ForkchoiceCaller} from "../forkChoice/index.js";
32
48
  import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_SEC} from "../reprocess.js";
33
- import {toCheckpointHex} from "../stateCache/persistentCheckpointsCache.js";
49
+ import {toCheckpointHexPayload} from "../stateCache/persistentCheckpointsCache.js";
34
50
  import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
35
51
  import {AttestationImportOpt, FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
36
52
  import {getCheckpointFromState} from "./utils/checkpoint.js";
@@ -69,7 +85,7 @@ export async function importBlock(
69
85
  fullyVerifiedBlock: FullyVerifiedBlock,
70
86
  opts: ImportBlockOpts
71
87
  ): Promise<void> {
72
- const {blockInput, postState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
88
+ const {blockInput, postBlockState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
73
89
  fullyVerifiedBlock;
74
90
  const block = blockInput.getBlock();
75
91
  const source = blockInput.getBlockSource();
@@ -81,7 +97,7 @@ export async function importBlock(
81
97
  const blockEpoch = computeEpochAtSlot(blockSlot);
82
98
  const prevFinalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
83
99
  const blockDelaySec =
84
- fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot, postState.genesisTime);
100
+ fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot, postBlockState.genesisTime);
85
101
  const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
86
102
  const fork = this.config.getForkSeq(blockSlot);
87
103
 
@@ -104,19 +120,40 @@ export async function importBlock(
104
120
  // 2. Import block to fork choice
105
121
 
106
122
  // Should compute checkpoint balances before forkchoice.onBlock
107
- this.checkpointBalancesCache.processState(blockRootHex, postState);
123
+ this.checkpointBalancesCache.processState(blockRootHex, postBlockState);
108
124
  const blockSummary = this.forkChoice.onBlock(
109
125
  block.message,
110
- postState,
126
+ postBlockState,
111
127
  blockDelaySec,
112
128
  currentSlot,
113
- executionStatus,
129
+ fork >= ForkSeq.gloas ? ExecutionStatus.PayloadSeparated : executionStatus,
114
130
  dataAvailabilityStatus
115
131
  );
116
132
 
117
133
  // This adds the state necessary to process the next block
118
134
  // Some block event handlers require state being in state cache so need to do this before emitting EventType.block
119
- this.regen.processState(blockRootHex, postState);
135
+ // Pre-Gloas: blockSummary.payloadStatus is always FULL, payloadPresent = true
136
+ // Post-Gloas: blockSummary.payloadStatus is always PENDING, so payloadPresent = false (block state only, no payload processing yet)
137
+ const payloadPresent = !isGloasBlock(blockSummary);
138
+ // processState manages both block state and payload state variants together for memory/disk management
139
+ this.regen.processBlockState(blockRootHex, postBlockState);
140
+
141
+ // For Gloas blocks, create PayloadEnvelopeInput so it's available for later payload import
142
+ if (fork >= ForkSeq.gloas) {
143
+ this.seenPayloadEnvelopeInputCache.add({
144
+ blockRootHex,
145
+ block: block as SignedBeaconBlock<ForkPostGloas>,
146
+ sampledColumns: this.custodyConfig.sampledColumns,
147
+ custodyColumns: this.custodyConfig.custodyColumns,
148
+ timeCreatedSec: fullyVerifiedBlock.seenTimestampSec,
149
+ });
150
+ this.logger.debug("Created PayloadEnvelopeInput for block", {
151
+ slot: blockSlot,
152
+ root: blockRootHex,
153
+ source: source.source,
154
+ ...(opts.seenTimestampSec !== undefined ? {recvToImport: Date.now() / 1000 - opts.seenTimestampSec} : {}),
155
+ });
156
+ }
120
157
 
121
158
  this.metrics?.importBlock.bySource.inc({source: source.source});
122
159
  this.logger.verbose("Added block to forkchoice and state cache", {slot: blockSlot, root: blockRootHex});
@@ -135,7 +172,7 @@ export async function importBlock(
135
172
  (opts.importAttestations !== AttestationImportOpt.Skip && blockEpoch >= currentEpoch - FORK_CHOICE_ATT_EPOCH_LIMIT)
136
173
  ) {
137
174
  const attestations = block.message.body.attestations;
138
- const rootCache = new RootCache(postState);
175
+ const rootCache = new RootCache(postBlockState);
139
176
  const invalidAttestationErrorsByCode = new Map<string, {error: Error; count: number}>();
140
177
 
141
178
  const addAttestation = fork >= ForkSeq.electra ? addAttestationPostElectra : addAttestationPreElectra;
@@ -149,7 +186,7 @@ export async function importBlock(
149
186
  const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
150
187
  addAttestation.call(
151
188
  this,
152
- postState.epochCtx,
189
+ postBlockState,
153
190
  target,
154
191
  attDataRoot,
155
192
  attestation as Attestation<ForkPostElectra>,
@@ -264,7 +301,7 @@ export async function importBlock(
264
301
 
265
302
  if (newHead.blockRoot !== oldHead.blockRoot) {
266
303
  // Set head state as strong reference
267
- this.regen.updateHeadState(newHead, postState);
304
+ this.regen.updateHeadState(newHead, postBlockState);
268
305
 
269
306
  try {
270
307
  this.emitter.emit(routes.events.EventType.head, {
@@ -336,7 +373,7 @@ export async function importBlock(
336
373
  try {
337
374
  this.lightClientServer?.onImportBlockHead(
338
375
  block.message as BeaconBlock<ForkPostAltair>,
339
- postState as CachedBeaconStateAltair,
376
+ postBlockState,
340
377
  parentBlockSlot
341
378
  );
342
379
  } catch (e) {
@@ -357,11 +394,11 @@ export async function importBlock(
357
394
  // and the block is weak and can potentially be reorged out.
358
395
  let shouldOverrideFcu = false;
359
396
 
360
- if (blockSlot >= currentSlot && isExecutionStateType(postState)) {
397
+ if (blockSlot >= currentSlot && postBlockState.isExecutionStateType) {
361
398
  let notOverrideFcuReason = NotReorgedReason.Unknown;
362
399
  const proposalSlot = blockSlot + 1;
363
400
  try {
364
- const proposerIndex = postState.epochCtx.getBeaconProposer(proposalSlot);
401
+ const proposerIndex = postBlockState.getBeaconProposer(proposalSlot);
365
402
  const feeRecipient = this.beaconProposerCache.get(proposerIndex);
366
403
 
367
404
  if (feeRecipient) {
@@ -441,29 +478,29 @@ export async function importBlock(
441
478
  }
442
479
  }
443
480
 
444
- if (!isStateValidatorsNodesPopulated(postState)) {
445
- this.logger.verbose("After importBlock caching postState without SSZ cache", {slot: postState.slot});
481
+ if (!postBlockState.isStateValidatorsNodesPopulated()) {
482
+ this.logger.verbose("After importBlock caching postState without SSZ cache", {slot: postBlockState.slot});
446
483
  }
447
484
 
448
485
  // Cache shufflings when crossing an epoch boundary
449
486
  const parentEpoch = computeEpochAtSlot(parentBlockSlot);
450
487
  if (parentEpoch < blockEpoch) {
451
- this.shufflingCache.processState(postState);
488
+ this.shufflingCache.processState(postBlockState);
452
489
  this.logger.verbose("Processed shuffling for next epoch", {parentEpoch, blockEpoch, slot: blockSlot});
453
490
  }
454
491
 
455
492
  if (blockSlot % SLOTS_PER_EPOCH === 0) {
456
493
  // Cache state to preserve epoch transition work
457
- const checkpointState = postState;
494
+ const checkpointState = postBlockState;
458
495
  const cp = getCheckpointFromState(checkpointState);
459
- this.regen.addCheckpointState(cp, checkpointState);
496
+ this.regen.addCheckpointState(cp, checkpointState, payloadPresent);
460
497
  // consumers should not mutate state ever
461
498
  this.emitter.emit(ChainEvent.checkpoint, cp, checkpointState);
462
499
 
463
500
  // Note: in-lined code from previos handler of ChainEvent.checkpoint
464
- this.logger.verbose("Checkpoint processed", toCheckpointHex(cp));
501
+ this.logger.verbose("Checkpoint processed", toCheckpointHexPayload(cp, payloadPresent));
465
502
 
466
- const activeValidatorsCount = checkpointState.epochCtx.currentShuffling.activeIndices.length;
503
+ const activeValidatorsCount = checkpointState.activeValidatorCount;
467
504
  this.metrics?.currentActiveValidators.set(activeValidatorsCount);
468
505
  this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
469
506
 
@@ -479,7 +516,7 @@ export async function importBlock(
479
516
  const justifiedEpoch = justifiedCheckpoint.epoch;
480
517
  const preJustifiedEpoch = parentBlockSummary.justifiedEpoch;
481
518
  if (justifiedEpoch > preJustifiedEpoch) {
482
- this.logger.verbose("Checkpoint justified", toCheckpointHex(justifiedCheckpoint));
519
+ this.logger.verbose("Checkpoint justified", toCheckpointHexPayload(justifiedCheckpoint, payloadPresent));
483
520
  this.metrics?.previousJustifiedEpoch.set(checkpointState.previousJustifiedCheckpoint.epoch);
484
521
  this.metrics?.currentJustifiedEpoch.set(justifiedCheckpoint.epoch);
485
522
  }
@@ -493,7 +530,7 @@ export async function importBlock(
493
530
  state: toRootHex(checkpointState.hashTreeRoot()),
494
531
  executionOptimistic: false,
495
532
  });
496
- this.logger.verbose("Checkpoint finalized", toCheckpointHex(finalizedCheckpoint));
533
+ this.logger.verbose("Checkpoint finalized", toCheckpointHexPayload(finalizedCheckpoint, payloadPresent));
497
534
  this.metrics?.finalizedEpoch.set(finalizedCheckpoint.epoch);
498
535
  }
499
536
  }
@@ -548,7 +585,7 @@ export async function importBlock(
548
585
  this.validatorMonitor?.registerSyncAggregateInBlock(
549
586
  blockEpoch,
550
587
  (block as altair.SignedBeaconBlock).message.body.syncAggregate,
551
- fullyVerifiedBlock.postState.epochCtx.currentSyncCommitteeIndexed.validatorIndices
588
+ fullyVerifiedBlock.postBlockState.currentSyncCommitteeIndexed.validatorIndices
552
589
  );
553
590
  }
554
591
 
@@ -590,7 +627,7 @@ export async function importBlock(
590
627
  export function addAttestationPreElectra(
591
628
  this: BeaconChain,
592
629
  // added to have the same signature as addAttestationPostElectra
593
- _: EpochCache,
630
+ _: IBeaconStateView,
594
631
  target: phase0.Checkpoint,
595
632
  attDataRoot: string,
596
633
  attestation: Attestation,
@@ -607,7 +644,7 @@ export function addAttestationPreElectra(
607
644
 
608
645
  export function addAttestationPostElectra(
609
646
  this: BeaconChain,
610
- epochCtx: EpochCache,
647
+ state: IBeaconStateView,
611
648
  target: phase0.Checkpoint,
612
649
  attDataRoot: string,
613
650
  attestation: Attestation<ForkPostElectra>,
@@ -625,7 +662,7 @@ export function addAttestationPostElectra(
625
662
  } else {
626
663
  const attSlot = attestation.data.slot;
627
664
  const attEpoch = computeEpochAtSlot(attSlot);
628
- const decisionRoot = epochCtx.getShufflingDecisionRoot(attEpoch);
665
+ const decisionRoot = state.getShufflingDecisionRoot(attEpoch);
629
666
  const committees = this.shufflingCache.getBeaconCommittees(attEpoch, decisionRoot, attSlot, committeeIndices);
630
667
  const aggregationBools = attestation.aggregationBits.toBoolArray();
631
668
  let offset = 0;
@@ -0,0 +1,247 @@
1
+ import {routes} from "@lodestar/api";
2
+ import {ExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
3
+ import {ForkName, SLOTS_PER_EPOCH} from "@lodestar/params";
4
+ import {getExecutionPayloadEnvelopeSignatureSet} from "@lodestar/state-transition";
5
+ import {byteArrayEquals, fromHex, toRootHex} from "@lodestar/utils";
6
+ import {ExecutionPayloadStatus} from "../../execution/index.js";
7
+ import {isQueueErrorAborted} from "../../util/queue/index.js";
8
+ import {BeaconChain} from "../chain.js";
9
+ import {RegenCaller} from "../regen/interface.js";
10
+ import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
11
+ import {ImportPayloadOpts} from "./types.js";
12
+
13
+ const EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS = 64;
14
+
15
+ export enum PayloadErrorCode {
16
+ EXECUTION_ENGINE_INVALID = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID",
17
+ EXECUTION_ENGINE_ERROR = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR",
18
+ BLOCK_NOT_IN_FORK_CHOICE = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE",
19
+ STATE_TRANSITION_ERROR = "PAYLOAD_ERROR_STATE_TRANSITION_ERROR",
20
+ INVALID_SIGNATURE = "PAYLOAD_ERROR_INVALID_SIGNATURE",
21
+ }
22
+
23
+ export type PayloadErrorType =
24
+ | {
25
+ code: PayloadErrorCode.EXECUTION_ENGINE_INVALID;
26
+ execStatus: ExecutionPayloadStatus;
27
+ errorMessage: string;
28
+ }
29
+ | {
30
+ code: PayloadErrorCode.EXECUTION_ENGINE_ERROR;
31
+ execStatus: ExecutionPayloadStatus;
32
+ errorMessage: string;
33
+ }
34
+ | {
35
+ code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE;
36
+ blockRootHex: string;
37
+ }
38
+ | {
39
+ code: PayloadErrorCode.STATE_TRANSITION_ERROR;
40
+ message: string;
41
+ }
42
+ | {
43
+ code: PayloadErrorCode.INVALID_SIGNATURE;
44
+ };
45
+
46
+ export class PayloadError extends Error {
47
+ type: PayloadErrorType;
48
+
49
+ constructor(type: PayloadErrorType, message?: string) {
50
+ super(message ?? type.code);
51
+ this.type = type;
52
+ }
53
+ }
54
+
55
+ function toForkChoiceExecutionStatus(status: ExecutionPayloadStatus): PayloadExecutionStatus {
56
+ switch (status) {
57
+ case ExecutionPayloadStatus.VALID:
58
+ return ExecutionStatus.Valid;
59
+ // TODO GLOAS: Handle optimistic import for payload
60
+ case ExecutionPayloadStatus.SYNCING:
61
+ case ExecutionPayloadStatus.ACCEPTED:
62
+ return ExecutionStatus.Syncing;
63
+ default:
64
+ throw new Error(`Unexpected execution payload status for fork choice: ${status}`);
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Import an execution payload envelope after all data is available.
70
+ *
71
+ * This function:
72
+ * 1. Gets the ProtoBlock from fork choice
73
+ * 2. Applies write-queue backpressure (waitForSpace) early, before verification
74
+ * 3. Regenerates the block state
75
+ * 4. Runs EL verification (notifyNewPayload) in parallel with signature verification and processExecutionPayloadEnvelope
76
+ * 5. Persists verified payload envelope to hot DB
77
+ * 6. Updates fork choice
78
+ * 7. Caches the post-execution payload state
79
+ * 8. Records metrics for column sources
80
+ *
81
+ */
82
+ export async function importExecutionPayload(
83
+ this: BeaconChain,
84
+ payloadInput: PayloadEnvelopeInput,
85
+ opts: ImportPayloadOpts = {}
86
+ ): Promise<void> {
87
+ const envelope = payloadInput.getPayloadEnvelope();
88
+ const blockRootHex = payloadInput.blockRootHex;
89
+
90
+ // 1. Get ProtoBlock for parent root lookup
91
+ const protoBlock = this.forkChoice.getBlockHexDefaultStatus(blockRootHex);
92
+ if (!protoBlock) {
93
+ throw new PayloadError({
94
+ code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE,
95
+ blockRootHex,
96
+ });
97
+ }
98
+
99
+ // 2. Apply backpressure from the write queue early, before doing verification work.
100
+ // The actual DB write is deferred until after verification succeeds.
101
+ await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
102
+
103
+ // 3. Get pre-state for processExecutionPayloadEnvelope
104
+ // We need the block state (post-block, pre-payload) to process the envelope
105
+ const blockState = await this.regen.getBlockSlotState(
106
+ protoBlock,
107
+ protoBlock.slot,
108
+ {dontTransferCache: true},
109
+ RegenCaller.processBlock
110
+ );
111
+
112
+ // 4. Run verification steps in parallel
113
+ // Note: No data availability check needed here - importExecutionPayload is only
114
+ // called when payloadInput.isComplete() is true, so all data is already available.
115
+ const [execResult, signatureValid, postPayloadResult] = await Promise.all([
116
+ this.executionEngine.notifyNewPayload(
117
+ ForkName.gloas,
118
+ envelope.message.payload,
119
+ payloadInput.getVersionedHashes(),
120
+ fromHex(protoBlock.parentRoot),
121
+ envelope.message.executionRequests
122
+ ),
123
+
124
+ opts.validSignature === true
125
+ ? Promise.resolve(true)
126
+ : (async () => {
127
+ const signatureSet = getExecutionPayloadEnvelopeSignatureSet(
128
+ this.config,
129
+ this.pubkeyCache,
130
+ blockState,
131
+ envelope,
132
+ payloadInput.proposerIndex
133
+ );
134
+ return this.bls.verifySignatureSets([signatureSet]);
135
+ })(),
136
+
137
+ // Signature verified separately above.
138
+ // State root check is done separately below with better error typing (matching block pipeline pattern).
139
+ (async () => {
140
+ try {
141
+ return {
142
+ postPayloadState: blockState.processExecutionPayloadEnvelope(envelope, {
143
+ verifySignature: false,
144
+ verifyStateRoot: false,
145
+ }),
146
+ };
147
+ } catch (e) {
148
+ throw new PayloadError(
149
+ {
150
+ code: PayloadErrorCode.STATE_TRANSITION_ERROR,
151
+ message: (e as Error).message,
152
+ },
153
+ `State transition error: ${(e as Error).message}`
154
+ );
155
+ }
156
+ })(),
157
+ ]);
158
+
159
+ // 4b. Check signature verification result
160
+ if (!signatureValid) {
161
+ throw new PayloadError({code: PayloadErrorCode.INVALID_SIGNATURE});
162
+ }
163
+
164
+ // 5. Handle EL response
165
+ switch (execResult.status) {
166
+ case ExecutionPayloadStatus.VALID:
167
+ break;
168
+
169
+ case ExecutionPayloadStatus.INVALID:
170
+ throw new PayloadError({
171
+ code: PayloadErrorCode.EXECUTION_ENGINE_INVALID,
172
+ execStatus: execResult.status,
173
+ errorMessage: execResult.validationError ?? "",
174
+ });
175
+
176
+ case ExecutionPayloadStatus.ACCEPTED:
177
+ case ExecutionPayloadStatus.SYNCING:
178
+ break;
179
+
180
+ case ExecutionPayloadStatus.INVALID_BLOCK_HASH:
181
+ case ExecutionPayloadStatus.ELERROR:
182
+ case ExecutionPayloadStatus.UNAVAILABLE:
183
+ throw new PayloadError({
184
+ code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
185
+ execStatus: execResult.status,
186
+ errorMessage: execResult.validationError ?? "",
187
+ });
188
+ }
189
+
190
+ // 5b. Verify envelope state root matches post-state
191
+ const postPayloadState = postPayloadResult.postPayloadState;
192
+ const postPayloadStateRoot = postPayloadState.hashTreeRoot();
193
+ if (!byteArrayEquals(envelope.message.stateRoot, postPayloadStateRoot)) {
194
+ throw new PayloadError({
195
+ code: PayloadErrorCode.STATE_TRANSITION_ERROR,
196
+ message: `Envelope state root mismatch expected=${toRootHex(envelope.message.stateRoot)} actual=${toRootHex(postPayloadStateRoot)}`,
197
+ });
198
+ }
199
+
200
+ // 5c. Persist payload envelope to hot DB (performed asynchronously to avoid blocking)
201
+ this.unfinalizedPayloadEnvelopeWrites.push(payloadInput).catch((e) => {
202
+ if (!isQueueErrorAborted(e)) {
203
+ this.logger.error(
204
+ "Error pushing payload envelope to unfinalized write queue",
205
+ {slot: payloadInput.slot, root: blockRootHex},
206
+ e as Error
207
+ );
208
+ }
209
+ });
210
+
211
+ // 6. Update fork choice
212
+ this.forkChoice.onExecutionPayload(
213
+ blockRootHex,
214
+ payloadInput.getBlockHashHex(),
215
+ envelope.message.payload.blockNumber,
216
+ toRootHex(postPayloadStateRoot),
217
+ toForkChoiceExecutionStatus(execResult.status)
218
+ );
219
+
220
+ // 7. Cache payload state
221
+ this.regen.processPayloadState(postPayloadState);
222
+ if (postPayloadState.slot % SLOTS_PER_EPOCH === 0) {
223
+ const {checkpoint} = postPayloadState.computeAnchorCheckpoint();
224
+ this.regen.addCheckpointState(checkpoint, postPayloadState, true);
225
+ }
226
+
227
+ // 8. Record metrics for payload envelope and column sources
228
+ this.metrics?.importPayload.bySource.inc({source: payloadInput.getPayloadEnvelopeSource().source});
229
+ for (const {source} of payloadInput.getSampledColumnsWithSource()) {
230
+ this.metrics?.importPayload.columnsBySource.inc({source});
231
+ }
232
+
233
+ this.logger.verbose("Execution payload imported", {
234
+ slot: payloadInput.slot,
235
+ root: blockRootHex,
236
+ blockHash: payloadInput.getBlockHashHex(),
237
+ });
238
+
239
+ // 9. Emit event after payload is fully verified and imported to fork choice, only for recent enough payloads
240
+ const currentSlot = this.clock.currentSlot;
241
+ if (currentSlot - payloadInput.slot < EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS) {
242
+ this.emitter.emit(routes.events.EventType.executionPayloadAvailable, {
243
+ slot: payloadInput.slot,
244
+ blockRoot: blockRootHex,
245
+ });
246
+ }
247
+ }
@@ -88,7 +88,8 @@ export async function processBlocks(
88
88
  const fullyVerifiedBlocks = relevantBlocks.map(
89
89
  (block, i): FullyVerifiedBlock => ({
90
90
  blockInput: block,
91
- postState: postStates[i],
91
+ postBlockState: postStates[i],
92
+ postEnvelopeState: null,
92
93
  parentBlockSlot: parentSlots[i],
93
94
  executionStatus: executionStatuses[i],
94
95
  // start supporting optimistic syncing/processing
@@ -126,7 +127,7 @@ export async function processBlocks(
126
127
  const {state} = err.type;
127
128
  const forkTypes = this.config.getForkTypes(blockSlot);
128
129
  this.persistInvalidSszValue(forkTypes.SignedBeaconBlock, signedBlock, `${blockSlot}_invalid_signature`);
129
- this.persistInvalidSszView(state, `${state.slot}_invalid_signature`);
130
+ this.persistInvalidSszBytes("BeaconState", state.serialize(), `${state.slot}_invalid_signature`);
130
131
  } else if (err.type.code === BlockErrorCode.INVALID_STATE_ROOT) {
131
132
  const {signedBlock} = err;
132
133
  const blockSlot = signedBlock.message.slot;
@@ -0,0 +1,2 @@
1
+ export * from "./payloadEnvelopeInput.js";
2
+ export * from "./types.js";