@lodestar/beacon-node 1.43.0-dev.aef3645690 → 1.43.0-dev.b0e1143d06

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 (449) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +17 -9
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +45 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  10. package/lib/api/impl/debug/index.d.ts.map +1 -1
  11. package/lib/api/impl/debug/index.js +0 -1
  12. package/lib/api/impl/debug/index.js.map +1 -1
  13. package/lib/api/impl/lodestar/index.js +1 -1
  14. package/lib/api/impl/lodestar/index.js.map +1 -1
  15. package/lib/api/impl/validator/index.d.ts.map +1 -1
  16. package/lib/api/impl/validator/index.js +68 -5
  17. package/lib/api/impl/validator/index.js.map +1 -1
  18. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  19. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  20. package/lib/chain/GetBlobsTracker.js +1 -2
  21. package/lib/chain/GetBlobsTracker.js.map +1 -1
  22. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  23. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  24. package/lib/chain/archiveStore/interface.d.ts +4 -4
  25. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  26. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  27. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  28. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
  29. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  30. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  31. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  32. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  33. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  34. package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  36. package/lib/chain/blocks/blockInput/blockInput.js +4 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  38. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  39. package/lib/chain/blocks/importBlock.js +38 -58
  40. package/lib/chain/blocks/importBlock.js.map +1 -1
  41. package/lib/chain/blocks/importExecutionPayload.d.ts +32 -14
  42. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  43. package/lib/chain/blocks/importExecutionPayload.js +101 -90
  44. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  45. package/lib/chain/blocks/index.d.ts +5 -3
  46. package/lib/chain/blocks/index.d.ts.map +1 -1
  47. package/lib/chain/blocks/index.js +58 -26
  48. package/lib/chain/blocks/index.js.map +1 -1
  49. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +15 -1
  50. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  51. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +48 -2
  52. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  53. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +17 -0
  54. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  55. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  57. package/lib/chain/blocks/payloadEnvelopeProcessor.js +7 -5
  58. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  59. package/lib/chain/blocks/types.d.ts +16 -21
  60. package/lib/chain/blocks/types.d.ts.map +1 -1
  61. package/lib/chain/blocks/utils/chainSegment.d.ts +21 -2
  62. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  63. package/lib/chain/blocks/utils/chainSegment.js +92 -12
  64. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  65. package/lib/chain/blocks/verifyBlock.d.ts +5 -3
  66. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  67. package/lib/chain/blocks/verifyBlock.js +50 -7
  68. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  69. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  70. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  71. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  72. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  73. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  74. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
  76. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  77. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  78. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  79. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +80 -0
  80. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  81. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  82. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  83. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +30 -0
  84. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  85. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  86. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  87. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  88. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  89. package/lib/chain/chain.d.ts +8 -6
  90. package/lib/chain/chain.d.ts.map +1 -1
  91. package/lib/chain/chain.js +59 -49
  92. package/lib/chain/chain.js.map +1 -1
  93. package/lib/chain/emitter.d.ts +16 -15
  94. package/lib/chain/emitter.d.ts.map +1 -1
  95. package/lib/chain/emitter.js +5 -4
  96. package/lib/chain/emitter.js.map +1 -1
  97. package/lib/chain/errors/attestationError.d.ts +8 -1
  98. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  99. package/lib/chain/errors/attestationError.js +4 -0
  100. package/lib/chain/errors/attestationError.js.map +1 -1
  101. package/lib/chain/errors/blockError.d.ts +8 -1
  102. package/lib/chain/errors/blockError.d.ts.map +1 -1
  103. package/lib/chain/errors/blockError.js +2 -0
  104. package/lib/chain/errors/blockError.js.map +1 -1
  105. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  106. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  107. package/lib/chain/errors/executionPayloadBid.js +1 -0
  108. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  109. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  110. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  111. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  112. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  113. package/lib/chain/errors/index.d.ts +1 -0
  114. package/lib/chain/errors/index.d.ts.map +1 -1
  115. package/lib/chain/errors/index.js +1 -0
  116. package/lib/chain/errors/index.js.map +1 -1
  117. package/lib/chain/errors/proposerPreferences.d.ts +40 -0
  118. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  119. package/lib/chain/errors/proposerPreferences.js +14 -0
  120. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  121. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  122. package/lib/chain/forkChoice/index.js +11 -15
  123. package/lib/chain/forkChoice/index.js.map +1 -1
  124. package/lib/chain/initState.d.ts.map +1 -1
  125. package/lib/chain/initState.js +6 -1
  126. package/lib/chain/initState.js.map +1 -1
  127. package/lib/chain/interface.d.ts +7 -5
  128. package/lib/chain/interface.d.ts.map +1 -1
  129. package/lib/chain/interface.js.map +1 -1
  130. package/lib/chain/opPools/payloadAttestationPool.d.ts +3 -2
  131. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  132. package/lib/chain/opPools/payloadAttestationPool.js +26 -4
  133. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  134. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  135. package/lib/chain/prepareNextSlot.js +47 -23
  136. package/lib/chain/prepareNextSlot.js.map +1 -1
  137. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
  138. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  139. package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
  140. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  141. package/lib/chain/produceBlock/produceBlockBody.d.ts +13 -8
  142. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  143. package/lib/chain/produceBlock/produceBlockBody.js +68 -25
  144. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  145. package/lib/chain/regen/errors.d.ts +1 -11
  146. package/lib/chain/regen/errors.d.ts.map +1 -1
  147. package/lib/chain/regen/errors.js +0 -2
  148. package/lib/chain/regen/errors.js.map +1 -1
  149. package/lib/chain/regen/interface.d.ts +7 -12
  150. package/lib/chain/regen/interface.d.ts.map +1 -1
  151. package/lib/chain/regen/interface.js +1 -0
  152. package/lib/chain/regen/interface.js.map +1 -1
  153. package/lib/chain/regen/queued.d.ts +6 -11
  154. package/lib/chain/regen/queued.d.ts.map +1 -1
  155. package/lib/chain/regen/queued.js +9 -44
  156. package/lib/chain/regen/queued.js.map +1 -1
  157. package/lib/chain/regen/regen.d.ts +0 -5
  158. package/lib/chain/regen/regen.d.ts.map +1 -1
  159. package/lib/chain/regen/regen.js +8 -38
  160. package/lib/chain/regen/regen.js.map +1 -1
  161. package/lib/chain/seenCache/index.d.ts +1 -0
  162. package/lib/chain/seenCache/index.d.ts.map +1 -1
  163. package/lib/chain/seenCache/index.js +1 -0
  164. package/lib/chain/seenCache/index.js.map +1 -1
  165. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +24 -7
  166. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  167. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +69 -17
  168. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  169. package/lib/chain/seenCache/seenProposerPreferences.d.ts +16 -0
  170. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  171. package/lib/chain/seenCache/seenProposerPreferences.js +26 -0
  172. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  173. package/lib/chain/stateCache/datastore/db.d.ts +5 -4
  174. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
  175. package/lib/chain/stateCache/datastore/db.js +10 -32
  176. package/lib/chain/stateCache/datastore/db.js.map +1 -1
  177. package/lib/chain/stateCache/datastore/file.d.ts +1 -1
  178. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
  179. package/lib/chain/stateCache/datastore/file.js +5 -5
  180. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  181. package/lib/chain/stateCache/datastore/types.d.ts +1 -1
  182. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
  183. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -7
  184. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  185. package/lib/chain/stateCache/fifoBlockStateCache.js +0 -8
  186. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  187. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +13 -30
  188. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  189. package/lib/chain/stateCache/persistentCheckpointsCache.js +120 -216
  190. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  191. package/lib/chain/stateCache/types.d.ts +8 -15
  192. package/lib/chain/stateCache/types.d.ts.map +1 -1
  193. package/lib/chain/stateCache/types.js.map +1 -1
  194. package/lib/chain/validation/aggregateAndProof.js +12 -0
  195. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  196. package/lib/chain/validation/attestation.d.ts.map +1 -1
  197. package/lib/chain/validation/attestation.js +12 -0
  198. package/lib/chain/validation/attestation.js.map +1 -1
  199. package/lib/chain/validation/block.d.ts.map +1 -1
  200. package/lib/chain/validation/block.js +1 -0
  201. package/lib/chain/validation/block.js.map +1 -1
  202. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  203. package/lib/chain/validation/executionPayloadBid.js +24 -9
  204. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  205. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  206. package/lib/chain/validation/executionPayloadEnvelope.js +21 -11
  207. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  208. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  209. package/lib/chain/validation/payloadAttestationMessage.js +4 -3
  210. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  211. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  212. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  213. package/lib/chain/validation/proposerPreferences.js +91 -0
  214. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  215. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  216. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  217. package/lib/execution/engine/http.d.ts.map +1 -1
  218. package/lib/execution/engine/http.js +21 -14
  219. package/lib/execution/engine/http.js.map +1 -1
  220. package/lib/execution/engine/interface.d.ts +1 -0
  221. package/lib/execution/engine/interface.d.ts.map +1 -1
  222. package/lib/execution/engine/mock.d.ts.map +1 -1
  223. package/lib/execution/engine/mock.js +6 -0
  224. package/lib/execution/engine/mock.js.map +1 -1
  225. package/lib/execution/engine/types.d.ts +20 -0
  226. package/lib/execution/engine/types.d.ts.map +1 -1
  227. package/lib/execution/engine/types.js +18 -0
  228. package/lib/execution/engine/types.js.map +1 -1
  229. package/lib/metrics/metrics/lodestar.d.ts +5 -0
  230. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  231. package/lib/metrics/metrics/lodestar.js +9 -0
  232. package/lib/metrics/metrics/lodestar.js.map +1 -1
  233. package/lib/network/gossip/interface.d.ts +7 -1
  234. package/lib/network/gossip/interface.d.ts.map +1 -1
  235. package/lib/network/gossip/interface.js +1 -0
  236. package/lib/network/gossip/interface.js.map +1 -1
  237. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  238. package/lib/network/gossip/scoringParameters.js +12 -1
  239. package/lib/network/gossip/scoringParameters.js.map +1 -1
  240. package/lib/network/gossip/topic.d.ts +33 -2
  241. package/lib/network/gossip/topic.d.ts.map +1 -1
  242. package/lib/network/gossip/topic.js +6 -0
  243. package/lib/network/gossip/topic.js.map +1 -1
  244. package/lib/network/interface.d.ts +2 -0
  245. package/lib/network/interface.d.ts.map +1 -1
  246. package/lib/network/network.d.ts +2 -0
  247. package/lib/network/network.d.ts.map +1 -1
  248. package/lib/network/network.js +9 -1
  249. package/lib/network/network.js.map +1 -1
  250. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  251. package/lib/network/processor/gossipHandlers.js +91 -23
  252. package/lib/network/processor/gossipHandlers.js.map +1 -1
  253. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  254. package/lib/network/processor/gossipQueues/index.js +5 -0
  255. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  256. package/lib/network/processor/index.d.ts.map +1 -1
  257. package/lib/network/processor/index.js +6 -5
  258. package/lib/network/processor/index.js.map +1 -1
  259. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  260. package/lib/network/reqresp/ReqRespBeaconNode.js +1 -1
  261. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  262. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts +9 -0
  263. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts.map +1 -0
  264. package/lib/network/reqresp/handlers/beaconBlocksByHead.js +61 -0
  265. package/lib/network/reqresp/handlers/beaconBlocksByHead.js.map +1 -0
  266. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  267. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  268. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  269. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  270. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  271. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  272. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  273. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  274. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  275. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  276. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  277. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  278. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  279. package/lib/network/reqresp/handlers/index.js +5 -0
  280. package/lib/network/reqresp/handlers/index.js.map +1 -1
  281. package/lib/network/reqresp/interface.d.ts +1 -1
  282. package/lib/network/reqresp/interface.js +1 -1
  283. package/lib/network/reqresp/protocols.d.ts +1 -0
  284. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  285. package/lib/network/reqresp/protocols.js +5 -0
  286. package/lib/network/reqresp/protocols.js.map +1 -1
  287. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  288. package/lib/network/reqresp/rateLimit.js +4 -0
  289. package/lib/network/reqresp/rateLimit.js.map +1 -1
  290. package/lib/network/reqresp/score.d.ts.map +1 -1
  291. package/lib/network/reqresp/score.js +1 -0
  292. package/lib/network/reqresp/score.js.map +1 -1
  293. package/lib/network/reqresp/types.d.ts +3 -0
  294. package/lib/network/reqresp/types.d.ts.map +1 -1
  295. package/lib/network/reqresp/types.js +3 -0
  296. package/lib/network/reqresp/types.js.map +1 -1
  297. package/lib/node/nodejs.d.ts.map +1 -1
  298. package/lib/node/nodejs.js +6 -4
  299. package/lib/node/nodejs.js.map +1 -1
  300. package/lib/sync/constants.d.ts +7 -1
  301. package/lib/sync/constants.d.ts.map +1 -1
  302. package/lib/sync/constants.js +7 -4
  303. package/lib/sync/constants.js.map +1 -1
  304. package/lib/sync/range/batch.d.ts +55 -8
  305. package/lib/sync/range/batch.d.ts.map +1 -1
  306. package/lib/sync/range/batch.js +291 -66
  307. package/lib/sync/range/batch.js.map +1 -1
  308. package/lib/sync/range/chain.d.ts +22 -4
  309. package/lib/sync/range/chain.d.ts.map +1 -1
  310. package/lib/sync/range/chain.js +103 -11
  311. package/lib/sync/range/chain.js.map +1 -1
  312. package/lib/sync/range/range.d.ts.map +1 -1
  313. package/lib/sync/range/range.js +71 -11
  314. package/lib/sync/range/range.js.map +1 -1
  315. package/lib/sync/range/utils/peerBalancer.d.ts +2 -1
  316. package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -1
  317. package/lib/sync/range/utils/peerBalancer.js +8 -4
  318. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  319. package/lib/sync/sync.d.ts.map +1 -1
  320. package/lib/sync/sync.js +13 -0
  321. package/lib/sync/sync.js.map +1 -1
  322. package/lib/sync/types.d.ts +34 -0
  323. package/lib/sync/types.d.ts.map +1 -1
  324. package/lib/sync/types.js +34 -0
  325. package/lib/sync/types.js.map +1 -1
  326. package/lib/sync/unknownBlock.d.ts +29 -1
  327. package/lib/sync/unknownBlock.d.ts.map +1 -1
  328. package/lib/sync/unknownBlock.js +727 -61
  329. package/lib/sync/unknownBlock.js.map +1 -1
  330. package/lib/sync/utils/downloadByRange.d.ts +73 -10
  331. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  332. package/lib/sync/utils/downloadByRange.js +213 -26
  333. package/lib/sync/utils/downloadByRange.js.map +1 -1
  334. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  335. package/lib/sync/utils/downloadByRoot.js +16 -2
  336. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  337. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  338. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  339. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  340. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  341. package/lib/sync/utils/rateLimit.d.ts +2 -0
  342. package/lib/sync/utils/rateLimit.d.ts.map +1 -0
  343. package/lib/sync/utils/rateLimit.js +15 -0
  344. package/lib/sync/utils/rateLimit.js.map +1 -0
  345. package/lib/util/sszBytes.d.ts.map +1 -1
  346. package/lib/util/sszBytes.js +20 -5
  347. package/lib/util/sszBytes.js.map +1 -1
  348. package/package.json +18 -17
  349. package/src/api/impl/beacon/blocks/index.ts +22 -9
  350. package/src/api/impl/beacon/pool/index.ts +83 -1
  351. package/src/api/impl/beacon/state/utils.ts +2 -2
  352. package/src/api/impl/debug/index.ts +0 -1
  353. package/src/api/impl/lodestar/index.ts +1 -1
  354. package/src/api/impl/validator/index.ts +84 -6
  355. package/src/chain/GetBlobsTracker.ts +1 -2
  356. package/src/chain/archiveStore/archiveStore.ts +5 -5
  357. package/src/chain/archiveStore/interface.ts +4 -4
  358. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
  359. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  360. package/src/chain/blocks/blockInput/blockInput.ts +4 -1
  361. package/src/chain/blocks/importBlock.ts +38 -83
  362. package/src/chain/blocks/importExecutionPayload.ts +127 -107
  363. package/src/chain/blocks/index.ts +72 -24
  364. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +64 -3
  365. package/src/chain/blocks/payloadEnvelopeInput/types.ts +18 -0
  366. package/src/chain/blocks/payloadEnvelopeProcessor.ts +7 -6
  367. package/src/chain/blocks/types.ts +16 -26
  368. package/src/chain/blocks/utils/chainSegment.ts +117 -17
  369. package/src/chain/blocks/verifyBlock.ts +70 -9
  370. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  371. package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
  372. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +137 -0
  373. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +41 -0
  374. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  375. package/src/chain/chain.ts +79 -71
  376. package/src/chain/emitter.ts +15 -14
  377. package/src/chain/errors/attestationError.ts +6 -1
  378. package/src/chain/errors/blockError.ts +4 -1
  379. package/src/chain/errors/executionPayloadBid.ts +6 -0
  380. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  381. package/src/chain/errors/index.ts +1 -0
  382. package/src/chain/errors/proposerPreferences.ts +47 -0
  383. package/src/chain/forkChoice/index.ts +8 -20
  384. package/src/chain/initState.ts +9 -1
  385. package/src/chain/interface.ts +11 -3
  386. package/src/chain/opPools/payloadAttestationPool.ts +29 -8
  387. package/src/chain/prepareNextSlot.ts +55 -24
  388. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
  389. package/src/chain/produceBlock/produceBlockBody.ts +91 -27
  390. package/src/chain/regen/errors.ts +1 -6
  391. package/src/chain/regen/interface.ts +7 -12
  392. package/src/chain/regen/queued.ts +14 -55
  393. package/src/chain/regen/regen.ts +10 -43
  394. package/src/chain/seenCache/index.ts +1 -0
  395. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +89 -21
  396. package/src/chain/seenCache/seenProposerPreferences.ts +32 -0
  397. package/src/chain/stateCache/datastore/db.ts +10 -33
  398. package/src/chain/stateCache/datastore/file.ts +5 -6
  399. package/src/chain/stateCache/datastore/types.ts +2 -3
  400. package/src/chain/stateCache/fifoBlockStateCache.ts +1 -10
  401. package/src/chain/stateCache/persistentCheckpointsCache.ts +139 -247
  402. package/src/chain/stateCache/types.ts +8 -14
  403. package/src/chain/validation/aggregateAndProof.ts +13 -0
  404. package/src/chain/validation/attestation.ts +13 -0
  405. package/src/chain/validation/block.ts +1 -0
  406. package/src/chain/validation/executionPayloadBid.ts +25 -8
  407. package/src/chain/validation/executionPayloadEnvelope.ts +22 -12
  408. package/src/chain/validation/payloadAttestationMessage.ts +5 -3
  409. package/src/chain/validation/proposerPreferences.ts +110 -0
  410. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  411. package/src/execution/engine/http.ts +21 -14
  412. package/src/execution/engine/interface.ts +1 -0
  413. package/src/execution/engine/mock.ts +8 -1
  414. package/src/execution/engine/types.ts +41 -0
  415. package/src/metrics/metrics/lodestar.ts +10 -0
  416. package/src/network/gossip/interface.ts +6 -0
  417. package/src/network/gossip/scoringParameters.ts +14 -1
  418. package/src/network/gossip/topic.ts +6 -0
  419. package/src/network/interface.ts +2 -0
  420. package/src/network/network.ts +24 -1
  421. package/src/network/processor/gossipHandlers.ts +114 -28
  422. package/src/network/processor/gossipQueues/index.ts +5 -0
  423. package/src/network/processor/index.ts +6 -5
  424. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -0
  425. package/src/network/reqresp/handlers/beaconBlocksByHead.ts +91 -0
  426. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  427. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  428. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  429. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  430. package/src/network/reqresp/handlers/index.ts +5 -0
  431. package/src/network/reqresp/interface.ts +1 -1
  432. package/src/network/reqresp/protocols.ts +6 -0
  433. package/src/network/reqresp/rateLimit.ts +4 -0
  434. package/src/network/reqresp/score.ts +1 -0
  435. package/src/network/reqresp/types.ts +5 -0
  436. package/src/node/nodejs.ts +6 -4
  437. package/src/sync/constants.ts +8 -4
  438. package/src/sync/range/batch.ts +388 -75
  439. package/src/sync/range/chain.ts +131 -14
  440. package/src/sync/range/range.ts +86 -11
  441. package/src/sync/range/utils/peerBalancer.ts +9 -3
  442. package/src/sync/sync.ts +13 -1
  443. package/src/sync/types.ts +72 -0
  444. package/src/sync/unknownBlock.ts +915 -65
  445. package/src/sync/utils/downloadByRange.ts +386 -39
  446. package/src/sync/utils/downloadByRoot.ts +24 -2
  447. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  448. package/src/sync/utils/rateLimit.ts +16 -0
  449. package/src/util/sszBytes.ts +25 -5
