@lodestar/beacon-node 1.43.0-dev.5f9285892c → 1.43.0-dev.66d2c102e3

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 (332) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +4 -6
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  4. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  6. package/lib/api/impl/lodestar/index.js +1 -1
  7. package/lib/api/impl/lodestar/index.js.map +1 -1
  8. package/lib/api/impl/validator/index.d.ts.map +1 -1
  9. package/lib/api/impl/validator/index.js +1 -4
  10. package/lib/api/impl/validator/index.js.map +1 -1
  11. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  12. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  13. package/lib/chain/GetBlobsTracker.js +1 -2
  14. package/lib/chain/GetBlobsTracker.js.map +1 -1
  15. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  16. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  17. package/lib/chain/archiveStore/interface.d.ts +4 -4
  18. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  19. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  20. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  21. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
  22. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  23. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  24. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  25. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  26. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  27. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  28. package/lib/chain/blocks/importBlock.js +28 -33
  29. package/lib/chain/blocks/importBlock.js.map +1 -1
  30. package/lib/chain/blocks/importExecutionPayload.d.ts +25 -13
  31. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  32. package/lib/chain/blocks/importExecutionPayload.js +73 -84
  33. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  34. package/lib/chain/blocks/index.d.ts +5 -3
  35. package/lib/chain/blocks/index.d.ts.map +1 -1
  36. package/lib/chain/blocks/index.js +29 -11
  37. package/lib/chain/blocks/index.js.map +1 -1
  38. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +3 -0
  39. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  40. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +20 -0
  41. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  42. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  43. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  44. package/lib/chain/blocks/payloadEnvelopeProcessor.js +7 -5
  45. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  46. package/lib/chain/blocks/types.d.ts +15 -21
  47. package/lib/chain/blocks/types.d.ts.map +1 -1
  48. package/lib/chain/blocks/utils/chainSegment.d.ts +23 -2
  49. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  50. package/lib/chain/blocks/utils/chainSegment.js +81 -12
  51. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  52. package/lib/chain/blocks/verifyBlock.d.ts +3 -2
  53. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  54. package/lib/chain/blocks/verifyBlock.js +30 -5
  55. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  56. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  57. package/lib/chain/blocks/verifyBlocksSanityChecks.js +15 -4
  58. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  59. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  60. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  61. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +76 -0
  62. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  63. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  64. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  65. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +25 -0
  66. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  67. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  68. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  69. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  70. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  71. package/lib/chain/chain.d.ts +8 -6
  72. package/lib/chain/chain.d.ts.map +1 -1
  73. package/lib/chain/chain.js +33 -36
  74. package/lib/chain/chain.js.map +1 -1
  75. package/lib/chain/emitter.d.ts +16 -4
  76. package/lib/chain/emitter.d.ts.map +1 -1
  77. package/lib/chain/emitter.js +5 -0
  78. package/lib/chain/emitter.js.map +1 -1
  79. package/lib/chain/errors/blockError.d.ts +8 -1
  80. package/lib/chain/errors/blockError.d.ts.map +1 -1
  81. package/lib/chain/errors/blockError.js +2 -0
  82. package/lib/chain/errors/blockError.js.map +1 -1
  83. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  84. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  85. package/lib/chain/errors/executionPayloadBid.js +1 -0
  86. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  87. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  88. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  89. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  90. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  91. package/lib/chain/errors/index.d.ts +1 -0
  92. package/lib/chain/errors/index.d.ts.map +1 -1
  93. package/lib/chain/errors/index.js +1 -0
  94. package/lib/chain/errors/index.js.map +1 -1
  95. package/lib/chain/errors/proposerPreferences.d.ts +33 -0
  96. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  97. package/lib/chain/errors/proposerPreferences.js +13 -0
  98. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  99. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  100. package/lib/chain/forkChoice/index.js +11 -19
  101. package/lib/chain/forkChoice/index.js.map +1 -1
  102. package/lib/chain/interface.d.ts +7 -5
  103. package/lib/chain/interface.d.ts.map +1 -1
  104. package/lib/chain/interface.js.map +1 -1
  105. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  106. package/lib/chain/prepareNextSlot.js +48 -22
  107. package/lib/chain/prepareNextSlot.js.map +1 -1
  108. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
  109. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  110. package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
  111. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  112. package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -8
  113. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  114. package/lib/chain/produceBlock/produceBlockBody.js +55 -24
  115. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  116. package/lib/chain/regen/errors.d.ts +1 -11
  117. package/lib/chain/regen/errors.d.ts.map +1 -1
  118. package/lib/chain/regen/errors.js +0 -2
  119. package/lib/chain/regen/errors.js.map +1 -1
  120. package/lib/chain/regen/interface.d.ts +7 -11
  121. package/lib/chain/regen/interface.d.ts.map +1 -1
  122. package/lib/chain/regen/interface.js +1 -0
  123. package/lib/chain/regen/interface.js.map +1 -1
  124. package/lib/chain/regen/queued.d.ts +6 -10
  125. package/lib/chain/regen/queued.d.ts.map +1 -1
  126. package/lib/chain/regen/queued.js +3 -10
  127. package/lib/chain/regen/queued.js.map +1 -1
  128. package/lib/chain/regen/regen.d.ts +0 -5
  129. package/lib/chain/regen/regen.d.ts.map +1 -1
  130. package/lib/chain/regen/regen.js +0 -8
  131. package/lib/chain/regen/regen.js.map +1 -1
  132. package/lib/chain/seenCache/index.d.ts +1 -0
  133. package/lib/chain/seenCache/index.d.ts.map +1 -1
  134. package/lib/chain/seenCache/index.js +1 -0
  135. package/lib/chain/seenCache/index.js.map +1 -1
  136. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +11 -4
  137. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  138. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +20 -18
  139. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  140. package/lib/chain/seenCache/seenProposerPreferences.d.ts +15 -0
  141. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  142. package/lib/chain/seenCache/seenProposerPreferences.js +25 -0
  143. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  144. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +1 -7
  145. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  146. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -9
  147. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  148. package/lib/chain/stateCache/types.d.ts +0 -6
  149. package/lib/chain/stateCache/types.d.ts.map +1 -1
  150. package/lib/chain/stateCache/types.js.map +1 -1
  151. package/lib/chain/validation/block.d.ts.map +1 -1
  152. package/lib/chain/validation/block.js +1 -0
  153. package/lib/chain/validation/block.js.map +1 -1
  154. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  155. package/lib/chain/validation/executionPayloadBid.js +13 -1
  156. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  157. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  158. package/lib/chain/validation/executionPayloadEnvelope.js +20 -10
  159. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  160. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  161. package/lib/chain/validation/payloadAttestationMessage.js +4 -3
  162. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  163. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  164. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  165. package/lib/chain/validation/proposerPreferences.js +69 -0
  166. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  167. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  168. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  169. package/lib/execution/engine/http.d.ts.map +1 -1
  170. package/lib/execution/engine/http.js +21 -14
  171. package/lib/execution/engine/http.js.map +1 -1
  172. package/lib/execution/engine/interface.d.ts +1 -0
  173. package/lib/execution/engine/interface.d.ts.map +1 -1
  174. package/lib/execution/engine/mock.d.ts.map +1 -1
  175. package/lib/execution/engine/mock.js +6 -0
  176. package/lib/execution/engine/mock.js.map +1 -1
  177. package/lib/execution/engine/types.d.ts +20 -0
  178. package/lib/execution/engine/types.d.ts.map +1 -1
  179. package/lib/execution/engine/types.js +18 -0
  180. package/lib/execution/engine/types.js.map +1 -1
  181. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  182. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  183. package/lib/metrics/metrics/lodestar.js +4 -0
  184. package/lib/metrics/metrics/lodestar.js.map +1 -1
  185. package/lib/network/gossip/interface.d.ts +7 -1
  186. package/lib/network/gossip/interface.d.ts.map +1 -1
  187. package/lib/network/gossip/interface.js +1 -0
  188. package/lib/network/gossip/interface.js.map +1 -1
  189. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  190. package/lib/network/gossip/scoringParameters.js +12 -1
  191. package/lib/network/gossip/scoringParameters.js.map +1 -1
  192. package/lib/network/gossip/topic.d.ts +11 -2
  193. package/lib/network/gossip/topic.d.ts.map +1 -1
  194. package/lib/network/gossip/topic.js +6 -0
  195. package/lib/network/gossip/topic.js.map +1 -1
  196. package/lib/network/network.js +1 -1
  197. package/lib/network/network.js.map +1 -1
  198. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  199. package/lib/network/processor/gossipHandlers.js +32 -12
  200. package/lib/network/processor/gossipHandlers.js.map +1 -1
  201. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  202. package/lib/network/processor/gossipQueues/index.js +5 -0
  203. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  204. package/lib/network/processor/index.d.ts.map +1 -1
  205. package/lib/network/processor/index.js +1 -0
  206. package/lib/network/processor/index.js.map +1 -1
  207. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  208. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  209. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  210. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  211. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  212. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  213. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  214. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  215. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  216. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  217. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  218. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  219. package/lib/node/nodejs.d.ts.map +1 -1
  220. package/lib/node/nodejs.js +4 -2
  221. package/lib/node/nodejs.js.map +1 -1
  222. package/lib/node/notifier.js +7 -1
  223. package/lib/node/notifier.js.map +1 -1
  224. package/lib/sync/range/batch.d.ts +12 -2
  225. package/lib/sync/range/batch.d.ts.map +1 -1
  226. package/lib/sync/range/batch.js +56 -30
  227. package/lib/sync/range/batch.js.map +1 -1
  228. package/lib/sync/range/chain.d.ts +6 -2
  229. package/lib/sync/range/chain.d.ts.map +1 -1
  230. package/lib/sync/range/chain.js +4 -3
  231. package/lib/sync/range/chain.js.map +1 -1
  232. package/lib/sync/range/range.d.ts.map +1 -1
  233. package/lib/sync/range/range.js +17 -6
  234. package/lib/sync/range/range.js.map +1 -1
  235. package/lib/sync/types.d.ts +34 -0
  236. package/lib/sync/types.d.ts.map +1 -1
  237. package/lib/sync/types.js +34 -0
  238. package/lib/sync/types.js.map +1 -1
  239. package/lib/sync/unknownBlock.d.ts +24 -1
  240. package/lib/sync/unknownBlock.d.ts.map +1 -1
  241. package/lib/sync/unknownBlock.js +649 -53
  242. package/lib/sync/unknownBlock.js.map +1 -1
  243. package/lib/sync/utils/downloadByRange.d.ts +46 -10
  244. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  245. package/lib/sync/utils/downloadByRange.js +147 -24
  246. package/lib/sync/utils/downloadByRange.js.map +1 -1
  247. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  248. package/lib/sync/utils/downloadByRoot.js +6 -2
  249. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  250. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  251. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  252. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  253. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  254. package/lib/util/sszBytes.d.ts.map +1 -1
  255. package/lib/util/sszBytes.js +16 -3
  256. package/lib/util/sszBytes.js.map +1 -1
  257. package/package.json +17 -16
  258. package/src/api/impl/beacon/blocks/index.ts +6 -6
  259. package/src/api/impl/beacon/state/utils.ts +2 -2
  260. package/src/api/impl/lodestar/index.ts +1 -1
  261. package/src/api/impl/validator/index.ts +3 -6
  262. package/src/chain/GetBlobsTracker.ts +1 -2
  263. package/src/chain/archiveStore/archiveStore.ts +5 -5
  264. package/src/chain/archiveStore/interface.ts +4 -4
  265. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
  266. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  267. package/src/chain/blocks/importBlock.ts +27 -38
  268. package/src/chain/blocks/importExecutionPayload.ts +93 -104
  269. package/src/chain/blocks/index.ts +45 -14
  270. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +27 -0
  271. package/src/chain/blocks/payloadEnvelopeProcessor.ts +7 -6
  272. package/src/chain/blocks/types.ts +15 -26
  273. package/src/chain/blocks/utils/chainSegment.ts +106 -17
  274. package/src/chain/blocks/verifyBlock.ts +35 -6
  275. package/src/chain/blocks/verifyBlocksSanityChecks.ts +16 -7
  276. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +129 -0
  277. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +38 -0
  278. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  279. package/src/chain/chain.ts +49 -51
  280. package/src/chain/emitter.ts +15 -3
  281. package/src/chain/errors/blockError.ts +4 -1
  282. package/src/chain/errors/executionPayloadBid.ts +6 -0
  283. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  284. package/src/chain/errors/index.ts +1 -0
  285. package/src/chain/errors/proposerPreferences.ts +39 -0
  286. package/src/chain/forkChoice/index.ts +8 -24
  287. package/src/chain/interface.ts +11 -3
  288. package/src/chain/prepareNextSlot.ts +62 -23
  289. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
  290. package/src/chain/produceBlock/produceBlockBody.ts +73 -27
  291. package/src/chain/regen/errors.ts +1 -6
  292. package/src/chain/regen/interface.ts +7 -11
  293. package/src/chain/regen/queued.ts +6 -14
  294. package/src/chain/regen/regen.ts +0 -8
  295. package/src/chain/seenCache/index.ts +1 -0
  296. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +22 -20
  297. package/src/chain/seenCache/seenProposerPreferences.ts +29 -0
  298. package/src/chain/stateCache/persistentCheckpointsCache.ts +5 -15
  299. package/src/chain/stateCache/types.ts +0 -3
  300. package/src/chain/validation/block.ts +1 -0
  301. package/src/chain/validation/executionPayloadBid.ts +14 -0
  302. package/src/chain/validation/executionPayloadEnvelope.ts +21 -11
  303. package/src/chain/validation/payloadAttestationMessage.ts +5 -3
  304. package/src/chain/validation/proposerPreferences.ts +91 -0
  305. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  306. package/src/execution/engine/http.ts +21 -14
  307. package/src/execution/engine/interface.ts +1 -0
  308. package/src/execution/engine/mock.ts +8 -1
  309. package/src/execution/engine/types.ts +41 -0
  310. package/src/metrics/metrics/lodestar.ts +4 -0
  311. package/src/network/gossip/interface.ts +6 -0
  312. package/src/network/gossip/scoringParameters.ts +14 -1
  313. package/src/network/gossip/topic.ts +6 -0
  314. package/src/network/network.ts +1 -1
  315. package/src/network/processor/gossipHandlers.ts +41 -16
  316. package/src/network/processor/gossipQueues/index.ts +5 -0
  317. package/src/network/processor/index.ts +1 -0
  318. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  319. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  320. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  321. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  322. package/src/node/nodejs.ts +4 -2
  323. package/src/node/notifier.ts +8 -1
  324. package/src/sync/range/batch.ts +90 -35
  325. package/src/sync/range/chain.ts +13 -5
  326. package/src/sync/range/range.ts +18 -6
  327. package/src/sync/types.ts +72 -0
  328. package/src/sync/unknownBlock.ts +810 -57
  329. package/src/sync/utils/downloadByRange.ts +256 -39
  330. package/src/sync/utils/downloadByRoot.ts +12 -2
  331. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  332. package/src/util/sszBytes.ts +21 -3
