@lodestar/beacon-node 1.42.0 → 1.43.0-dev.0bc48d3b54

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 (268) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +20 -0
  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/lodestar/attesterSlashing.d.ts +8 -0
  11. package/lib/api/impl/lodestar/attesterSlashing.d.ts.map +1 -0
  12. package/lib/api/impl/lodestar/attesterSlashing.js +29 -0
  13. package/lib/api/impl/lodestar/attesterSlashing.js.map +1 -0
  14. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  15. package/lib/api/impl/lodestar/index.js +39 -0
  16. package/lib/api/impl/lodestar/index.js.map +1 -1
  17. package/lib/api/impl/validator/index.d.ts.map +1 -1
  18. package/lib/api/impl/validator/index.js +11 -4
  19. package/lib/api/impl/validator/index.js.map +1 -1
  20. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  21. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  22. package/lib/chain/GetBlobsTracker.js +1 -2
  23. package/lib/chain/GetBlobsTracker.js.map +1 -1
  24. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  25. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
  26. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  27. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  28. package/lib/chain/blocks/importBlock.js +29 -35
  29. package/lib/chain/blocks/importBlock.js.map +1 -1
  30. package/lib/chain/blocks/importExecutionPayload.d.ts +1 -1
  31. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  32. package/lib/chain/blocks/importExecutionPayload.js +24 -13
  33. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  34. package/lib/chain/blocks/index.js +2 -2
  35. package/lib/chain/blocks/index.js.map +1 -1
  36. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +3 -0
  37. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  38. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +20 -0
  39. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  40. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  41. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  42. package/lib/chain/blocks/payloadEnvelopeProcessor.js +6 -4
  43. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  44. package/lib/chain/blocks/types.d.ts +4 -4
  45. package/lib/chain/blocks/types.d.ts.map +1 -1
  46. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  47. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +3 -2
  48. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  49. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  50. package/lib/chain/blocks/verifyBlocksSignatures.js +4 -2
  51. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  52. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  53. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  54. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +25 -0
  55. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  56. package/lib/chain/chain.d.ts +2 -1
  57. package/lib/chain/chain.d.ts.map +1 -1
  58. package/lib/chain/chain.js +30 -36
  59. package/lib/chain/chain.js.map +1 -1
  60. package/lib/chain/emitter.d.ts +13 -1
  61. package/lib/chain/emitter.d.ts.map +1 -1
  62. package/lib/chain/emitter.js +5 -0
  63. package/lib/chain/emitter.js.map +1 -1
  64. package/lib/chain/errors/attestationError.d.ts +8 -1
  65. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  66. package/lib/chain/errors/attestationError.js +4 -0
  67. package/lib/chain/errors/attestationError.js.map +1 -1
  68. package/lib/chain/errors/blockError.d.ts +11 -1
  69. package/lib/chain/errors/blockError.d.ts.map +1 -1
  70. package/lib/chain/errors/blockError.js +4 -0
  71. package/lib/chain/errors/blockError.js.map +1 -1
  72. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  73. package/lib/chain/forkChoice/index.js +22 -12
  74. package/lib/chain/forkChoice/index.js.map +1 -1
  75. package/lib/chain/interface.d.ts +2 -1
  76. package/lib/chain/interface.d.ts.map +1 -1
  77. package/lib/chain/interface.js.map +1 -1
  78. package/lib/chain/lightClient/index.d.ts +2 -2
  79. package/lib/chain/lightClient/index.d.ts.map +1 -1
  80. package/lib/chain/lightClient/index.js +7 -0
  81. package/lib/chain/lightClient/index.js.map +1 -1
  82. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  83. package/lib/chain/opPools/aggregatedAttestationPool.js +5 -2
  84. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  85. package/lib/chain/opPools/executionPayloadBidPool.d.ts +2 -2
  86. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
  87. package/lib/chain/opPools/executionPayloadBidPool.js +2 -2
  88. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
  89. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  90. package/lib/chain/prepareNextSlot.js +22 -10
  91. package/lib/chain/prepareNextSlot.js.map +1 -1
  92. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +1 -7
  93. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  94. package/lib/chain/produceBlock/computeNewStateRoot.js +1 -28
  95. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  96. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -10
  97. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  98. package/lib/chain/produceBlock/produceBlockBody.js +46 -19
  99. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  100. package/lib/chain/regen/errors.d.ts +1 -11
  101. package/lib/chain/regen/errors.d.ts.map +1 -1
  102. package/lib/chain/regen/errors.js +0 -2
  103. package/lib/chain/regen/errors.js.map +1 -1
  104. package/lib/chain/regen/interface.d.ts +6 -12
  105. package/lib/chain/regen/interface.d.ts.map +1 -1
  106. package/lib/chain/regen/queued.d.ts +6 -11
  107. package/lib/chain/regen/queued.d.ts.map +1 -1
  108. package/lib/chain/regen/queued.js +8 -40
  109. package/lib/chain/regen/queued.js.map +1 -1
  110. package/lib/chain/regen/regen.d.ts +0 -5
  111. package/lib/chain/regen/regen.d.ts.map +1 -1
  112. package/lib/chain/regen/regen.js +7 -34
  113. package/lib/chain/regen/regen.js.map +1 -1
  114. package/lib/chain/stateCache/datastore/db.d.ts +5 -4
  115. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
  116. package/lib/chain/stateCache/datastore/db.js +10 -32
  117. package/lib/chain/stateCache/datastore/db.js.map +1 -1
  118. package/lib/chain/stateCache/datastore/file.d.ts +1 -1
  119. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
  120. package/lib/chain/stateCache/datastore/file.js +5 -5
  121. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  122. package/lib/chain/stateCache/datastore/types.d.ts +1 -1
  123. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
  124. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -7
  125. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  126. package/lib/chain/stateCache/fifoBlockStateCache.js +0 -8
  127. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  128. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +13 -30
  129. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  130. package/lib/chain/stateCache/persistentCheckpointsCache.js +120 -216
  131. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  132. package/lib/chain/stateCache/types.d.ts +8 -15
  133. package/lib/chain/stateCache/types.d.ts.map +1 -1
  134. package/lib/chain/stateCache/types.js.map +1 -1
  135. package/lib/chain/validation/aggregateAndProof.js +12 -0
  136. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  137. package/lib/chain/validation/attestation.d.ts.map +1 -1
  138. package/lib/chain/validation/attestation.js +12 -0
  139. package/lib/chain/validation/attestation.js.map +1 -1
  140. package/lib/chain/validation/block.d.ts.map +1 -1
  141. package/lib/chain/validation/block.js +27 -5
  142. package/lib/chain/validation/block.js.map +1 -1
  143. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  144. package/lib/chain/validation/executionPayloadBid.js +7 -4
  145. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  146. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  147. package/lib/chain/validation/executionPayloadEnvelope.js +8 -3
  148. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  149. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  150. package/lib/chain/validation/payloadAttestationMessage.js +8 -4
  151. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  152. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  153. package/lib/chain/validation/syncCommittee.js +4 -0
  154. package/lib/chain/validation/syncCommittee.js.map +1 -1
  155. package/lib/chain/validation/syncCommitteeContributionAndProof.js +4 -1
  156. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  157. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  158. package/lib/chain/validatorMonitor.js +3 -3
  159. package/lib/chain/validatorMonitor.js.map +1 -1
  160. package/lib/execution/engine/http.d.ts.map +1 -1
  161. package/lib/execution/engine/http.js +21 -14
  162. package/lib/execution/engine/http.js.map +1 -1
  163. package/lib/execution/engine/interface.d.ts +1 -0
  164. package/lib/execution/engine/interface.d.ts.map +1 -1
  165. package/lib/execution/engine/mock.d.ts.map +1 -1
  166. package/lib/execution/engine/mock.js +3 -0
  167. package/lib/execution/engine/mock.js.map +1 -1
  168. package/lib/execution/engine/types.d.ts +20 -0
  169. package/lib/execution/engine/types.d.ts.map +1 -1
  170. package/lib/execution/engine/types.js +18 -0
  171. package/lib/execution/engine/types.js.map +1 -1
  172. package/lib/network/gossip/topic.d.ts +2 -0
  173. package/lib/network/gossip/topic.d.ts.map +1 -1
  174. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  175. package/lib/network/processor/gossipHandlers.js +23 -3
  176. package/lib/network/processor/gossipHandlers.js.map +1 -1
  177. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  178. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -1
  179. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  180. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
  181. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +2 -0
  182. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  183. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +2 -2
  184. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  185. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +7 -3
  186. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  187. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
  188. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +6 -0
  189. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  190. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +2 -2
  191. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  192. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +7 -3
  193. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  194. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  195. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +2 -1
  196. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  197. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -1
  198. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +3 -8
  199. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -1
  200. package/lib/node/nodejs.d.ts.map +1 -1
  201. package/lib/node/nodejs.js +6 -1
  202. package/lib/node/nodejs.js.map +1 -1
  203. package/lib/node/notifier.d.ts.map +1 -1
  204. package/lib/node/notifier.js +2 -2
  205. package/lib/node/notifier.js.map +1 -1
  206. package/package.json +16 -16
  207. package/src/api/impl/beacon/blocks/index.ts +29 -0
  208. package/src/api/impl/beacon/pool/index.ts +4 -0
  209. package/src/api/impl/beacon/state/index.ts +15 -15
  210. package/src/api/impl/lodestar/attesterSlashing.ts +43 -0
  211. package/src/api/impl/lodestar/index.ts +51 -1
  212. package/src/api/impl/validator/index.ts +13 -5
  213. package/src/chain/GetBlobsTracker.ts +1 -2
  214. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +2 -4
  215. package/src/chain/blocks/importBlock.ts +33 -42
  216. package/src/chain/blocks/importExecutionPayload.ts +26 -12
  217. package/src/chain/blocks/index.ts +2 -2
  218. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +27 -0
  219. package/src/chain/blocks/payloadEnvelopeProcessor.ts +6 -5
  220. package/src/chain/blocks/types.ts +4 -4
  221. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +2 -1
  222. package/src/chain/blocks/verifyBlocksSignatures.ts +9 -2
  223. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +38 -0
  224. package/src/chain/chain.ts +38 -47
  225. package/src/chain/emitter.ts +12 -0
  226. package/src/chain/errors/attestationError.ts +6 -1
  227. package/src/chain/errors/blockError.ts +7 -1
  228. package/src/chain/forkChoice/index.ts +23 -12
  229. package/src/chain/interface.ts +5 -0
  230. package/src/chain/lightClient/index.ts +15 -3
  231. package/src/chain/opPools/aggregatedAttestationPool.ts +6 -1
  232. package/src/chain/opPools/executionPayloadBidPool.ts +3 -3
  233. package/src/chain/prepareNextSlot.ts +26 -9
  234. package/src/chain/produceBlock/computeNewStateRoot.ts +1 -37
  235. package/src/chain/produceBlock/produceBlockBody.ts +71 -23
  236. package/src/chain/regen/errors.ts +1 -6
  237. package/src/chain/regen/interface.ts +6 -12
  238. package/src/chain/regen/queued.ts +12 -48
  239. package/src/chain/regen/regen.ts +8 -36
  240. package/src/chain/stateCache/datastore/db.ts +10 -33
  241. package/src/chain/stateCache/datastore/file.ts +5 -6
  242. package/src/chain/stateCache/datastore/types.ts +2 -3
  243. package/src/chain/stateCache/fifoBlockStateCache.ts +1 -10
  244. package/src/chain/stateCache/persistentCheckpointsCache.ts +139 -247
  245. package/src/chain/stateCache/types.ts +8 -14
  246. package/src/chain/validation/aggregateAndProof.ts +13 -0
  247. package/src/chain/validation/attestation.ts +13 -0
  248. package/src/chain/validation/block.ts +30 -7
  249. package/src/chain/validation/executionPayloadBid.ts +7 -3
  250. package/src/chain/validation/executionPayloadEnvelope.ts +12 -3
  251. package/src/chain/validation/payloadAttestationMessage.ts +9 -3
  252. package/src/chain/validation/syncCommittee.ts +5 -1
  253. package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -1
  254. package/src/chain/validatorMonitor.ts +3 -2
  255. package/src/execution/engine/http.ts +21 -14
  256. package/src/execution/engine/interface.ts +1 -0
  257. package/src/execution/engine/mock.ts +3 -0
  258. package/src/execution/engine/types.ts +41 -0
  259. package/src/network/processor/gossipHandlers.ts +28 -7
  260. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +3 -1
  261. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +3 -0
  262. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +15 -3
  263. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +11 -0
  264. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +19 -3
  265. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +3 -1
  266. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +3 -12
  267. package/src/node/nodejs.ts +7 -2
  268. package/src/node/notifier.ts +7 -2
