@lodestar/beacon-node 1.42.0-dev.5f2fffc2ce → 1.42.0-dev.687ecdc8cd

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 (439) 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 +4 -4
  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 +27 -27
  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.map +1 -1
  27. package/lib/chain/archiveStore/archiveStore.js +1 -0
  28. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  29. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
  32. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  33. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
  34. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  35. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  36. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  37. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  38. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  39. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  40. package/lib/chain/archiveStore/historicalState/worker.js +1 -3
  41. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  42. package/lib/chain/archiveStore/interface.d.ts +1 -0
  43. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  44. package/lib/chain/balancesCache.d.ts +2 -2
  45. package/lib/chain/balancesCache.d.ts.map +1 -1
  46. package/lib/chain/balancesCache.js +4 -4
  47. package/lib/chain/balancesCache.js.map +1 -1
  48. package/lib/chain/blocks/blockInput/types.d.ts +4 -3
  49. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  50. package/lib/chain/blocks/blockInput/types.js +1 -0
  51. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  52. package/lib/chain/blocks/importBlock.d.ts +3 -3
  53. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  54. package/lib/chain/blocks/importBlock.js +39 -23
  55. package/lib/chain/blocks/importBlock.js.map +1 -1
  56. package/lib/chain/blocks/importExecutionPayload.d.ts +48 -0
  57. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -0
  58. package/lib/chain/blocks/importExecutionPayload.js +167 -0
  59. package/lib/chain/blocks/importExecutionPayload.js.map +1 -0
  60. package/lib/chain/blocks/index.d.ts.map +1 -1
  61. package/lib/chain/blocks/index.js +3 -2
  62. package/lib/chain/blocks/index.js.map +1 -1
  63. package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts +3 -0
  64. package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts.map +1 -0
  65. package/lib/chain/blocks/payloadEnvelopeInput/index.js +3 -0
  66. package/lib/chain/blocks/payloadEnvelopeInput/index.js.map +1 -0
  67. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +80 -0
  68. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -0
  69. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +248 -0
  70. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -0
  71. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +29 -0
  72. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -0
  73. package/lib/chain/blocks/payloadEnvelopeInput/types.js +11 -0
  74. package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -0
  75. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +15 -0
  76. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -0
  77. package/lib/chain/blocks/payloadEnvelopeProcessor.js +46 -0
  78. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -0
  79. package/lib/chain/blocks/types.d.ts +28 -15
  80. package/lib/chain/blocks/types.d.ts.map +1 -1
  81. package/lib/chain/blocks/types.js.map +1 -1
  82. package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
  83. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
  84. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  85. package/lib/chain/blocks/verifyBlock.d.ts +2 -2
  86. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  87. package/lib/chain/blocks/verifyBlock.js +4 -4
  88. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  89. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
  90. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  91. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +4 -4
  92. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  93. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  94. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  95. package/lib/chain/blocks/verifyBlocksSignatures.js +1 -1
  96. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  97. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
  98. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  99. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
  100. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  101. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +12 -0
  102. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -0
  103. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +40 -0
  104. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -0
  105. package/lib/chain/chain.d.ts +19 -14
  106. package/lib/chain/chain.d.ts.map +1 -1
  107. package/lib/chain/chain.js +75 -42
  108. package/lib/chain/chain.js.map +1 -1
  109. package/lib/chain/emitter.d.ts +2 -2
  110. package/lib/chain/emitter.d.ts.map +1 -1
  111. package/lib/chain/errors/blockError.d.ts +4 -4
  112. package/lib/chain/errors/blockError.d.ts.map +1 -1
  113. package/lib/chain/errors/executionPayloadEnvelope.d.ts +12 -2
  114. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  115. package/lib/chain/errors/executionPayloadEnvelope.js +3 -1
  116. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  117. package/lib/chain/forkChoice/index.d.ts +4 -4
  118. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  119. package/lib/chain/forkChoice/index.js +27 -33
  120. package/lib/chain/forkChoice/index.js.map +1 -1
  121. package/lib/chain/initState.d.ts +2 -2
  122. package/lib/chain/initState.d.ts.map +1 -1
  123. package/lib/chain/initState.js +1 -1
  124. package/lib/chain/initState.js.map +1 -1
  125. package/lib/chain/interface.d.ts +17 -15
  126. package/lib/chain/interface.d.ts.map +1 -1
  127. package/lib/chain/lightClient/index.d.ts +2 -2
  128. package/lib/chain/lightClient/index.d.ts.map +1 -1
  129. package/lib/chain/lightClient/index.js +4 -4
  130. package/lib/chain/lightClient/index.js.map +1 -1
  131. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
  132. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  133. package/lib/chain/opPools/aggregatedAttestationPool.js +10 -13
  134. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  135. package/lib/chain/opPools/opPool.d.ts +3 -3
  136. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  137. package/lib/chain/opPools/opPool.js +7 -7
  138. package/lib/chain/opPools/opPool.js.map +1 -1
  139. package/lib/chain/opPools/utils.d.ts +2 -2
  140. package/lib/chain/opPools/utils.d.ts.map +1 -1
  141. package/lib/chain/opPools/utils.js +2 -2
  142. package/lib/chain/opPools/utils.js.map +1 -1
  143. package/lib/chain/options.d.ts +1 -0
  144. package/lib/chain/options.d.ts.map +1 -1
  145. package/lib/chain/options.js +1 -0
  146. package/lib/chain/options.js.map +1 -1
  147. package/lib/chain/prepareNextSlot.d.ts +2 -2
  148. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  149. package/lib/chain/prepareNextSlot.js +3 -3
  150. package/lib/chain/prepareNextSlot.js.map +1 -1
  151. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
  152. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  153. package/lib/chain/produceBlock/computeNewStateRoot.js +8 -4
  154. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  155. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
  156. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  157. package/lib/chain/produceBlock/produceBlockBody.js +13 -17
  158. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  159. package/lib/chain/regen/interface.d.ts +15 -13
  160. package/lib/chain/regen/interface.d.ts.map +1 -1
  161. package/lib/chain/regen/interface.js +2 -0
  162. package/lib/chain/regen/interface.js.map +1 -1
  163. package/lib/chain/regen/queued.d.ts +14 -14
  164. package/lib/chain/regen/queued.d.ts.map +1 -1
  165. package/lib/chain/regen/queued.js.map +1 -1
  166. package/lib/chain/regen/regen.d.ts +6 -5
  167. package/lib/chain/regen/regen.d.ts.map +1 -1
  168. package/lib/chain/regen/regen.js +6 -6
  169. package/lib/chain/regen/regen.js.map +1 -1
  170. package/lib/chain/seenCache/index.d.ts +1 -1
  171. package/lib/chain/seenCache/index.d.ts.map +1 -1
  172. package/lib/chain/seenCache/index.js +1 -1
  173. package/lib/chain/seenCache/index.js.map +1 -1
  174. package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
  175. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  176. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +38 -0
  177. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -0
  178. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +76 -0
  179. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -0
  180. package/lib/chain/serializeState.d.ts +2 -2
  181. package/lib/chain/serializeState.d.ts.map +1 -1
  182. package/lib/chain/serializeState.js +1 -1
  183. package/lib/chain/serializeState.js.map +1 -1
  184. package/lib/chain/shufflingCache.d.ts +2 -2
  185. package/lib/chain/shufflingCache.d.ts.map +1 -1
  186. package/lib/chain/shufflingCache.js +3 -4
  187. package/lib/chain/shufflingCache.js.map +1 -1
  188. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
  189. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  190. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  191. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
  192. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  193. package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
  194. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  195. package/lib/chain/stateCache/types.d.ts +14 -14
  196. package/lib/chain/stateCache/types.d.ts.map +1 -1
  197. package/lib/chain/stateCache/types.js.map +1 -1
  198. package/lib/chain/validation/attesterSlashing.js +3 -3
  199. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  200. package/lib/chain/validation/blobSidecar.js +1 -1
  201. package/lib/chain/validation/blobSidecar.js.map +1 -1
  202. package/lib/chain/validation/block.d.ts.map +1 -1
  203. package/lib/chain/validation/block.js +3 -3
  204. package/lib/chain/validation/block.js.map +1 -1
  205. package/lib/chain/validation/blsToExecutionChange.js +2 -2
  206. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  207. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  208. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  209. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  210. package/lib/chain/validation/executionPayloadBid.js +4 -4
  211. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  212. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  213. package/lib/chain/validation/executionPayloadEnvelope.js +29 -19
  214. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  215. package/lib/chain/validation/lightClientFinalityUpdate.js +1 -1
  216. package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
  217. package/lib/chain/validation/lightClientOptimisticUpdate.js +1 -1
  218. package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
  219. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  220. package/lib/chain/validation/payloadAttestationMessage.js +1 -2
  221. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  222. package/lib/chain/validation/proposerSlashing.js +1 -1
  223. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  224. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  225. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  226. package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
  227. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  228. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  229. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  230. package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
  231. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  232. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
  233. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  234. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  235. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  236. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  237. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
  238. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  239. package/lib/chain/validation/syncCommittee.d.ts +4 -4
  240. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  241. package/lib/chain/validation/syncCommittee.js +13 -12
  242. package/lib/chain/validation/syncCommittee.js.map +1 -1
  243. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  244. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  245. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  246. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  247. package/lib/chain/validation/voluntaryExit.js +3 -3
  248. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  249. package/lib/chain/validatorMonitor.d.ts +5 -4
  250. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  251. package/lib/chain/validatorMonitor.js +13 -8
  252. package/lib/chain/validatorMonitor.js.map +1 -1
  253. package/lib/execution/engine/interface.d.ts +2 -2
  254. package/lib/metrics/metrics/lodestar.d.ts +40 -4
  255. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  256. package/lib/metrics/metrics/lodestar.js +93 -15
  257. package/lib/metrics/metrics/lodestar.js.map +1 -1
  258. package/lib/network/gossip/encoding.d.ts.map +1 -1
  259. package/lib/network/gossip/encoding.js +15 -0
  260. package/lib/network/gossip/encoding.js.map +1 -1
  261. package/lib/network/interface.d.ts +4 -2
  262. package/lib/network/interface.d.ts.map +1 -1
  263. package/lib/network/libp2p/index.d.ts.map +1 -1
  264. package/lib/network/libp2p/index.js +5 -0
  265. package/lib/network/libp2p/index.js.map +1 -1
  266. package/lib/network/network.d.ts +4 -2
  267. package/lib/network/network.d.ts.map +1 -1
  268. package/lib/network/network.js +11 -5
  269. package/lib/network/network.js.map +1 -1
  270. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  271. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  272. package/lib/network/processor/extractSlotRootFns.js +15 -5
  273. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  274. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  275. package/lib/network/processor/gossipHandlers.js +39 -9
  276. package/lib/network/processor/gossipHandlers.js.map +1 -1
  277. package/lib/network/processor/index.d.ts +12 -7
  278. package/lib/network/processor/index.d.ts.map +1 -1
  279. package/lib/network/processor/index.js +99 -78
  280. package/lib/network/processor/index.js.map +1 -1
  281. package/lib/network/reqresp/ReqRespBeaconNode.d.ts +1 -1
  282. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  283. package/lib/network/reqresp/ReqRespBeaconNode.js +10 -1
  284. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  285. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
  286. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
  287. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
  288. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
  289. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
  290. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
  291. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
  292. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
  293. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  294. package/lib/network/reqresp/handlers/index.js +11 -1
  295. package/lib/network/reqresp/handlers/index.js.map +1 -1
  296. package/lib/network/reqresp/protocols.d.ts +2 -0
  297. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  298. package/lib/network/reqresp/protocols.js +10 -0
  299. package/lib/network/reqresp/protocols.js.map +1 -1
  300. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  301. package/lib/network/reqresp/rateLimit.js +8 -0
  302. package/lib/network/reqresp/rateLimit.js.map +1 -1
  303. package/lib/network/reqresp/score.d.ts.map +1 -1
  304. package/lib/network/reqresp/score.js +2 -0
  305. package/lib/network/reqresp/score.js.map +1 -1
  306. package/lib/network/reqresp/types.d.ts +8 -2
  307. package/lib/network/reqresp/types.d.ts.map +1 -1
  308. package/lib/network/reqresp/types.js +7 -1
  309. package/lib/network/reqresp/types.js.map +1 -1
  310. package/lib/node/nodejs.d.ts +2 -2
  311. package/lib/node/nodejs.d.ts.map +1 -1
  312. package/lib/node/nodejs.js +1 -4
  313. package/lib/node/nodejs.js.map +1 -1
  314. package/lib/node/notifier.d.ts.map +1 -1
  315. package/lib/node/notifier.js +3 -3
  316. package/lib/node/notifier.js.map +1 -1
  317. package/lib/sync/backfill/backfill.d.ts +3 -3
  318. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  319. package/lib/sync/backfill/backfill.js +3 -3
  320. package/lib/sync/backfill/backfill.js.map +1 -1
  321. package/lib/sync/constants.d.ts +1 -1
  322. package/lib/sync/constants.js +1 -1
  323. package/lib/sync/unknownBlock.d.ts +3 -9
  324. package/lib/sync/unknownBlock.d.ts.map +1 -1
  325. package/lib/sync/unknownBlock.js +8 -41
  326. package/lib/sync/unknownBlock.js.map +1 -1
  327. package/lib/util/sszBytes.d.ts +4 -1
  328. package/lib/util/sszBytes.d.ts.map +1 -1
  329. package/lib/util/sszBytes.js +69 -12
  330. package/lib/util/sszBytes.js.map +1 -1
  331. package/lib/util/types.d.ts +2 -0
  332. package/lib/util/types.d.ts.map +1 -1
  333. package/lib/util/types.js +1 -0
  334. package/lib/util/types.js.map +1 -1
  335. package/package.json +16 -16
  336. package/src/api/impl/beacon/blocks/index.ts +37 -18
  337. package/src/api/impl/beacon/pool/index.ts +1 -1
  338. package/src/api/impl/beacon/state/index.ts +29 -41
  339. package/src/api/impl/beacon/state/utils.ts +11 -25
  340. package/src/api/impl/lodestar/index.ts +4 -8
  341. package/src/api/impl/proof/index.ts +2 -9
  342. package/src/api/impl/validator/index.ts +29 -41
  343. package/src/api/impl/validator/utils.ts +4 -7
  344. package/src/chain/archiveStore/archiveStore.ts +1 -0
  345. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
  346. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  347. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  348. package/src/chain/archiveStore/historicalState/worker.ts +1 -4
  349. package/src/chain/archiveStore/interface.ts +1 -0
  350. package/src/chain/balancesCache.ts +5 -11
  351. package/src/chain/blocks/blockInput/types.ts +4 -3
  352. package/src/chain/blocks/importBlock.ts +59 -27
  353. package/src/chain/blocks/importExecutionPayload.ts +247 -0
  354. package/src/chain/blocks/index.ts +3 -2
  355. package/src/chain/blocks/payloadEnvelopeInput/index.ts +2 -0
  356. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +336 -0
  357. package/src/chain/blocks/payloadEnvelopeInput/types.ts +33 -0
  358. package/src/chain/blocks/payloadEnvelopeProcessor.ts +61 -0
  359. package/src/chain/blocks/types.ts +34 -15
  360. package/src/chain/blocks/utils/checkpoint.ts +2 -2
  361. package/src/chain/blocks/verifyBlock.ts +5 -10
  362. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -14
  363. package/src/chain/blocks/verifyBlocksSignatures.ts +3 -3
  364. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
  365. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +55 -0
  366. package/src/chain/chain.ts +112 -70
  367. package/src/chain/emitter.ts +2 -2
  368. package/src/chain/errors/blockError.ts +4 -4
  369. package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
  370. package/src/chain/forkChoice/index.ts +33 -52
  371. package/src/chain/initState.ts +7 -2
  372. package/src/chain/interface.ts +18 -16
  373. package/src/chain/lightClient/index.ts +9 -22
  374. package/src/chain/opPools/aggregatedAttestationPool.ts +15 -21
  375. package/src/chain/opPools/opPool.ts +13 -14
  376. package/src/chain/opPools/utils.ts +4 -4
  377. package/src/chain/options.ts +2 -0
  378. package/src/chain/prepareNextSlot.ts +6 -8
  379. package/src/chain/produceBlock/computeNewStateRoot.ts +11 -10
  380. package/src/chain/produceBlock/produceBlockBody.ts +23 -50
  381. package/src/chain/regen/interface.ts +15 -17
  382. package/src/chain/regen/queued.ts +16 -20
  383. package/src/chain/regen/regen.ts +16 -17
  384. package/src/chain/seenCache/index.ts +1 -1
  385. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
  386. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +106 -0
  387. package/src/chain/serializeState.ts +3 -3
  388. package/src/chain/shufflingCache.ts +5 -7
  389. package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
  390. package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
  391. package/src/chain/stateCache/types.ts +14 -18
  392. package/src/chain/validation/attesterSlashing.ts +3 -3
  393. package/src/chain/validation/blobSidecar.ts +1 -1
  394. package/src/chain/validation/block.ts +2 -4
  395. package/src/chain/validation/blsToExecutionChange.ts +2 -2
  396. package/src/chain/validation/dataColumnSidecar.ts +1 -1
  397. package/src/chain/validation/executionPayloadBid.ts +3 -7
  398. package/src/chain/validation/executionPayloadEnvelope.ts +36 -29
  399. package/src/chain/validation/lightClientFinalityUpdate.ts +1 -1
  400. package/src/chain/validation/lightClientOptimisticUpdate.ts +1 -1
  401. package/src/chain/validation/payloadAttestationMessage.ts +2 -4
  402. package/src/chain/validation/proposerSlashing.ts +1 -1
  403. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
  404. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
  405. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
  406. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
  407. package/src/chain/validation/syncCommittee.ts +21 -20
  408. package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -10
  409. package/src/chain/validation/voluntaryExit.ts +3 -8
  410. package/src/chain/validatorMonitor.ts +23 -12
  411. package/src/execution/engine/interface.ts +2 -2
  412. package/src/metrics/metrics/lodestar.ts +100 -19
  413. package/src/network/gossip/encoding.ts +16 -0
  414. package/src/network/interface.ts +15 -2
  415. package/src/network/libp2p/index.ts +5 -0
  416. package/src/network/network.ts +34 -6
  417. package/src/network/processor/extractSlotRootFns.ts +19 -6
  418. package/src/network/processor/gossipHandlers.ts +45 -8
  419. package/src/network/processor/index.ts +110 -89
  420. package/src/network/reqresp/ReqRespBeaconNode.ts +14 -1
  421. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
  422. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
  423. package/src/network/reqresp/handlers/index.ts +12 -0
  424. package/src/network/reqresp/protocols.ts +12 -0
  425. package/src/network/reqresp/rateLimit.ts +18 -0
  426. package/src/network/reqresp/score.ts +2 -0
  427. package/src/network/reqresp/types.ts +13 -0
  428. package/src/node/nodejs.ts +3 -5
  429. package/src/node/notifier.ts +4 -10
  430. package/src/sync/backfill/backfill.ts +4 -4
  431. package/src/sync/constants.ts +1 -1
  432. package/src/sync/unknownBlock.ts +10 -50
  433. package/src/util/sszBytes.ts +90 -10
  434. package/src/util/types.ts +6 -0
  435. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +0 -15
  436. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +0 -1
  437. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +0 -28
  438. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +0 -1
  439. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +0 -34