@@ -2,10 +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 {CheckpointWithPayloadStatus, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
5
+ import {CheckpointWithHex, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
6
6
  import {LoggerNode} from "@lodestar/logger/node";
7
7
  import {
8
- BUILDER_INDEX_SELF_BUILD,
9
8
  EFFECTIVE_BALANCE_INCREMENT,
10
9
  type ForkPostFulu,
11
10
  type ForkPostGloas,
@@ -24,7 +23,6 @@ import {
24
23
  getEffectiveBalancesFromStateBytes,
25
24
  isStatePostAltair,
26
25
  isStatePostElectra,
27
- isStatePostGloas,
28
26
  } from "@lodestar/state-transition";
29
27
  import {
30
28
  BeaconBlock,
@@ -41,6 +39,7 @@ import {
41
39
  ValidatorIndex,
42
40
  Wei,
43
41
  deneb,
42
+ electra,
44
43
  gloas,
45
44
  isBlindedBeaconBlock,
46
45
  phase0,
@@ -93,8 +92,8 @@ import {
93
92
  } from "./opPools/index.js";
94
93
  import {IChainOptions} from "./options.js";
95
94
  import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
96
- import {computeNewStateRoot, computePayloadEnvelopeStateRoot} from "./produceBlock/computeNewStateRoot.js";
97
- import {AssembledBlockType, BlockType, ProduceFullGloas, ProduceResult} from "./produceBlock/index.js";
95
+ import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
96
+ import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
98
97
  import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
99
98
  import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
100
99
  import {ReprocessController} from "./reprocess.js";
@@ -107,6 +106,7 @@ import {
107
106
  SeenExecutionPayloadBids,
108
107
  SeenPayloadAttesters,
109
108
  SeenPayloadEnvelopeInput,
109
+ SeenProposerPreferences,
110
110
  SeenSyncCommitteeMessages,
111
111
  } from "./seenCache/index.js";
112
112
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -118,7 +118,7 @@ import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datasto
118
118
  import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
119
119
  import {CPStateDatastore} from "./stateCache/datastore/types.js";
120
120
  import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
121
- import {PersistentCheckpointStateCache, fcCheckpointToHexPayload} from "./stateCache/persistentCheckpointsCache.js";
121
+ import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
122
122
  import {CheckpointStateCache} from "./stateCache/types.js";
123
123
  import {ValidatorMonitor} from "./validatorMonitor.js";
124
124
 
@@ -187,6 +187,7 @@ export class BeaconChain implements IBeaconChain {
187
187
  readonly seenPayloadAttesters = new SeenPayloadAttesters();
188
188
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
189
189
  readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
190
+ readonly seenProposerPreferences = new SeenProposerPreferences();
190
191
  readonly seenBlockProposers = new SeenBlockProposers();
191
192
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
192
193
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -682,11 +683,11 @@ export class BeaconChain implements IBeaconChain {
682
683
  }
683
684
 
684
685
  getStateByCheckpoint(
685
- checkpoint: CheckpointWithPayloadStatus
686
+ checkpoint: CheckpointWithHex
686
687
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null {
687
688
  // finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
688
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
689
- const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHexPayload);
689
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
690
+ const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHex);
690
691
  if (cachedStateCtx) {
691
692
  const block = this.forkChoice.getBlockDefaultStatus(
692
693
  ssz.phase0.BeaconBlockHeader.hashTreeRoot(cachedStateCtx.latestBlockHeader)
@@ -703,10 +704,10 @@ export class BeaconChain implements IBeaconChain {
703
704
  }
704
705
 
705
706
  async getStateOrBytesByCheckpoint(
706
- checkpoint: CheckpointWithPayloadStatus
707
+ checkpoint: CheckpointWithHex
707
708
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
708
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
709
- const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHexPayload);
709
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
710
+ const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHex);
710
711
  if (cachedStateCtx) {
711
712
  const block = this.forkChoice.getBlockDefaultStatus(checkpoint.root);
712
713
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
@@ -888,6 +889,21 @@ export class BeaconChain implements IBeaconChain {
888
889
  );
889
890
  }
890
891
 
892
+ async getParentExecutionRequests(
893
+ parentBlockSlot: Slot,
894
+ parentBlockRootHex: RootHex
895
+ ): Promise<electra.ExecutionRequests> {
896
+ // at the fork boundary, parent is pre-gloas
897
+ if (!isForkPostGloas(this.config.getForkName(parentBlockSlot))) {
898
+ return ssz.electra.ExecutionRequests.defaultValue();
899
+ }
900
+ const envelope = await this.getExecutionPayloadEnvelope(parentBlockSlot, parentBlockRootHex);
901
+ if (envelope === null) {
902
+ throw Error(`Parent execution payload envelope not found slot=${parentBlockSlot}, root=${parentBlockRootHex}`);
903
+ }
904
+ return envelope.message.executionRequests;
905
+ }
906
+
891
907
  async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]> {
892
908
  const fork = this.config.getForkName(blockSlot);
893
909
 
@@ -1062,7 +1078,7 @@ export class BeaconChain implements IBeaconChain {
1062
1078
  body,
1063
1079
  } as AssembledBlockType<T>;
1064
1080
 
1065
- const {newStateRoot, proposerReward, postBlockState} = computeNewStateRoot(this.metrics, state, block);
1081
+ const {newStateRoot, proposerReward} = computeNewStateRoot(this.metrics, state, block);
1066
1082
  block.stateRoot = newStateRoot;
1067
1083
  const blockRoot =
1068
1084
  produceResult.type === BlockType.Full
@@ -1071,26 +1087,9 @@ export class BeaconChain implements IBeaconChain {
1071
1087
  const blockRootHex = toRootHex(blockRoot);
1072
1088
 
1073
1089
  const fork = this.config.getForkName(slot);
1074
- if (isForkPostGloas(fork)) {
1075
- // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1076
- if (produceResult.type !== BlockType.Full) {
1077
- throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1078
- }
1079
-
1080
- const gloasResult = produceResult as ProduceFullGloas;
1081
- const envelope: gloas.ExecutionPayloadEnvelope = {
1082
- payload: gloasResult.executionPayload,
1083
- executionRequests: gloasResult.executionRequests,
1084
- builderIndex: BUILDER_INDEX_SELF_BUILD,
1085
- beaconBlockRoot: blockRoot,
1086
- slot,
1087
- stateRoot: ZERO_HASH,
1088
- };
1089
- if (!isStatePostGloas(postBlockState)) {
1090
- throw Error(`Expected gloas+ post-state for execution payload envelope, got fork=${postBlockState.forkName}`);
1091
- }
1092
- const payloadEnvelopeStateRoot = computePayloadEnvelopeStateRoot(this.metrics, postBlockState, envelope);
1093
- gloasResult.payloadEnvelopeStateRoot = payloadEnvelopeStateRoot;
1090
+ // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1091
+ if (isForkPostGloas(fork) && produceResult.type !== BlockType.Full) {
1092
+ throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1094
1093
  }
1095
1094
 
1096
1095
  // Track the produced block for consensus broadcast validations, later validation, etc.
@@ -1101,11 +1100,15 @@ export class BeaconChain implements IBeaconChain {
1101
1100
  }
1102
1101
 
1103
1102
  async processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void> {
1104
- return this.blockProcessor.processBlocksJob([block], opts);
1103
+ return this.blockProcessor.processBlocksJob([block], null, opts);
1105
1104
  }
1106
1105
 
1107
- async processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void> {
1108
- return this.blockProcessor.processBlocksJob(blocks, opts);
1106
+ async processChainSegment(
1107
+ blocks: IBlockInput[],
1108
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
1109
+ opts?: ImportBlockOpts
1110
+ ): Promise<void> {
1111
+ await this.blockProcessor.processBlocksJob(blocks, payloadEnvelopes, opts);
1109
1112
  }
1110
1113
 
1111
1114
  async processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void> {
@@ -1296,7 +1299,7 @@ export class BeaconChain implements IBeaconChain {
1296
1299
  * @param blockState state that declares justified checkpoint `checkpoint`
1297
1300
  */
1298
1301
  private justifiedBalancesGetter(
1299
- checkpoint: CheckpointWithPayloadStatus,
1302
+ checkpoint: CheckpointWithHex,
1300
1303
  blockState: IBeaconStateView
1301
1304
  ): EffectiveBalanceIncrements {
1302
1305
  this.metrics?.balancesCache.requests.inc();
@@ -1335,11 +1338,11 @@ export class BeaconChain implements IBeaconChain {
1335
1338
  * @param blockState state that declares justified checkpoint `checkpoint`
1336
1339
  */
1337
1340
  private closestJustifiedBalancesStateToCheckpoint(
1338
- checkpoint: CheckpointWithPayloadStatus,
1341
+ checkpoint: CheckpointWithHex,
1339
1342
  blockState: IBeaconStateView
1340
1343
  ): {state: IBeaconStateView; stateId: string; shouldWarn: boolean} {
1341
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
1342
- const state = this.regen.getCheckpointStateSync(checkpointHexPayload);
1344
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
1345
+ const state = this.regen.getCheckpointStateSync(checkpointHex);
1343
1346
  if (state) {
1344
1347
  return {state, stateId: "checkpoint_state", shouldWarn: false};
1345
1348
  }
@@ -1350,10 +1353,7 @@ export class BeaconChain implements IBeaconChain {
1350
1353
  }
1351
1354
 
1352
1355
  // Find a state in the same branch of checkpoint at same epoch. Balances should exactly the same
1353
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1354
- checkpoint.rootHex,
1355
- checkpoint.payloadStatus
1356
- )) {
1356
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1357
1357
  if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
1358
1358
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1359
1359
  if (descendantBlockState) {
@@ -1369,10 +1369,7 @@ export class BeaconChain implements IBeaconChain {
1369
1369
 
1370
1370
  // Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
1371
1371
  // Note: must call .forwardIterateDescendants() again since nodes are not sorted
1372
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1373
- checkpoint.rootHex,
1374
- checkpoint.payloadStatus
1375
- )) {
1372
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1376
1373
  if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
1377
1374
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1378
1375
  if (descendantBlockState) {
@@ -1442,6 +1439,7 @@ export class BeaconChain implements IBeaconChain {
1442
1439
  this.payloadAttestationPool.prune(slot);
1443
1440
  this.executionPayloadBidPool.prune(slot);
1444
1441
  this.seenExecutionPayloadBids.prune(slot);
1442
+ this.seenProposerPreferences.prune(slot);
1445
1443
  this.seenAttestationDatas.onSlot(slot);
1446
1444
  this.reprocessController.onSlot(slot);
1447
1445
 
@@ -1476,7 +1474,7 @@ export class BeaconChain implements IBeaconChain {
1476
1474
  this.seenContributionAndProof.prune(head.slot);
1477
1475
  }
1478
1476
 
1479
- private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithPayloadStatus): void {
1477
+ private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
1480
1478
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1481
1479
  }
1482
1480
 
@@ -1487,7 +1485,7 @@ export class BeaconChain implements IBeaconChain {
1487
1485
  });
1488
1486
  }
1489
1487
 
1490
- private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithPayloadStatus): Promise<void> {
1488
+ private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1491
1489
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1492
1490
  const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1493
1491
  this.seenBlockProposers.prune(finalizedSlot);
@@ -1528,7 +1526,7 @@ export class BeaconChain implements IBeaconChain {
1528
1526
  }
1529
1527
  }
1530
1528
 
1531
- private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithPayloadStatus): Promise<void> {
1529
+ private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
1532
1530
  if (this.custodyConfig.targetCustodyGroupCount === this.config.NUMBER_OF_CUSTODY_GROUPS) {
1533
1531
  // Custody requirements can only be increased, we can disable dynamic custody updates
1534
1532
  // if the node already maintains custody of all custody groups in case it is configured
@@ -1,12 +1,13 @@
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
7
  import {SignedExecutionPayloadEnvelope} from "@lodestar/types/gloas";
8
8
  import {PeerIdStr} from "../util/peerId.js";
9
9
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
10
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
10
11
 
11
12
  /**
12
13
  * Important chain events that occur during normal chain operation.
@@ -76,6 +77,11 @@ export enum ChainEvent {
76
77
  * cut-off window passes for waiting on gossip
77
78
  */
78
79
  incompleteBlockInput = "incompleteBlockInput",
80
+ /**
81
+ * Post-gloas: trigger BlockInputSync for payload envelopes whose envelope and/or sampled columns are partially
82
+ * received via gossip but are not complete by time the cut-off window passes for waiting on gossip
83
+ */
84
+ incompletePayloadEnvelope = "incompletePayloadEnvelope",
79
85
  }
80
86
 
81
87
  export type HeadEventData = routes.events.EventData[routes.events.EventType.head];
@@ -93,14 +99,19 @@ export type ChainEventData = {
93
99
  };
94
100
  [ChainEvent.unknownBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
95
101
  [ChainEvent.incompleteBlockInput]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
102
+ [ChainEvent.incompletePayloadEnvelope]: {
103
+ payloadInput: PayloadEnvelopeInput;
104
+ peer: PeerIdStr;
105
+ source: BlockInputSource;
106
+ };
96
107
  [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
97
108
  };
98
109
 
99
110
  export type IChainEvents = ApiEvents & {
100
111
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: IBeaconStateView) => void;
101
112
 
102
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayloadStatus) => void;
113
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
114
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
104
115
 
105
116
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
106
117
 
@@ -116,6 +127,7 @@ export type IChainEvents = ApiEvents & {
116
127
  [ChainEvent.envelopeUnknownBlock]: (data: ChainEventData[ChainEvent.envelopeUnknownBlock]) => void;
117
128
  [ChainEvent.unknownBlockRoot]: (data: ChainEventData[ChainEvent.unknownBlockRoot]) => void;
118
129
  [ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
130
+ [ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
119
131
  [ChainEvent.unknownEnvelopeBlockRoot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRoot]) => void;
120
132
  };
121
133
 
@@ -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,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,16 +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 = isForkPostGloas
109
- ? PayloadStatus.PENDING
110
- : getCheckpointPayloadStatus(config, state, justifiedCheckpoint.epoch);
111
-
112
- // Determine finalized checkpoint payload status
113
- const finalizedPayloadStatus = isForkPostGloas
114
- ? PayloadStatus.PENDING
115
- : getCheckpointPayloadStatus(config, state, finalizedCheckpoint.epoch);
116
-
117
106
  return new forkchoiceConstructor(
118
107
  config,
119
108
 
@@ -123,8 +112,6 @@ export function initializeForkChoiceFromFinalizedState(
123
112
  finalizedCheckpoint,
124
113
  justifiedBalances,
125
114
  justifiedBalancesGetter,
126
- justifiedPayloadStatus,
127
- finalizedPayloadStatus,
128
115
  {
129
116
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
130
117
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -150,7 +137,9 @@ export function initializeForkChoiceFromFinalizedState(
150
137
 
151
138
  ...(isStatePostBellatrix(state) && state.isExecutionStateType && state.isMergeTransitionComplete
152
139
  ? {
153
- executionPayloadBlockHash: toRootHex(state.latestBlockHash),
140
+ executionPayloadBlockHash: isStatePostGloas(state)
141
+ ? toRootHex(state.latestBlockHash)
142
+ : toRootHex(state.latestExecutionPayloadHeader.blockHash),
154
143
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
155
144
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
156
145
  executionPayloadNumber: isStatePostGloas(state) ? 0 : state.payloadBlockNumber,
@@ -159,7 +148,7 @@ export function initializeForkChoiceFromFinalizedState(
159
148
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
160
149
 
161
150
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
162
- 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,
163
152
  parentBlockHash: isStatePostGloas(state) ? toRootHex(state.latestBlockHash) : null,
164
153
  },
165
154
  currentSlot
@@ -206,19 +195,12 @@ export function initializeForkChoiceFromUnfinalizedState(
206
195
 
207
196
  const isForkPostGloas = computeEpochAtSlot(unfinalizedState.slot) >= config.GLOAS_FORK_EPOCH;
208
197
 
209
- // For unfinalized state, use getCheckpointPayloadStatus to determine the correct status.
210
- // It checks state.execution_payload_availability to determine EMPTY vs FULL.
211
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, justifiedCheckpoint.epoch);
212
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, finalizedCheckpoint.epoch);
213
-
214
198
  const store = new ForkChoiceStore(
215
199
  currentSlot,
216
200
  justifiedCheckpoint,
217
201
  finalizedCheckpoint,
218
202
  justifiedBalances,
219
203
  justifiedBalancesGetter,
220
- justifiedPayloadStatus,
221
- finalizedPayloadStatus,
222
204
  {
223
205
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
224
206
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -247,7 +229,9 @@ export function initializeForkChoiceFromUnfinalizedState(
247
229
  unfinalizedState.isExecutionStateType &&
248
230
  unfinalizedState.isMergeTransitionComplete
249
231
  ? {
250
- executionPayloadBlockHash: toRootHex(unfinalizedState.latestBlockHash),
232
+ executionPayloadBlockHash: isStatePostGloas(unfinalizedState)
233
+ ? toRootHex(unfinalizedState.latestBlockHash)
234
+ : toRootHex(unfinalizedState.latestExecutionPayloadHeader.blockHash),
251
235
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
252
236
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
253
237
  executionPayloadNumber: isStatePostGloas(unfinalizedState) ? 0 : unfinalizedState.payloadBlockNumber,
@@ -256,7 +240,7 @@ export function initializeForkChoiceFromUnfinalizedState(
256
240
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
257
241
 
258
242
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
259
- 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,
260
244
  parentBlockHash: isStatePostGloas(unfinalizedState) ? toRootHex(unfinalizedState.latestBlockHash) : null,
261
245
  };
262
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>;