@@ -12,6 +12,13 @@ export async function* onBlobSidecarsByRoot(
12
12
  ): AsyncIterable<ResponseOutgoing> {
13
13
  const finalizedSlot = chain.forkChoice.getFinalizedBlock().slot;
14
14
 
15
+ // Spec: [max(current_epoch - MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS, DENEB_FORK_EPOCH), current_epoch]
16
+ const currentEpoch = chain.clock.currentEpoch;
17
+ const minimumRequestEpoch = Math.max(
18
+ currentEpoch - chain.config.MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS,
19
+ chain.config.DENEB_FORK_EPOCH
20
+ );
21
+
15
22
  // In sidecars by root request, it can be expected that sidecar requests will be come
16
23
  // clustured by blockroots, and this helps us save db lookups once we load sidecars
17
24
  // for a root
@@ -29,6 +36,10 @@ export async function* onBlobSidecarsByRoot(
29
36
  continue;
30
37
  }
31
38
 
39
+ if (computeEpochAtSlot(block.slot) < minimumRequestEpoch) {
40
+ continue;
41
+ }
42
+
32
43
  // Check if we need to load sidecars for a new block root
33
44
  if (lastFetchedSideCars === null || lastFetchedSideCars.blockRoot !== blockRootHex) {
34
45
  const blobSidecarsBytes = await chain.getSerializedBlobSidecars(block.slot, blockRootHex);
@@ -3,7 +3,7 @@ import {ChainConfig} from "@lodestar/config";
3
3
  import {GENESIS_SLOT} from "@lodestar/params";
4
4
  import {RespStatus, ResponseError, ResponseOutgoing} from "@lodestar/reqresp";
5
5
  import {computeEpochAtSlot} from "@lodestar/state-transition";
6
- import {ColumnIndex, fulu} from "@lodestar/types";
6
+ import {ColumnIndex, Epoch, fulu} from "@lodestar/types";
7
7
  import {fromHex} from "@lodestar/utils";
8
8
  import {IBeaconChain} from "../../../chain/index.js";
9
9
  import {IBeaconDb} from "../../../db/index.js";
@@ -21,7 +21,11 @@ export async function* onDataColumnSidecarsByRange(
21
21
  peerClient: string
22
22
  ): AsyncIterable<ResponseOutgoing> {
23
23
  // Non-finalized range of columns
24
- const {startSlot, count, columns: requestedColumns} = validateDataColumnSidecarsByRangeRequest(chain.config, request);
24
+ const {
25
+ startSlot,
26
+ count,
27
+ columns: requestedColumns,
28
+ } = validateDataColumnSidecarsByRangeRequest(chain.config, chain.clock.currentEpoch, request);
25
29
  const availableColumns = validateRequestedDataColumns(chain, requestedColumns);
26
30
  const endSlot = startSlot + count;
27
31
 
@@ -139,6 +143,7 @@ export async function* onDataColumnSidecarsByRange(
139
143
 
140
144
  export function validateDataColumnSidecarsByRangeRequest(
141
145
  config: ChainConfig,
146
+ currentEpoch: Epoch,
142
147
  request: fulu.DataColumnSidecarsByRangeRequest
143
148
  ): fulu.DataColumnSidecarsByRangeRequest {
144
149
  const {startSlot, columns} = request;
@@ -147,11 +152,22 @@ export function validateDataColumnSidecarsByRangeRequest(
147
152
  if (count < 1) {
148
153
  throw new ResponseError(RespStatus.INVALID_REQUEST, "count < 1");
149
154
  }
150
- // TODO: validate against MIN_EPOCHS_FOR_BLOCK_REQUESTS
151
155
  if (startSlot < GENESIS_SLOT) {
152
156
  throw new ResponseError(RespStatus.INVALID_REQUEST, "startSlot < genesis");
153
157
  }
154
158
 
159
+ // Spec: [max(current_epoch - MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS, FULU_FORK_EPOCH), current_epoch]
160
+ const minimumRequestEpoch = Math.max(
161
+ currentEpoch - config.MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS,
162
+ config.FULU_FORK_EPOCH
163
+ );
164
+ if (computeEpochAtSlot(startSlot) < minimumRequestEpoch) {
165
+ throw new ResponseError(
166
+ RespStatus.RESOURCE_UNAVAILABLE,
167
+ "startSlot is before MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS"
168
+ );
169
+ }
170
+
155
171
  if (count > config.MAX_REQUEST_BLOCKS_DENEB) {
156
172
  count = config.MAX_REQUEST_BLOCKS_DENEB;
157
173
  }
@@ -81,11 +81,13 @@ export function validateExecutionPayloadEnvelopesByRangeRequest(
81
81
  if (count < 1) {
82
82
  throw new ResponseError(RespStatus.INVALID_REQUEST, "count < 1");
83
83
  }
84
- // TODO: validate against MIN_EPOCHS_FOR_BLOCK_REQUESTS
85
84
  if (startSlot < GENESIS_SLOT) {
86
85
  throw new ResponseError(RespStatus.INVALID_REQUEST, "startSlot < genesis");
87
86
  }
88
87
 
88
+ // The gloas req/resp spec uses MIN_EPOCHS_FOR_BLOCK_REQUESTS to define the minimum range peers MUST serve.
89
+ // Archival nodes may still serve older retained payloads to allow genesis sync.
90
+
89
91
  if (count > config.MAX_REQUEST_BLOCKS_DENEB) {
90
92
  count = config.MAX_REQUEST_BLOCKS_DENEB;
91
93
  }
@@ -10,12 +10,8 @@ export async function* onExecutionPayloadEnvelopesByRoot(
10
10
  chain: IBeaconChain,
11
11
  db: IBeaconDb
12
12
  ): AsyncIterable<ResponseOutgoing> {
13
- // Spec: [max(GLOAS_FORK_EPOCH, current_epoch - MIN_EPOCHS_FOR_BLOCK_REQUESTS), current_epoch]
14
- const currentEpoch = chain.clock.currentEpoch;
15
- const minimumRequestEpoch = Math.max(
16
- currentEpoch - chain.config.MIN_EPOCHS_FOR_BLOCK_REQUESTS,
17
- chain.config.GLOAS_FORK_EPOCH
18
- );
13
+ // The gloas req/resp spec uses MIN_EPOCHS_FOR_BLOCK_REQUESTS to define the minimum range peers MUST serve.
14
+ // Archival nodes may still serve older retained payloads to allow genesis sync.
19
15
 
20
16
  for (const root of requestBody) {
21
17
  const rootHex = toRootHex(root);
@@ -27,16 +23,11 @@ export async function* onExecutionPayloadEnvelopesByRoot(
27
23
  continue;
28
24
  }
29
25
 
30
- const requestedEpoch = computeEpochAtSlot(slot);
31
- if (requestedEpoch < minimumRequestEpoch) {
32
- continue;
33
- }
34
-
35
26
  const envelopeBytes = await chain.getSerializedExecutionPayloadEnvelope(slot, rootHex);
36
27
  if (envelopeBytes) {
37
28
  yield {
38
29
  data: envelopeBytes,
39
- boundary: chain.config.getForkBoundaryAtEpoch(requestedEpoch),
30
+ boundary: chain.config.getForkBoundaryAtEpoch(computeEpochAtSlot(slot)),
40
31
  };
41
32
  }
42
33
  }
@@ -6,7 +6,7 @@ import {BeaconApiMethods} from "@lodestar/api/beacon/server";
6
6
  import {BeaconConfig} from "@lodestar/config";
7
7
  import type {LoggerNode} from "@lodestar/logger/node";
8
8
  import {ZERO_HASH_HEX} from "@lodestar/params";
9
- import {IBeaconStateView, PubkeyCache} from "@lodestar/state-transition";
9
+ import {IBeaconStateView, PubkeyCache, isStatePostBellatrix, isStatePostGloas} from "@lodestar/state-transition";
10
10
  import {phase0} from "@lodestar/types";
11
11
  import {sleep, toRootHex} from "@lodestar/utils";
12
12
  import {ProcessShutdownCallback} from "@lodestar/validator";
@@ -221,7 +221,12 @@ export class BeaconNode {
221
221
 
222
222
  let executionEngineOpts = opts.executionEngine;
223
223
  if (opts.executionEngine.mode === "mock") {
224
- const eth1BlockHash = anchorState.isExecutionStateType ? toRootHex(anchorState.latestBlockHash) : undefined;
224
+ const eth1BlockHash =
225
+ isStatePostBellatrix(anchorState) && anchorState.isExecutionStateType
226
+ ? isStatePostGloas(anchorState)
227
+ ? toRootHex(anchorState.latestBlockHash)
228
+ : toRootHex(anchorState.latestExecutionPayloadHeader.blockHash)
229
+ : undefined;
225
230
  executionEngineOpts = {
226
231
  ...opts.executionEngine,
227
232
  genesisBlockHash: ZERO_HASH_HEX,
@@ -1,7 +1,12 @@
1
1
  import {BeaconConfig} from "@lodestar/config";
2
2
  import {ExecutionStatus, ProtoBlock} from "@lodestar/fork-choice";
3
3
  import {EPOCHS_PER_SYNC_COMMITTEE_PERIOD, SLOTS_PER_EPOCH} from "@lodestar/params";
4
- import {IBeaconStateView, computeEpochAtSlot, computeStartSlotAtEpoch} from "@lodestar/state-transition";
4
+ import {
5
+ IBeaconStateView,
6
+ computeEpochAtSlot,
7
+ computeStartSlotAtEpoch,
8
+ isStatePostBellatrix,
9
+ } from "@lodestar/state-transition";
5
10
  import {Epoch} from "@lodestar/types";
6
11
  import {ErrorAborted, Logger, prettyBytes, prettyBytesShort, sleep} from "@lodestar/utils";
7
12
  import {IBeaconChain} from "../chain/index.js";
@@ -165,7 +170,7 @@ function getHeadExecutionInfo(
165
170
  const executionStatusStr = headInfo.executionStatus.toLowerCase();
166
171
 
167
172
  // Add execution status to notifier only if head is on/post bellatrix
168
- if (headState.isExecutionStateType) {
173
+ if (isStatePostBellatrix(headState) && headState.isExecutionStateType) {
169
174
  if (headState.isMergeTransitionComplete) {
170
175
  const executionPayloadHashInfo =
171
176
  headInfo.executionStatus !== ExecutionStatus.PreMerge ? headInfo.executionPayloadBlockHash : "empty";