@lodestar/beacon-node 1.42.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 -729
  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
@@ -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
 
@@ -8,14 +8,15 @@ import {
8
8
  ProtoArray,
9
9
  ProtoBlock,
10
10
  ForkChoiceOpts as RawForkChoiceOpts,
11
- getCheckpointPayloadStatus,
12
11
  } from "@lodestar/fork-choice";
13
- import {ForkSeq, ZERO_HASH_HEX} from "@lodestar/params";
12
+ import {ZERO_HASH_HEX} from "@lodestar/params";
14
13
  import {
15
14
  DataAvailabilityStatus,
16
15
  IBeaconStateView,
17
16
  computeEpochAtSlot,
18
17
  computeStartSlotAtEpoch,
18
+ isStatePostBellatrix,
19
+ isStatePostGloas,
19
20
  } from "@lodestar/state-transition";
20
21
  import {Slot, ssz} from "@lodestar/types";
21
22
  import {Logger, toRootHex} from "@lodestar/utils";
@@ -102,12 +103,6 @@ export function initializeForkChoiceFromFinalizedState(
102
103
 
103
104
  const isForkPostGloas = computeEpochAtSlot(state.slot) >= config.GLOAS_FORK_EPOCH;
104
105
 
105
- // Determine justified checkpoint payload status
106
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, state, justifiedCheckpoint.epoch);
107
-
108
- // Determine finalized checkpoint payload status
109
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, state, finalizedCheckpoint.epoch);
110
-
111
106
  return new forkchoiceConstructor(
112
107
  config,
113
108
 
@@ -117,8 +112,6 @@ export function initializeForkChoiceFromFinalizedState(
117
112
  finalizedCheckpoint,
118
113
  justifiedBalances,
119
114
  justifiedBalancesGetter,
120
- justifiedPayloadStatus,
121
- finalizedPayloadStatus,
122
115
  {
123
116
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
124
117
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -142,19 +135,21 @@ export function initializeForkChoiceFromFinalizedState(
142
135
  unrealizedFinalizedEpoch: finalizedCheckpoint.epoch,
143
136
  unrealizedFinalizedRoot: toRootHex(finalizedCheckpoint.root),
144
137
 
145
- ...(state.isExecutionStateType && state.isMergeTransitionComplete
138
+ ...(isStatePostBellatrix(state) && state.isExecutionStateType && state.isMergeTransitionComplete
146
139
  ? {
147
- executionPayloadBlockHash: toRootHex(state.latestBlockHash),
140
+ executionPayloadBlockHash: isStatePostGloas(state)
141
+ ? toRootHex(state.latestBlockHash)
142
+ : toRootHex(state.latestExecutionPayloadHeader.blockHash),
148
143
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
149
144
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
150
- executionPayloadNumber: config.getForkSeq(state.slot) >= ForkSeq.gloas ? 0 : state.payloadBlockNumber,
145
+ executionPayloadNumber: isStatePostGloas(state) ? 0 : state.payloadBlockNumber,
151
146
  executionStatus: blockHeader.slot === GENESIS_SLOT ? ExecutionStatus.Valid : ExecutionStatus.Syncing,
152
147
  }
153
148
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
154
149
 
155
150
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
156
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
157
- parentBlockHash: isForkPostGloas ? toRootHex(state.latestBlockHash) : null,
151
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
152
+ parentBlockHash: isStatePostGloas(state) ? toRootHex(state.latestBlockHash) : null,
158
153
  },
159
154
  currentSlot
160
155
  ),
@@ -200,19 +195,12 @@ export function initializeForkChoiceFromUnfinalizedState(
200
195
 
201
196
  const isForkPostGloas = computeEpochAtSlot(unfinalizedState.slot) >= config.GLOAS_FORK_EPOCH;
202
197
 
203
- // For unfinalized state, use getCheckpointPayloadStatus to determine the correct status.
204
- // It checks state.execution_payload_availability to determine EMPTY vs FULL.
205
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, justifiedCheckpoint.epoch);
206
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, finalizedCheckpoint.epoch);
207
-
208
198
  const store = new ForkChoiceStore(
209
199
  currentSlot,
210
200
  justifiedCheckpoint,
211
201
  finalizedCheckpoint,
212
202
  justifiedBalances,
213
203
  justifiedBalancesGetter,
214
- justifiedPayloadStatus,
215
- finalizedPayloadStatus,
216
204
  {
217
205
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
218
206
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -237,20 +225,23 @@ export function initializeForkChoiceFromUnfinalizedState(
237
225
  unrealizedFinalizedEpoch: finalizedCheckpoint.epoch,
238
226
  unrealizedFinalizedRoot: toRootHex(finalizedCheckpoint.root),
239
227
 
240
- ...(unfinalizedState.isExecutionStateType && unfinalizedState.isMergeTransitionComplete
228
+ ...(isStatePostBellatrix(unfinalizedState) &&
229
+ unfinalizedState.isExecutionStateType &&
230
+ unfinalizedState.isMergeTransitionComplete
241
231
  ? {
242
- executionPayloadBlockHash: toRootHex(unfinalizedState.latestBlockHash),
232
+ executionPayloadBlockHash: isStatePostGloas(unfinalizedState)
233
+ ? toRootHex(unfinalizedState.latestBlockHash)
234
+ : toRootHex(unfinalizedState.latestExecutionPayloadHeader.blockHash),
243
235
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
244
236
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
245
- executionPayloadNumber:
246
- config.getForkSeq(unfinalizedState.slot) >= ForkSeq.gloas ? 0 : unfinalizedState.payloadBlockNumber,
237
+ executionPayloadNumber: isStatePostGloas(unfinalizedState) ? 0 : unfinalizedState.payloadBlockNumber,
247
238
  executionStatus: blockHeader.slot === GENESIS_SLOT ? ExecutionStatus.Valid : ExecutionStatus.Syncing,
248
239
  }
249
240
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
250
241
 
251
242
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
252
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
253
- parentBlockHash: isForkPostGloas ? toRootHex(unfinalizedState.latestBlockHash) : null,
243
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
244
+ parentBlockHash: isStatePostGloas(unfinalizedState) ? toRootHex(unfinalizedState.latestBlockHash) : null,
254
245
  };
255
246
 
256
247
  const parentSlot = blockHeader.slot - 1;
@@ -1,6 +1,6 @@
1
1
  import {Type} from "@chainsafe/ssz";
2
2
  import {BeaconConfig} from "@lodestar/config";
3
- import {CheckpointWithHex, CheckpointWithPayloadStatus, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
3
+ import {CheckpointWithHex, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
4
4
  import {EpochShuffling, IBeaconStateView, PubkeyCache} from "@lodestar/state-transition";
5
5
  import {
6
6
  BeaconBlock,
@@ -18,6 +18,7 @@ import {
18
18
  altair,
19
19
  capella,
20
20
  deneb,
21
+ gloas,
21
22
  phase0,
22
23
  rewards,
23
24
  } from "@lodestar/types";
@@ -194,7 +195,7 @@ export interface IBeaconChain {
194
195
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null;
195
196
  /** Return state bytes by checkpoint */
196
197
  getStateOrBytesByCheckpoint(
197
- checkpoint: CheckpointWithPayloadStatus
198
+ checkpoint: CheckpointWithHex
198
199
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null>;
199
200
 
200
201
  /**
@@ -226,6 +227,10 @@ export interface IBeaconChain {
226
227
  indices: number[]
227
228
  ): Promise<(Uint8Array | undefined)[]>;
228
229
  getSerializedExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null>;
230
+ getExecutionPayloadEnvelope(
231
+ blockSlot: Slot,
232
+ blockRootHex: string
233
+ ): Promise<gloas.SignedExecutionPayloadEnvelope | null>;
229
234
 
230
235
  produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody>;
231
236
  produceBlock(blockAttributes: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}): Promise<{
@@ -21,7 +21,7 @@ import {
21
21
  isForkPostElectra,
22
22
  } from "@lodestar/params";
23
23
  import {
24
- IBeaconStateView,
24
+ type IBeaconStateViewAltair,
25
25
  computeStartSlotAtEpoch,
26
26
  computeSyncPeriodAtEpoch,
27
27
  computeSyncPeriodAtSlot,
@@ -260,7 +260,11 @@ export class LightClientServer {
260
260
  * - Persist state witness
261
261
  * - Use block's syncAggregate
262
262
  */
263
- onImportBlockHead(block: BeaconBlock<ForkPostAltair>, postState: IBeaconStateView, parentBlockSlot: Slot): void {
263
+ onImportBlockHead(
264
+ block: BeaconBlock<ForkPostAltair>,
265
+ postState: IBeaconStateViewAltair,
266
+ parentBlockSlot: Slot
267
+ ): void {
264
268
  // TEMP: To disable this functionality for fork_choice spec tests.
265
269
  // Since the tests have deep-reorgs attested data is not available often printing lots of error logs.
266
270
  // While this function is only called for head blocks, best to disable.
@@ -268,6 +272,14 @@ export class LightClientServer {
268
272
  return;
269
273
  }
270
274
 
275
+ // TODO GLOAS: Light client updates for gloas are not yet updated in the spec.
276
+ // The block body no longer contains execution payload, so `blockToLightClientHeader`
277
+ // cannot construct a header from a gloas block. Skip all light client processing
278
+ // for post-gloas blocks, revisit once there is a spec for it.
279
+ if (this.config.getForkSeq(block.slot) >= ForkSeq.gloas) {
280
+ return;
281
+ }
282
+
271
283
  // What is the syncAggregate signing?
272
284
  // From the state-transition
273
285
  // ```
@@ -396,7 +408,7 @@ export class LightClientServer {
396
408
 
397
409
  private async persistPostBlockImportData(
398
410
  block: BeaconBlock<ForkPostAltair>,
399
- postState: IBeaconStateView,
411
+ postState: IBeaconStateViewAltair,
400
412
  parentBlockSlot: Slot
401
413
  ): Promise<void> {
402
414
  const blockSlot = block.slot;