@lodestar/beacon-node 1.43.0-dev.2870b59b6a → 1.43.0-dev.2fba242f5d

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 (357) 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 +67 -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/importBlock.d.ts.map +1 -1
  35. package/lib/chain/blocks/importBlock.js +45 -49
  36. package/lib/chain/blocks/importBlock.js.map +1 -1
  37. package/lib/chain/blocks/importExecutionPayload.d.ts +28 -14
  38. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  39. package/lib/chain/blocks/importExecutionPayload.js +88 -88
  40. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  41. package/lib/chain/blocks/index.d.ts +5 -3
  42. package/lib/chain/blocks/index.d.ts.map +1 -1
  43. package/lib/chain/blocks/index.js +59 -26
  44. package/lib/chain/blocks/index.js.map +1 -1
  45. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +4 -0
  46. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  47. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +25 -1
  48. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  49. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +1 -0
  50. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  51. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  52. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  53. package/lib/chain/blocks/payloadEnvelopeProcessor.js +7 -5
  54. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  55. package/lib/chain/blocks/types.d.ts +16 -21
  56. package/lib/chain/blocks/types.d.ts.map +1 -1
  57. package/lib/chain/blocks/utils/chainSegment.d.ts +23 -2
  58. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  59. package/lib/chain/blocks/utils/chainSegment.js +89 -12
  60. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  61. package/lib/chain/blocks/verifyBlock.d.ts +5 -3
  62. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  63. package/lib/chain/blocks/verifyBlock.js +50 -7
  64. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  65. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  66. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  68. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  69. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  70. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  71. package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
  72. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  73. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  74. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  75. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +76 -0
  76. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  77. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  78. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  79. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +30 -0
  80. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  81. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  82. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  83. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  84. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  85. package/lib/chain/chain.d.ts +8 -6
  86. package/lib/chain/chain.d.ts.map +1 -1
  87. package/lib/chain/chain.js +35 -36
  88. package/lib/chain/chain.js.map +1 -1
  89. package/lib/chain/emitter.d.ts +16 -15
  90. package/lib/chain/emitter.d.ts.map +1 -1
  91. package/lib/chain/emitter.js +5 -4
  92. package/lib/chain/emitter.js.map +1 -1
  93. package/lib/chain/errors/blockError.d.ts +8 -1
  94. package/lib/chain/errors/blockError.d.ts.map +1 -1
  95. package/lib/chain/errors/blockError.js +2 -0
  96. package/lib/chain/errors/blockError.js.map +1 -1
  97. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  98. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  99. package/lib/chain/errors/executionPayloadBid.js +1 -0
  100. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  101. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  102. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  103. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  104. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  105. package/lib/chain/errors/index.d.ts +1 -0
  106. package/lib/chain/errors/index.d.ts.map +1 -1
  107. package/lib/chain/errors/index.js +1 -0
  108. package/lib/chain/errors/index.js.map +1 -1
  109. package/lib/chain/errors/proposerPreferences.d.ts +33 -0
  110. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  111. package/lib/chain/errors/proposerPreferences.js +13 -0
  112. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  113. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  114. package/lib/chain/forkChoice/index.js +11 -15
  115. package/lib/chain/forkChoice/index.js.map +1 -1
  116. package/lib/chain/interface.d.ts +7 -5
  117. package/lib/chain/interface.d.ts.map +1 -1
  118. package/lib/chain/interface.js.map +1 -1
  119. package/lib/chain/opPools/payloadAttestationPool.d.ts +3 -2
  120. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  121. package/lib/chain/opPools/payloadAttestationPool.js +26 -4
  122. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  123. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  124. package/lib/chain/prepareNextSlot.js +47 -23
  125. package/lib/chain/prepareNextSlot.js.map +1 -1
  126. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
  127. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  128. package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
  129. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  130. package/lib/chain/produceBlock/produceBlockBody.d.ts +12 -8
  131. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  132. package/lib/chain/produceBlock/produceBlockBody.js +67 -25
  133. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  134. package/lib/chain/regen/errors.d.ts +1 -11
  135. package/lib/chain/regen/errors.d.ts.map +1 -1
  136. package/lib/chain/regen/errors.js +0 -2
  137. package/lib/chain/regen/errors.js.map +1 -1
  138. package/lib/chain/regen/interface.d.ts +7 -11
  139. package/lib/chain/regen/interface.d.ts.map +1 -1
  140. package/lib/chain/regen/interface.js +1 -0
  141. package/lib/chain/regen/interface.js.map +1 -1
  142. package/lib/chain/regen/queued.d.ts +6 -10
  143. package/lib/chain/regen/queued.d.ts.map +1 -1
  144. package/lib/chain/regen/queued.js +4 -14
  145. package/lib/chain/regen/queued.js.map +1 -1
  146. package/lib/chain/regen/regen.d.ts +0 -5
  147. package/lib/chain/regen/regen.d.ts.map +1 -1
  148. package/lib/chain/regen/regen.js +1 -12
  149. package/lib/chain/regen/regen.js.map +1 -1
  150. package/lib/chain/seenCache/index.d.ts +1 -0
  151. package/lib/chain/seenCache/index.d.ts.map +1 -1
  152. package/lib/chain/seenCache/index.js +1 -0
  153. package/lib/chain/seenCache/index.js.map +1 -1
  154. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +19 -6
  155. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  156. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +40 -22
  157. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  158. package/lib/chain/seenCache/seenProposerPreferences.d.ts +15 -0
  159. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  160. package/lib/chain/seenCache/seenProposerPreferences.js +25 -0
  161. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  162. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +1 -7
  163. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  164. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -9
  165. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  166. package/lib/chain/stateCache/types.d.ts +0 -6
  167. package/lib/chain/stateCache/types.d.ts.map +1 -1
  168. package/lib/chain/stateCache/types.js.map +1 -1
  169. package/lib/chain/validation/block.d.ts.map +1 -1
  170. package/lib/chain/validation/block.js +1 -0
  171. package/lib/chain/validation/block.js.map +1 -1
  172. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  173. package/lib/chain/validation/executionPayloadBid.js +13 -1
  174. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  175. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  176. package/lib/chain/validation/executionPayloadEnvelope.js +20 -10
  177. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  178. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  179. package/lib/chain/validation/payloadAttestationMessage.js +4 -3
  180. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  181. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  182. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  183. package/lib/chain/validation/proposerPreferences.js +69 -0
  184. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  185. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  186. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  187. package/lib/execution/engine/http.d.ts.map +1 -1
  188. package/lib/execution/engine/http.js +21 -14
  189. package/lib/execution/engine/http.js.map +1 -1
  190. package/lib/execution/engine/interface.d.ts +1 -0
  191. package/lib/execution/engine/interface.d.ts.map +1 -1
  192. package/lib/execution/engine/mock.d.ts.map +1 -1
  193. package/lib/execution/engine/mock.js +6 -0
  194. package/lib/execution/engine/mock.js.map +1 -1
  195. package/lib/execution/engine/types.d.ts +20 -0
  196. package/lib/execution/engine/types.d.ts.map +1 -1
  197. package/lib/execution/engine/types.js +18 -0
  198. package/lib/execution/engine/types.js.map +1 -1
  199. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  200. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  201. package/lib/metrics/metrics/lodestar.js +4 -0
  202. package/lib/metrics/metrics/lodestar.js.map +1 -1
  203. package/lib/network/gossip/interface.d.ts +7 -1
  204. package/lib/network/gossip/interface.d.ts.map +1 -1
  205. package/lib/network/gossip/interface.js +1 -0
  206. package/lib/network/gossip/interface.js.map +1 -1
  207. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  208. package/lib/network/gossip/scoringParameters.js +12 -1
  209. package/lib/network/gossip/scoringParameters.js.map +1 -1
  210. package/lib/network/gossip/topic.d.ts +11 -2
  211. package/lib/network/gossip/topic.d.ts.map +1 -1
  212. package/lib/network/gossip/topic.js +6 -0
  213. package/lib/network/gossip/topic.js.map +1 -1
  214. package/lib/network/interface.d.ts +1 -0
  215. package/lib/network/interface.d.ts.map +1 -1
  216. package/lib/network/network.d.ts +1 -0
  217. package/lib/network/network.d.ts.map +1 -1
  218. package/lib/network/network.js +6 -1
  219. package/lib/network/network.js.map +1 -1
  220. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  221. package/lib/network/processor/gossipHandlers.js +46 -22
  222. package/lib/network/processor/gossipHandlers.js.map +1 -1
  223. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  224. package/lib/network/processor/gossipQueues/index.js +5 -0
  225. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  226. package/lib/network/processor/index.d.ts.map +1 -1
  227. package/lib/network/processor/index.js +6 -5
  228. package/lib/network/processor/index.js.map +1 -1
  229. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  230. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  231. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  232. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  233. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  234. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  235. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  236. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  237. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  238. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  239. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  240. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  241. package/lib/node/nodejs.d.ts.map +1 -1
  242. package/lib/node/nodejs.js +6 -4
  243. package/lib/node/nodejs.js.map +1 -1
  244. package/lib/sync/range/batch.d.ts +23 -2
  245. package/lib/sync/range/batch.d.ts.map +1 -1
  246. package/lib/sync/range/batch.js +84 -33
  247. package/lib/sync/range/batch.js.map +1 -1
  248. package/lib/sync/range/chain.d.ts +6 -2
  249. package/lib/sync/range/chain.d.ts.map +1 -1
  250. package/lib/sync/range/chain.js +26 -7
  251. package/lib/sync/range/chain.js.map +1 -1
  252. package/lib/sync/range/range.d.ts.map +1 -1
  253. package/lib/sync/range/range.js +17 -6
  254. package/lib/sync/range/range.js.map +1 -1
  255. package/lib/sync/types.d.ts +34 -0
  256. package/lib/sync/types.d.ts.map +1 -1
  257. package/lib/sync/types.js +34 -0
  258. package/lib/sync/types.js.map +1 -1
  259. package/lib/sync/unknownBlock.d.ts +22 -1
  260. package/lib/sync/unknownBlock.d.ts.map +1 -1
  261. package/lib/sync/unknownBlock.js +602 -53
  262. package/lib/sync/unknownBlock.js.map +1 -1
  263. package/lib/sync/utils/downloadByRange.d.ts +46 -10
  264. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  265. package/lib/sync/utils/downloadByRange.js +164 -24
  266. package/lib/sync/utils/downloadByRange.js.map +1 -1
  267. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  268. package/lib/sync/utils/downloadByRoot.js +16 -2
  269. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  270. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  271. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  272. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  273. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  274. package/lib/util/sszBytes.d.ts.map +1 -1
  275. package/lib/util/sszBytes.js +16 -3
  276. package/lib/util/sszBytes.js.map +1 -1
  277. package/package.json +17 -16
  278. package/src/api/impl/beacon/blocks/index.ts +22 -9
  279. package/src/api/impl/beacon/pool/index.ts +83 -1
  280. package/src/api/impl/beacon/state/utils.ts +2 -2
  281. package/src/api/impl/debug/index.ts +0 -1
  282. package/src/api/impl/lodestar/index.ts +1 -1
  283. package/src/api/impl/validator/index.ts +83 -6
  284. package/src/chain/GetBlobsTracker.ts +1 -2
  285. package/src/chain/archiveStore/archiveStore.ts +5 -5
  286. package/src/chain/archiveStore/interface.ts +4 -4
  287. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
  288. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  289. package/src/chain/blocks/importBlock.ts +46 -73
  290. package/src/chain/blocks/importExecutionPayload.ts +109 -101
  291. package/src/chain/blocks/index.ts +74 -24
  292. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +33 -1
  293. package/src/chain/blocks/payloadEnvelopeInput/types.ts +1 -0
  294. package/src/chain/blocks/payloadEnvelopeProcessor.ts +7 -6
  295. package/src/chain/blocks/types.ts +16 -26
  296. package/src/chain/blocks/utils/chainSegment.ts +114 -17
  297. package/src/chain/blocks/verifyBlock.ts +70 -9
  298. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  299. package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
  300. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +129 -0
  301. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +41 -0
  302. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  303. package/src/chain/chain.ts +51 -51
  304. package/src/chain/emitter.ts +15 -14
  305. package/src/chain/errors/blockError.ts +4 -1
  306. package/src/chain/errors/executionPayloadBid.ts +6 -0
  307. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  308. package/src/chain/errors/index.ts +1 -0
  309. package/src/chain/errors/proposerPreferences.ts +39 -0
  310. package/src/chain/forkChoice/index.ts +8 -20
  311. package/src/chain/interface.ts +11 -3
  312. package/src/chain/opPools/payloadAttestationPool.ts +29 -8
  313. package/src/chain/prepareNextSlot.ts +55 -24
  314. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
  315. package/src/chain/produceBlock/produceBlockBody.ts +89 -27
  316. package/src/chain/regen/errors.ts +1 -6
  317. package/src/chain/regen/interface.ts +7 -11
  318. package/src/chain/regen/queued.ts +8 -21
  319. package/src/chain/regen/regen.ts +2 -15
  320. package/src/chain/seenCache/index.ts +1 -0
  321. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +47 -25
  322. package/src/chain/seenCache/seenProposerPreferences.ts +29 -0
  323. package/src/chain/stateCache/persistentCheckpointsCache.ts +5 -15
  324. package/src/chain/stateCache/types.ts +0 -3
  325. package/src/chain/validation/block.ts +1 -0
  326. package/src/chain/validation/executionPayloadBid.ts +14 -0
  327. package/src/chain/validation/executionPayloadEnvelope.ts +21 -11
  328. package/src/chain/validation/payloadAttestationMessage.ts +5 -3
  329. package/src/chain/validation/proposerPreferences.ts +91 -0
  330. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  331. package/src/execution/engine/http.ts +21 -14
  332. package/src/execution/engine/interface.ts +1 -0
  333. package/src/execution/engine/mock.ts +8 -1
  334. package/src/execution/engine/types.ts +41 -0
  335. package/src/metrics/metrics/lodestar.ts +4 -0
  336. package/src/network/gossip/interface.ts +6 -0
  337. package/src/network/gossip/scoringParameters.ts +14 -1
  338. package/src/network/gossip/topic.ts +6 -0
  339. package/src/network/interface.ts +1 -0
  340. package/src/network/network.ts +12 -1
  341. package/src/network/processor/gossipHandlers.ts +61 -27
  342. package/src/network/processor/gossipQueues/index.ts +5 -0
  343. package/src/network/processor/index.ts +6 -5
  344. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  345. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  346. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  347. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  348. package/src/node/nodejs.ts +6 -4
  349. package/src/sync/range/batch.ts +142 -38
  350. package/src/sync/range/chain.ts +37 -9
  351. package/src/sync/range/range.ts +18 -6
  352. package/src/sync/types.ts +72 -0
  353. package/src/sync/unknownBlock.ts +760 -57
  354. package/src/sync/utils/downloadByRange.ts +274 -39
  355. package/src/sync/utils/downloadByRoot.ts +24 -2
  356. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  357. package/src/util/sszBytes.ts +21 -3
