@lodestar/beacon-node 1.43.0-dev.5f9285892c → 1.43.0-dev.657dd16e61

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 (371) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +17 -9
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +45 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  10. package/lib/api/impl/debug/index.d.ts.map +1 -1
  11. package/lib/api/impl/debug/index.js +0 -1
  12. package/lib/api/impl/debug/index.js.map +1 -1
  13. package/lib/api/impl/lodestar/index.js +1 -1
  14. package/lib/api/impl/lodestar/index.js.map +1 -1
  15. package/lib/api/impl/validator/index.d.ts.map +1 -1
  16. package/lib/api/impl/validator/index.js +68 -5
  17. package/lib/api/impl/validator/index.js.map +1 -1
  18. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  19. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  20. package/lib/chain/GetBlobsTracker.js +1 -2
  21. package/lib/chain/GetBlobsTracker.js.map +1 -1
  22. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  23. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  24. package/lib/chain/archiveStore/interface.d.ts +4 -4
  25. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  26. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  27. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  28. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
  29. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  30. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  31. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  32. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  33. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  34. package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  36. package/lib/chain/blocks/blockInput/blockInput.js +4 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  38. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  39. package/lib/chain/blocks/importBlock.js +34 -54
  40. package/lib/chain/blocks/importBlock.js.map +1 -1
  41. package/lib/chain/blocks/importExecutionPayload.d.ts +28 -14
  42. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  43. package/lib/chain/blocks/importExecutionPayload.js +89 -89
  44. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  45. package/lib/chain/blocks/index.d.ts +5 -3
  46. package/lib/chain/blocks/index.d.ts.map +1 -1
  47. package/lib/chain/blocks/index.js +59 -26
  48. package/lib/chain/blocks/index.js.map +1 -1
  49. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +7 -0
  50. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  51. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +29 -2
  52. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  53. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +1 -0
  54. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  55. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  57. package/lib/chain/blocks/payloadEnvelopeProcessor.js +7 -5
  58. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  59. package/lib/chain/blocks/types.d.ts +16 -21
  60. package/lib/chain/blocks/types.d.ts.map +1 -1
  61. package/lib/chain/blocks/utils/chainSegment.d.ts +23 -2
  62. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  63. package/lib/chain/blocks/utils/chainSegment.js +89 -12
  64. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  65. package/lib/chain/blocks/verifyBlock.d.ts +5 -3
  66. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  67. package/lib/chain/blocks/verifyBlock.js +50 -7
  68. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  69. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  70. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  71. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  72. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  73. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  74. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
  76. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  77. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  78. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  79. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +79 -0
  80. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  81. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  82. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  83. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +30 -0
  84. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  85. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  86. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  87. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  88. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  89. package/lib/chain/chain.d.ts +8 -6
  90. package/lib/chain/chain.d.ts.map +1 -1
  91. package/lib/chain/chain.js +43 -43
  92. package/lib/chain/chain.js.map +1 -1
  93. package/lib/chain/emitter.d.ts +16 -15
  94. package/lib/chain/emitter.d.ts.map +1 -1
  95. package/lib/chain/emitter.js +5 -4
  96. package/lib/chain/emitter.js.map +1 -1
  97. package/lib/chain/errors/blockError.d.ts +8 -1
  98. package/lib/chain/errors/blockError.d.ts.map +1 -1
  99. package/lib/chain/errors/blockError.js +2 -0
  100. package/lib/chain/errors/blockError.js.map +1 -1
  101. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  102. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  103. package/lib/chain/errors/executionPayloadBid.js +1 -0
  104. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  105. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  106. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  107. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  108. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  109. package/lib/chain/errors/index.d.ts +1 -0
  110. package/lib/chain/errors/index.d.ts.map +1 -1
  111. package/lib/chain/errors/index.js +1 -0
  112. package/lib/chain/errors/index.js.map +1 -1
  113. package/lib/chain/errors/proposerPreferences.d.ts +40 -0
  114. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  115. package/lib/chain/errors/proposerPreferences.js +14 -0
  116. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  117. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  118. package/lib/chain/forkChoice/index.js +11 -19
  119. package/lib/chain/forkChoice/index.js.map +1 -1
  120. package/lib/chain/initState.d.ts.map +1 -1
  121. package/lib/chain/initState.js +6 -1
  122. package/lib/chain/initState.js.map +1 -1
  123. package/lib/chain/interface.d.ts +7 -5
  124. package/lib/chain/interface.d.ts.map +1 -1
  125. package/lib/chain/interface.js.map +1 -1
  126. package/lib/chain/opPools/payloadAttestationPool.d.ts +3 -2
  127. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  128. package/lib/chain/opPools/payloadAttestationPool.js +26 -4
  129. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  130. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  131. package/lib/chain/prepareNextSlot.js +47 -23
  132. package/lib/chain/prepareNextSlot.js.map +1 -1
  133. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
  134. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  135. package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
  136. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  137. package/lib/chain/produceBlock/produceBlockBody.d.ts +13 -8
  138. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  139. package/lib/chain/produceBlock/produceBlockBody.js +68 -25
  140. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  141. package/lib/chain/regen/errors.d.ts +1 -11
  142. package/lib/chain/regen/errors.d.ts.map +1 -1
  143. package/lib/chain/regen/errors.js +0 -2
  144. package/lib/chain/regen/errors.js.map +1 -1
  145. package/lib/chain/regen/interface.d.ts +7 -11
  146. package/lib/chain/regen/interface.d.ts.map +1 -1
  147. package/lib/chain/regen/interface.js +1 -0
  148. package/lib/chain/regen/interface.js.map +1 -1
  149. package/lib/chain/regen/queued.d.ts +6 -10
  150. package/lib/chain/regen/queued.d.ts.map +1 -1
  151. package/lib/chain/regen/queued.js +4 -14
  152. package/lib/chain/regen/queued.js.map +1 -1
  153. package/lib/chain/regen/regen.d.ts +0 -5
  154. package/lib/chain/regen/regen.d.ts.map +1 -1
  155. package/lib/chain/regen/regen.js +1 -12
  156. package/lib/chain/regen/regen.js.map +1 -1
  157. package/lib/chain/seenCache/index.d.ts +1 -0
  158. package/lib/chain/seenCache/index.d.ts.map +1 -1
  159. package/lib/chain/seenCache/index.js +1 -0
  160. package/lib/chain/seenCache/index.js.map +1 -1
  161. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +22 -6
  162. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  163. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +53 -17
  164. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  165. package/lib/chain/seenCache/seenProposerPreferences.d.ts +16 -0
  166. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  167. package/lib/chain/seenCache/seenProposerPreferences.js +26 -0
  168. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  169. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +1 -7
  170. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  171. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -9
  172. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  173. package/lib/chain/stateCache/types.d.ts +0 -6
  174. package/lib/chain/stateCache/types.d.ts.map +1 -1
  175. package/lib/chain/stateCache/types.js.map +1 -1
  176. package/lib/chain/validation/block.d.ts.map +1 -1
  177. package/lib/chain/validation/block.js +1 -0
  178. package/lib/chain/validation/block.js.map +1 -1
  179. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  180. package/lib/chain/validation/executionPayloadBid.js +24 -9
  181. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  182. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  183. package/lib/chain/validation/executionPayloadEnvelope.js +20 -10
  184. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  185. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  186. package/lib/chain/validation/payloadAttestationMessage.js +4 -3
  187. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  188. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  189. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  190. package/lib/chain/validation/proposerPreferences.js +91 -0
  191. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  192. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  193. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  194. package/lib/execution/engine/http.d.ts.map +1 -1
  195. package/lib/execution/engine/http.js +21 -14
  196. package/lib/execution/engine/http.js.map +1 -1
  197. package/lib/execution/engine/interface.d.ts +1 -0
  198. package/lib/execution/engine/interface.d.ts.map +1 -1
  199. package/lib/execution/engine/mock.d.ts.map +1 -1
  200. package/lib/execution/engine/mock.js +6 -0
  201. package/lib/execution/engine/mock.js.map +1 -1
  202. package/lib/execution/engine/types.d.ts +20 -0
  203. package/lib/execution/engine/types.d.ts.map +1 -1
  204. package/lib/execution/engine/types.js +18 -0
  205. package/lib/execution/engine/types.js.map +1 -1
  206. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  207. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  208. package/lib/metrics/metrics/lodestar.js +4 -0
  209. package/lib/metrics/metrics/lodestar.js.map +1 -1
  210. package/lib/network/gossip/interface.d.ts +7 -1
  211. package/lib/network/gossip/interface.d.ts.map +1 -1
  212. package/lib/network/gossip/interface.js +1 -0
  213. package/lib/network/gossip/interface.js.map +1 -1
  214. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  215. package/lib/network/gossip/scoringParameters.js +12 -1
  216. package/lib/network/gossip/scoringParameters.js.map +1 -1
  217. package/lib/network/gossip/topic.d.ts +13 -2
  218. package/lib/network/gossip/topic.d.ts.map +1 -1
  219. package/lib/network/gossip/topic.js +6 -0
  220. package/lib/network/gossip/topic.js.map +1 -1
  221. package/lib/network/interface.d.ts +1 -0
  222. package/lib/network/interface.d.ts.map +1 -1
  223. package/lib/network/network.d.ts +1 -0
  224. package/lib/network/network.d.ts.map +1 -1
  225. package/lib/network/network.js +6 -1
  226. package/lib/network/network.js.map +1 -1
  227. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  228. package/lib/network/processor/gossipHandlers.js +60 -22
  229. package/lib/network/processor/gossipHandlers.js.map +1 -1
  230. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  231. package/lib/network/processor/gossipQueues/index.js +5 -0
  232. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  233. package/lib/network/processor/index.d.ts.map +1 -1
  234. package/lib/network/processor/index.js +6 -5
  235. package/lib/network/processor/index.js.map +1 -1
  236. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  237. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  238. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  239. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  240. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  241. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  242. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  243. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  244. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  245. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  246. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  247. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  248. package/lib/node/nodejs.d.ts.map +1 -1
  249. package/lib/node/nodejs.js +6 -4
  250. package/lib/node/nodejs.js.map +1 -1
  251. package/lib/sync/constants.d.ts +3 -1
  252. package/lib/sync/constants.d.ts.map +1 -1
  253. package/lib/sync/constants.js +3 -4
  254. package/lib/sync/constants.js.map +1 -1
  255. package/lib/sync/range/batch.d.ts +28 -2
  256. package/lib/sync/range/batch.d.ts.map +1 -1
  257. package/lib/sync/range/batch.js +146 -44
  258. package/lib/sync/range/batch.js.map +1 -1
  259. package/lib/sync/range/chain.d.ts +12 -2
  260. package/lib/sync/range/chain.d.ts.map +1 -1
  261. package/lib/sync/range/chain.js +53 -9
  262. package/lib/sync/range/chain.js.map +1 -1
  263. package/lib/sync/range/range.d.ts.map +1 -1
  264. package/lib/sync/range/range.js +17 -6
  265. package/lib/sync/range/range.js.map +1 -1
  266. package/lib/sync/types.d.ts +34 -0
  267. package/lib/sync/types.d.ts.map +1 -1
  268. package/lib/sync/types.js +34 -0
  269. package/lib/sync/types.js.map +1 -1
  270. package/lib/sync/unknownBlock.d.ts +22 -1
  271. package/lib/sync/unknownBlock.d.ts.map +1 -1
  272. package/lib/sync/unknownBlock.js +604 -53
  273. package/lib/sync/unknownBlock.js.map +1 -1
  274. package/lib/sync/utils/downloadByRange.d.ts +46 -10
  275. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  276. package/lib/sync/utils/downloadByRange.js +162 -24
  277. package/lib/sync/utils/downloadByRange.js.map +1 -1
  278. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  279. package/lib/sync/utils/downloadByRoot.js +16 -2
  280. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  281. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  282. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  283. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  284. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  285. package/lib/util/sszBytes.d.ts.map +1 -1
  286. package/lib/util/sszBytes.js +20 -5
  287. package/lib/util/sszBytes.js.map +1 -1
  288. package/package.json +17 -16
  289. package/src/api/impl/beacon/blocks/index.ts +22 -9
  290. package/src/api/impl/beacon/pool/index.ts +83 -1
  291. package/src/api/impl/beacon/state/utils.ts +2 -2
  292. package/src/api/impl/debug/index.ts +0 -1
  293. package/src/api/impl/lodestar/index.ts +1 -1
  294. package/src/api/impl/validator/index.ts +84 -6
  295. package/src/chain/GetBlobsTracker.ts +1 -2
  296. package/src/chain/archiveStore/archiveStore.ts +5 -5
  297. package/src/chain/archiveStore/interface.ts +4 -4
  298. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
  299. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  300. package/src/chain/blocks/blockInput/blockInput.ts +4 -1
  301. package/src/chain/blocks/importBlock.ts +34 -79
  302. package/src/chain/blocks/importExecutionPayload.ts +110 -102
  303. package/src/chain/blocks/index.ts +74 -24
  304. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +37 -2
  305. package/src/chain/blocks/payloadEnvelopeInput/types.ts +1 -0
  306. package/src/chain/blocks/payloadEnvelopeProcessor.ts +7 -6
  307. package/src/chain/blocks/types.ts +16 -26
  308. package/src/chain/blocks/utils/chainSegment.ts +114 -17
  309. package/src/chain/blocks/verifyBlock.ts +70 -9
  310. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  311. package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
  312. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +134 -0
  313. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +41 -0
  314. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  315. package/src/chain/chain.ts +61 -58
  316. package/src/chain/emitter.ts +15 -14
  317. package/src/chain/errors/blockError.ts +4 -1
  318. package/src/chain/errors/executionPayloadBid.ts +6 -0
  319. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  320. package/src/chain/errors/index.ts +1 -0
  321. package/src/chain/errors/proposerPreferences.ts +47 -0
  322. package/src/chain/forkChoice/index.ts +8 -24
  323. package/src/chain/initState.ts +9 -1
  324. package/src/chain/interface.ts +11 -3
  325. package/src/chain/opPools/payloadAttestationPool.ts +29 -8
  326. package/src/chain/prepareNextSlot.ts +55 -24
  327. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
  328. package/src/chain/produceBlock/produceBlockBody.ts +91 -27
  329. package/src/chain/regen/errors.ts +1 -6
  330. package/src/chain/regen/interface.ts +7 -11
  331. package/src/chain/regen/queued.ts +8 -21
  332. package/src/chain/regen/regen.ts +2 -15
  333. package/src/chain/seenCache/index.ts +1 -0
  334. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +71 -20
  335. package/src/chain/seenCache/seenProposerPreferences.ts +32 -0
  336. package/src/chain/stateCache/persistentCheckpointsCache.ts +5 -15
  337. package/src/chain/stateCache/types.ts +0 -3
  338. package/src/chain/validation/block.ts +1 -0
  339. package/src/chain/validation/executionPayloadBid.ts +25 -8
  340. package/src/chain/validation/executionPayloadEnvelope.ts +21 -11
  341. package/src/chain/validation/payloadAttestationMessage.ts +5 -3
  342. package/src/chain/validation/proposerPreferences.ts +110 -0
  343. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  344. package/src/execution/engine/http.ts +21 -14
  345. package/src/execution/engine/interface.ts +1 -0
  346. package/src/execution/engine/mock.ts +8 -1
  347. package/src/execution/engine/types.ts +41 -0
  348. package/src/metrics/metrics/lodestar.ts +4 -0
  349. package/src/network/gossip/interface.ts +6 -0
  350. package/src/network/gossip/scoringParameters.ts +14 -1
  351. package/src/network/gossip/topic.ts +6 -0
  352. package/src/network/interface.ts +1 -0
  353. package/src/network/network.ts +12 -1
  354. package/src/network/processor/gossipHandlers.ts +79 -27
  355. package/src/network/processor/gossipQueues/index.ts +5 -0
  356. package/src/network/processor/index.ts +6 -5
  357. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  358. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  359. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  360. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  361. package/src/node/nodejs.ts +6 -4
  362. package/src/sync/constants.ts +4 -4
  363. package/src/sync/range/batch.ts +204 -49
  364. package/src/sync/range/chain.ts +69 -11
  365. package/src/sync/range/range.ts +18 -6
  366. package/src/sync/types.ts +72 -0
  367. package/src/sync/unknownBlock.ts +762 -57
  368. package/src/sync/utils/downloadByRange.ts +272 -39
  369. package/src/sync/utils/downloadByRoot.ts +24 -2
  370. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  371. package/src/util/sszBytes.ts +25 -5
