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

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