@lodestar/beacon-node 1.43.0-dev.2740f92909 → 1.43.0-dev.38479366cc

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 (315) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +4 -6
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  4. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  6. package/lib/api/impl/lodestar/index.js +1 -1
  7. package/lib/api/impl/lodestar/index.js.map +1 -1
  8. package/lib/api/impl/validator/index.d.ts.map +1 -1
  9. package/lib/api/impl/validator/index.js +1 -4
  10. package/lib/api/impl/validator/index.js.map +1 -1
  11. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  12. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  13. package/lib/chain/GetBlobsTracker.js +1 -2
  14. package/lib/chain/GetBlobsTracker.js.map +1 -1
  15. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  16. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  17. package/lib/chain/archiveStore/interface.d.ts +4 -4
  18. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  19. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  20. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  21. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
  22. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  23. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  24. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  25. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  26. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  27. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  28. package/lib/chain/blocks/importBlock.js +32 -37
  29. package/lib/chain/blocks/importBlock.js.map +1 -1
  30. package/lib/chain/blocks/importExecutionPayload.d.ts +25 -13
  31. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  32. package/lib/chain/blocks/importExecutionPayload.js +73 -84
  33. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  34. package/lib/chain/blocks/index.d.ts +5 -3
  35. package/lib/chain/blocks/index.d.ts.map +1 -1
  36. package/lib/chain/blocks/index.js +29 -11
  37. package/lib/chain/blocks/index.js.map +1 -1
  38. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +3 -0
  39. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  40. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +20 -0
  41. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  42. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  43. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  44. package/lib/chain/blocks/payloadEnvelopeProcessor.js +7 -5
  45. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  46. package/lib/chain/blocks/types.d.ts +15 -21
  47. package/lib/chain/blocks/types.d.ts.map +1 -1
  48. package/lib/chain/blocks/utils/chainSegment.d.ts +23 -2
  49. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  50. package/lib/chain/blocks/utils/chainSegment.js +81 -12
  51. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  52. package/lib/chain/blocks/verifyBlock.d.ts +3 -2
  53. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  54. package/lib/chain/blocks/verifyBlock.js +30 -5
  55. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  56. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  57. package/lib/chain/blocks/verifyBlocksSanityChecks.js +15 -4
  58. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  59. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  60. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  61. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +76 -0
  62. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  63. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  64. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  65. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +25 -0
  66. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  67. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  68. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  69. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  70. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  71. package/lib/chain/chain.d.ts +6 -5
  72. package/lib/chain/chain.d.ts.map +1 -1
  73. package/lib/chain/chain.js +33 -42
  74. package/lib/chain/chain.js.map +1 -1
  75. package/lib/chain/emitter.d.ts +16 -4
  76. package/lib/chain/emitter.d.ts.map +1 -1
  77. package/lib/chain/emitter.js +5 -0
  78. package/lib/chain/emitter.js.map +1 -1
  79. package/lib/chain/errors/attestationError.d.ts +8 -1
  80. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  81. package/lib/chain/errors/attestationError.js +4 -0
  82. package/lib/chain/errors/attestationError.js.map +1 -1
  83. package/lib/chain/errors/blockError.d.ts +8 -1
  84. package/lib/chain/errors/blockError.d.ts.map +1 -1
  85. package/lib/chain/errors/blockError.js +2 -0
  86. package/lib/chain/errors/blockError.js.map +1 -1
  87. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  88. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  89. package/lib/chain/errors/executionPayloadBid.js +1 -0
  90. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  91. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  92. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  93. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  94. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  95. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  96. package/lib/chain/forkChoice/index.js +11 -15
  97. package/lib/chain/forkChoice/index.js.map +1 -1
  98. package/lib/chain/interface.d.ts +5 -4
  99. package/lib/chain/interface.d.ts.map +1 -1
  100. package/lib/chain/interface.js.map +1 -1
  101. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  102. package/lib/chain/prepareNextSlot.js +48 -22
  103. package/lib/chain/prepareNextSlot.js.map +1 -1
  104. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
  105. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  106. package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
  107. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  108. package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -8
  109. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  110. package/lib/chain/produceBlock/produceBlockBody.js +55 -24
  111. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  112. package/lib/chain/regen/errors.d.ts +1 -11
  113. package/lib/chain/regen/errors.d.ts.map +1 -1
  114. package/lib/chain/regen/errors.js +0 -2
  115. package/lib/chain/regen/errors.js.map +1 -1
  116. package/lib/chain/regen/interface.d.ts +6 -12
  117. package/lib/chain/regen/interface.d.ts.map +1 -1
  118. package/lib/chain/regen/queued.d.ts +6 -11
  119. package/lib/chain/regen/queued.d.ts.map +1 -1
  120. package/lib/chain/regen/queued.js +8 -40
  121. package/lib/chain/regen/queued.js.map +1 -1
  122. package/lib/chain/regen/regen.d.ts +0 -5
  123. package/lib/chain/regen/regen.d.ts.map +1 -1
  124. package/lib/chain/regen/regen.js +7 -34
  125. package/lib/chain/regen/regen.js.map +1 -1
  126. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +11 -4
  127. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  128. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +20 -18
  129. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  130. package/lib/chain/stateCache/datastore/db.d.ts +5 -4
  131. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
  132. package/lib/chain/stateCache/datastore/db.js +10 -32
  133. package/lib/chain/stateCache/datastore/db.js.map +1 -1
  134. package/lib/chain/stateCache/datastore/file.d.ts +1 -1
  135. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
  136. package/lib/chain/stateCache/datastore/file.js +5 -5
  137. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  138. package/lib/chain/stateCache/datastore/types.d.ts +1 -1
  139. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
  140. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -7
  141. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  142. package/lib/chain/stateCache/fifoBlockStateCache.js +0 -8
  143. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  144. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +13 -30
  145. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  146. package/lib/chain/stateCache/persistentCheckpointsCache.js +120 -216
  147. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  148. package/lib/chain/stateCache/types.d.ts +8 -15
  149. package/lib/chain/stateCache/types.d.ts.map +1 -1
  150. package/lib/chain/stateCache/types.js.map +1 -1
  151. package/lib/chain/validation/aggregateAndProof.js +12 -0
  152. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  153. package/lib/chain/validation/attestation.d.ts.map +1 -1
  154. package/lib/chain/validation/attestation.js +12 -0
  155. package/lib/chain/validation/attestation.js.map +1 -1
  156. package/lib/chain/validation/block.d.ts.map +1 -1
  157. package/lib/chain/validation/block.js +1 -0
  158. package/lib/chain/validation/block.js.map +1 -1
  159. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  160. package/lib/chain/validation/executionPayloadBid.js +13 -1
  161. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  162. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  163. package/lib/chain/validation/executionPayloadEnvelope.js +21 -11
  164. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  165. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  166. package/lib/chain/validation/payloadAttestationMessage.js +4 -3
  167. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  168. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  169. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  170. package/lib/execution/engine/http.d.ts.map +1 -1
  171. package/lib/execution/engine/http.js +21 -14
  172. package/lib/execution/engine/http.js.map +1 -1
  173. package/lib/execution/engine/interface.d.ts +1 -0
  174. package/lib/execution/engine/interface.d.ts.map +1 -1
  175. package/lib/execution/engine/mock.d.ts.map +1 -1
  176. package/lib/execution/engine/mock.js +6 -0
  177. package/lib/execution/engine/mock.js.map +1 -1
  178. package/lib/execution/engine/types.d.ts +20 -0
  179. package/lib/execution/engine/types.d.ts.map +1 -1
  180. package/lib/execution/engine/types.js +18 -0
  181. package/lib/execution/engine/types.js.map +1 -1
  182. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  183. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  184. package/lib/metrics/metrics/lodestar.js +4 -0
  185. package/lib/metrics/metrics/lodestar.js.map +1 -1
  186. package/lib/network/gossip/topic.d.ts +3 -729
  187. package/lib/network/gossip/topic.d.ts.map +1 -1
  188. package/lib/network/network.js +1 -1
  189. package/lib/network/network.js.map +1 -1
  190. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  191. package/lib/network/processor/gossipHandlers.js +24 -7
  192. package/lib/network/processor/gossipHandlers.js.map +1 -1
  193. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  194. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  195. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  196. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  197. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  198. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  199. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  200. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  201. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  202. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  203. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  204. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  205. package/lib/node/nodejs.d.ts.map +1 -1
  206. package/lib/node/nodejs.js +4 -2
  207. package/lib/node/nodejs.js.map +1 -1
  208. package/lib/node/notifier.js +7 -1
  209. package/lib/node/notifier.js.map +1 -1
  210. package/lib/sync/range/batch.d.ts +12 -2
  211. package/lib/sync/range/batch.d.ts.map +1 -1
  212. package/lib/sync/range/batch.js +56 -30
  213. package/lib/sync/range/batch.js.map +1 -1
  214. package/lib/sync/range/chain.d.ts +6 -2
  215. package/lib/sync/range/chain.d.ts.map +1 -1
  216. package/lib/sync/range/chain.js +4 -3
  217. package/lib/sync/range/chain.js.map +1 -1
  218. package/lib/sync/range/range.d.ts.map +1 -1
  219. package/lib/sync/range/range.js +17 -6
  220. package/lib/sync/range/range.js.map +1 -1
  221. package/lib/sync/types.d.ts +34 -0
  222. package/lib/sync/types.d.ts.map +1 -1
  223. package/lib/sync/types.js +34 -0
  224. package/lib/sync/types.js.map +1 -1
  225. package/lib/sync/unknownBlock.d.ts +24 -1
  226. package/lib/sync/unknownBlock.d.ts.map +1 -1
  227. package/lib/sync/unknownBlock.js +649 -53
  228. package/lib/sync/unknownBlock.js.map +1 -1
  229. package/lib/sync/utils/downloadByRange.d.ts +46 -10
  230. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  231. package/lib/sync/utils/downloadByRange.js +147 -24
  232. package/lib/sync/utils/downloadByRange.js.map +1 -1
  233. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  234. package/lib/sync/utils/downloadByRoot.js +6 -2
  235. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  236. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  237. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  238. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  239. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  240. package/lib/util/sszBytes.d.ts.map +1 -1
  241. package/lib/util/sszBytes.js +16 -3
  242. package/lib/util/sszBytes.js.map +1 -1
  243. package/package.json +17 -16
  244. package/src/api/impl/beacon/blocks/index.ts +6 -6
  245. package/src/api/impl/beacon/state/utils.ts +2 -2
  246. package/src/api/impl/lodestar/index.ts +1 -1
  247. package/src/api/impl/validator/index.ts +3 -6
  248. package/src/chain/GetBlobsTracker.ts +1 -2
  249. package/src/chain/archiveStore/archiveStore.ts +5 -5
  250. package/src/chain/archiveStore/interface.ts +4 -4
  251. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
  252. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  253. package/src/chain/blocks/importBlock.ts +31 -42
  254. package/src/chain/blocks/importExecutionPayload.ts +93 -104
  255. package/src/chain/blocks/index.ts +45 -14
  256. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +27 -0
  257. package/src/chain/blocks/payloadEnvelopeProcessor.ts +7 -6
  258. package/src/chain/blocks/types.ts +15 -26
  259. package/src/chain/blocks/utils/chainSegment.ts +106 -17
  260. package/src/chain/blocks/verifyBlock.ts +35 -6
  261. package/src/chain/blocks/verifyBlocksSanityChecks.ts +16 -7
  262. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +129 -0
  263. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +38 -0
  264. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  265. package/src/chain/chain.ts +48 -65
  266. package/src/chain/emitter.ts +15 -3
  267. package/src/chain/errors/attestationError.ts +6 -1
  268. package/src/chain/errors/blockError.ts +4 -1
  269. package/src/chain/errors/executionPayloadBid.ts +6 -0
  270. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  271. package/src/chain/forkChoice/index.ts +8 -20
  272. package/src/chain/interface.ts +9 -3
  273. package/src/chain/prepareNextSlot.ts +62 -23
  274. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
  275. package/src/chain/produceBlock/produceBlockBody.ts +73 -27
  276. package/src/chain/regen/errors.ts +1 -6
  277. package/src/chain/regen/interface.ts +6 -12
  278. package/src/chain/regen/queued.ts +12 -48
  279. package/src/chain/regen/regen.ts +8 -36
  280. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +22 -20
  281. package/src/chain/stateCache/datastore/db.ts +10 -33
  282. package/src/chain/stateCache/datastore/file.ts +5 -6
  283. package/src/chain/stateCache/datastore/types.ts +2 -3
  284. package/src/chain/stateCache/fifoBlockStateCache.ts +1 -10
  285. package/src/chain/stateCache/persistentCheckpointsCache.ts +139 -247
  286. package/src/chain/stateCache/types.ts +8 -14
  287. package/src/chain/validation/aggregateAndProof.ts +13 -0
  288. package/src/chain/validation/attestation.ts +13 -0
  289. package/src/chain/validation/block.ts +1 -0
  290. package/src/chain/validation/executionPayloadBid.ts +14 -0
  291. package/src/chain/validation/executionPayloadEnvelope.ts +22 -12
  292. package/src/chain/validation/payloadAttestationMessage.ts +5 -3
  293. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  294. package/src/execution/engine/http.ts +21 -14
  295. package/src/execution/engine/interface.ts +1 -0
  296. package/src/execution/engine/mock.ts +8 -1
  297. package/src/execution/engine/types.ts +41 -0
  298. package/src/metrics/metrics/lodestar.ts +4 -0
  299. package/src/network/network.ts +1 -1
  300. package/src/network/processor/gossipHandlers.ts +30 -11
  301. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  302. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  303. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  304. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  305. package/src/node/nodejs.ts +4 -2
  306. package/src/node/notifier.ts +8 -1
  307. package/src/sync/range/batch.ts +90 -35
  308. package/src/sync/range/chain.ts +13 -5
  309. package/src/sync/range/range.ts +18 -6
  310. package/src/sync/types.ts +72 -0
  311. package/src/sync/unknownBlock.ts +810 -57
  312. package/src/sync/utils/downloadByRange.ts +256 -39
  313. package/src/sync/utils/downloadByRoot.ts +12 -2
  314. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  315. package/src/util/sszBytes.ts +21 -3
