@lodestar/beacon-node 1.42.0-rc.0 → 1.43.0-dev.07875b3e0c

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 (320) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +21 -4
  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 +4 -0
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  8. package/lib/api/impl/beacon/state/index.js +13 -10
  9. package/lib/api/impl/beacon/state/index.js.map +1 -1
  10. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  11. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  13. package/lib/api/impl/lodestar/attesterSlashing.d.ts +8 -0
  14. package/lib/api/impl/lodestar/attesterSlashing.d.ts.map +1 -0
  15. package/lib/api/impl/lodestar/attesterSlashing.js +29 -0
  16. package/lib/api/impl/lodestar/attesterSlashing.js.map +1 -0
  17. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  18. package/lib/api/impl/lodestar/index.js +39 -0
  19. package/lib/api/impl/lodestar/index.js.map +1 -1
  20. package/lib/api/impl/validator/index.d.ts.map +1 -1
  21. package/lib/api/impl/validator/index.js +8 -5
  22. package/lib/api/impl/validator/index.js.map +1 -1
  23. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  24. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  25. package/lib/chain/GetBlobsTracker.js +1 -2
  26. package/lib/chain/GetBlobsTracker.js.map +1 -1
  27. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  28. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  29. package/lib/chain/archiveStore/interface.d.ts +4 -4
  30. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  31. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  32. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  33. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
  34. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  35. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  36. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  37. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  38. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  39. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  40. package/lib/chain/blocks/importBlock.js +29 -35
  41. package/lib/chain/blocks/importBlock.js.map +1 -1
  42. package/lib/chain/blocks/importExecutionPayload.d.ts +15 -14
  43. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  44. package/lib/chain/blocks/importExecutionPayload.js +69 -82
  45. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  46. package/lib/chain/blocks/index.d.ts.map +1 -1
  47. package/lib/chain/blocks/index.js +1 -2
  48. package/lib/chain/blocks/index.js.map +1 -1
  49. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +3 -0
  50. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  51. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +20 -0
  52. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  53. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  54. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  55. package/lib/chain/blocks/payloadEnvelopeProcessor.js +6 -4
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  57. package/lib/chain/blocks/types.d.ts +15 -21
  58. package/lib/chain/blocks/types.d.ts.map +1 -1
  59. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  60. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +3 -2
  61. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  62. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  63. package/lib/chain/blocks/verifyBlocksSignatures.js +4 -2
  64. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  65. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  66. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  67. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +76 -0
  68. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  69. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  70. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  71. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +25 -0
  72. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  73. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  74. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  75. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  76. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  77. package/lib/chain/chain.d.ts +5 -4
  78. package/lib/chain/chain.d.ts.map +1 -1
  79. package/lib/chain/chain.js +32 -38
  80. package/lib/chain/chain.js.map +1 -1
  81. package/lib/chain/emitter.d.ts +16 -4
  82. package/lib/chain/emitter.d.ts.map +1 -1
  83. package/lib/chain/emitter.js +5 -0
  84. package/lib/chain/emitter.js.map +1 -1
  85. package/lib/chain/errors/attestationError.d.ts +8 -1
  86. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  87. package/lib/chain/errors/attestationError.js +4 -0
  88. package/lib/chain/errors/attestationError.js.map +1 -1
  89. package/lib/chain/errors/blockError.d.ts +11 -1
  90. package/lib/chain/errors/blockError.d.ts.map +1 -1
  91. package/lib/chain/errors/blockError.js +4 -0
  92. package/lib/chain/errors/blockError.js.map +1 -1
  93. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  94. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  95. package/lib/chain/errors/executionPayloadBid.js +1 -0
  96. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  97. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  98. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  99. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  100. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  101. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  102. package/lib/chain/forkChoice/index.js +21 -23
  103. package/lib/chain/forkChoice/index.js.map +1 -1
  104. package/lib/chain/interface.d.ts +4 -3
  105. package/lib/chain/interface.d.ts.map +1 -1
  106. package/lib/chain/interface.js.map +1 -1
  107. package/lib/chain/lightClient/index.d.ts +2 -2
  108. package/lib/chain/lightClient/index.d.ts.map +1 -1
  109. package/lib/chain/lightClient/index.js +7 -0
  110. package/lib/chain/lightClient/index.js.map +1 -1
  111. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  112. package/lib/chain/opPools/aggregatedAttestationPool.js +5 -2
  113. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  114. package/lib/chain/opPools/executionPayloadBidPool.d.ts +2 -2
  115. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
  116. package/lib/chain/opPools/executionPayloadBidPool.js +2 -2
  117. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
  118. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  119. package/lib/chain/prepareNextSlot.js +32 -11
  120. package/lib/chain/prepareNextSlot.js.map +1 -1
  121. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +1 -7
  122. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  123. package/lib/chain/produceBlock/computeNewStateRoot.js +1 -28
  124. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  125. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -10
  126. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  127. package/lib/chain/produceBlock/produceBlockBody.js +49 -19
  128. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  129. package/lib/chain/regen/errors.d.ts +1 -11
  130. package/lib/chain/regen/errors.d.ts.map +1 -1
  131. package/lib/chain/regen/errors.js +0 -2
  132. package/lib/chain/regen/errors.js.map +1 -1
  133. package/lib/chain/regen/interface.d.ts +6 -12
  134. package/lib/chain/regen/interface.d.ts.map +1 -1
  135. package/lib/chain/regen/queued.d.ts +6 -11
  136. package/lib/chain/regen/queued.d.ts.map +1 -1
  137. package/lib/chain/regen/queued.js +8 -40
  138. package/lib/chain/regen/queued.js.map +1 -1
  139. package/lib/chain/regen/regen.d.ts +0 -5
  140. package/lib/chain/regen/regen.d.ts.map +1 -1
  141. package/lib/chain/regen/regen.js +7 -34
  142. package/lib/chain/regen/regen.js.map +1 -1
  143. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +11 -4
  144. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  145. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +20 -18
  146. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  147. package/lib/chain/stateCache/datastore/db.d.ts +5 -4
  148. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
  149. package/lib/chain/stateCache/datastore/db.js +10 -32
  150. package/lib/chain/stateCache/datastore/db.js.map +1 -1
  151. package/lib/chain/stateCache/datastore/file.d.ts +1 -1
  152. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
  153. package/lib/chain/stateCache/datastore/file.js +5 -5
  154. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  155. package/lib/chain/stateCache/datastore/types.d.ts +1 -1
  156. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
  157. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -7
  158. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  159. package/lib/chain/stateCache/fifoBlockStateCache.js +0 -8
  160. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  161. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +13 -30
  162. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  163. package/lib/chain/stateCache/persistentCheckpointsCache.js +120 -216
  164. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  165. package/lib/chain/stateCache/types.d.ts +8 -15
  166. package/lib/chain/stateCache/types.d.ts.map +1 -1
  167. package/lib/chain/stateCache/types.js.map +1 -1
  168. package/lib/chain/validation/aggregateAndProof.js +12 -0
  169. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  170. package/lib/chain/validation/attestation.d.ts.map +1 -1
  171. package/lib/chain/validation/attestation.js +12 -0
  172. package/lib/chain/validation/attestation.js.map +1 -1
  173. package/lib/chain/validation/block.d.ts.map +1 -1
  174. package/lib/chain/validation/block.js +27 -5
  175. package/lib/chain/validation/block.js.map +1 -1
  176. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  177. package/lib/chain/validation/executionPayloadBid.js +19 -4
  178. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  179. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  180. package/lib/chain/validation/executionPayloadEnvelope.js +27 -12
  181. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  182. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  183. package/lib/chain/validation/payloadAttestationMessage.js +8 -4
  184. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  185. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  186. package/lib/chain/validation/syncCommittee.js +4 -0
  187. package/lib/chain/validation/syncCommittee.js.map +1 -1
  188. package/lib/chain/validation/syncCommitteeContributionAndProof.js +4 -1
  189. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  190. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  191. package/lib/chain/validatorMonitor.js +3 -3
  192. package/lib/chain/validatorMonitor.js.map +1 -1
  193. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  194. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  195. package/lib/execution/engine/http.d.ts.map +1 -1
  196. package/lib/execution/engine/http.js +21 -14
  197. package/lib/execution/engine/http.js.map +1 -1
  198. package/lib/execution/engine/interface.d.ts +1 -0
  199. package/lib/execution/engine/interface.d.ts.map +1 -1
  200. package/lib/execution/engine/mock.d.ts.map +1 -1
  201. package/lib/execution/engine/mock.js +6 -0
  202. package/lib/execution/engine/mock.js.map +1 -1
  203. package/lib/execution/engine/types.d.ts +20 -0
  204. package/lib/execution/engine/types.d.ts.map +1 -1
  205. package/lib/execution/engine/types.js +18 -0
  206. package/lib/execution/engine/types.js.map +1 -1
  207. package/lib/network/gossip/topic.d.ts +3 -2
  208. package/lib/network/gossip/topic.d.ts.map +1 -1
  209. package/lib/network/network.js +1 -1
  210. package/lib/network/network.js.map +1 -1
  211. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  212. package/lib/network/processor/gossipHandlers.js +26 -6
  213. package/lib/network/processor/gossipHandlers.js.map +1 -1
  214. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  215. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -1
  216. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  217. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
  218. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +2 -0
  219. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  220. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +2 -2
  221. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  222. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +7 -3
  223. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  224. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
  225. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +6 -0
  226. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  227. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +2 -2
  228. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  229. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +7 -3
  230. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  231. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  232. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +2 -1
  233. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  234. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -1
  235. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +3 -8
  236. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -1
  237. package/lib/node/nodejs.d.ts.map +1 -1
  238. package/lib/node/nodejs.js +6 -1
  239. package/lib/node/nodejs.js.map +1 -1
  240. package/lib/node/notifier.d.ts.map +1 -1
  241. package/lib/node/notifier.js +2 -2
  242. package/lib/node/notifier.js.map +1 -1
  243. package/lib/util/sszBytes.d.ts.map +1 -1
  244. package/lib/util/sszBytes.js +16 -3
  245. package/lib/util/sszBytes.js.map +1 -1
  246. package/package.json +16 -16
  247. package/src/api/impl/beacon/blocks/index.ts +30 -4
  248. package/src/api/impl/beacon/pool/index.ts +4 -0
  249. package/src/api/impl/beacon/state/index.ts +15 -15
  250. package/src/api/impl/beacon/state/utils.ts +2 -2
  251. package/src/api/impl/lodestar/attesterSlashing.ts +43 -0
  252. package/src/api/impl/lodestar/index.ts +51 -1
  253. package/src/api/impl/validator/index.ts +10 -6
  254. package/src/chain/GetBlobsTracker.ts +1 -2
  255. package/src/chain/archiveStore/archiveStore.ts +5 -5
  256. package/src/chain/archiveStore/interface.ts +4 -4
  257. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
  258. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  259. package/src/chain/blocks/importBlock.ts +33 -42
  260. package/src/chain/blocks/importExecutionPayload.ts +83 -99
  261. package/src/chain/blocks/index.ts +1 -2
  262. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +27 -0
  263. package/src/chain/blocks/payloadEnvelopeProcessor.ts +6 -5
  264. package/src/chain/blocks/types.ts +15 -26
  265. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +2 -1
  266. package/src/chain/blocks/verifyBlocksSignatures.ts +9 -2
  267. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +129 -0
  268. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +38 -0
  269. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  270. package/src/chain/chain.ts +47 -62
  271. package/src/chain/emitter.ts +15 -3
  272. package/src/chain/errors/attestationError.ts +6 -1
  273. package/src/chain/errors/blockError.ts +7 -1
  274. package/src/chain/errors/executionPayloadBid.ts +6 -0
  275. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  276. package/src/chain/forkChoice/index.ts +19 -28
  277. package/src/chain/interface.ts +7 -2
  278. package/src/chain/lightClient/index.ts +15 -3
  279. package/src/chain/opPools/aggregatedAttestationPool.ts +6 -1
  280. package/src/chain/opPools/executionPayloadBidPool.ts +3 -3
  281. package/src/chain/prepareNextSlot.ts +38 -11
  282. package/src/chain/produceBlock/computeNewStateRoot.ts +1 -37
  283. package/src/chain/produceBlock/produceBlockBody.ts +74 -23
  284. package/src/chain/regen/errors.ts +1 -6
  285. package/src/chain/regen/interface.ts +6 -12
  286. package/src/chain/regen/queued.ts +12 -48
  287. package/src/chain/regen/regen.ts +8 -36
  288. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +22 -20
  289. package/src/chain/stateCache/datastore/db.ts +10 -33
  290. package/src/chain/stateCache/datastore/file.ts +5 -6
  291. package/src/chain/stateCache/datastore/types.ts +2 -3
  292. package/src/chain/stateCache/fifoBlockStateCache.ts +1 -10
  293. package/src/chain/stateCache/persistentCheckpointsCache.ts +139 -247
  294. package/src/chain/stateCache/types.ts +8 -14
  295. package/src/chain/validation/aggregateAndProof.ts +13 -0
  296. package/src/chain/validation/attestation.ts +13 -0
  297. package/src/chain/validation/block.ts +30 -7
  298. package/src/chain/validation/executionPayloadBid.ts +21 -3
  299. package/src/chain/validation/executionPayloadEnvelope.ts +32 -13
  300. package/src/chain/validation/payloadAttestationMessage.ts +9 -3
  301. package/src/chain/validation/syncCommittee.ts +5 -1
  302. package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -1
  303. package/src/chain/validatorMonitor.ts +3 -2
  304. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  305. package/src/execution/engine/http.ts +21 -14
  306. package/src/execution/engine/interface.ts +1 -0
  307. package/src/execution/engine/mock.ts +8 -1
  308. package/src/execution/engine/types.ts +41 -0
  309. package/src/network/network.ts +1 -1
  310. package/src/network/processor/gossipHandlers.ts +31 -10
  311. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +3 -1
  312. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +3 -0
  313. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +15 -3
  314. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +11 -0
  315. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +19 -3
  316. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +3 -1
  317. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +3 -12
  318. package/src/node/nodejs.ts +7 -2
  319. package/src/node/notifier.ts +7 -2
  320. package/src/util/sszBytes.ts +21 -3