@@ -3,25 +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,
10
11
  isGloasBlock,
11
12
  } from "@lodestar/fork-choice";
12
- import {ForkPostAltair, ForkPostElectra, ForkSeq, MAX_SEED_LOOKAHEAD, SLOTS_PER_EPOCH} from "@lodestar/params";
13
13
  import {
14
- CachedBeaconStateAltair,
15
- 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,
16
23
  RootCache,
17
24
  computeEpochAtSlot,
18
25
  computeStartSlotAtEpoch,
19
26
  computeTimeAtSlot,
20
- isExecutionStateType,
21
27
  isStartSlotOfEpoch,
22
- isStateValidatorsNodesPopulated,
23
28
  } from "@lodestar/state-transition";
24
- 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";
25
40
  import {isErrorAborted, toRootHex} from "@lodestar/utils";
26
41
  import {ZERO_HASH_HEX} from "../../constants/index.js";
27
42
  import {callInNextEventLoop} from "../../util/eventLoop.js";
@@ -70,7 +85,7 @@ export async function importBlock(
70
85
  fullyVerifiedBlock: FullyVerifiedBlock,
71
86
  opts: ImportBlockOpts
72
87
  ): Promise<void> {
73
- const {blockInput, postState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
88
+ const {blockInput, postBlockState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
74
89
  fullyVerifiedBlock;
75
90
  const block = blockInput.getBlock();
76
91
  const source = blockInput.getBlockSource();
@@ -82,7 +97,7 @@ export async function importBlock(
82
97
  const blockEpoch = computeEpochAtSlot(blockSlot);
83
98
  const prevFinalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
84
99
  const blockDelaySec =
85
- fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot, postState.genesisTime);
100
+ fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot, postBlockState.genesisTime);
86
101
  const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
87
102
  const fork = this.config.getForkSeq(blockSlot);
88
103
 
@@ -105,13 +120,13 @@ export async function importBlock(
105
120
  // 2. Import block to fork choice
106
121
 
107
122
  // Should compute checkpoint balances before forkchoice.onBlock
108
- this.checkpointBalancesCache.processState(blockRootHex, postState);
123
+ this.checkpointBalancesCache.processState(blockRootHex, postBlockState);
109
124
  const blockSummary = this.forkChoice.onBlock(
110
125
  block.message,
111
- postState,
126
+ postBlockState,
112
127
  blockDelaySec,
113
128
  currentSlot,
114
- executionStatus,
129
+ fork >= ForkSeq.gloas ? ExecutionStatus.PayloadSeparated : executionStatus,
115
130
  dataAvailabilityStatus
116
131
  );
117
132
 
@@ -121,7 +136,24 @@ export async function importBlock(
121
136
  // Post-Gloas: blockSummary.payloadStatus is always PENDING, so payloadPresent = false (block state only, no payload processing yet)
122
137
  const payloadPresent = !isGloasBlock(blockSummary);
123
138
  // processState manages both block state and payload state variants together for memory/disk management
124
- this.regen.processBlockState(blockRootHex, postState);
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
+ }
125
157
 
126
158
  this.metrics?.importBlock.bySource.inc({source: source.source});
127
159
  this.logger.verbose("Added block to forkchoice and state cache", {slot: blockSlot, root: blockRootHex});
@@ -140,7 +172,7 @@ export async function importBlock(
140
172
  (opts.importAttestations !== AttestationImportOpt.Skip && blockEpoch >= currentEpoch - FORK_CHOICE_ATT_EPOCH_LIMIT)
141
173
  ) {
142
174
  const attestations = block.message.body.attestations;
143
- const rootCache = new RootCache(postState);
175
+ const rootCache = new RootCache(postBlockState);
144
176
  const invalidAttestationErrorsByCode = new Map<string, {error: Error; count: number}>();
145
177
 
146
178
  const addAttestation = fork >= ForkSeq.electra ? addAttestationPostElectra : addAttestationPreElectra;
@@ -154,7 +186,7 @@ export async function importBlock(
154
186
  const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
155
187
  addAttestation.call(
156
188
  this,
157
- postState.epochCtx,
189
+ postBlockState,
158
190
  target,
159
191
  attDataRoot,
160
192
  attestation as Attestation<ForkPostElectra>,
@@ -269,7 +301,7 @@ export async function importBlock(
269
301
 
270
302
  if (newHead.blockRoot !== oldHead.blockRoot) {
271
303
  // Set head state as strong reference
272
- this.regen.updateHeadState(newHead, postState);
304
+ this.regen.updateHeadState(newHead, postBlockState);
273
305
 
274
306
  try {
275
307
  this.emitter.emit(routes.events.EventType.head, {
@@ -341,7 +373,7 @@ export async function importBlock(
341
373
  try {
342
374
  this.lightClientServer?.onImportBlockHead(
343
375
  block.message as BeaconBlock<ForkPostAltair>,
344
- postState as CachedBeaconStateAltair,
376
+ postBlockState,
345
377
  parentBlockSlot
346
378
  );
347
379
  } catch (e) {
@@ -362,11 +394,11 @@ export async function importBlock(
362
394
  // and the block is weak and can potentially be reorged out.
363
395
  let shouldOverrideFcu = false;
364
396
 
365
- if (blockSlot >= currentSlot && isExecutionStateType(postState)) {
397
+ if (blockSlot >= currentSlot && postBlockState.isExecutionStateType) {
366
398
  let notOverrideFcuReason = NotReorgedReason.Unknown;
367
399
  const proposalSlot = blockSlot + 1;
368
400
  try {
369
- const proposerIndex = postState.epochCtx.getBeaconProposer(proposalSlot);
401
+ const proposerIndex = postBlockState.getBeaconProposer(proposalSlot);
370
402
  const feeRecipient = this.beaconProposerCache.get(proposerIndex);
371
403
 
372
404
  if (feeRecipient) {
@@ -446,20 +478,20 @@ export async function importBlock(
446
478
  }
447
479
  }
448
480
 
449
- if (!isStateValidatorsNodesPopulated(postState)) {
450
- 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});
451
483
  }
452
484
 
453
485
  // Cache shufflings when crossing an epoch boundary
454
486
  const parentEpoch = computeEpochAtSlot(parentBlockSlot);
455
487
  if (parentEpoch < blockEpoch) {
456
- this.shufflingCache.processState(postState);
488
+ this.shufflingCache.processState(postBlockState);
457
489
  this.logger.verbose("Processed shuffling for next epoch", {parentEpoch, blockEpoch, slot: blockSlot});
458
490
  }
459
491
 
460
492
  if (blockSlot % SLOTS_PER_EPOCH === 0) {
461
493
  // Cache state to preserve epoch transition work
462
- const checkpointState = postState;
494
+ const checkpointState = postBlockState;
463
495
  const cp = getCheckpointFromState(checkpointState);
464
496
  this.regen.addCheckpointState(cp, checkpointState, payloadPresent);
465
497
  // consumers should not mutate state ever
@@ -468,7 +500,7 @@ export async function importBlock(
468
500
  // Note: in-lined code from previos handler of ChainEvent.checkpoint
469
501
  this.logger.verbose("Checkpoint processed", toCheckpointHexPayload(cp, payloadPresent));
470
502
 
471
- const activeValidatorsCount = checkpointState.epochCtx.currentShuffling.activeIndices.length;
503
+ const activeValidatorsCount = checkpointState.activeValidatorCount;
472
504
  this.metrics?.currentActiveValidators.set(activeValidatorsCount);
473
505
  this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
474
506
 
@@ -553,7 +585,7 @@ export async function importBlock(
553
585
  this.validatorMonitor?.registerSyncAggregateInBlock(
554
586
  blockEpoch,
555
587
  (block as altair.SignedBeaconBlock).message.body.syncAggregate,
556
- fullyVerifiedBlock.postState.epochCtx.currentSyncCommitteeIndexed.validatorIndices
588
+ fullyVerifiedBlock.postBlockState.currentSyncCommitteeIndexed.validatorIndices
557
589
  );
558
590
  }
559
591
 
@@ -595,7 +627,7 @@ export async function importBlock(
595
627
  export function addAttestationPreElectra(
596
628
  this: BeaconChain,
597
629
  // added to have the same signature as addAttestationPostElectra
598
- _: EpochCache,
630
+ _: IBeaconStateView,
599
631
  target: phase0.Checkpoint,
600
632
  attDataRoot: string,
601
633
  attestation: Attestation,
@@ -612,7 +644,7 @@ export function addAttestationPreElectra(
612
644
 
613
645
  export function addAttestationPostElectra(
614
646
  this: BeaconChain,
615
- epochCtx: EpochCache,
647
+ state: IBeaconStateView,
616
648
  target: phase0.Checkpoint,
617
649
  attDataRoot: string,
618
650
  attestation: Attestation<ForkPostElectra>,
@@ -630,7 +662,7 @@ export function addAttestationPostElectra(
630
662
  } else {
631
663
  const attSlot = attestation.data.slot;
632
664
  const attEpoch = computeEpochAtSlot(attSlot);
633
- const decisionRoot = epochCtx.getShufflingDecisionRoot(attEpoch);
665
+ const decisionRoot = state.getShufflingDecisionRoot(attEpoch);
634
666
  const committees = this.shufflingCache.getBeaconCommittees(attEpoch, decisionRoot, attSlot, committeeIndices);
635
667
  const aggregationBools = attestation.aggregationBits.toBoolArray();
636
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";