@@ -2,17 +2,9 @@ import path from "node:path";
2
2
  import {PrivateKey} from "@libp2p/interface";
3
3
  import {Type} from "@chainsafe/ssz";
4
4
  import {BeaconConfig} from "@lodestar/config";
5
- import {
6
- CheckpointWithPayloadStatus,
7
- IForkChoice,
8
- PayloadStatus,
9
- ProtoBlock,
10
- UpdateHeadOpt,
11
- getCheckpointPayloadStatus,
12
- } from "@lodestar/fork-choice";
5
+ import {CheckpointWithHex, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
13
6
  import {LoggerNode} from "@lodestar/logger/node";
14
7
  import {
15
- BUILDER_INDEX_SELF_BUILD,
16
8
  EFFECTIVE_BALANCE_INCREMENT,
17
9
  type ForkPostFulu,
18
10
  type ForkPostGloas,
@@ -31,7 +23,6 @@ import {
31
23
  getEffectiveBalancesFromStateBytes,
32
24
  isStatePostAltair,
33
25
  isStatePostElectra,
34
- isStatePostGloas,
35
26
  } from "@lodestar/state-transition";
36
27
  import {
37
28
  BeaconBlock,
@@ -48,6 +39,7 @@ import {
48
39
  ValidatorIndex,
49
40
  Wei,
50
41
  deneb,
42
+ electra,
51
43
  gloas,
52
44
  isBlindedBeaconBlock,
53
45
  phase0,
@@ -100,8 +92,8 @@ import {
100
92
  } from "./opPools/index.js";
101
93
  import {IChainOptions} from "./options.js";
102
94
  import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
103
- import {computeNewStateRoot, computePayloadEnvelopeStateRoot} from "./produceBlock/computeNewStateRoot.js";
104
- import {AssembledBlockType, BlockType, ProduceFullGloas, ProduceResult} from "./produceBlock/index.js";
95
+ import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
96
+ import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
105
97
  import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
106
98
  import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
107
99
  import {ReprocessController} from "./reprocess.js";
@@ -125,7 +117,7 @@ import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datasto
125
117
  import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
126
118
  import {CPStateDatastore} from "./stateCache/datastore/types.js";
127
119
  import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
128
- import {PersistentCheckpointStateCache, fcCheckpointToHexPayload} from "./stateCache/persistentCheckpointsCache.js";
120
+ import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
129
121
  import {CheckpointStateCache} from "./stateCache/types.js";
130
122
  import {ValidatorMonitor} from "./validatorMonitor.js";
131
123
 
@@ -390,8 +382,7 @@ export class BeaconChain implements IBeaconChain {
390
382
  const {checkpoint} = anchorState.computeAnchorCheckpoint();
391
383
  blockStateCache.add(anchorState);
392
384
  blockStateCache.setHeadState(anchorState);
393
- const payloadPresent = getCheckpointPayloadStatus(config, anchorState, checkpoint.epoch) === PayloadStatus.FULL;
394
- checkpointStateCache.add(checkpoint, anchorState, payloadPresent);
385
+ checkpointStateCache.add(checkpoint, anchorState);
395
386
 
396
387
  const forkChoice = initializeForkChoice(
397
388
  config,
@@ -685,16 +676,16 @@ export class BeaconChain implements IBeaconChain {
685
676
 
686
677
  // TODO GLOAS: Need to revisit the design of this api. Currently we just retrieve FULL state of the checkpoint for backwards compatibility.
687
678
  // because pre-gloas we always store FULL checkpoint state.
688
- const persistedKey = checkpointToDatastoreKey(checkpoint, true);
679
+ const persistedKey = checkpointToDatastoreKey(checkpoint);
689
680
  return this.cpStateDatastore.read(persistedKey);
690
681
  }
691
682
 
692
683
  getStateByCheckpoint(
693
- checkpoint: CheckpointWithPayloadStatus
684
+ checkpoint: CheckpointWithHex
694
685
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null {
695
686
  // finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
696
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
697
- const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHexPayload);
687
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
688
+ const cachedStateCtx = this.regen.getCheckpointStateSync(checkpointHex);
698
689
  if (cachedStateCtx) {
699
690
  const block = this.forkChoice.getBlockDefaultStatus(
700
691
  ssz.phase0.BeaconBlockHeader.hashTreeRoot(cachedStateCtx.latestBlockHeader)
@@ -711,10 +702,10 @@ export class BeaconChain implements IBeaconChain {
711
702
  }
712
703
 
713
704
  async getStateOrBytesByCheckpoint(
714
- checkpoint: CheckpointWithPayloadStatus
705
+ checkpoint: CheckpointWithHex
715
706
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
716
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
717
- const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHexPayload);
707
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
708
+ const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHex);
718
709
  if (cachedStateCtx) {
719
710
  const block = this.forkChoice.getBlockDefaultStatus(checkpoint.root);
720
711
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
@@ -896,6 +887,21 @@ export class BeaconChain implements IBeaconChain {
896
887
  );
897
888
  }
898
889
 
890
+ async getParentExecutionRequests(
891
+ parentBlockSlot: Slot,
892
+ parentBlockRootHex: RootHex
893
+ ): Promise<electra.ExecutionRequests> {
894
+ // at the fork boundary, parent is pre-gloas
895
+ if (!isForkPostGloas(this.config.getForkName(parentBlockSlot))) {
896
+ return ssz.electra.ExecutionRequests.defaultValue();
897
+ }
898
+ const envelope = await this.getExecutionPayloadEnvelope(parentBlockSlot, parentBlockRootHex);
899
+ if (envelope === null) {
900
+ throw Error(`Parent execution payload envelope not found slot=${parentBlockSlot}, root=${parentBlockRootHex}`);
901
+ }
902
+ return envelope.message.executionRequests;
903
+ }
904
+
899
905
  async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]> {
900
906
  const fork = this.config.getForkName(blockSlot);
901
907
 
@@ -1070,7 +1076,7 @@ export class BeaconChain implements IBeaconChain {
1070
1076
  body,
1071
1077
  } as AssembledBlockType<T>;
1072
1078
 
1073
- const {newStateRoot, proposerReward, postBlockState} = computeNewStateRoot(this.metrics, state, block);
1079
+ const {newStateRoot, proposerReward} = computeNewStateRoot(this.metrics, state, block);
1074
1080
  block.stateRoot = newStateRoot;
1075
1081
  const blockRoot =
1076
1082
  produceResult.type === BlockType.Full
@@ -1079,26 +1085,9 @@ export class BeaconChain implements IBeaconChain {
1079
1085
  const blockRootHex = toRootHex(blockRoot);
1080
1086
 
1081
1087
  const fork = this.config.getForkName(slot);
1082
- if (isForkPostGloas(fork)) {
1083
- // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1084
- if (produceResult.type !== BlockType.Full) {
1085
- throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1086
- }
1087
-
1088
- const gloasResult = produceResult as ProduceFullGloas;
1089
- const envelope: gloas.ExecutionPayloadEnvelope = {
1090
- payload: gloasResult.executionPayload,
1091
- executionRequests: gloasResult.executionRequests,
1092
- builderIndex: BUILDER_INDEX_SELF_BUILD,
1093
- beaconBlockRoot: blockRoot,
1094
- slot,
1095
- stateRoot: ZERO_HASH,
1096
- };
1097
- if (!isStatePostGloas(postBlockState)) {
1098
- throw Error(`Expected gloas+ post-state for execution payload envelope, got fork=${postBlockState.forkName}`);
1099
- }
1100
- const payloadEnvelopeStateRoot = computePayloadEnvelopeStateRoot(this.metrics, postBlockState, envelope);
1101
- gloasResult.payloadEnvelopeStateRoot = payloadEnvelopeStateRoot;
1088
+ // TODO GLOAS: we should retire BlockType post-gloas, may need a new enum for self vs non-self built
1089
+ if (isForkPostGloas(fork) && produceResult.type !== BlockType.Full) {
1090
+ throw Error(`Unexpected block type=${produceResult.type} for post-gloas fork=${fork}`);
1102
1091
  }
1103
1092
 
1104
1093
  // Track the produced block for consensus broadcast validations, later validation, etc.
@@ -1109,11 +1098,15 @@ export class BeaconChain implements IBeaconChain {
1109
1098
  }
1110
1099
 
1111
1100
  async processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void> {
1112
- return this.blockProcessor.processBlocksJob([block], opts);
1101
+ return this.blockProcessor.processBlocksJob([block], null, opts);
1113
1102
  }
1114
1103
 
1115
- async processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void> {
1116
- return this.blockProcessor.processBlocksJob(blocks, opts);
1104
+ async processChainSegment(
1105
+ blocks: IBlockInput[],
1106
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
1107
+ opts?: ImportBlockOpts
1108
+ ): Promise<void> {
1109
+ await this.blockProcessor.processBlocksJob(blocks, payloadEnvelopes, opts);
1117
1110
  }
1118
1111
 
1119
1112
  async processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void> {
@@ -1304,7 +1297,7 @@ export class BeaconChain implements IBeaconChain {
1304
1297
  * @param blockState state that declares justified checkpoint `checkpoint`
1305
1298
  */
1306
1299
  private justifiedBalancesGetter(
1307
- checkpoint: CheckpointWithPayloadStatus,
1300
+ checkpoint: CheckpointWithHex,
1308
1301
  blockState: IBeaconStateView
1309
1302
  ): EffectiveBalanceIncrements {
1310
1303
  this.metrics?.balancesCache.requests.inc();
@@ -1343,11 +1336,11 @@ export class BeaconChain implements IBeaconChain {
1343
1336
  * @param blockState state that declares justified checkpoint `checkpoint`
1344
1337
  */
1345
1338
  private closestJustifiedBalancesStateToCheckpoint(
1346
- checkpoint: CheckpointWithPayloadStatus,
1339
+ checkpoint: CheckpointWithHex,
1347
1340
  blockState: IBeaconStateView
1348
1341
  ): {state: IBeaconStateView; stateId: string; shouldWarn: boolean} {
1349
- const checkpointHexPayload = fcCheckpointToHexPayload(checkpoint);
1350
- const state = this.regen.getCheckpointStateSync(checkpointHexPayload);
1342
+ const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
1343
+ const state = this.regen.getCheckpointStateSync(checkpointHex);
1351
1344
  if (state) {
1352
1345
  return {state, stateId: "checkpoint_state", shouldWarn: false};
1353
1346
  }
@@ -1358,10 +1351,7 @@ export class BeaconChain implements IBeaconChain {
1358
1351
  }
1359
1352
 
1360
1353
  // Find a state in the same branch of checkpoint at same epoch. Balances should exactly the same
1361
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1362
- checkpoint.rootHex,
1363
- checkpoint.payloadStatus
1364
- )) {
1354
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1365
1355
  if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
1366
1356
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1367
1357
  if (descendantBlockState) {
@@ -1377,10 +1367,7 @@ export class BeaconChain implements IBeaconChain {
1377
1367
 
1378
1368
  // Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
1379
1369
  // Note: must call .forwardIterateDescendants() again since nodes are not sorted
1380
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1381
- checkpoint.rootHex,
1382
- checkpoint.payloadStatus
1383
- )) {
1370
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1384
1371
  if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
1385
1372
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1386
1373
  if (descendantBlockState) {
@@ -1471,10 +1458,6 @@ export class BeaconChain implements IBeaconChain {
1471
1458
  private onClockEpoch(epoch: Epoch): void {
1472
1459
  this.metrics?.clockEpoch.set(epoch);
1473
1460
 
1474
- if (epoch === this.config.GLOAS_FORK_EPOCH) {
1475
- this.regen.upgradeForGloas(epoch);
1476
- }
1477
-
1478
1461
  this.seenAttesters.prune(epoch);
1479
1462
  this.seenAggregators.prune(epoch);
1480
1463
  this.seenPayloadAttesters.prune(epoch);
@@ -1488,7 +1471,7 @@ export class BeaconChain implements IBeaconChain {
1488
1471
  this.seenContributionAndProof.prune(head.slot);
1489
1472
  }
1490
1473
 
1491
- private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithPayloadStatus): void {
1474
+ private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
1492
1475
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1493
1476
  }
1494
1477
 
@@ -1499,7 +1482,7 @@ export class BeaconChain implements IBeaconChain {
1499
1482
  });
1500
1483
  }
1501
1484
 
1502
- private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithPayloadStatus): Promise<void> {
1485
+ private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1503
1486
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1504
1487
  const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1505
1488
  this.seenBlockProposers.prune(finalizedSlot);
@@ -1540,7 +1523,7 @@ export class BeaconChain implements IBeaconChain {
1540
1523
  }
1541
1524
  }
1542
1525
 
1543
- private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithPayloadStatus): Promise<void> {
1526
+ private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
1544
1527
  if (this.custodyConfig.targetCustodyGroupCount === this.config.NUMBER_OF_CUSTODY_GROUPS) {
1545
1528
  // Custody requirements can only be increased, we can disable dynamic custody updates
1546
1529
  // if the node already maintains custody of all custody groups in case it is configured
@@ -1,12 +1,13 @@
1
1
  import {EventEmitter} from "node:events";
2
2
  import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
- import {CheckpointWithPayloadStatus} from "@lodestar/fork-choice";
4
+ import {CheckpointWithHex} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
6
  import {DataColumnSidecar, RootHex, deneb, phase0} from "@lodestar/types";
7
7
  import {SignedExecutionPayloadEnvelope} from "@lodestar/types/gloas";
8
8
  import {PeerIdStr} from "../util/peerId.js";
9
9
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
10
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
10
11
 
11
12
  /**
12
13
  * Important chain events that occur during normal chain operation.
@@ -76,6 +77,11 @@ export enum ChainEvent {
76
77
  * cut-off window passes for waiting on gossip
77
78
  */
78
79
  incompleteBlockInput = "incompleteBlockInput",
80
+ /**
81
+ * Post-gloas: trigger BlockInputSync for payload envelopes whose envelope and/or sampled columns are partially
82
+ * received via gossip but are not complete by time the cut-off window passes for waiting on gossip
83
+ */
84
+ incompletePayloadEnvelope = "incompletePayloadEnvelope",
79
85
  }
80
86
 
81
87
  export type HeadEventData = routes.events.EventData[routes.events.EventType.head];
@@ -93,14 +99,19 @@ export type ChainEventData = {
93
99
  };
94
100
  [ChainEvent.unknownBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
95
101
  [ChainEvent.incompleteBlockInput]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
102
+ [ChainEvent.incompletePayloadEnvelope]: {
103
+ payloadInput: PayloadEnvelopeInput;
104
+ peer: PeerIdStr;
105
+ source: BlockInputSource;
106
+ };
96
107
  [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
97
108
  };
98
109
 
99
110
  export type IChainEvents = ApiEvents & {
100
111
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: IBeaconStateView) => void;
101
112
 
102
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayloadStatus) => void;
113
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
114
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
104
115
 
105
116
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
106
117
 
@@ -116,6 +127,7 @@ export type IChainEvents = ApiEvents & {
116
127
  [ChainEvent.envelopeUnknownBlock]: (data: ChainEventData[ChainEvent.envelopeUnknownBlock]) => void;
117
128
  [ChainEvent.unknownBlockRoot]: (data: ChainEventData[ChainEvent.unknownBlockRoot]) => void;
118
129
  [ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
130
+ [ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
119
131
  [ChainEvent.unknownEnvelopeBlockRoot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRoot]) => void;
120
132
  };
121
133
 
@@ -147,6 +147,10 @@ export enum AttestationErrorCode {
147
147
  * Gloas: Current slot attestation is marking payload as present
148
148
  */
149
149
  PREMATURELY_INDICATED_PAYLOAD_PRESENT = "ATTESTATION_ERROR_PREMATURELY_INDICATED_PAYLOAD_PRESENT",
150
+ /**
151
+ * Gloas: index-1 attestation but the execution payload has not been seen yet
152
+ */
153
+ EXECUTION_PAYLOAD_NOT_SEEN = "ATTESTATION_ERROR_EXECUTION_PAYLOAD_NOT_SEEN",
150
154
  }
151
155
 
152
156
  export type AttestationErrorType =
@@ -185,7 +189,8 @@ export type AttestationErrorType =
185
189
  | {code: AttestationErrorCode.NON_ZERO_ATTESTATION_DATA_INDEX}
186
190
  | {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE}
187
191
  | {code: AttestationErrorCode.INVALID_PAYLOAD_STATUS_VALUE; attDataIndex: number}
188
- | {code: AttestationErrorCode.PREMATURELY_INDICATED_PAYLOAD_PRESENT};
192
+ | {code: AttestationErrorCode.PREMATURELY_INDICATED_PAYLOAD_PRESENT}
193
+ | {code: AttestationErrorCode.EXECUTION_PAYLOAD_NOT_SEEN; beaconBlockRoot: RootHex};
189
194
 
190
195
  export class AttestationError extends GossipActionError<AttestationErrorType> {
191
196
  getMetadata(): Record<string, string | number | null> {
@@ -74,6 +74,8 @@ export enum BlockErrorCode {
74
74
  PARENT_EXECUTION_INVALID = "BLOCK_ERROR_PARENT_EXECUTION_INVALID",
75
75
  /** The block's parent execution payload (defined by bid.parent_block_hash) has not been seen */
76
76
  PARENT_PAYLOAD_UNKNOWN = "BLOCK_ERROR_PARENT_PAYLOAD_UNKNOWN",
77
+ /** An execution payload envelope in the chain segment references a block root that does not match its slot's block */
78
+ ENVELOPE_BLOCK_ROOT_MISMATCH = "BLOCK_ERROR_ENVELOPE_BLOCK_ROOT_MISMATCH",
77
79
  }
78
80
 
79
81
  type ExecutionErrorStatus = Exclude<
@@ -107,6 +109,7 @@ export type BlockErrorType =
107
109
  | {code: BlockErrorCode.NOT_LATER_THAN_PARENT; parentSlot: Slot; slot: Slot}
108
110
  | {code: BlockErrorCode.NON_LINEAR_PARENT_ROOTS}
109
111
  | {code: BlockErrorCode.NON_LINEAR_SLOTS}
112
+ | {code: BlockErrorCode.ENVELOPE_BLOCK_ROOT_MISMATCH; envelopeBlockRoot: RootHex; blockRoot: RootHex}
110
113
  | {code: BlockErrorCode.PER_BLOCK_PROCESSING_ERROR; error: Error}
111
114
  | {code: BlockErrorCode.BEACON_CHAIN_ERROR; error: Error}
112
115
  | {code: BlockErrorCode.KNOWN_BAD_BLOCK}
@@ -120,7 +123,7 @@ export type BlockErrorType =
120
123
  | {code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS; blobKzgCommitmentsLen: number; commitmentLimit: number}
121
124
  | {code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH; bidParentRoot: RootHex; blockParentRoot: RootHex}
122
125
  | {code: BlockErrorCode.PARENT_EXECUTION_INVALID; parentRoot: RootHex}
123
- | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentBlockHash: RootHex};
126
+ | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentRoot: RootHex; parentBlockHash: RootHex};
124
127
 
125
128
  export class BlockGossipError extends GossipActionError<BlockErrorType> {}
126
129
 
@@ -7,6 +7,7 @@ export enum ExecutionPayloadBidErrorCode {
7
7
  BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
8
8
  BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
9
9
  BID_TOO_HIGH = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_HIGH",
10
+ TOO_MANY_KZG_COMMITMENTS = "EXECUTION_PAYLOAD_BID_ERROR_TOO_MANY_KZG_COMMITMENTS",
10
11
  UNKNOWN_BLOCK_ROOT = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_BLOCK_ROOT",
11
12
  INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
12
13
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
@@ -28,6 +29,11 @@ export type ExecutionPayloadBidErrorType =
28
29
  }
29
30
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
30
31
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
32
+ | {
33
+ code: ExecutionPayloadBidErrorCode.TOO_MANY_KZG_COMMITMENTS;
34
+ blobKzgCommitmentsLen: number;
35
+ commitmentLimit: number;
36
+ }
31
37
  | {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
32
38
  | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
33
39
  | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
@@ -11,6 +11,7 @@ export enum ExecutionPayloadEnvelopeErrorCode {
11
11
  SLOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_SLOT_MISMATCH",
12
12
  BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
13
13
  BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
14
+ EXECUTION_REQUESTS_ROOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_EXECUTION_REQUESTS_ROOT_MISMATCH",
14
15
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
15
16
  PAYLOAD_ENVELOPE_INPUT_MISSING = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_PAYLOAD_ENVELOPE_INPUT_MISSING",
16
17
  }
@@ -36,6 +37,11 @@ export type ExecutionPayloadEnvelopeErrorType =
36
37
  envelopeBlockHash: RootHex;
37
38
  bidBlockHash: RootHex | null;
38
39
  }
40
+ | {
41
+ code: ExecutionPayloadEnvelopeErrorCode.EXECUTION_REQUESTS_ROOT_MISMATCH;
42
+ envelopeRequestsRoot: RootHex;
43
+ bidRequestsRoot: RootHex;
44
+ }
39
45
  | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE}
40
46
  | {code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING; blockRoot: RootHex};
41
47
 
@@ -8,7 +8,6 @@ import {
8
8
  ProtoArray,
9
9
  ProtoBlock,
10
10
  ForkChoiceOpts as RawForkChoiceOpts,
11
- getCheckpointPayloadStatus,
12
11
  } from "@lodestar/fork-choice";
13
12
  import {ZERO_HASH_HEX} from "@lodestar/params";
14
13
  import {
@@ -104,12 +103,6 @@ export function initializeForkChoiceFromFinalizedState(
104
103
 
105
104
  const isForkPostGloas = computeEpochAtSlot(state.slot) >= config.GLOAS_FORK_EPOCH;
106
105
 
107
- // Determine justified checkpoint payload status
108
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, state, justifiedCheckpoint.epoch);
109
-
110
- // Determine finalized checkpoint payload status
111
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, state, finalizedCheckpoint.epoch);
112
-
113
106
  return new forkchoiceConstructor(
114
107
  config,
115
108
 
@@ -119,8 +112,6 @@ export function initializeForkChoiceFromFinalizedState(
119
112
  finalizedCheckpoint,
120
113
  justifiedBalances,
121
114
  justifiedBalancesGetter,
122
- justifiedPayloadStatus,
123
- finalizedPayloadStatus,
124
115
  {
125
116
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
126
117
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -146,7 +137,9 @@ export function initializeForkChoiceFromFinalizedState(
146
137
 
147
138
  ...(isStatePostBellatrix(state) && state.isExecutionStateType && state.isMergeTransitionComplete
148
139
  ? {
149
- executionPayloadBlockHash: toRootHex(state.latestBlockHash),
140
+ executionPayloadBlockHash: isStatePostGloas(state)
141
+ ? toRootHex(state.latestBlockHash)
142
+ : toRootHex(state.latestExecutionPayloadHeader.blockHash),
150
143
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
151
144
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
152
145
  executionPayloadNumber: isStatePostGloas(state) ? 0 : state.payloadBlockNumber,
@@ -155,7 +148,7 @@ export function initializeForkChoiceFromFinalizedState(
155
148
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
156
149
 
157
150
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
158
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
151
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
159
152
  parentBlockHash: isStatePostGloas(state) ? toRootHex(state.latestBlockHash) : null,
160
153
  },
161
154
  currentSlot
@@ -202,19 +195,12 @@ export function initializeForkChoiceFromUnfinalizedState(
202
195
 
203
196
  const isForkPostGloas = computeEpochAtSlot(unfinalizedState.slot) >= config.GLOAS_FORK_EPOCH;
204
197
 
205
- // For unfinalized state, use getCheckpointPayloadStatus to determine the correct status.
206
- // It checks state.execution_payload_availability to determine EMPTY vs FULL.
207
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, justifiedCheckpoint.epoch);
208
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, finalizedCheckpoint.epoch);
209
-
210
198
  const store = new ForkChoiceStore(
211
199
  currentSlot,
212
200
  justifiedCheckpoint,
213
201
  finalizedCheckpoint,
214
202
  justifiedBalances,
215
203
  justifiedBalancesGetter,
216
- justifiedPayloadStatus,
217
- finalizedPayloadStatus,
218
204
  {
219
205
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
220
206
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -243,7 +229,9 @@ export function initializeForkChoiceFromUnfinalizedState(
243
229
  unfinalizedState.isExecutionStateType &&
244
230
  unfinalizedState.isMergeTransitionComplete
245
231
  ? {
246
- executionPayloadBlockHash: toRootHex(unfinalizedState.latestBlockHash),
232
+ executionPayloadBlockHash: isStatePostGloas(unfinalizedState)
233
+ ? toRootHex(unfinalizedState.latestBlockHash)
234
+ : toRootHex(unfinalizedState.latestExecutionPayloadHeader.blockHash),
247
235
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
248
236
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
249
237
  executionPayloadNumber: isStatePostGloas(unfinalizedState) ? 0 : unfinalizedState.payloadBlockNumber,
@@ -252,7 +240,7 @@ export function initializeForkChoiceFromUnfinalizedState(
252
240
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
253
241
 
254
242
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
255
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
243
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
256
244
  parentBlockHash: isStatePostGloas(unfinalizedState) ? toRootHex(unfinalizedState.latestBlockHash) : null,
257
245
  };
258
246
 
@@ -1,6 +1,6 @@
1
1
  import {Type} from "@chainsafe/ssz";
2
2
  import {BeaconConfig} from "@lodestar/config";
3
- import {CheckpointWithHex, CheckpointWithPayloadStatus, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
3
+ import {CheckpointWithHex, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
4
4
  import {EpochShuffling, IBeaconStateView, PubkeyCache} from "@lodestar/state-transition";
5
5
  import {
6
6
  BeaconBlock,
@@ -18,6 +18,7 @@ import {
18
18
  altair,
19
19
  capella,
20
20
  deneb,
21
+ electra,
21
22
  gloas,
22
23
  phase0,
23
24
  rewards,
@@ -195,7 +196,7 @@ export interface IBeaconChain {
195
196
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null;
196
197
  /** Return state bytes by checkpoint */
197
198
  getStateOrBytesByCheckpoint(
198
- checkpoint: CheckpointWithPayloadStatus
199
+ checkpoint: CheckpointWithHex
199
200
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null>;
200
201
 
201
202
  /**
@@ -231,6 +232,7 @@ export interface IBeaconChain {
231
232
  blockSlot: Slot,
232
233
  blockRootHex: string
233
234
  ): Promise<gloas.SignedExecutionPayloadEnvelope | null>;
235
+ getParentExecutionRequests(parentBlockSlot: Slot, parentBlockRootHex: RootHex): Promise<electra.ExecutionRequests>;
234
236
 
235
237
  produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody>;
236
238
  produceBlock(blockAttributes: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}): Promise<{
@@ -248,7 +250,11 @@ export interface IBeaconChain {
248
250
  /** Process a block until complete */
249
251
  processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void>;
250
252
  /** Process a chain of blocks until complete */
251
- processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void>;
253
+ processChainSegment(
254
+ blocks: IBlockInput[],
255
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
256
+ opts?: ImportBlockOpts
257
+ ): Promise<void>;
252
258
 
253
259
  /** Process execution payload envelope: verify, import to fork choice, and persist to DB */
254
260
  processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void>;