@@ -8,7 +8,7 @@ import {
8
8
  ProtoBlock,
9
9
  } from "@lodestar/fork-choice";
10
10
  import {ForkSeq} from "@lodestar/params";
11
- import {IBeaconStateView, isExecutionBlockBodyType} from "@lodestar/state-transition";
11
+ import {IBeaconStateView, isExecutionBlockBodyType, isStatePostBellatrix} from "@lodestar/state-transition";
12
12
  import {bellatrix, electra} from "@lodestar/types";
13
13
  import {ErrorAborted, Logger, toRootHex} from "@lodestar/utils";
14
14
  import {ExecutionPayloadStatus, IExecutionEngine} from "../../execution/engine/interface.js";
@@ -152,6 +152,7 @@ export async function verifyBlockExecutionPayload(
152
152
 
153
153
  /** Not null if execution is enabled */
154
154
  const executionPayloadEnabled =
155
+ isStatePostBellatrix(preState0) &&
155
156
  preState0.isExecutionStateType &&
156
157
  isExecutionBlockBodyType(block.message.body) &&
157
158
  preState0.isExecutionEnabled(block.message)
@@ -1,5 +1,10 @@
1
1
  import {BeaconConfig} from "@lodestar/config";
2
- import {IBeaconStateView, getBlockSignatureSets} from "@lodestar/state-transition";
2
+ import {
3
+ IBeaconStateView,
4
+ SyncCommitteeCacheEmpty,
5
+ getBlockSignatureSets,
6
+ isStatePostAltair,
7
+ } from "@lodestar/state-transition";
3
8
  import {IndexedAttestation, SignedBeaconBlock} from "@lodestar/types";
4
9
  import {Logger} from "@lodestar/utils";
5
10
  import {Metrics} from "../../metrics/metrics.js";
@@ -27,7 +32,9 @@ export async function verifyBlocksSignatures(
27
32
  ): Promise<{verifySignaturesTime: number}> {
28
33
  const isValidPromises: Promise<boolean>[] = [];
29
34
  const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
30
- const currentSyncCommitteeIndexed = preState0.currentSyncCommitteeIndexed;
35
+ const currentSyncCommitteeIndexed = isStatePostAltair(preState0)
36
+ ? preState0.currentSyncCommitteeIndexed
37
+ : new SyncCommitteeCacheEmpty();
31
38
 
32
39
  // Verifies signatures after running state transition, so all SyncCommittee signed roots are known at this point.
33
40
  // We must ensure block.slot <= state.slot before running getAllBlockSignatureSets().
@@ -0,0 +1,129 @@
1
+ import {BeaconConfig} from "@lodestar/config";
2
+ import {
3
+ type IBeaconStateViewGloas,
4
+ type PubkeyCache,
5
+ computeTimeAtSlot,
6
+ getExecutionPayloadEnvelopeSignatureSet,
7
+ } from "@lodestar/state-transition";
8
+ import {gloas, ssz} from "@lodestar/types";
9
+ import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
10
+ import {IBlsVerifier} from "../bls/index.js";
11
+
12
+ export type VerifyExecutionPayloadEnvelopeOpts = {
13
+ verifyExecutionRequestsRoot?: boolean;
14
+ };
15
+
16
+ /**
17
+ * Verify execution payload envelope fields against the post-block state.
18
+ *
19
+ * Signature verification and the execution engine call (`verify_and_notify_new_payload`) are
20
+ * performed outside this function, see `verifyExecutionPayloadEnvelopeSignature` and
21
+ * `importExecutionPayload` which run both in parallel with this check.
22
+ *
23
+ * Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.5/specs/gloas/fork-choice.md#new-verify_execution_payload_envelope
24
+ */
25
+ export function verifyExecutionPayloadEnvelope(
26
+ config: BeaconConfig,
27
+ state: IBeaconStateViewGloas,
28
+ envelope: gloas.ExecutionPayloadEnvelope,
29
+ opts?: VerifyExecutionPayloadEnvelopeOpts
30
+ ): void {
31
+ const {verifyExecutionRequestsRoot = true} = opts ?? {};
32
+ const payload = envelope.payload;
33
+
34
+ // Verify consistency with the beacon block.
35
+ // Compute header root on a copy of latestBlockHeader to avoid mutating state.
36
+ const headerValue = {...state.latestBlockHeader};
37
+ if (byteArrayEquals(headerValue.stateRoot, ssz.Root.defaultValue())) {
38
+ headerValue.stateRoot = state.hashTreeRoot();
39
+ }
40
+ const headerRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(headerValue);
41
+ if (!byteArrayEquals(envelope.beaconBlockRoot, headerRoot)) {
42
+ throw new Error(
43
+ `Envelope's block is not the latest block header envelope=${toRootHex(envelope.beaconBlockRoot)} latestBlockHeader=${toRootHex(headerRoot)}`
44
+ );
45
+ }
46
+
47
+ // Verify consistency with the committed bid
48
+ const bid = state.latestExecutionPayloadBid;
49
+ if (envelope.builderIndex !== bid.builderIndex) {
50
+ throw new Error(
51
+ `Builder index mismatch between envelope and committed bid envelope=${envelope.builderIndex} bid=${bid.builderIndex}`
52
+ );
53
+ }
54
+ if (!byteArrayEquals(bid.prevRandao, payload.prevRandao)) {
55
+ throw new Error(
56
+ `Prev randao mismatch between bid and payload bid=${toHex(bid.prevRandao)} payload=${toHex(payload.prevRandao)}`
57
+ );
58
+ }
59
+ if (Number(bid.gasLimit) !== payload.gasLimit) {
60
+ throw new Error(
61
+ `Gas limit mismatch between payload and bid payload=${payload.gasLimit} bid=${Number(bid.gasLimit)}`
62
+ );
63
+ }
64
+ if (!byteArrayEquals(bid.blockHash, payload.blockHash)) {
65
+ throw new Error(
66
+ `Block hash mismatch between payload and bid payload=${toRootHex(payload.blockHash)} bid=${toRootHex(bid.blockHash)}`
67
+ );
68
+ }
69
+ // Verify execution_requests_root matches bid commitment.
70
+ // Can be skipped if already verified during gossip validation.
71
+ if (verifyExecutionRequestsRoot) {
72
+ const requestsRoot = ssz.electra.ExecutionRequests.hashTreeRoot(envelope.executionRequests);
73
+ if (!byteArrayEquals(requestsRoot, bid.executionRequestsRoot)) {
74
+ throw new Error(
75
+ `Execution requests root mismatch envelope=${toRootHex(requestsRoot)} bid=${toRootHex(bid.executionRequestsRoot)}`
76
+ );
77
+ }
78
+ }
79
+
80
+ // Verify the execution payload is valid
81
+ if (payload.slotNumber !== state.slot) {
82
+ throw new Error(`Slot mismatch between payload and state payload=${payload.slotNumber} state=${state.slot}`);
83
+ }
84
+ if (!byteArrayEquals(payload.parentHash, state.latestBlockHash)) {
85
+ throw new Error(
86
+ `Parent hash mismatch between payload and state payload=${toRootHex(payload.parentHash)} state=${toRootHex(state.latestBlockHash)}`
87
+ );
88
+ }
89
+ const expectedTimestamp = computeTimeAtSlot(config, state.slot, state.genesisTime);
90
+ if (payload.timestamp !== expectedTimestamp) {
91
+ throw new Error(
92
+ `Timestamp mismatch between payload and state payload=${payload.timestamp} state=${expectedTimestamp}`
93
+ );
94
+ }
95
+
96
+ // Verify consistency with expected withdrawals
97
+ const payloadWithdrawalsRoot = ssz.capella.Withdrawals.hashTreeRoot(payload.withdrawals);
98
+ const expectedWithdrawalsRoot = ssz.capella.Withdrawals.hashTreeRoot(state.payloadExpectedWithdrawals);
99
+ if (!byteArrayEquals(payloadWithdrawalsRoot, expectedWithdrawalsRoot)) {
100
+ throw new Error(
101
+ `Withdrawals mismatch between payload and expected payload=${toRootHex(payloadWithdrawalsRoot)} expected=${toRootHex(expectedWithdrawalsRoot)}`
102
+ );
103
+ }
104
+
105
+ // Execution engine verification (verify_and_notify_new_payload) is done externally by the caller
106
+ }
107
+
108
+ /**
109
+ * Verify the BLS signature of an execution payload envelope.
110
+ *
111
+ * Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.5/specs/gloas/fork-choice.md#new-verify_execution_payload_envelope_signature
112
+ */
113
+ export async function verifyExecutionPayloadEnvelopeSignature(
114
+ config: BeaconConfig,
115
+ state: IBeaconStateViewGloas,
116
+ pubkeyCache: PubkeyCache,
117
+ signedEnvelope: gloas.SignedExecutionPayloadEnvelope,
118
+ proposerIndex: number,
119
+ bls: IBlsVerifier
120
+ ): Promise<boolean> {
121
+ const signatureSet = getExecutionPayloadEnvelopeSignatureSet(
122
+ config,
123
+ pubkeyCache,
124
+ state,
125
+ signedEnvelope,
126
+ proposerIndex
127
+ );
128
+ return bls.verifySignatureSets([signatureSet]);
129
+ }
@@ -0,0 +1,38 @@
1
+ import {DataAvailabilityStatus} from "@lodestar/state-transition";
2
+ import {gloas} from "@lodestar/types";
3
+ import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
4
+
5
+ // we can now wait for full 12 seconds because sync and reconstruction will try pulling
6
+ // the data columns from the network anyway while the envelope is being processed
7
+ export const PAYLOAD_DATA_AVAILABILITY_TIMEOUT = 12_000;
8
+
9
+ /**
10
+ * Verifies that all payload envelope inputs have their data columns available.
11
+ * - Waits a max of PAYLOAD_DATA_AVAILABILITY_TIMEOUT for all data to be available
12
+ * - Returns the time at which all data was available
13
+ * - Returns the data availability status for each payload input
14
+ */
15
+ export async function verifyPayloadsDataAvailability(
16
+ payloadInputs: PayloadEnvelopeInput[],
17
+ signal: AbortSignal
18
+ ): Promise<{
19
+ dataAvailabilityStatuses: DataAvailabilityStatus[];
20
+ availableTime: number;
21
+ }> {
22
+ const promises: Promise<gloas.DataColumnSidecar[]>[] = [];
23
+ for (const payloadInput of payloadInputs) {
24
+ if (!payloadInput.hasAllData()) {
25
+ promises.push(payloadInput.waitForAllData(PAYLOAD_DATA_AVAILABILITY_TIMEOUT, signal));
26
+ }
27
+ }
28
+ await Promise.all(promises);
29
+
30
+ const availableTime = Math.max(0, Math.max(...payloadInputs.map((payloadInput) => payloadInput.getTimeComplete())));
31
+ const dataAvailabilityStatuses: DataAvailabilityStatus[] = payloadInputs.map((payloadInput) =>
32
+ payloadInput.getBlobKzgCommitments().length === 0
33
+ ? DataAvailabilityStatus.NotRequired
34
+ : DataAvailabilityStatus.Available
35
+ );
36
+
37
+ return {dataAvailabilityStatuses, availableTime};
38
+ }
@@ -5,7 +5,7 @@ import {writeDataColumnsToDb} from "./writeBlockInputToDb.js";
5
5
  /**
6
6
  * Persists payload envelope data to DB. This operation must be eventually completed if a payload is imported.
7
7
  *
8
- * TODO GLOAS: Persist envelope metadata (stateRoot, executionRequests, builderIndex, etc.) without the full
8
+ * TODO GLOAS: Persist envelope metadata (executionRequests, builderIndex, etc.) without the full
9
9
  * execution payload body — only keep the blockHash reference. The EL already stores the payload.
10
10
  * See https://github.com/ChainSafe/lodestar/issues/5671
11
11
  */
@@ -33,23 +33,14 @@ export async function persistPayloadEnvelopeInput(
33
33
  this: BeaconChain,
34
34
  payloadInput: PayloadEnvelopeInput
35
35
  ): Promise<void> {
36
- await writePayloadEnvelopeInputToDb
37
- .call(this, payloadInput)
38
- .catch((e) => {
39
- this.logger.error(
40
- "Error persisting payload envelope in hot db",
41
- {
42
- slot: payloadInput.slot,
43
- root: payloadInput.blockRootHex,
44
- },
45
- e
46
- );
47
- })
48
- .finally(() => {
49
- this.seenPayloadEnvelopeInputCache.prune(payloadInput.blockRootHex);
50
- this.logger.debug("Pruned payload envelope input", {
36
+ await writePayloadEnvelopeInputToDb.call(this, payloadInput).catch((e) => {
37
+ this.logger.error(
38
+ "Error persisting payload envelope in hot db",
39
+ {
51
40
  slot: payloadInput.slot,
52
41
  root: payloadInput.blockRootHex,
53
- });
54
- });
42
+ },
43
+ e
44
+ );
45
+ });
55
46
  }
@@ -2,23 +2,14 @@ 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,
19
11
  GENESIS_SLOT,
20
12
  SLOTS_PER_EPOCH,
21
- isForkPostElectra,
22
13
  isForkPostGloas,
23
14
  } from "@lodestar/params";
24
15
  import {
@@ -30,6 +21,8 @@ import {
30
21
  computeEpochAtSlot,
31
22
  computeStartSlotAtEpoch,
32
23
  getEffectiveBalancesFromStateBytes,
24
+ isStatePostAltair,
25
+ isStatePostElectra,
33
26
  } from "@lodestar/state-transition";
34
27
  import {
35
28
  BeaconBlock,
@@ -98,8 +91,8 @@ import {
98
91
  } from "./opPools/index.js";
99
92
  import {IChainOptions} from "./options.js";
100
93
  import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
101
- import {computeEnvelopeStateRoot, computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
102
- import {AssembledBlockType, BlockType, ProduceFullGloas, ProduceResult} from "./produceBlock/index.js";
94
+ import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
95
+ import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
103
96
  import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
104
97
  import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
105
98
  import {ReprocessController} from "./reprocess.js";
@@ -123,7 +116,7 @@ import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datasto
123
116
  import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
124
117
  import {CPStateDatastore} from "./stateCache/datastore/types.js";
125
118
  import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
126
- import {PersistentCheckpointStateCache, fcCheckpointToHexPayload} from "./stateCache/persistentCheckpointsCache.js";
119
+ import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
127
120
  import {CheckpointStateCache} from "./stateCache/types.js";
128
121
  import {ValidatorMonitor} from "./validatorMonitor.js";
129
122
 
@@ -388,8 +381,7 @@ export class BeaconChain implements IBeaconChain {
388
381
  const {checkpoint} = anchorState.computeAnchorCheckpoint();
389
382
  blockStateCache.add(anchorState);
390
383
  blockStateCache.setHeadState(anchorState);
391
- const payloadPresent = getCheckpointPayloadStatus(config, anchorState, checkpoint.epoch) === PayloadStatus.FULL;
392
- checkpointStateCache.add(checkpoint, anchorState, payloadPresent);
384
+ checkpointStateCache.add(checkpoint, anchorState);
393
385
 
394
386
  const forkChoice = initializeForkChoice(
395
387
  config,
@@ -683,16 +675,16 @@ export class BeaconChain implements IBeaconChain {
683
675
 
684
676
  // TODO GLOAS: Need to revisit the design of this api. Currently we just retrieve FULL state of the checkpoint for backwards compatibility.
685
677
  // because pre-gloas we always store FULL checkpoint state.
686
- const persistedKey = checkpointToDatastoreKey(checkpoint, true);
678
+ const persistedKey = checkpointToDatastoreKey(checkpoint);
687
679
  return this.cpStateDatastore.read(persistedKey);
688
680
  }
689
681
 
690
682
  getStateByCheckpoint(
691
- checkpoint: CheckpointWithPayloadStatus
683
+ checkpoint: CheckpointWithHex
692
684
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null {
693
685
  // finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
694
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
695
- const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHexPayload);
686
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
687
+ const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHex);
696
688
  if (cachedStateCtx) {
697
689
  const block = this.forkChoice.getBlockDefaultStatus(
698
690
  ssz.phase0.BeaconBlockHeader.hashTreeRoot(cachedStateCtx.latestBlockHeader)
@@ -709,10 +701,10 @@ export class BeaconChain implements IBeaconChain {
709
701
  }
710
702
 
711
703
  async getStateOrBytesByCheckpoint(
712
- checkpoint: CheckpointWithPayloadStatus
704
+ checkpoint: CheckpointWithHex
713
705
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
714
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
715
- const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHexPayload);
706
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
707
+ const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHex);
716
708
  if (cachedStateCtx) {
717
709
  const block = this.forkChoice.getBlockDefaultStatus(checkpoint.root);
718
710
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
@@ -878,6 +870,22 @@ export class BeaconChain implements IBeaconChain {
878
870
  );
879
871
  }
880
872
 
873
+ async getExecutionPayloadEnvelope(
874
+ blockSlot: Slot,
875
+ blockRootHex: string
876
+ ): Promise<gloas.SignedExecutionPayloadEnvelope | null> {
877
+ const payloadInput = this.seenPayloadEnvelopeInputCache.get(blockRootHex);
878
+ if (payloadInput?.hasPayloadEnvelope()) {
879
+ return payloadInput.getPayloadEnvelope();
880
+ }
881
+
882
+ return (
883
+ (await this.db.executionPayloadEnvelope.get(fromHex(blockRootHex))) ??
884
+ (await this.db.executionPayloadEnvelopeArchive.get(blockSlot)) ??
885
+ null
886
+ );
887
+ }
888
+
881
889
  async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]> {
882
890
  const fork = this.config.getForkName(blockSlot);
883
891
 
@@ -1052,7 +1060,7 @@ export class BeaconChain implements IBeaconChain {
1052
1060
  body,
1053
1061
  } as AssembledBlockType<T>;
1054
1062
 
1055
- const {newStateRoot, proposerReward, postState} = computeNewStateRoot(this.metrics, state, block);
1063
+ const {newStateRoot, proposerReward} = computeNewStateRoot(this.metrics, state, block);
1056
1064
  block.stateRoot = newStateRoot;
1057
1065
  const blockRoot =
1058
1066
  produceResult.type === BlockType.Full
@@ -1061,23 +1069,9 @@ export class BeaconChain implements IBeaconChain {
1061
1069
  const blockRootHex = toRootHex(blockRoot);
1062
1070
 
1063
1071
  const fork = this.config.getForkName(slot);
1064
- if (isForkPostGloas(fork)) {
1065
- // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1066
- if (produceResult.type !== BlockType.Full) {
1067
- throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1068
- }
1069
-
1070
- const gloasResult = produceResult as ProduceFullGloas;
1071
- const envelope: gloas.ExecutionPayloadEnvelope = {
1072
- payload: gloasResult.executionPayload,
1073
- executionRequests: gloasResult.executionRequests,
1074
- builderIndex: BUILDER_INDEX_SELF_BUILD,
1075
- beaconBlockRoot: blockRoot,
1076
- slot,
1077
- stateRoot: ZERO_HASH,
1078
- };
1079
- const envelopeStateRoot = computeEnvelopeStateRoot(this.metrics, postState, envelope);
1080
- gloasResult.envelopeStateRoot = envelopeStateRoot;
1072
+ // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1073
+ if (isForkPostGloas(fork) && produceResult.type !== BlockType.Full) {
1074
+ throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1081
1075
  }
1082
1076
 
1083
1077
  // Track the produced block for consensus broadcast validations, later validation, etc.
@@ -1283,7 +1277,7 @@ export class BeaconChain implements IBeaconChain {
1283
1277
  * @param blockState state that declares justified checkpoint `checkpoint`
1284
1278
  */
1285
1279
  private justifiedBalancesGetter(
1286
- checkpoint: CheckpointWithPayloadStatus,
1280
+ checkpoint: CheckpointWithHex,
1287
1281
  blockState: IBeaconStateView
1288
1282
  ): EffectiveBalanceIncrements {
1289
1283
  this.metrics?.balancesCache.requests.inc();
@@ -1322,11 +1316,11 @@ export class BeaconChain implements IBeaconChain {
1322
1316
  * @param blockState state that declares justified checkpoint `checkpoint`
1323
1317
  */
1324
1318
  private closestJustifiedBalancesStateToCheckpoint(
1325
- checkpoint: CheckpointWithPayloadStatus,
1319
+ checkpoint: CheckpointWithHex,
1326
1320
  blockState: IBeaconStateView
1327
1321
  ): {state: IBeaconStateView; stateId: string; shouldWarn: boolean} {
1328
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
1329
- const state = this.regen.getCheckpointStateSync(checkpointHexPayload);
1322
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
1323
+ const state = this.regen.getCheckpointStateSync(checkpointHex);
1330
1324
  if (state) {
1331
1325
  return {state, stateId: "checkpoint_state", shouldWarn: false};
1332
1326
  }
@@ -1337,10 +1331,7 @@ export class BeaconChain implements IBeaconChain {
1337
1331
  }
1338
1332
 
1339
1333
  // Find a state in the same branch of checkpoint at same epoch. Balances should exactly the same
1340
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1341
- checkpoint.rootHex,
1342
- checkpoint.payloadStatus
1343
- )) {
1334
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1344
1335
  if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
1345
1336
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1346
1337
  if (descendantBlockState) {
@@ -1356,10 +1347,7 @@ export class BeaconChain implements IBeaconChain {
1356
1347
 
1357
1348
  // Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
1358
1349
  // Note: must call .forwardIterateDescendants() again since nodes are not sorted
1359
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1360
- checkpoint.rootHex,
1361
- checkpoint.payloadStatus
1362
- )) {
1350
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1363
1351
  if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
1364
1352
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1365
1353
  if (descendantBlockState) {
@@ -1404,9 +1392,7 @@ export class BeaconChain implements IBeaconChain {
1404
1392
  metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
1405
1393
 
1406
1394
  const headState = this.getHeadState();
1407
- const fork = this.config.getForkName(headState.slot);
1408
-
1409
- if (isForkPostElectra(fork)) {
1395
+ if (isStatePostElectra(headState)) {
1410
1396
  metrics.pendingDeposits.set(headState.pendingDepositsCount);
1411
1397
  metrics.pendingPartialWithdrawals.set(headState.pendingPartialWithdrawalsCount);
1412
1398
  metrics.pendingConsolidations.set(headState.pendingConsolidationsCount);
@@ -1452,10 +1438,6 @@ export class BeaconChain implements IBeaconChain {
1452
1438
  private onClockEpoch(epoch: Epoch): void {
1453
1439
  this.metrics?.clockEpoch.set(epoch);
1454
1440
 
1455
- if (epoch === this.config.GLOAS_FORK_EPOCH) {
1456
- this.regen.upgradeForGloas(epoch);
1457
- }
1458
-
1459
1441
  this.seenAttesters.prune(epoch);
1460
1442
  this.seenAggregators.prune(epoch);
1461
1443
  this.seenPayloadAttesters.prune(epoch);
@@ -1469,7 +1451,7 @@ export class BeaconChain implements IBeaconChain {
1469
1451
  this.seenContributionAndProof.prune(head.slot);
1470
1452
  }
1471
1453
 
1472
- private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithPayloadStatus): void {
1454
+ private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
1473
1455
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1474
1456
  }
1475
1457
 
@@ -1480,7 +1462,7 @@ export class BeaconChain implements IBeaconChain {
1480
1462
  });
1481
1463
  }
1482
1464
 
1483
- private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithPayloadStatus): Promise<void> {
1465
+ private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1484
1466
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1485
1467
  const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1486
1468
  this.seenBlockProposers.prune(finalizedSlot);
@@ -1521,7 +1503,7 @@ export class BeaconChain implements IBeaconChain {
1521
1503
  }
1522
1504
  }
1523
1505
 
1524
- private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithPayloadStatus): Promise<void> {
1506
+ private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
1525
1507
  if (this.custodyConfig.targetCustodyGroupCount === this.config.NUMBER_OF_CUSTODY_GROUPS) {
1526
1508
  // Custody requirements can only be increased, we can disable dynamic custody updates
1527
1509
  // if the node already maintains custody of all custody groups in case it is configured
@@ -1653,6 +1635,9 @@ export class BeaconChain implements IBeaconChain {
1653
1635
  }
1654
1636
 
1655
1637
  preState = preState.processSlots(block.slot); // Dial preState's slot to block.slot
1638
+ if (!isStatePostAltair(preState)) {
1639
+ throw new Error("Sync committee rewards are not supported before Altair");
1640
+ }
1656
1641
 
1657
1642
  return preState.computeSyncCommitteeRewards(block, validatorIds ?? []);
1658
1643
  }
@@ -1,12 +1,13 @@
1
1
  import {EventEmitter} from "node:events";
2
2
  import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
- import {CheckpointWithPayloadStatus} from "@lodestar/fork-choice";
4
+ import {CheckpointWithHex} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
6
  import {DataColumnSidecar, RootHex, deneb, phase0} from "@lodestar/types";
7
7
  import {SignedExecutionPayloadEnvelope} from "@lodestar/types/gloas";
8
8
  import {PeerIdStr} from "../util/peerId.js";
9
9
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
10
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
10
11
 
11
12
  /**
12
13
  * Important chain events that occur during normal chain operation.
@@ -76,6 +77,11 @@ export enum ChainEvent {
76
77
  * cut-off window passes for waiting on gossip
77
78
  */
78
79
  incompleteBlockInput = "incompleteBlockInput",
80
+ /**
81
+ * Post-gloas: trigger BlockInputSync for payload envelopes whose envelope and/or sampled columns are partially
82
+ * received via gossip but are not complete by time the cut-off window passes for waiting on gossip
83
+ */
84
+ incompletePayloadEnvelope = "incompletePayloadEnvelope",
79
85
  }
80
86
 
81
87
  export type HeadEventData = routes.events.EventData[routes.events.EventType.head];
@@ -93,14 +99,19 @@ export type ChainEventData = {
93
99
  };
94
100
  [ChainEvent.unknownBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
95
101
  [ChainEvent.incompleteBlockInput]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
102
+ [ChainEvent.incompletePayloadEnvelope]: {
103
+ payloadInput: PayloadEnvelopeInput;
104
+ peer: PeerIdStr;
105
+ source: BlockInputSource;
106
+ };
96
107
  [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
97
108
  };
98
109
 
99
110
  export type IChainEvents = ApiEvents & {
100
111
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: IBeaconStateView) => void;
101
112
 
102
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayloadStatus) => void;
113
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
114
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
104
115
 
105
116
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
106
117
 
@@ -116,6 +127,7 @@ export type IChainEvents = ApiEvents & {
116
127
  [ChainEvent.envelopeUnknownBlock]: (data: ChainEventData[ChainEvent.envelopeUnknownBlock]) => void;
117
128
  [ChainEvent.unknownBlockRoot]: (data: ChainEventData[ChainEvent.unknownBlockRoot]) => void;
118
129
  [ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
130
+ [ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
119
131
  [ChainEvent.unknownEnvelopeBlockRoot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRoot]) => void;
120
132
  };
121
133
 
@@ -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> {
@@ -70,6 +70,10 @@ export enum BlockErrorCode {
70
70
  TOO_MANY_KZG_COMMITMENTS = "BLOCK_ERROR_TOO_MANY_KZG_COMMITMENTS",
71
71
  /** Bid parent block root does not match block parent root */
72
72
  BID_PARENT_ROOT_MISMATCH = "BLOCK_ERROR_BID_PARENT_ROOT_MISMATCH",
73
+ /** The parent block's execution payload has been verified as invalid */
74
+ PARENT_EXECUTION_INVALID = "BLOCK_ERROR_PARENT_EXECUTION_INVALID",
75
+ /** The block's parent execution payload (defined by bid.parent_block_hash) has not been seen */
76
+ PARENT_PAYLOAD_UNKNOWN = "BLOCK_ERROR_PARENT_PAYLOAD_UNKNOWN",
73
77
  }
74
78
 
75
79
  type ExecutionErrorStatus = Exclude<
@@ -114,7 +118,9 @@ export type BlockErrorType =
114
118
  | {code: BlockErrorCode.EXECUTION_ENGINE_ERROR; execStatus: ExecutionErrorStatus; errorMessage: string}
115
119
  | {code: BlockErrorCode.DATA_UNAVAILABLE}
116
120
  | {code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS; blobKzgCommitmentsLen: number; commitmentLimit: number}
117
- | {code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH; bidParentRoot: RootHex; blockParentRoot: RootHex};
121
+ | {code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH; bidParentRoot: RootHex; blockParentRoot: RootHex}
122
+ | {code: BlockErrorCode.PARENT_EXECUTION_INVALID; parentRoot: RootHex}
123
+ | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentBlockHash: RootHex};
118
124
 
119
125
  export class BlockGossipError extends GossipActionError<BlockErrorType> {}
120
126
 
@@ -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