@@ -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;
@@ -334,13 +335,6 @@ export class BeaconChain implements IBeaconChain {
334
335
  metrics,
335
336
  logger,
336
337
  });
337
- this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
338
- chainEvents: emitter,
339
- signal,
340
- serializedCache: this.serializedCache,
341
- metrics,
342
- logger,
343
- });
344
338
 
345
339
  this._earliestAvailableSlot = anchorState.slot;
346
340
 
@@ -420,6 +414,18 @@ export class BeaconChain implements IBeaconChain {
420
414
  this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
421
415
 
422
416
  this.forkChoice = forkChoice;
417
+
418
+ this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
419
+ config,
420
+ clock,
421
+ forkChoice,
422
+ chainEvents: emitter,
423
+ signal,
424
+ serializedCache: this.serializedCache,
425
+ metrics,
426
+ logger,
427
+ });
428
+
423
429
  this.clock = clock;
424
430
  this.regen = regen;
425
431
  this.bls = bls;
@@ -682,11 +688,11 @@ export class BeaconChain implements IBeaconChain {
682
688
  }
683
689
 
684
690
  getStateByCheckpoint(
685
- checkpoint: CheckpointWithPayloadStatus
691
+ checkpoint: CheckpointWithHex
686
692
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null {
687
693
  // 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);
694
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
695
+ const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHex);
690
696
  if (cachedStateCtx) {
691
697
  const block = this.forkChoice.getBlockDefaultStatus(
692
698
  ssz.phase0.BeaconBlockHeader.hashTreeRoot(cachedStateCtx.latestBlockHeader)
@@ -703,10 +709,10 @@ export class BeaconChain implements IBeaconChain {
703
709
  }
704
710
 
705
711
  async getStateOrBytesByCheckpoint(
706
- checkpoint: CheckpointWithPayloadStatus
712
+ checkpoint: CheckpointWithHex
707
713
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
708
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
709
- const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHexPayload);
714
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
715
+ const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHex);
710
716
  if (cachedStateCtx) {
711
717
  const block = this.forkChoice.getBlockDefaultStatus(checkpoint.root);
712
718
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
@@ -888,6 +894,21 @@ export class BeaconChain implements IBeaconChain {
888
894
  );
889
895
  }
890
896
 
897
+ async getParentExecutionRequests(
898
+ parentBlockSlot: Slot,
899
+ parentBlockRootHex: RootHex
900
+ ): Promise<electra.ExecutionRequests> {
901
+ // at the fork boundary, parent is pre-gloas
902
+ if (!isForkPostGloas(this.config.getForkName(parentBlockSlot))) {
903
+ return ssz.electra.ExecutionRequests.defaultValue();
904
+ }
905
+ const envelope = await this.getExecutionPayloadEnvelope(parentBlockSlot, parentBlockRootHex);
906
+ if (envelope === null) {
907
+ throw Error(`Parent execution payload envelope not found slot=${parentBlockSlot}, root=${parentBlockRootHex}`);
908
+ }
909
+ return envelope.message.executionRequests;
910
+ }
911
+
891
912
  async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]> {
892
913
  const fork = this.config.getForkName(blockSlot);
893
914
 
@@ -1062,7 +1083,7 @@ export class BeaconChain implements IBeaconChain {
1062
1083
  body,
1063
1084
  } as AssembledBlockType<T>;
1064
1085
 
1065
- const {newStateRoot, proposerReward, postBlockState} = computeNewStateRoot(this.metrics, state, block);
1086
+ const {newStateRoot, proposerReward} = computeNewStateRoot(this.metrics, state, block);
1066
1087
  block.stateRoot = newStateRoot;
1067
1088
  const blockRoot =
1068
1089
  produceResult.type === BlockType.Full
@@ -1071,26 +1092,9 @@ export class BeaconChain implements IBeaconChain {
1071
1092
  const blockRootHex = toRootHex(blockRoot);
1072
1093
 
1073
1094
  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;
1095
+ // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1096
+ if (isForkPostGloas(fork) && produceResult.type !== BlockType.Full) {
1097
+ throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1094
1098
  }
1095
1099
 
1096
1100
  // Track the produced block for consensus broadcast validations, later validation, etc.
@@ -1101,11 +1105,15 @@ export class BeaconChain implements IBeaconChain {
1101
1105
  }
1102
1106
 
1103
1107
  async processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void> {
1104
- return this.blockProcessor.processBlocksJob([block], opts);
1108
+ return this.blockProcessor.processBlocksJob([block], null, opts);
1105
1109
  }
1106
1110
 
1107
- async processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void> {
1108
- return this.blockProcessor.processBlocksJob(blocks, opts);
1111
+ async processChainSegment(
1112
+ blocks: IBlockInput[],
1113
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
1114
+ opts?: ImportBlockOpts
1115
+ ): Promise<void> {
1116
+ await this.blockProcessor.processBlocksJob(blocks, payloadEnvelopes, opts);
1109
1117
  }
1110
1118
 
1111
1119
  async processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void> {
@@ -1296,7 +1304,7 @@ export class BeaconChain implements IBeaconChain {
1296
1304
  * @param blockState state that declares justified checkpoint `checkpoint`
1297
1305
  */
1298
1306
  private justifiedBalancesGetter(
1299
- checkpoint: CheckpointWithPayloadStatus,
1307
+ checkpoint: CheckpointWithHex,
1300
1308
  blockState: IBeaconStateView
1301
1309
  ): EffectiveBalanceIncrements {
1302
1310
  this.metrics?.balancesCache.requests.inc();
@@ -1335,11 +1343,11 @@ export class BeaconChain implements IBeaconChain {
1335
1343
  * @param blockState state that declares justified checkpoint `checkpoint`
1336
1344
  */
1337
1345
  private closestJustifiedBalancesStateToCheckpoint(
1338
- checkpoint: CheckpointWithPayloadStatus,
1346
+ checkpoint: CheckpointWithHex,
1339
1347
  blockState: IBeaconStateView
1340
1348
  ): {state: IBeaconStateView; stateId: string; shouldWarn: boolean} {
1341
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
1342
- const state = this.regen.getCheckpointStateSync(checkpointHexPayload);
1349
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
1350
+ const state = this.regen.getCheckpointStateSync(checkpointHex);
1343
1351
  if (state) {
1344
1352
  return {state, stateId: "checkpoint_state", shouldWarn: false};
1345
1353
  }
@@ -1350,10 +1358,7 @@ export class BeaconChain implements IBeaconChain {
1350
1358
  }
1351
1359
 
1352
1360
  // 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
- )) {
1361
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1357
1362
  if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
1358
1363
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1359
1364
  if (descendantBlockState) {
@@ -1369,10 +1374,7 @@ export class BeaconChain implements IBeaconChain {
1369
1374
 
1370
1375
  // Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
1371
1376
  // 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
- )) {
1377
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1376
1378
  if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
1377
1379
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1378
1380
  if (descendantBlockState) {
@@ -1442,6 +1444,7 @@ export class BeaconChain implements IBeaconChain {
1442
1444
  this.payloadAttestationPool.prune(slot);
1443
1445
  this.executionPayloadBidPool.prune(slot);
1444
1446
  this.seenExecutionPayloadBids.prune(slot);
1447
+ this.seenProposerPreferences.prune(slot);
1445
1448
  this.seenAttestationDatas.onSlot(slot);
1446
1449
  this.reprocessController.onSlot(slot);
1447
1450
 
@@ -1476,7 +1479,7 @@ export class BeaconChain implements IBeaconChain {
1476
1479
  this.seenContributionAndProof.prune(head.slot);
1477
1480
  }
1478
1481
 
1479
- private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithPayloadStatus): void {
1482
+ private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
1480
1483
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1481
1484
  }
1482
1485
 
@@ -1487,7 +1490,7 @@ export class BeaconChain implements IBeaconChain {
1487
1490
  });
1488
1491
  }
1489
1492
 
1490
- private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithPayloadStatus): Promise<void> {
1493
+ private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1491
1494
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1492
1495
  const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1493
1496
  this.seenBlockProposers.prune(finalizedSlot);
@@ -1528,7 +1531,7 @@ export class BeaconChain implements IBeaconChain {
1528
1531
  }
1529
1532
  }
1530
1533
 
1531
- private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithPayloadStatus): Promise<void> {
1534
+ private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
1532
1535
  if (this.custodyConfig.targetCustodyGroupCount === this.config.NUMBER_OF_CUSTODY_GROUPS) {
1533
1536
  // Custody requirements can only be increased, we can disable dynamic custody updates
1534
1537
  // if the node already maintains custody of all custody groups in case it is configured
@@ -1,12 +1,12 @@
1
1
  import {EventEmitter} from "node:events";
2
2
  import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
- import {CheckpointWithPayloadStatus} from "@lodestar/fork-choice";
4
+ import {CheckpointWithHex} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
6
  import {DataColumnSidecar, RootHex, deneb, phase0} from "@lodestar/types";
7
- import {SignedExecutionPayloadEnvelope} from "@lodestar/types/gloas";
8
7
  import {PeerIdStr} from "../util/peerId.js";
9
8
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
9
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
10
10
 
11
11
  /**
12
12
  * Important chain events that occur during normal chain operation.
@@ -59,10 +59,6 @@ export enum ChainEvent {
59
59
  * Post-gloas, missing parent could be a SignedBeaconBlock and/or a SignedExecutionPayloadEnvelope
60
60
  */
61
61
  blockUnknownParent = "blockUnknownParent",
62
- /**
63
- * Trigger BlockInputSync to find a SignedBeaconBlock given a SignedExecutionPayloadEnvelop received
64
- */
65
- envelopeUnknownBlock = "envelopeUnknownBlock",
66
62
  /**
67
63
  * Trigger BlockInputSync to find a SignedBeaconBlock with specified block root.
68
64
  */
@@ -76,6 +72,11 @@ export enum ChainEvent {
76
72
  * cut-off window passes for waiting on gossip
77
73
  */
78
74
  incompleteBlockInput = "incompleteBlockInput",
75
+ /**
76
+ * Post-gloas: trigger BlockInputSync for payload envelopes whose envelope and/or sampled columns are partially
77
+ * received via gossip but are not complete by time the cut-off window passes for waiting on gossip
78
+ */
79
+ incompletePayloadEnvelope = "incompletePayloadEnvelope",
79
80
  }
80
81
 
81
82
  export type HeadEventData = routes.events.EventData[routes.events.EventType.head];
@@ -86,21 +87,21 @@ type ApiEvents = {[K in routes.events.EventType]: (data: routes.events.EventData
86
87
 
87
88
  export type ChainEventData = {
88
89
  [ChainEvent.blockUnknownParent]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
89
- [ChainEvent.envelopeUnknownBlock]: {
90
- envelope: SignedExecutionPayloadEnvelope;
91
- peer?: PeerIdStr;
92
- source: BlockInputSource;
93
- };
94
90
  [ChainEvent.unknownBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
95
91
  [ChainEvent.incompleteBlockInput]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
92
+ [ChainEvent.incompletePayloadEnvelope]: {
93
+ payloadInput: PayloadEnvelopeInput;
94
+ peer: PeerIdStr;
95
+ source: BlockInputSource;
96
+ };
96
97
  [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
97
98
  };
98
99
 
99
100
  export type IChainEvents = ApiEvents & {
100
101
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: IBeaconStateView) => void;
101
102
 
102
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
104
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
104
105
 
105
106
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
106
107
 
@@ -113,9 +114,9 @@ export type IChainEvents = ApiEvents & {
113
114
  // Sync events that are chain->chain. Initiated from network requests but do not cross the network
114
115
  // barrier so are considered ChainEvent(s).
115
116
  [ChainEvent.blockUnknownParent]: (data: ChainEventData[ChainEvent.blockUnknownParent]) => void;
116
- [ChainEvent.envelopeUnknownBlock]: (data: ChainEventData[ChainEvent.envelopeUnknownBlock]) => void;
117
117
  [ChainEvent.unknownBlockRoot]: (data: ChainEventData[ChainEvent.unknownBlockRoot]) => void;
118
118
  [ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
119
+ [ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
119
120
  [ChainEvent.unknownEnvelopeBlockRoot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRoot]) => void;
120
121
  };
121
122
 
@@ -74,6 +74,8 @@ export enum BlockErrorCode {
74
74
  PARENT_EXECUTION_INVALID = "BLOCK_ERROR_PARENT_EXECUTION_INVALID",
75
75
  /** The block's parent execution payload (defined by bid.parent_block_hash) has not been seen */
76
76
  PARENT_PAYLOAD_UNKNOWN = "BLOCK_ERROR_PARENT_PAYLOAD_UNKNOWN",
77
+ /** An execution payload envelope in the chain segment references a block root that does not match its slot's block */
78
+ ENVELOPE_BLOCK_ROOT_MISMATCH = "BLOCK_ERROR_ENVELOPE_BLOCK_ROOT_MISMATCH",
77
79
  }
78
80
 
79
81
  type ExecutionErrorStatus = Exclude<
@@ -107,6 +109,7 @@ export type BlockErrorType =
107
109
  | {code: BlockErrorCode.NOT_LATER_THAN_PARENT; parentSlot: Slot; slot: Slot}
108
110
  | {code: BlockErrorCode.NON_LINEAR_PARENT_ROOTS}
109
111
  | {code: BlockErrorCode.NON_LINEAR_SLOTS}
112
+ | {code: BlockErrorCode.ENVELOPE_BLOCK_ROOT_MISMATCH; envelopeBlockRoot: RootHex; blockRoot: RootHex}
110
113
  | {code: BlockErrorCode.PER_BLOCK_PROCESSING_ERROR; error: Error}
111
114
  | {code: BlockErrorCode.BEACON_CHAIN_ERROR; error: Error}
112
115
  | {code: BlockErrorCode.KNOWN_BAD_BLOCK}
@@ -120,7 +123,7 @@ export type BlockErrorType =
120
123
  | {code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS; blobKzgCommitmentsLen: number; commitmentLimit: number}
121
124
  | {code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH; bidParentRoot: RootHex; blockParentRoot: RootHex}
122
125
  | {code: BlockErrorCode.PARENT_EXECUTION_INVALID; parentRoot: RootHex}
123
- | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentBlockHash: RootHex};
126
+ | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentRoot: RootHex; parentBlockHash: RootHex};
124
127
 
125
128
  export class BlockGossipError extends GossipActionError<BlockErrorType> {}
126
129
 
@@ -7,6 +7,7 @@ export enum ExecutionPayloadBidErrorCode {
7
7
  BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
8
8
  BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
9
9
  BID_TOO_HIGH = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_HIGH",
10
+ TOO_MANY_KZG_COMMITMENTS = "EXECUTION_PAYLOAD_BID_ERROR_TOO_MANY_KZG_COMMITMENTS",
10
11
  UNKNOWN_BLOCK_ROOT = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_BLOCK_ROOT",
11
12
  INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
12
13
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
@@ -28,6 +29,11 @@ export type ExecutionPayloadBidErrorType =
28
29
  }
29
30
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
30
31
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
32
+ | {
33
+ code: ExecutionPayloadBidErrorCode.TOO_MANY_KZG_COMMITMENTS;
34
+ blobKzgCommitmentsLen: number;
35
+ commitmentLimit: number;
36
+ }
31
37
  | {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
32
38
  | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
33
39
  | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
@@ -11,6 +11,7 @@ export enum ExecutionPayloadEnvelopeErrorCode {
11
11
  SLOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_SLOT_MISMATCH",
12
12
  BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
13
13
  BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
14
+ EXECUTION_REQUESTS_ROOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_EXECUTION_REQUESTS_ROOT_MISMATCH",
14
15
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
15
16
  PAYLOAD_ENVELOPE_INPUT_MISSING = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_PAYLOAD_ENVELOPE_INPUT_MISSING",
16
17
  }
@@ -36,6 +37,11 @@ export type ExecutionPayloadEnvelopeErrorType =
36
37
  envelopeBlockHash: RootHex;
37
38
  bidBlockHash: RootHex | null;
38
39
  }
40
+ | {
41
+ code: ExecutionPayloadEnvelopeErrorCode.EXECUTION_REQUESTS_ROOT_MISMATCH;
42
+ envelopeRequestsRoot: RootHex;
43
+ bidRequestsRoot: RootHex;
44
+ }
39
45
  | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE}
40
46
  | {code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING; blockRoot: RootHex};
41
47
 
@@ -8,6 +8,7 @@ export * from "./executionPayloadBid.js";
8
8
  export * from "./executionPayloadEnvelope.js";
9
9
  export * from "./gossipValidation.js";
10
10
  export * from "./payloadAttestation.js";
11
+ export * from "./proposerPreferences.js";
11
12
  export * from "./proposerSlashingError.js";
12
13
  export * from "./syncCommitteeError.js";
13
14
  export * from "./voluntaryExitError.js";
@@ -0,0 +1,47 @@
1
+ import {RootHex, Slot, ValidatorIndex} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.js";
3
+
4
+ export enum ProposerPreferencesErrorCode {
5
+ INVALID_EPOCH = "PROPOSER_PREFERENCES_ERROR_INVALID_EPOCH",
6
+ PROPOSAL_SLOT_PASSED = "PROPOSER_PREFERENCES_ERROR_PROPOSAL_SLOT_PASSED",
7
+ UNKNOWN_DEPENDENT_ROOT = "PROPOSER_PREFERENCES_ERROR_UNKNOWN_DEPENDENT_ROOT",
8
+ INVALID_PROPOSER = "PROPOSER_PREFERENCES_ERROR_INVALID_PROPOSER",
9
+ ALREADY_KNOWN = "PROPOSER_PREFERENCES_ERROR_ALREADY_KNOWN",
10
+ INVALID_SIGNATURE = "PROPOSER_PREFERENCES_ERROR_INVALID_SIGNATURE",
11
+ }
12
+
13
+ export type ProposerPreferencesErrorType =
14
+ | {
15
+ code: ProposerPreferencesErrorCode.INVALID_EPOCH;
16
+ proposalSlot: Slot;
17
+ currentEpoch: number;
18
+ }
19
+ | {
20
+ code: ProposerPreferencesErrorCode.PROPOSAL_SLOT_PASSED;
21
+ proposalSlot: Slot;
22
+ currentSlot: Slot;
23
+ }
24
+ | {
25
+ code: ProposerPreferencesErrorCode.UNKNOWN_DEPENDENT_ROOT;
26
+ proposalSlot: Slot;
27
+ dependentRoot: RootHex;
28
+ }
29
+ | {
30
+ code: ProposerPreferencesErrorCode.INVALID_PROPOSER;
31
+ proposalSlot: Slot;
32
+ validatorIndex: ValidatorIndex;
33
+ dependentRoot: RootHex;
34
+ }
35
+ | {
36
+ code: ProposerPreferencesErrorCode.ALREADY_KNOWN;
37
+ proposalSlot: Slot;
38
+ validatorIndex: ValidatorIndex;
39
+ dependentRoot: RootHex;
40
+ }
41
+ | {
42
+ code: ProposerPreferencesErrorCode.INVALID_SIGNATURE;
43
+ proposalSlot: Slot;
44
+ validatorIndex: ValidatorIndex;
45
+ };
46
+
47
+ export class ProposerPreferencesError extends GossipActionError<ProposerPreferencesErrorType> {}
@@ -8,7 +8,6 @@ import {
8
8
  ProtoArray,
9
9
  ProtoBlock,
10
10
  ForkChoiceOpts as RawForkChoiceOpts,
11
- getCheckpointPayloadStatus,
12
11
  } from "@lodestar/fork-choice";
13
12
  import {ZERO_HASH_HEX} from "@lodestar/params";
14
13
  import {
@@ -104,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,7 +1,8 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
- import {ZERO_HASH} from "@lodestar/params";
2
+ import {ForkPostGloas, ForkSeq, ZERO_HASH} from "@lodestar/params";
3
3
  import {
4
4
  BeaconStateAllForks,
5
+ BeaconStateGloas,
5
6
  IBeaconStateView,
6
7
  computeEpochAtSlot,
7
8
  computeStartSlotAtEpoch,
@@ -52,6 +53,13 @@ export function createGenesisBlock(config: ChainForkConfig, genesisState: Beacon
52
53
  const genesisBlock = types.SignedBeaconBlock.defaultValue();
53
54
  const stateRoot = genesisState.hashTreeRoot();
54
55
  genesisBlock.message.stateRoot = stateRoot;
56
+
57
+ if (config.getForkSeq(GENESIS_SLOT) >= ForkSeq.gloas) {
58
+ const gloasBlock = genesisBlock as SignedBeaconBlock<ForkPostGloas>;
59
+ const gloasState = genesisState as BeaconStateGloas;
60
+ gloasBlock.message.body.signedExecutionPayloadBid.message = gloasState.latestExecutionPayloadBid.toValue();
61
+ }
62
+
55
63
  return genesisBlock;
56
64
  }
57
65
 
@@ -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>;