@@ -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,39 @@
1
+ import {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
+ INVALID_PROPOSER = "PROPOSER_PREFERENCES_ERROR_INVALID_PROPOSER",
8
+ ALREADY_KNOWN = "PROPOSER_PREFERENCES_ERROR_ALREADY_KNOWN",
9
+ INVALID_SIGNATURE = "PROPOSER_PREFERENCES_ERROR_INVALID_SIGNATURE",
10
+ }
11
+
12
+ export type ProposerPreferencesErrorType =
13
+ | {
14
+ code: ProposerPreferencesErrorCode.INVALID_EPOCH;
15
+ proposalSlot: Slot;
16
+ currentEpoch: number;
17
+ }
18
+ | {
19
+ code: ProposerPreferencesErrorCode.PROPOSAL_SLOT_PASSED;
20
+ proposalSlot: Slot;
21
+ currentSlot: Slot;
22
+ }
23
+ | {
24
+ code: ProposerPreferencesErrorCode.INVALID_PROPOSER;
25
+ proposalSlot: Slot;
26
+ validatorIndex: ValidatorIndex;
27
+ }
28
+ | {
29
+ code: ProposerPreferencesErrorCode.ALREADY_KNOWN;
30
+ proposalSlot: Slot;
31
+ validatorIndex: ValidatorIndex;
32
+ }
33
+ | {
34
+ code: ProposerPreferencesErrorCode.INVALID_SIGNATURE;
35
+ proposalSlot: Slot;
36
+ validatorIndex: ValidatorIndex;
37
+ };
38
+
39
+ 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,6 +1,6 @@
1
1
  import {Type} from "@chainsafe/ssz";