@@ -2,17 +2,9 @@ import path from "node:path";
2
2
  import {PrivateKey} from "@libp2p/interface";
3
3
  import {Type} from "@chainsafe/ssz";
4
4
  import {BeaconConfig} from "@lodestar/config";
5
- import {
6
- CheckpointWithPayloadStatus,
7
- IForkChoice,
8
- PayloadStatus,
9
- ProtoBlock,
10
- UpdateHeadOpt,
11
- getCheckpointPayloadStatus,
12
- } from "@lodestar/fork-choice";
5
+ import {CheckpointWithHex, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
13
6
  import {LoggerNode} from "@lodestar/logger/node";
14
7
  import {
15
- BUILDER_INDEX_SELF_BUILD,
16
8
  EFFECTIVE_BALANCE_INCREMENT,
17
9
  type ForkPostFulu,
18
10
  type ForkPostGloas,
@@ -48,6 +40,7 @@ import {
48
40
  ValidatorIndex,
49
41
  Wei,
50
42
  deneb,
43
+ electra,
51
44
  gloas,
52
45
  isBlindedBeaconBlock,
53
46
  phase0,
@@ -100,8 +93,8 @@ import {
100
93
  } from "./opPools/index.js";
101
94
  import {IChainOptions} from "./options.js";
102
95
  import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
103
- import {computeNewStateRoot, computePayloadEnvelopeStateRoot} from "./produceBlock/computeNewStateRoot.js";
104
- import {AssembledBlockType, BlockType, ProduceFullGloas, ProduceResult} from "./produceBlock/index.js";
96
+ import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
97
+ import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
105
98
  import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
106
99
  import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
107
100
  import {ReprocessController} from "./reprocess.js";
@@ -114,6 +107,7 @@ import {
114
107
  SeenExecutionPayloadBids,
115
108
  SeenPayloadAttesters,
116
109
  SeenPayloadEnvelopeInput,
110
+ SeenProposerPreferences,
117
111
  SeenSyncCommitteeMessages,
118
112
  } from "./seenCache/index.js";
119
113
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -125,7 +119,7 @@ import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datasto
125
119
  import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
126
120
  import {CPStateDatastore} from "./stateCache/datastore/types.js";
127
121
  import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
128
- import {PersistentCheckpointStateCache, fcCheckpointToHexPayload} from "./stateCache/persistentCheckpointsCache.js";
122
+ import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
129
123
  import {CheckpointStateCache} from "./stateCache/types.js";
130
124
  import {ValidatorMonitor} from "./validatorMonitor.js";
131
125
 
@@ -194,6 +188,7 @@ export class BeaconChain implements IBeaconChain {
194
188
  readonly seenPayloadAttesters = new SeenPayloadAttesters();
195
189
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
196
190
  readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
191
+ readonly seenProposerPreferences = new SeenProposerPreferences();
197
192
  readonly seenBlockProposers = new SeenBlockProposers();
198
193
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
199
194
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -341,13 +336,6 @@ export class BeaconChain implements IBeaconChain {
341
336
  metrics,
342
337
  logger,
343
338
  });
344
- this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
345
- chainEvents: emitter,
346
- signal,
347
- serializedCache: this.serializedCache,
348
- metrics,
349
- logger,
350
- });
351
339
 
352
340
  this._earliestAvailableSlot = anchorState.slot;
353
341
 
@@ -390,8 +378,7 @@ export class BeaconChain implements IBeaconChain {
390
378
  const {checkpoint} = anchorState.computeAnchorCheckpoint();
391
379
  blockStateCache.add(anchorState);
392
380
  blockStateCache.setHeadState(anchorState);
393
- const payloadPresent = getCheckpointPayloadStatus(config, anchorState, checkpoint.epoch) === PayloadStatus.FULL;
394
- checkpointStateCache.add(checkpoint, anchorState, payloadPresent);
381
+ checkpointStateCache.add(checkpoint, anchorState);
395
382
 
396
383
  const forkChoice = initializeForkChoice(
397
384
  config,
@@ -404,6 +391,7 @@ export class BeaconChain implements IBeaconChain {
404
391
  metrics,
405
392
  logger
406
393
  );
394
+
407
395
  const regen = new QueuedStateRegenerator({
408
396
  config,
409
397
  forkChoice,
@@ -428,6 +416,33 @@ export class BeaconChain implements IBeaconChain {
428
416
  this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
429
417
 
430
418
  this.forkChoice = forkChoice;
419
+
420
+ this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
421
+ config,
422
+ clock,
423
+ forkChoice,
424
+ chainEvents: emitter,
425
+ signal,
426
+ serializedCache: this.serializedCache,
427
+ metrics,
428
+ logger,
429
+ });
430
+
431
+ const anchorBlockSlot = anchorState.latestBlockHeader.slot;
432
+ if (isStatePostGloas(anchorState) && anchorBlockSlot > 0) {
433
+ const anchorBid = anchorState.latestExecutionPayloadBid;
434
+ this.seenPayloadEnvelopeInputCache.addFromBid({
435
+ blockRootHex: toRootHex(checkpoint.root),
436
+ slot: anchorBlockSlot,
437
+ forkName: anchorState.forkName,
438
+ proposerIndex: anchorState.latestBlockHeader.proposerIndex,
439
+ bid: anchorBid,
440
+ sampledColumns: this.custodyConfig.sampledColumns,
441
+ custodyColumns: this.custodyConfig.custodyColumns,
442
+ timeCreatedSec: Math.floor(Date.now() / 1000),
443
+ });
444
+ }
445
+
431
446
  this.clock = clock;
432
447
  this.regen = regen;
433
448
  this.bls = bls;
@@ -685,16 +700,16 @@ export class BeaconChain implements IBeaconChain {
685
700
 
686
701
  // TODO GLOAS: Need to revisit the design of this api. Currently we just retrieve FULL state of the checkpoint for backwards compatibility.
687
702
  // because pre-gloas we always store FULL checkpoint state.
688
- const persistedKey = checkpointToDatastoreKey(checkpoint, true);
703
+ const persistedKey = checkpointToDatastoreKey(checkpoint);
689
704
  return this.cpStateDatastore.read(persistedKey);
690
705
  }
691
706
 
692
707
  getStateByCheckpoint(
693
- checkpoint: CheckpointWithPayloadStatus
708
+ checkpoint: CheckpointWithHex
694
709
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null {
695
710
  // finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
696
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
697
- const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHexPayload);
711
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
712
+ const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHex);
698
713
  if (cachedStateCtx) {
699
714
  const block = this.forkChoice.getBlockDefaultStatus(
700
715
  ssz.phase0.BeaconBlockHeader.hashTreeRoot(cachedStateCtx.latestBlockHeader)
@@ -711,10 +726,10 @@ export class BeaconChain implements IBeaconChain {
711
726
  }
712
727
 
713
728
  async getStateOrBytesByCheckpoint(
714
- checkpoint: CheckpointWithPayloadStatus
729
+ checkpoint: CheckpointWithHex
715
730
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
716
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
717
- const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHexPayload);
731
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
732
+ const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHex);
718
733
  if (cachedStateCtx) {
719
734
  const block = this.forkChoice.getBlockDefaultStatus(checkpoint.root);
720
735
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
@@ -896,6 +911,21 @@ export class BeaconChain implements IBeaconChain {
896
911
  );
897
912
  }
898
913
 
914
+ async getParentExecutionRequests(
915
+ parentBlockSlot: Slot,
916
+ parentBlockRootHex: RootHex
917
+ ): Promise<electra.ExecutionRequests> {
918
+ // at the fork boundary, parent is pre-gloas
919
+ if (!isForkPostGloas(this.config.getForkName(parentBlockSlot))) {
920
+ return ssz.electra.ExecutionRequests.defaultValue();
921
+ }
922
+ const envelope = await this.getExecutionPayloadEnvelope(parentBlockSlot, parentBlockRootHex);
923
+ if (envelope === null) {
924
+ throw Error(`Parent execution payload envelope not found slot=${parentBlockSlot}, root=${parentBlockRootHex}`);
925
+ }
926
+ return envelope.message.executionRequests;
927
+ }
928
+
899
929
  async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]> {
900
930
  const fork = this.config.getForkName(blockSlot);
901
931
 
@@ -1070,7 +1100,7 @@ export class BeaconChain implements IBeaconChain {
1070
1100
  body,
1071
1101
  } as AssembledBlockType<T>;
1072
1102
 
1073
- const {newStateRoot, proposerReward, postBlockState} = computeNewStateRoot(this.metrics, state, block);
1103
+ const {newStateRoot, proposerReward} = computeNewStateRoot(this.metrics, state, block);
1074
1104
  block.stateRoot = newStateRoot;
1075
1105
  const blockRoot =
1076
1106
  produceResult.type === BlockType.Full
@@ -1079,26 +1109,9 @@ export class BeaconChain implements IBeaconChain {
1079
1109
  const blockRootHex = toRootHex(blockRoot);
1080
1110
 
1081
1111
  const fork = this.config.getForkName(slot);
1082
- if (isForkPostGloas(fork)) {
1083
- // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1084
- if (produceResult.type !== BlockType.Full) {
1085
- throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1086
- }
1087
-
1088
- const gloasResult = produceResult as ProduceFullGloas;
1089
- const envelope: gloas.ExecutionPayloadEnvelope = {
1090
- payload: gloasResult.executionPayload,
1091
- executionRequests: gloasResult.executionRequests,
1092
- builderIndex: BUILDER_INDEX_SELF_BUILD,
1093
- beaconBlockRoot: blockRoot,
1094
- slot,
1095
- stateRoot: ZERO_HASH,
1096
- };
1097
- if (!isStatePostGloas(postBlockState)) {
1098
- throw Error(`Expected gloas+ post-state for execution payload envelope, got fork=${postBlockState.forkName}`);
1099
- }
1100
- const payloadEnvelopeStateRoot = computePayloadEnvelopeStateRoot(this.metrics, postBlockState, envelope);
1101
- gloasResult.payloadEnvelopeStateRoot = payloadEnvelopeStateRoot;
1112
+ // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1113
+ if (isForkPostGloas(fork) && produceResult.type !== BlockType.Full) {
1114
+ throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1102
1115
  }
1103
1116
 
1104
1117
  // Track the produced block for consensus broadcast validations, later validation, etc.
@@ -1109,11 +1122,15 @@ export class BeaconChain implements IBeaconChain {
1109
1122
  }
1110
1123
 
1111
1124
  async processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void> {
1112
- return this.blockProcessor.processBlocksJob([block], opts);
1125
+ return this.blockProcessor.processBlocksJob([block], null, opts);
1113
1126
  }
1114
1127
 
1115
- async processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void> {
1116
- return this.blockProcessor.processBlocksJob(blocks, opts);
1128
+ async processChainSegment(
1129
+ blocks: IBlockInput[],
1130
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
1131
+ opts?: ImportBlockOpts
1132
+ ): Promise<void> {
1133
+ await this.blockProcessor.processBlocksJob(blocks, payloadEnvelopes, opts);
1117
1134
  }
1118
1135
 
1119
1136
  async processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void> {
@@ -1304,7 +1321,7 @@ export class BeaconChain implements IBeaconChain {
1304
1321
  * @param blockState state that declares justified checkpoint `checkpoint`
1305
1322
  */
1306
1323
  private justifiedBalancesGetter(
1307
- checkpoint: CheckpointWithPayloadStatus,
1324
+ checkpoint: CheckpointWithHex,
1308
1325
  blockState: IBeaconStateView
1309
1326
  ): EffectiveBalanceIncrements {
1310
1327
  this.metrics?.balancesCache.requests.inc();
@@ -1343,11 +1360,11 @@ export class BeaconChain implements IBeaconChain {
1343
1360
  * @param blockState state that declares justified checkpoint `checkpoint`
1344
1361
  */
1345
1362
  private closestJustifiedBalancesStateToCheckpoint(
1346
- checkpoint: CheckpointWithPayloadStatus,
1363
+ checkpoint: CheckpointWithHex,
1347
1364
  blockState: IBeaconStateView
1348
1365
  ): {state: IBeaconStateView; stateId: string; shouldWarn: boolean} {
1349
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
1350
- const state = this.regen.getCheckpointStateSync(checkpointHexPayload);
1366
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
1367
+ const state = this.regen.getCheckpointStateSync(checkpointHex);
1351
1368
  if (state) {
1352
1369
  return {state, stateId: "checkpoint_state", shouldWarn: false};
1353
1370
  }
@@ -1358,10 +1375,7 @@ export class BeaconChain implements IBeaconChain {
1358
1375
  }
1359
1376
 
1360
1377
  // Find a state in the same branch of checkpoint at same epoch. Balances should exactly the same
1361
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1362
- checkpoint.rootHex,
1363
- checkpoint.payloadStatus
1364
- )) {
1378
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1365
1379
  if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
1366
1380
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1367
1381
  if (descendantBlockState) {
@@ -1377,10 +1391,7 @@ export class BeaconChain implements IBeaconChain {
1377
1391
 
1378
1392
  // Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
1379
1393
  // Note: must call .forwardIterateDescendants() again since nodes are not sorted
1380
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1381
- checkpoint.rootHex,
1382
- checkpoint.payloadStatus
1383
- )) {
1394
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1384
1395
  if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
1385
1396
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1386
1397
  if (descendantBlockState) {
@@ -1450,6 +1461,7 @@ export class BeaconChain implements IBeaconChain {
1450
1461
  this.payloadAttestationPool.prune(slot);
1451
1462
  this.executionPayloadBidPool.prune(slot);
1452
1463
  this.seenExecutionPayloadBids.prune(slot);
1464
+ this.seenProposerPreferences.prune(slot);
1453
1465
  this.seenAttestationDatas.onSlot(slot);
1454
1466
  this.reprocessController.onSlot(slot);
1455
1467
 
@@ -1471,10 +1483,6 @@ export class BeaconChain implements IBeaconChain {
1471
1483
  private onClockEpoch(epoch: Epoch): void {
1472
1484
  this.metrics?.clockEpoch.set(epoch);
1473
1485
 
1474
- if (epoch === this.config.GLOAS_FORK_EPOCH) {
1475
- this.regen.upgradeForGloas(epoch);
1476
- }
1477
-
1478
1486
  this.seenAttesters.prune(epoch);
1479
1487
  this.seenAggregators.prune(epoch);
1480
1488
  this.seenPayloadAttesters.prune(epoch);
@@ -1488,7 +1496,7 @@ export class BeaconChain implements IBeaconChain {
1488
1496
  this.seenContributionAndProof.prune(head.slot);
1489
1497
  }
1490
1498
 
1491
- private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithPayloadStatus): void {
1499
+ private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
1492
1500
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1493
1501
  }
1494
1502
 
@@ -1499,7 +1507,7 @@ export class BeaconChain implements IBeaconChain {
1499
1507
  });
1500
1508
  }
1501
1509
 
1502
- private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithPayloadStatus): Promise<void> {
1510
+ private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1503
1511
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1504
1512
  const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1505
1513
  this.seenBlockProposers.prune(finalizedSlot);
@@ -1540,7 +1548,7 @@ export class BeaconChain implements IBeaconChain {
1540
1548
  }
1541
1549
  }
1542
1550
 
1543
- private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithPayloadStatus): Promise<void> {
1551
+ private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
1544
1552
  if (this.custodyConfig.targetCustodyGroupCount === this.config.NUMBER_OF_CUSTODY_GROUPS) {
1545
1553
  // Custody requirements can only be increased, we can disable dynamic custody updates
1546
1554
  // if the node already maintains custody of all custody groups in case it is configured
@@ -1,12 +1,12 @@
1
1
  import {EventEmitter} from "node:events";
2
2
  import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
- import {CheckpointWithPayloadStatus} from "@lodestar/fork-choice";
4
+ import {CheckpointWithHex} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
6
  import {DataColumnSidecar, RootHex, deneb, phase0} from "@lodestar/types";
7
- import {SignedExecutionPayloadEnvelope} from "@lodestar/types/gloas";
8
7
  import {PeerIdStr} from "../util/peerId.js";
9
8
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
9
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
10
10
 
11
11
  /**
12
12
  * Important chain events that occur during normal chain operation.
@@ -59,10 +59,6 @@ export enum ChainEvent {
59
59
  * Post-gloas, missing parent could be a SignedBeaconBlock and/or a SignedExecutionPayloadEnvelope
60
60
  */
61
61
  blockUnknownParent = "blockUnknownParent",
62
- /**
63
- * Trigger BlockInputSync to find a SignedBeaconBlock given a SignedExecutionPayloadEnvelop received
64
- */
65
- envelopeUnknownBlock = "envelopeUnknownBlock",
66
62
  /**
67
63
  * Trigger BlockInputSync to find a SignedBeaconBlock with specified block root.
68
64
  */
@@ -76,6 +72,11 @@ export enum ChainEvent {
76
72
  * cut-off window passes for waiting on gossip
77
73
  */
78
74
  incompleteBlockInput = "incompleteBlockInput",
75
+ /**
76
+ * Post-gloas: trigger BlockInputSync for payload envelopes whose envelope and/or sampled columns are partially
77
+ * received via gossip but are not complete by time the cut-off window passes for waiting on gossip
78
+ */
79
+ incompletePayloadEnvelope = "incompletePayloadEnvelope",
79
80
  }
80
81
 
81
82
  export type HeadEventData = routes.events.EventData[routes.events.EventType.head];
@@ -86,21 +87,21 @@ type ApiEvents = {[K in routes.events.EventType]: (data: routes.events.EventData
86
87
 
87
88
  export type ChainEventData = {
88
89
  [ChainEvent.blockUnknownParent]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
89
- [ChainEvent.envelopeUnknownBlock]: {
90
- envelope: SignedExecutionPayloadEnvelope;
91
- peer?: PeerIdStr;
92
- source: BlockInputSource;
93
- };
94
90
  [ChainEvent.unknownBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
95
91
  [ChainEvent.incompleteBlockInput]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
92
+ [ChainEvent.incompletePayloadEnvelope]: {
93
+ payloadInput: PayloadEnvelopeInput;
94
+ peer: PeerIdStr;
95
+ source: BlockInputSource;
96
+ };
96
97
  [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
97
98
  };
98
99
 
99
100
  export type IChainEvents = ApiEvents & {
100
101
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: IBeaconStateView) => void;
101
102
 
102
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
104
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
104
105
 
105
106
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
106
107
 
@@ -113,9 +114,9 @@ export type IChainEvents = ApiEvents & {
113
114
  // Sync events that are chain->chain. Initiated from network requests but do not cross the network
114
115
  // barrier so are considered ChainEvent(s).
115
116
  [ChainEvent.blockUnknownParent]: (data: ChainEventData[ChainEvent.blockUnknownParent]) => void;
116
- [ChainEvent.envelopeUnknownBlock]: (data: ChainEventData[ChainEvent.envelopeUnknownBlock]) => void;
117
117
  [ChainEvent.unknownBlockRoot]: (data: ChainEventData[ChainEvent.unknownBlockRoot]) => void;
118
118
  [ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
119
+ [ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
119
120
  [ChainEvent.unknownEnvelopeBlockRoot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRoot]) => void;
120
121
  };
121
122
 
@@ -147,6 +147,10 @@ export enum AttestationErrorCode {
147
147
  * Gloas: Current slot attestation is marking payload as present
148
148
  */
149
149
  PREMATURELY_INDICATED_PAYLOAD_PRESENT = "ATTESTATION_ERROR_PREMATURELY_INDICATED_PAYLOAD_PRESENT",
150
+ /**
151
+ * Gloas: index-1 attestation but the execution payload has not been seen yet
152
+ */
153
+ EXECUTION_PAYLOAD_NOT_SEEN = "ATTESTATION_ERROR_EXECUTION_PAYLOAD_NOT_SEEN",
150
154
  }
151
155
 
152
156
  export type AttestationErrorType =
@@ -185,7 +189,8 @@ export type AttestationErrorType =
185
189
  | {code: AttestationErrorCode.NON_ZERO_ATTESTATION_DATA_INDEX}
186
190
  | {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE}
187
191
  | {code: AttestationErrorCode.INVALID_PAYLOAD_STATUS_VALUE; attDataIndex: number}
188
- | {code: AttestationErrorCode.PREMATURELY_INDICATED_PAYLOAD_PRESENT};
192
+ | {code: AttestationErrorCode.PREMATURELY_INDICATED_PAYLOAD_PRESENT}
193
+ | {code: AttestationErrorCode.EXECUTION_PAYLOAD_NOT_SEEN; beaconBlockRoot: RootHex};
189
194
 
190
195
  export class AttestationError extends GossipActionError<AttestationErrorType> {
191
196
  getMetadata(): Record<string, string | number | null> {
@@ -74,6 +74,8 @@ export enum BlockErrorCode {
74
74
  PARENT_EXECUTION_INVALID = "BLOCK_ERROR_PARENT_EXECUTION_INVALID",
75
75
  /** The block's parent execution payload (defined by bid.parent_block_hash) has not been seen */
76
76
  PARENT_PAYLOAD_UNKNOWN = "BLOCK_ERROR_PARENT_PAYLOAD_UNKNOWN",
77
+ /** An execution payload envelope in the chain segment references a block root that does not match its slot's block */
78
+ ENVELOPE_BLOCK_ROOT_MISMATCH = "BLOCK_ERROR_ENVELOPE_BLOCK_ROOT_MISMATCH",
77
79
  }
78
80
 
79
81
  type ExecutionErrorStatus = Exclude<
@@ -107,6 +109,7 @@ export type BlockErrorType =
107
109
  | {code: BlockErrorCode.NOT_LATER_THAN_PARENT; parentSlot: Slot; slot: Slot}
108
110
  | {code: BlockErrorCode.NON_LINEAR_PARENT_ROOTS}
109
111
  | {code: BlockErrorCode.NON_LINEAR_SLOTS}
112
+ | {code: BlockErrorCode.ENVELOPE_BLOCK_ROOT_MISMATCH; envelopeBlockRoot: RootHex; blockRoot: RootHex}
110
113
  | {code: BlockErrorCode.PER_BLOCK_PROCESSING_ERROR; error: Error}
111
114
  | {code: BlockErrorCode.BEACON_CHAIN_ERROR; error: Error}
112
115
  | {code: BlockErrorCode.KNOWN_BAD_BLOCK}
@@ -120,7 +123,7 @@ export type BlockErrorType =
120
123
  | {code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS; blobKzgCommitmentsLen: number; commitmentLimit: number}
121
124
  | {code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH; bidParentRoot: RootHex; blockParentRoot: RootHex}
122
125
  | {code: BlockErrorCode.PARENT_EXECUTION_INVALID; parentRoot: RootHex}
123
- | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentBlockHash: RootHex};
126
+ | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentRoot: RootHex; parentBlockHash: RootHex};
124
127
 
125
128
  export class BlockGossipError extends GossipActionError<BlockErrorType> {}
126
129
 
@@ -7,6 +7,7 @@ export enum ExecutionPayloadBidErrorCode {
7
7
  BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
8
8
  BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
9
9
  BID_TOO_HIGH = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_HIGH",
10
+ TOO_MANY_KZG_COMMITMENTS = "EXECUTION_PAYLOAD_BID_ERROR_TOO_MANY_KZG_COMMITMENTS",
10
11
  UNKNOWN_BLOCK_ROOT = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_BLOCK_ROOT",
11
12
  INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
12
13
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
@@ -28,6 +29,11 @@ export type ExecutionPayloadBidErrorType =
28
29
  }
29
30
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
30
31
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
32
+ | {
33
+ code: ExecutionPayloadBidErrorCode.TOO_MANY_KZG_COMMITMENTS;
34
+ blobKzgCommitmentsLen: number;
35
+ commitmentLimit: number;
36
+ }
31
37
  | {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
32
38
  | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
33
39
  | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
@@ -11,6 +11,7 @@ export enum ExecutionPayloadEnvelopeErrorCode {
11
11
  SLOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_SLOT_MISMATCH",
12
12
  BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
13
13
  BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
14
+ EXECUTION_REQUESTS_ROOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_EXECUTION_REQUESTS_ROOT_MISMATCH",
14
15
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
15
16
  PAYLOAD_ENVELOPE_INPUT_MISSING = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_PAYLOAD_ENVELOPE_INPUT_MISSING",
16
17
  }
@@ -36,6 +37,11 @@ export type ExecutionPayloadEnvelopeErrorType =
36
37
  envelopeBlockHash: RootHex;
37
38
  bidBlockHash: RootHex | null;
38
39
  }
40
+ | {
41
+ code: ExecutionPayloadEnvelopeErrorCode.EXECUTION_REQUESTS_ROOT_MISMATCH;
42
+ envelopeRequestsRoot: RootHex;
43
+ bidRequestsRoot: RootHex;
44
+ }
39
45
  | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE}
40
46
  | {code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING; blockRoot: RootHex};
41
47
 
@@ -8,6 +8,7 @@ export * from "./executionPayloadBid.js";
8
8
  export * from "./executionPayloadEnvelope.js";
9
9
  export * from "./gossipValidation.js";
10
10
  export * from "./payloadAttestation.js";
11
+ export * from "./proposerPreferences.js";
11
12
  export * from "./proposerSlashingError.js";
12
13
  export * from "./syncCommitteeError.js";
13
14
  export * from "./voluntaryExitError.js";
@@ -0,0 +1,47 @@
1
+ import {RootHex, Slot, ValidatorIndex} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.js";
3
+
4
+ export enum ProposerPreferencesErrorCode {
5
+ INVALID_EPOCH = "PROPOSER_PREFERENCES_ERROR_INVALID_EPOCH",
6
+ PROPOSAL_SLOT_PASSED = "PROPOSER_PREFERENCES_ERROR_PROPOSAL_SLOT_PASSED",
7
+ UNKNOWN_DEPENDENT_ROOT = "PROPOSER_PREFERENCES_ERROR_UNKNOWN_DEPENDENT_ROOT",
8
+ INVALID_PROPOSER = "PROPOSER_PREFERENCES_ERROR_INVALID_PROPOSER",
9
+ ALREADY_KNOWN = "PROPOSER_PREFERENCES_ERROR_ALREADY_KNOWN",
10
+ INVALID_SIGNATURE = "PROPOSER_PREFERENCES_ERROR_INVALID_SIGNATURE",
11
+ }
12
+
13
+ export type ProposerPreferencesErrorType =
14
+ | {
15
+ code: ProposerPreferencesErrorCode.INVALID_EPOCH;
16
+ proposalSlot: Slot;
17
+ currentEpoch: number;
18
+ }
19
+ | {
20
+ code: ProposerPreferencesErrorCode.PROPOSAL_SLOT_PASSED;
21
+ proposalSlot: Slot;
22
+ currentSlot: Slot;
23
+ }
24
+ | {
25
+ code: ProposerPreferencesErrorCode.UNKNOWN_DEPENDENT_ROOT;
26
+ proposalSlot: Slot;
27
+ dependentRoot: RootHex;
28
+ }
29
+ | {
30
+ code: ProposerPreferencesErrorCode.INVALID_PROPOSER;
31
+ proposalSlot: Slot;
32
+ validatorIndex: ValidatorIndex;
33
+ dependentRoot: RootHex;
34
+ }
35
+ | {
36
+ code: ProposerPreferencesErrorCode.ALREADY_KNOWN;
37
+ proposalSlot: Slot;
38
+ validatorIndex: ValidatorIndex;
39
+ dependentRoot: RootHex;
40
+ }
41
+ | {
42
+ code: ProposerPreferencesErrorCode.INVALID_SIGNATURE;
43
+ proposalSlot: Slot;
44
+ validatorIndex: ValidatorIndex;
45
+ };
46
+
47
+ export class ProposerPreferencesError extends GossipActionError<ProposerPreferencesErrorType> {}
@@ -8,7 +8,6 @@ import {
8
8
  ProtoArray,
9
9
  ProtoBlock,
10
10
  ForkChoiceOpts as RawForkChoiceOpts,
11
- getCheckpointPayloadStatus,
12
11
  } from "@lodestar/fork-choice";
13
12
  import {ZERO_HASH_HEX} from "@lodestar/params";
14
13
  import {
@@ -104,12 +103,6 @@ export function initializeForkChoiceFromFinalizedState(
104
103
 
105
104
  const isForkPostGloas = computeEpochAtSlot(state.slot) >= config.GLOAS_FORK_EPOCH;
106
105
 
107
- // Determine justified checkpoint payload status
108
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, state, justifiedCheckpoint.epoch);
109
-
110
- // Determine finalized checkpoint payload status
111
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, state, finalizedCheckpoint.epoch);
112
-
113
106
  return new forkchoiceConstructor(
114
107
  config,
115
108
 
@@ -119,8 +112,6 @@ export function initializeForkChoiceFromFinalizedState(
119
112
  finalizedCheckpoint,
120
113
  justifiedBalances,
121
114
  justifiedBalancesGetter,
122
- justifiedPayloadStatus,
123
- finalizedPayloadStatus,
124
115
  {
125
116
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
126
117
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -146,7 +137,9 @@ export function initializeForkChoiceFromFinalizedState(
146
137
 
147
138
  ...(isStatePostBellatrix(state) && state.isExecutionStateType && state.isMergeTransitionComplete
148
139
  ? {
149
- executionPayloadBlockHash: toRootHex(state.latestBlockHash),
140
+ executionPayloadBlockHash: isStatePostGloas(state)
141
+ ? toRootHex(state.latestBlockHash)
142
+ : toRootHex(state.latestExecutionPayloadHeader.blockHash),
150
143
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
151
144
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
152
145
  executionPayloadNumber: isStatePostGloas(state) ? 0 : state.payloadBlockNumber,
@@ -155,7 +148,7 @@ export function initializeForkChoiceFromFinalizedState(
155
148
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
156
149
 
157
150
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
158
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
151
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
159
152
  parentBlockHash: isStatePostGloas(state) ? toRootHex(state.latestBlockHash) : null,
160
153
  },
161
154
  currentSlot
@@ -202,19 +195,12 @@ export function initializeForkChoiceFromUnfinalizedState(
202
195
 
203
196
  const isForkPostGloas = computeEpochAtSlot(unfinalizedState.slot) >= config.GLOAS_FORK_EPOCH;
204
197
 
205
- // For unfinalized state, use getCheckpointPayloadStatus to determine the correct status.
206
- // It checks state.execution_payload_availability to determine EMPTY vs FULL.
207
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, justifiedCheckpoint.epoch);
208
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, finalizedCheckpoint.epoch);
209
-
210
198
  const store = new ForkChoiceStore(
211
199
  currentSlot,
212
200
  justifiedCheckpoint,
213
201
  finalizedCheckpoint,
214
202
  justifiedBalances,
215
203
  justifiedBalancesGetter,
216
- justifiedPayloadStatus,
217
- finalizedPayloadStatus,
218
204
  {
219
205
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
220
206
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -243,7 +229,9 @@ export function initializeForkChoiceFromUnfinalizedState(
243
229
  unfinalizedState.isExecutionStateType &&
244
230
  unfinalizedState.isMergeTransitionComplete
245
231
  ? {
246
- executionPayloadBlockHash: toRootHex(unfinalizedState.latestBlockHash),
232
+ executionPayloadBlockHash: isStatePostGloas(unfinalizedState)
233
+ ? toRootHex(unfinalizedState.latestBlockHash)
234
+ : toRootHex(unfinalizedState.latestExecutionPayloadHeader.blockHash),
247
235
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
248
236
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
249
237
  executionPayloadNumber: isStatePostGloas(unfinalizedState) ? 0 : unfinalizedState.payloadBlockNumber,
@@ -252,7 +240,7 @@ export function initializeForkChoiceFromUnfinalizedState(
252
240
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
253
241
 
254
242
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
255
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
243
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
256
244
  parentBlockHash: isStatePostGloas(unfinalizedState) ? toRootHex(unfinalizedState.latestBlockHash) : null,
257
245
  };
258
246
 
@@ -1,7 +1,8 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
- import {ZERO_HASH} from "@lodestar/params";
2
+ import {ForkPostGloas, ForkSeq, ZERO_HASH} from "@lodestar/params";
3
3
  import {
4
4
  BeaconStateAllForks,
5
+ BeaconStateGloas,
5
6
  IBeaconStateView,
6
7
  computeEpochAtSlot,
7
8
  computeStartSlotAtEpoch,
@@ -52,6 +53,13 @@ export function createGenesisBlock(config: ChainForkConfig, genesisState: Beacon
52
53
  const genesisBlock = types.SignedBeaconBlock.defaultValue();
53
54
  const stateRoot = genesisState.hashTreeRoot();
54
55
  genesisBlock.message.stateRoot = stateRoot;
56
+
57
+ if (config.getForkSeq(GENESIS_SLOT) >= ForkSeq.gloas) {
58
+ const gloasBlock = genesisBlock as SignedBeaconBlock<ForkPostGloas>;
59
+ const gloasState = genesisState as BeaconStateGloas;
60
+ gloasBlock.message.body.signedExecutionPayloadBid.message = gloasState.latestExecutionPayloadBid.toValue();
61
+ }
62
+
55
63
  return genesisBlock;
56
64
  }
57
65