2
2
  import {BeaconConfig} from "@lodestar/config";
3
- import {CheckpointWithHex, CheckpointWithPayloadStatus, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
3
+ import {CheckpointWithHex, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
4
4
  import {EpochShuffling, IBeaconStateView, PubkeyCache} from "@lodestar/state-transition";
5
5
  import {
6
6
  BeaconBlock,
@@ -18,6 +18,7 @@ import {
18
18
  altair,
19
19
  capella,
20
20
  deneb,
21
+ electra,
21
22
  gloas,
22
23
  phase0,
23
24
  rewards,
@@ -60,6 +61,7 @@ import {
60
61
  SeenContributionAndProof,
61
62
  SeenExecutionPayloadBids,
62
63
  SeenPayloadAttesters,
64
+ SeenProposerPreferences,
63
65
  SeenSyncCommitteeMessages,
64
66
  } from "./seenCache/index.js";
65
67
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -130,6 +132,7 @@ export interface IBeaconChain {
130
132
  readonly seenPayloadAttesters: SeenPayloadAttesters;
131
133
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
132
134
  readonly seenExecutionPayloadBids: SeenExecutionPayloadBids;
135
+ readonly seenProposerPreferences: SeenProposerPreferences;
133
136
  readonly seenBlockProposers: SeenBlockProposers;
134
137
  readonly seenSyncCommitteeMessages: SeenSyncCommitteeMessages;
135
138
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -195,7 +198,7 @@ export interface IBeaconChain {
195
198
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null;
196
199
  /** Return state bytes by checkpoint */
197
200
  getStateOrBytesByCheckpoint(
198
- checkpoint: CheckpointWithPayloadStatus
201
+ checkpoint: CheckpointWithHex
199
202
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null>;
200
203
 
201
204
  /**
@@ -231,6 +234,7 @@ export interface IBeaconChain {
231
234
  blockSlot: Slot,
232
235
  blockRootHex: string
233
236
  ): Promise<gloas.SignedExecutionPayloadEnvelope | null>;
237
+ getParentExecutionRequests(parentBlockSlot: Slot, parentBlockRootHex: RootHex): Promise<electra.ExecutionRequests>;
234
238
 
235
239
  produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody>;
236
240
  produceBlock(blockAttributes: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}): Promise<{
@@ -248,7 +252,11 @@ export interface IBeaconChain {
248
252
  /** Process a block until complete */
249
253
  processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void>;
250
254
  /** Process a chain of blocks until complete */
251
- processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void>;
255
+ processChainSegment(
256
+ blocks: IBlockInput[],
257
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
258
+ opts?: ImportBlockOpts
259
+ ): Promise<void>;
252
260
 
253
261
  /** Process execution payload envelope: verify, import to fork choice, and persist to DB */
254
262
  processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void>;
@@ -1,7 +1,7 @@
1
1
  import {Signature, aggregateSignatures} from "@chainsafe/blst";
2
2
  import {BitArray} from "@chainsafe/ssz";
3
3
  import {ChainForkConfig} from "@lodestar/config";
4
- import {MAX_COMMITTEES_PER_SLOT, PTC_SIZE} from "@lodestar/params";
4
+ import {MAX_COMMITTEES_PER_SLOT, MAX_PAYLOAD_ATTESTATIONS, PTC_SIZE} from "@lodestar/params";
5
5
  import {RootHex, Slot, gloas} from "@lodestar/types";
6
6
  import {MapDef, toRootHex} from "@lodestar/utils";
7
7
  import {Metrics} from "../../metrics/metrics.js";
@@ -95,13 +95,9 @@ export class PayloadAttestationPool {
95
95
 
96
96
  /**
97
97
  * Get payload attestations to be included in a block.
98
- * Pick the top `maxAttestation` number of attestations with the most votes
98
+ * Pick the top `MAX_PAYLOAD_ATTESTATIONS` aggregates with the most votes.
99
99
  */
100
- getPayloadAttestationsForBlock(
101
- beaconBlockRoot: BlockRootHex,
102
- slot: Slot,
103
- maxAttestation: number
104
- ): gloas.PayloadAttestation[] {
100
+ getPayloadAttestationsForBlock(beaconBlockRoot: BlockRootHex, slot: Slot): gloas.PayloadAttestation[] {
105
101
  const aggregateByDataRootByBlockRoot = this.aggregateByDataRootByBlockRootBySlot.get(slot);
106
102
 
107
103
  if (!aggregateByDataRootByBlockRoot) {
@@ -119,7 +115,32 @@ export class PayloadAttestationPool {
119
115
  return Array.from(aggregateByDataRoot.values())
120
116
  .slice()
121
117
  .sort((a, b) => b.aggregationBits.getTrueBitIndexes().length - a.aggregationBits.getTrueBitIndexes().length)
122
- .slice(0, maxAttestation)
118
+ .slice(0, MAX_PAYLOAD_ATTESTATIONS)
119
+ .map(fastToPayloadAttestation);
120
+ }
121
+
122
+ getAll(slot?: Slot): gloas.PayloadAttestation[] {
123
+ const aggregates: AggregateFast[] = [];
124
+
125
+ const addAggregates = (aggregateByDataRootByBlockRoot: Map<BlockRootHex, Map<DataRootHex, AggregateFast>>) => {
126
+ for (const aggregateByDataRoot of aggregateByDataRootByBlockRoot.values()) {
127
+ aggregates.push(...aggregateByDataRoot.values());
128
+ }
129
+ };
130
+
131
+ if (slot !== undefined) {
132
+ const aggregateByDataRootByBlockRoot = this.aggregateByDataRootByBlockRootBySlot.get(slot);
133
+ if (aggregateByDataRootByBlockRoot) {
134
+ addAggregates(aggregateByDataRootByBlockRoot);
135
+ }
136
+ } else {
137
+ for (const aggregateByDataRootByBlockRoot of this.aggregateByDataRootByBlockRootBySlot.values()) {
138
+ addAggregates(aggregateByDataRootByBlockRoot);
139
+ }
140
+ }
141
+
142
+ return aggregates
143
+ .sort((a, b) => b.aggregationBits.getTrueBitIndexes().length - a.aggregationBits.getTrueBitIndexes().length)
123
144
  .map(fastToPayloadAttestation);
124
145
  }
125
146
 
@@ -1,15 +1,17 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ChainForkConfig} from "@lodestar/config";
3
- import {PayloadStatus, getSafeExecutionBlockHash} from "@lodestar/fork-choice";
3
+ import {getSafeExecutionBlockHash} from "@lodestar/fork-choice";
4
4
  import {ForkPostBellatrix, ForkSeq, SLOTS_PER_EPOCH, isForkPostBellatrix} from "@lodestar/params";
5
5
  import {
6
6
  IBeaconStateView,
7
+ IBeaconStateViewBellatrix,
7
8
  StateHashTreeRootSource,
8
9
  computeEpochAtSlot,
9
10
  computeTimeAtSlot,
10
11
  isStatePostBellatrix,
12
+ isStatePostGloas,
11
13
  } from "@lodestar/state-transition";
12
- import {Slot} from "@lodestar/types";
14
+ import {Bytes32, Slot} from "@lodestar/types";
13
15
  import {Logger, fromHex, isErrorAborted, sleep} from "@lodestar/utils";
14
16
  import {GENESIS_SLOT, ZERO_HASH_HEX} from "../constants/constants.js";
15
17
  import {BuilderStatus} from "../execution/builder/http.js";
@@ -81,6 +83,8 @@ export class PrepareNextSlotScheduler {
81
83
  // calling updateHead() here before we produce a block to reduce reorg possibility
82
84
  const headBlock = this.chain.recomputeForkChoiceHead(ForkchoiceCaller.prepareNextSlot);
83
85
  const {slot: headSlot, blockRoot: headRoot} = headBlock;
86
+ // may be updated below if we predict a proposer-boost-reorg
87
+ let updatedHead = headBlock;
84
88
 
85
89
  // PS: previously this was comparing slots, but that gave no leway on the skipped
86
90
  // slots on epoch bounday. Making it more fluid.
@@ -123,7 +127,6 @@ export class PrepareNextSlotScheduler {
123
127
  const proposerIndex = prepareState.getBeaconProposer(prepareSlot);
124
128
  const feeRecipient = this.chain.beaconProposerCache.get(proposerIndex);
125
129
  let updatedPrepareState = prepareState;
126
- let updatedHeadRoot = headRoot;
127
130
 
128
131
  if (feeRecipient) {
129
132
  // If we are proposing next slot, we need to predict if we can proposer-boost-reorg or not
@@ -146,7 +149,7 @@ export class PrepareNextSlotScheduler {
146
149
  {dontTransferCache: !isEpochTransition},
147
150
  RegenCaller.predictProposerHead
148
151
  );
149
- updatedHeadRoot = proposerHeadRoot;
152
+ updatedHead = proposerHead;
150
153
  }
151
154
 
152
155
  // Update the builder status, if enabled shoot an api call to check status
@@ -156,28 +159,54 @@ export class PrepareNextSlotScheduler {
156
159
  this.logger.error("Builder disabled as the check status api failed", {prepareSlot}, e as Error);
157
160
  });
158
161
  }
162
+ }
163
+
164
+ if (!isStatePostBellatrix(updatedPrepareState)) {
165
+ throw new Error("Expected Bellatrix state for payload attributes");
166
+ }
167
+
168
+ let parentBlockHash: Bytes32;
169
+ // Apply parent payload once here as it's reused by EL prep and SSE emit below
170
+ let stateAfterParentPayload: IBeaconStateViewBellatrix = updatedPrepareState;
171
+ if (isStatePostGloas(updatedPrepareState)) {
172
+ if (this.chain.forkChoice.shouldExtendPayload(updatedHead.blockRoot)) {
173
+ parentBlockHash = updatedPrepareState.latestExecutionPayloadBid.blockHash;
174
+ // Skip applying parent payload unless we're proposing the next slot or have to emit payload_attributes events
175
+ if (feeRecipient !== undefined || this.chain.opts.emitPayloadAttributes === true) {
176
+ const parentExecutionRequests = await this.chain.getParentExecutionRequests(
177
+ updatedHead.slot,
178
+ updatedHead.blockRoot
179
+ );
180
+ stateAfterParentPayload = updatedPrepareState.withParentPayloadApplied(parentExecutionRequests);
181
+ }
182
+ } else {
183
+ parentBlockHash = updatedPrepareState.latestExecutionPayloadBid.parentBlockHash;
184
+ }
185
+ } else {
186
+ parentBlockHash = updatedPrepareState.latestExecutionPayloadHeader.blockHash;
187
+ }
159
188
 
189
+ if (feeRecipient) {
160
190
  const preparationTime =
161
191
  computeTimeAtSlot(this.config, prepareSlot, this.chain.genesisTime) - Date.now() / 1000;
162
192
  this.metrics?.blockPayload.payloadAdvancePrepTime.observe(preparationTime);
163
- if (!isStatePostBellatrix(updatedPrepareState)) {
164
- throw new Error("Expected Bellatrix state for payload preparation");
165
- }
166
193
 
167
194
  const safeBlockHash = getSafeExecutionBlockHash(this.chain.forkChoice);
168
195
  const finalizedBlockHash =
169
196
  this.chain.forkChoice.getFinalizedBlock().executionPayloadBlockHash ?? ZERO_HASH_HEX;
197
+
170
198
  // awaiting here instead of throwing an async call because there is no other task
171
- // left for scheduler and this gives nice sematics to catch and log errors in the
199
+ // left for scheduler and this gives nice semantics to catch and log errors in the
172
200
  // try/catch wrapper here.
173
201
  await prepareExecutionPayload(
174
202
  this.chain,
175
203
  this.logger,
176
204
  fork as ForkPostBellatrix, // State is of execution type
177
- fromHex(updatedHeadRoot),
205
+ fromHex(updatedHead.blockRoot),
206
+ parentBlockHash,
178
207
  safeBlockHash,
179
208
  finalizedBlockHash,
180
- updatedPrepareState,
209
+ stateAfterParentPayload,
181
210
  feeRecipient
182
211
  );
183
212
  this.logger.verbose("PrepareNextSlotScheduler prepared new payload", {
@@ -187,24 +216,30 @@ export class PrepareNextSlotScheduler {
187
216
  });
188
217
  }
189
218
 
190
- if (!isStatePostBellatrix(updatedPrepareState)) {
191
- throw new Error("Expected Bellatrix state for payload attributes");
219
+ if (ForkSeq[fork] >= ForkSeq.gloas) {
220
+ // Cutoff = slot of the parent of the block we'll actually build on (post-reorg).
221
+ // Steady state: cache holds just 2 entries — head (parent for next-slot production)
222
+ // and head.parent (proposer-boost-reorg fallback). Anything older is evicted.
223
+ const updatedHeadParent = this.chain.forkChoice.getBlockHexDefaultStatus(updatedHead.parentRoot);
224
+ if (updatedHeadParent) {
225
+ this.chain.seenPayloadEnvelopeInputCache.pruneBelow(updatedHeadParent.slot);
226
+ }
192
227
  }
193
228
 
194
229
  this.computeStateHashTreeRoot(updatedPrepareState, isEpochTransition);
195
230
 
196
- // If emitPayloadAttributes is true emit a SSE payloadAttributes event
231
+ // If emitPayloadAttributes is true emit a SSE payloadAttributes event for
232
+ // every slot. Without the flag, only emit the event if we are proposing in the next slot.
197
233
  if (
198
- this.chain.opts.emitPayloadAttributes === true &&
234
+ (feeRecipient || this.chain.opts.emitPayloadAttributes === true) &&
199
235
  this.chain.emitter.listenerCount(routes.events.EventType.payloadAttributes)
200
236
  ) {
201
237
  const data = getPayloadAttributesForSSE(fork as ForkPostBellatrix, this.chain, {
202
- prepareState: updatedPrepareState,
238
+ prepareState: stateAfterParentPayload,
203
239
  prepareSlot,
204
- parentBlockRoot: fromHex(headRoot),
205
- // The likely consumers of this API are builders and will anyway ignore the
206
- // feeRecipient, so just pass zero hash for now till a real use case arises
207
- feeRecipient: "0x0000000000000000000000000000000000000000000000000000000000000000",
240
+ parentBlockRoot: fromHex(updatedHead.blockRoot),
241
+ parentBlockHash,
242
+ feeRecipient: feeRecipient ?? "0x0000000000000000000000000000000000000000",
208
243
  });
209
244
  this.chain.emitter.emit(routes.events.EventType.payloadAttributes, {data, version: fork});
210
245
  }
@@ -217,11 +252,7 @@ export class PrepareNextSlotScheduler {
217
252
  // + if next slot is a skipped slot, it'd help getting target checkpoint state faster to validate attestations
218
253
  if (isEpochTransition) {
219
254
  this.metrics?.precomputeNextEpochTransition.count.inc({result: "success"}, 1);
220
- // Determine payloadPresent from head block's payload status
221
- // Pre-Gloas: payloadStatus is always FULL → payloadPresent = true
222
- // Post-Gloas: FULL → true, EMPTY → false, PENDING → false (conservative, treat as block state)
223
- const payloadPresent = headBlock.payloadStatus === PayloadStatus.FULL;
224
- const previousHits = this.chain.regen.updatePreComputedCheckpoint(headRoot, nextEpoch, payloadPresent);
255
+ const previousHits = this.chain.regen.updatePreComputedCheckpoint(headRoot, nextEpoch);
225
256
  if (previousHits === 0) {
226
257
  this.metrics?.precomputeNextEpochTransition.waste.inc();
227
258
  }
@@ -1,12 +1,10 @@
1
1
  import {
2
2
  DataAvailabilityStatus,
3
3
  ExecutionPayloadStatus,
4
- G2_POINT_AT_INFINITY,
5
4
  IBeaconStateView,
6
- IBeaconStateViewGloas,
7
5
  StateHashTreeRootSource,
8
6
  } from "@lodestar/state-transition";
9
- import {BeaconBlock, BlindedBeaconBlock, Gwei, Root, gloas} from "@lodestar/types";
7
+ import {BeaconBlock, BlindedBeaconBlock, Gwei, Root} from "@lodestar/types";
10
8
  import {ZERO_HASH} from "../../constants/index.js";
11
9
  import {Metrics} from "../../metrics/index.js";
12
10
 
@@ -19,11 +17,11 @@ export function computeNewStateRoot(
19
17
  metrics: Metrics | null,
20
18
  state: IBeaconStateView,
21
19
  block: BeaconBlock | BlindedBeaconBlock
22
- ): {newStateRoot: Root; proposerReward: Gwei; postBlockState: IBeaconStateView} {
20
+ ): {newStateRoot: Root; proposerReward: Gwei; postState: IBeaconStateView} {
23
21
  // Set signature to zero to re-use stateTransition() function which requires the SignedBeaconBlock type
24
22
  const blockEmptySig = {message: block, signature: ZERO_HASH};
25
23
 
26
- const postBlockState = state.stateTransition(
24
+ const postState = state.stateTransition(
27
25
  blockEmptySig,
28
26
  {
29
27
  // ExecutionPayloadStatus.valid: Assume payload valid, it has been produced by a trusted EL
@@ -42,49 +40,14 @@ export function computeNewStateRoot(
42
40
  {metrics}
43
41
  );
44
42
 
45
- const {attestations, syncAggregate, slashing} = postBlockState.proposerRewards;
43
+ const {attestations, syncAggregate, slashing} = postState.proposerRewards;
46
44
  const proposerReward = BigInt(attestations + syncAggregate + slashing);
47
45
 
48
46
  const hashTreeRootTimer = metrics?.stateHashTreeRootTime.startTimer({
49
47
  source: StateHashTreeRootSource.computeNewStateRoot,
50
48
  });
51
- const newStateRoot = postBlockState.hashTreeRoot();
49
+ const newStateRoot = postState.hashTreeRoot();
52
50
  hashTreeRootTimer?.();
53
51
 
54
- return {newStateRoot, proposerReward, postBlockState};
55
- }
56
-
57
- /**
58
- * Compute the state root after processing an execution payload envelope.
59
- * Similar to `computeNewStateRoot` but for payload envelope processing.
60
- *
61
- */
62
- export function computePayloadEnvelopeStateRoot(
63
- metrics: Metrics | null,
64
- postBlockState: IBeaconStateViewGloas,
65
- envelope: gloas.ExecutionPayloadEnvelope
66
- ): Root {
67
- const signedEnvelope: gloas.SignedExecutionPayloadEnvelope = {
68
- message: envelope,
69
- signature: G2_POINT_AT_INFINITY,
70
- };
71
-
72
- const processEnvelopeTimer = metrics?.blockPayload.executionPayloadEnvelopeProcessingTime.startTimer();
73
- const postPayloadState = postBlockState.processExecutionPayloadEnvelope(signedEnvelope, {
74
- // Signature is zero-ed (G2_POINT_AT_INFINITY), skip verification
75
- verifySignature: false,
76
- // State root is being computed here, the envelope doesn't have it yet
77
- verifyStateRoot: false,
78
- // Preserve cache in source state, since the resulting state is not added to the state cache
79
- dontTransferCache: true,
80
- });
81
- processEnvelopeTimer?.();
82
-
83
- const hashTreeRootTimer = metrics?.stateHashTreeRootTime.startTimer({
84
- source: StateHashTreeRootSource.computePayloadEnvelopeStateRoot,
85
- });
86
- const stateRoot = postPayloadState.hashTreeRoot();
87
- hashTreeRootTimer?.();
88
-
89
- return stateRoot;
52
+ return {newStateRoot, proposerReward, postState};
90
53
  }