@lodestar/beacon-node 1.43.0-dev.180030f946 → 1.43.0-dev.1a52372103

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 (224) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +15 -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 +45 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/debug/index.d.ts.map +1 -1
  8. package/lib/api/impl/debug/index.js +0 -1
  9. package/lib/api/impl/debug/index.js.map +1 -1
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +68 -2
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  14. package/lib/chain/blocks/importBlock.js +23 -22
  15. package/lib/chain/blocks/importBlock.js.map +1 -1
  16. package/lib/chain/blocks/importExecutionPayload.d.ts +5 -3
  17. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  18. package/lib/chain/blocks/importExecutionPayload.js +25 -14
  19. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  20. package/lib/chain/blocks/index.d.ts.map +1 -1
  21. package/lib/chain/blocks/index.js +36 -21
  22. package/lib/chain/blocks/index.js.map +1 -1
  23. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +1 -0
  24. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  25. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +5 -1
  26. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  27. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +1 -0
  28. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  29. package/lib/chain/blocks/types.d.ts +2 -1
  30. package/lib/chain/blocks/types.d.ts.map +1 -1
  31. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  32. package/lib/chain/blocks/utils/chainSegment.js +8 -0
  33. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  34. package/lib/chain/blocks/verifyBlock.d.ts +2 -1
  35. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  36. package/lib/chain/blocks/verifyBlock.js +30 -12
  37. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  38. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  39. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  40. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  41. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  42. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  43. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  44. package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
  45. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  46. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
  47. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +7 -4
  49. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  50. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  51. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +8 -3
  52. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  53. package/lib/chain/chain.d.ts +2 -1
  54. package/lib/chain/chain.d.ts.map +1 -1
  55. package/lib/chain/chain.js +5 -1
  56. package/lib/chain/chain.js.map +1 -1
  57. package/lib/chain/emitter.d.ts +0 -11
  58. package/lib/chain/emitter.d.ts.map +1 -1
  59. package/lib/chain/emitter.js +0 -4
  60. package/lib/chain/emitter.js.map +1 -1
  61. package/lib/chain/errors/index.d.ts +1 -0
  62. package/lib/chain/errors/index.d.ts.map +1 -1
  63. package/lib/chain/errors/index.js +1 -0
  64. package/lib/chain/errors/index.js.map +1 -1
  65. package/lib/chain/errors/proposerPreferences.d.ts +40 -0
  66. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  67. package/lib/chain/errors/proposerPreferences.js +14 -0
  68. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  69. package/lib/chain/interface.d.ts +2 -1
  70. package/lib/chain/interface.d.ts.map +1 -1
  71. package/lib/chain/interface.js.map +1 -1
  72. package/lib/chain/opPools/payloadAttestationPool.d.ts +3 -2
  73. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  74. package/lib/chain/opPools/payloadAttestationPool.js +26 -4
  75. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  76. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  77. package/lib/chain/prepareNextSlot.js +15 -17
  78. package/lib/chain/prepareNextSlot.js.map +1 -1
  79. package/lib/chain/produceBlock/produceBlockBody.d.ts +12 -3
  80. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  81. package/lib/chain/produceBlock/produceBlockBody.js +35 -17
  82. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  83. package/lib/chain/regen/interface.d.ts +1 -0
  84. package/lib/chain/regen/interface.d.ts.map +1 -1
  85. package/lib/chain/regen/interface.js +1 -0
  86. package/lib/chain/regen/interface.js.map +1 -1
  87. package/lib/chain/regen/queued.d.ts.map +1 -1
  88. package/lib/chain/regen/queued.js +1 -4
  89. package/lib/chain/regen/queued.js.map +1 -1
  90. package/lib/chain/regen/regen.d.ts.map +1 -1
  91. package/lib/chain/regen/regen.js +1 -4
  92. package/lib/chain/regen/regen.js.map +1 -1
  93. package/lib/chain/seenCache/index.d.ts +1 -0
  94. package/lib/chain/seenCache/index.d.ts.map +1 -1
  95. package/lib/chain/seenCache/index.js +1 -0
  96. package/lib/chain/seenCache/index.js.map +1 -1
  97. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +8 -2
  98. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  99. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +20 -4
  100. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  101. package/lib/chain/seenCache/seenProposerPreferences.d.ts +16 -0
  102. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  103. package/lib/chain/seenCache/seenProposerPreferences.js +31 -0
  104. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  105. package/lib/chain/validation/executionPayloadBid.js +11 -8
  106. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  107. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  108. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  109. package/lib/chain/validation/proposerPreferences.js +91 -0
  110. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  111. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  112. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  113. package/lib/metrics/metrics/lodestar.js +4 -0
  114. package/lib/metrics/metrics/lodestar.js.map +1 -1
  115. package/lib/network/gossip/interface.d.ts +7 -1
  116. package/lib/network/gossip/interface.d.ts.map +1 -1
  117. package/lib/network/gossip/interface.js +1 -0
  118. package/lib/network/gossip/interface.js.map +1 -1
  119. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  120. package/lib/network/gossip/scoringParameters.js +12 -1
  121. package/lib/network/gossip/scoringParameters.js.map +1 -1
  122. package/lib/network/gossip/topic.d.ts +29 -766
  123. package/lib/network/gossip/topic.d.ts.map +1 -1
  124. package/lib/network/gossip/topic.js +6 -0
  125. package/lib/network/gossip/topic.js.map +1 -1
  126. package/lib/network/interface.d.ts +1 -0
  127. package/lib/network/interface.d.ts.map +1 -1
  128. package/lib/network/network.d.ts +1 -0
  129. package/lib/network/network.d.ts.map +1 -1
  130. package/lib/network/network.js +5 -0
  131. package/lib/network/network.js.map +1 -1
  132. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  133. package/lib/network/processor/gossipHandlers.js +24 -16
  134. package/lib/network/processor/gossipHandlers.js.map +1 -1
  135. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  136. package/lib/network/processor/gossipQueues/index.js +5 -0
  137. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  138. package/lib/network/processor/index.d.ts.map +1 -1
  139. package/lib/network/processor/index.js +6 -5
  140. package/lib/network/processor/index.js.map +1 -1
  141. package/lib/node/nodejs.js +2 -2
  142. package/lib/node/nodejs.js.map +1 -1
  143. package/lib/node/notifier.js +1 -7
  144. package/lib/node/notifier.js.map +1 -1
  145. package/lib/sync/range/batch.d.ts +11 -0
  146. package/lib/sync/range/batch.d.ts.map +1 -1
  147. package/lib/sync/range/batch.js +29 -4
  148. package/lib/sync/range/batch.js.map +1 -1
  149. package/lib/sync/range/chain.d.ts.map +1 -1
  150. package/lib/sync/range/chain.js +23 -5
  151. package/lib/sync/range/chain.js.map +1 -1
  152. package/lib/sync/types.d.ts +34 -0
  153. package/lib/sync/types.d.ts.map +1 -1
  154. package/lib/sync/types.js +34 -0
  155. package/lib/sync/types.js.map +1 -1
  156. package/lib/sync/unknownBlock.d.ts +22 -1
  157. package/lib/sync/unknownBlock.d.ts.map +1 -1
  158. package/lib/sync/unknownBlock.js +602 -53
  159. package/lib/sync/unknownBlock.js.map +1 -1
  160. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  161. package/lib/sync/utils/downloadByRange.js +36 -19
  162. package/lib/sync/utils/downloadByRange.js.map +1 -1
  163. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  164. package/lib/sync/utils/downloadByRoot.js +16 -2
  165. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  166. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  167. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  168. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  169. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  170. package/lib/util/sszBytes.d.ts.map +1 -1
  171. package/lib/util/sszBytes.js +8 -6
  172. package/lib/util/sszBytes.js.map +1 -1
  173. package/package.json +15 -15
  174. package/src/api/impl/beacon/blocks/index.ts +20 -4
  175. package/src/api/impl/beacon/pool/index.ts +83 -1
  176. package/src/api/impl/debug/index.ts +0 -1
  177. package/src/api/impl/validator/index.ts +82 -1
  178. package/src/chain/blocks/importBlock.ts +23 -39
  179. package/src/chain/blocks/importExecutionPayload.ts +33 -14
  180. package/src/chain/blocks/index.ts +34 -15
  181. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +6 -1
  182. package/src/chain/blocks/payloadEnvelopeInput/types.ts +1 -0
  183. package/src/chain/blocks/types.ts +2 -1
  184. package/src/chain/blocks/utils/chainSegment.ts +8 -0
  185. package/src/chain/blocks/verifyBlock.ts +45 -13
  186. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  187. package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
  188. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +9 -4
  189. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +7 -4
  190. package/src/chain/chain.ts +5 -0
  191. package/src/chain/emitter.ts +0 -11
  192. package/src/chain/errors/index.ts +1 -0
  193. package/src/chain/errors/proposerPreferences.ts +47 -0
  194. package/src/chain/interface.ts +2 -0
  195. package/src/chain/opPools/payloadAttestationPool.ts +29 -8
  196. package/src/chain/prepareNextSlot.ts +20 -28
  197. package/src/chain/produceBlock/produceBlockBody.ts +46 -22
  198. package/src/chain/regen/interface.ts +1 -0
  199. package/src/chain/regen/queued.ts +2 -7
  200. package/src/chain/regen/regen.ts +2 -7
  201. package/src/chain/seenCache/index.ts +1 -0
  202. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +25 -5
  203. package/src/chain/seenCache/seenProposerPreferences.ts +37 -0
  204. package/src/chain/validation/executionPayloadBid.ts +11 -8
  205. package/src/chain/validation/proposerPreferences.ts +110 -0
  206. package/src/metrics/metrics/lodestar.ts +4 -0
  207. package/src/network/gossip/interface.ts +6 -0
  208. package/src/network/gossip/scoringParameters.ts +14 -1
  209. package/src/network/gossip/topic.ts +6 -0
  210. package/src/network/interface.ts +1 -0
  211. package/src/network/network.ts +11 -0
  212. package/src/network/processor/gossipHandlers.ts +35 -17
  213. package/src/network/processor/gossipQueues/index.ts +5 -0
  214. package/src/network/processor/index.ts +6 -5
  215. package/src/node/nodejs.ts +2 -2
  216. package/src/node/notifier.ts +1 -8
  217. package/src/sync/range/batch.ts +54 -5
  218. package/src/sync/range/chain.ts +25 -5
  219. package/src/sync/types.ts +72 -0
  220. package/src/sync/unknownBlock.ts +760 -57
  221. package/src/sync/utils/downloadByRange.ts +36 -18
  222. package/src/sync/utils/downloadByRoot.ts +24 -2
  223. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  224. package/src/util/sszBytes.ts +8 -6
@@ -14,6 +14,7 @@ import {
14
14
  deneb,
15
15
  fulu,
16
16
  gloas,
17
+ isGloasBeaconBlock,
17
18
  isGloasDataColumnSidecar,
18
19
  phase0,
19
20
  } from "@lodestar/types";
@@ -185,9 +186,24 @@ export function cacheByRangeResponses({
185
186
  }
186
187
  }
187
188
 
188
- // Build payloadEnvelopes map for gloas: start from existing (partial download) state.
189
- // The entries are wrappers around (block + envelope + sampled columns) and also seeded into
190
- // seenPayloadEnvelopeInputCache so importBlock can find them without creating a duplicate.
189
+ // Seed seenPayloadEnvelopeInputCache for every gloas block in the batch, regardless of whether
190
+ // the peer returned its envelope. Without this, a block returned without its envelope would be
191
+ // imported with no cache entry, and later payload-by-root sync would throw
192
+ // "Missing PayloadEnvelopeInput for known block" (see issue #9306).
193
+ for (const blockInput of updatedBatchBlocks.values()) {
194
+ if (!blockInput.hasBlock() || !isForkPostGloas(blockInput.forkName)) continue;
195
+ seenPayloadEnvelopeInputCache.add({
196
+ blockRootHex: blockInput.blockRootHex,
197
+ block: blockInput.getBlock() as SignedBeaconBlock<ForkPostGloas>,
198
+ forkName: blockInput.forkName,
199
+ sampledColumns: custodyConfig.sampledColumns,
200
+ custodyColumns: custodyConfig.custodyColumns,
201
+ timeCreatedSec: seenTimestampSec,
202
+ });
203
+ }
204
+
205
+ // Attach envelopes to entries whose envelope was returned by the peer. The returned
206
+ // payloadEnvelopes map only contains entries with envelopes ready for importExecutionPayload.
191
207
  let payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null = null;
192
208
  if (downloadedPayloadEnvelopes !== null) {
193
209
  payloadEnvelopes = new Map(existingPayloadEnvelopes ?? []);
@@ -198,20 +214,11 @@ export function cacheByRangeResponses({
198
214
  // No block to pair this envelope with; drop silently
199
215
  continue;
200
216
  }
201
- const {blockRootHex} = blockInput;
202
217
 
203
- // Reuse any existing PayloadEnvelopeInput (e.g. gossip arrived first) to avoid
204
- // duplicate cache entries. If missing, create a fresh one from the block's bid.
205
- let payloadInput = seenPayloadEnvelopeInputCache.get(blockRootHex);
218
+ const payloadInput = seenPayloadEnvelopeInputCache.get(blockInput.blockRootHex);
206
219
  if (payloadInput === undefined) {
207
- payloadInput = seenPayloadEnvelopeInputCache.add({
208
- blockRootHex,
209
- block: blockInput.getBlock() as SignedBeaconBlock<ForkPostGloas>,
210
- forkName: blockInput.forkName,
211
- sampledColumns: custodyConfig.sampledColumns,
212
- custodyColumns: custodyConfig.custodyColumns,
213
- timeCreatedSec: seenTimestampSec,
214
- });
220
+ // Unreachable given the loop above seeded an entry for every gloas block in the batch.
221
+ continue;
215
222
  }
216
223
 
217
224
  if (!payloadInput.hasPayloadEnvelope()) {
@@ -355,7 +362,7 @@ export async function requestByRange({
355
362
  let blocks: undefined | SignedBeaconBlock[];
356
363
  let blobSidecars: undefined | deneb.BlobSidecars;
357
364
  let columnSidecars: undefined | DataColumnSidecar[];
358
- let payloadEnvelopes: undefined | gloas.SignedExecutionPayloadEnvelope[];
365
+ const payloadEnvelopes: gloas.SignedExecutionPayloadEnvelope[] = [];
359
366
 
360
367
  const requests: Promise<unknown>[] = [];
361
368
 
@@ -363,6 +370,17 @@ export async function requestByRange({
363
370
  requests.push(
364
371
  network.sendBeaconBlocksByRange(peerIdStr, blocksRequest).then((blockResponse) => {
365
372
  blocks = blockResponse;
373
+ const firstBlock = blockResponse.at(0);
374
+ if (firstBlock && isGloasBeaconBlock(firstBlock.message)) {
375
+ return network
376
+ .sendExecutionPayloadEnvelopesByRoot(peerIdStr, [
377
+ firstBlock.message.body.signedExecutionPayloadBid.message.parentBlockRoot,
378
+ ])
379
+ .then((envelopeResponse) => {
380
+ payloadEnvelopes?.unshift(...envelopeResponse);
381
+ });
382
+ }
383
+ return undefined;
366
384
  })
367
385
  );
368
386
  }
@@ -386,7 +404,7 @@ export async function requestByRange({
386
404
  if (envelopesRequest) {
387
405
  requests.push(
388
406
  network.sendExecutionPayloadEnvelopesByRange(peerIdStr, envelopesRequest).then((envelopeResponse) => {
389
- payloadEnvelopes = envelopeResponse;
407
+ payloadEnvelopes?.push(...envelopeResponse);
390
408
  })
391
409
  );
392
410
  }
@@ -1173,7 +1191,7 @@ export function validateEnvelopesByRangeResponse(
1173
1191
  const slot = payloadEnvelope.message.payload.slotNumber;
1174
1192
  const batchBlockRoot = batchBlockRoots.get(slot);
1175
1193
 
1176
- // Envelopes for slots not in the batch are silently ignored (orphaned payloads)
1194
+ // Envelopes for slots not in the batch are silently ignored (orphaned payloads or a parent payload)
1177
1195
  if (batchBlockRoot === undefined) {
1178
1196
  continue;
1179
1197
  }
@@ -1,6 +1,14 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ChainForkConfig} from "@lodestar/config";
3
- import {ForkPostDeneb, ForkPostFulu, ForkPreFulu, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
3
+ import {
4
+ ForkPostDeneb,
5
+ ForkPostFulu,
6
+ ForkPostGloas,
7
+ ForkPreFulu,
8
+ isForkPostDeneb,
9
+ isForkPostFulu,
10
+ isForkPostGloas,
11
+ } from "@lodestar/params";
4
12
  import {BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
5
13
  import {LodestarError, byteArrayEquals, fromHex, prettyPrintIndices, toHex, toRootHex} from "@lodestar/utils";
6
14
  import {isBlockInputBlobs, isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
@@ -107,6 +115,17 @@ export async function downloadByRoot({
107
115
  });
108
116
  }
109
117
 
118
+ if (isForkPostGloas(blockInput.forkName)) {
119
+ chain.seenPayloadEnvelopeInputCache.add({
120
+ blockRootHex: rootHex,
121
+ block: blockInput.getBlock() as SignedBeaconBlock<ForkPostGloas>,
122
+ forkName: blockInput.forkName,
123
+ sampledColumns: chain.custodyConfig.sampledColumns,
124
+ custodyColumns: chain.custodyConfig.custodyColumns,
125
+ timeCreatedSec: Date.now() / 1000,
126
+ });
127
+ }
128
+
110
129
  const hasAllDataPreDownload = blockInput.hasBlockAndAllData();
111
130
 
112
131
  if (isBlockInputBlobs(blockInput) && !hasAllDataPreDownload) {
@@ -263,7 +282,10 @@ export async function fetchByRoot({
263
282
  blockRoot,
264
283
  });
265
284
  const forkName = config.getForkName(block.message.slot);
266
- if (isForkPostFulu(forkName)) {
285
+ if (isForkPostGloas(forkName)) {
286
+ // Post-gloas block sync only needs the block body. Payload columns stay on the
287
+ // payload/envelope path and are queued independently in the network processor.
288
+ } else if (isForkPostFulu(forkName)) {
267
289
  columnSidecarResult = await fetchAndValidateColumns({
268
290
  config,
269
291
  chain,
@@ -40,21 +40,6 @@ function addToDescendantBlocks(
40
40
  return descendantBlocks;
41
41
  }
42
42
 
43
- export function getDescendantBlocks(
44
- blockRootHex: RootHex,
45
- blocks: Map<RootHex, BlockInputSyncCacheItem>
46
- ): BlockInputSyncCacheItem[] {
47
- const descendantBlocks: BlockInputSyncCacheItem[] = [];
48
-
49
- for (const block of blocks.values()) {
50
- if ((isPendingBlockInput(block) ? block.blockInput.parentRootHex : undefined) === blockRootHex) {
51
- descendantBlocks.push(block);
52
- }
53
- }
54
-
55
- return descendantBlocks;
56
- }
57
-
58
43
  export type UnknownAndAncestorBlocks = {
59
44
  unknowns: BlockInputSyncCacheItem[];
60
45
  ancestors: PendingBlockInput[];
@@ -558,9 +558,10 @@ export function getBeaconBlockRootFromDataColumnSidecarSerialized(data: Uint8Arr
558
558
  * └─ ExecutionPayloadEnvelope (starts at byte 100):
559
559
  * ├─ 4 bytes: payload offset
560
560
  * ├─ 4 bytes: executionRequests offset
561
- * ├─ 8 bytes: builderIndex (offset 108-115)
562
- * ├─ 32 bytes: beaconBlockRoot (offset 116-147)
563
- * └─ variable: payload data (starts at envelope + 48)
561
+ * ├─ 8 bytes: builderIndex (offset 108-115)
562
+ * ├─ 32 bytes: beaconBlockRoot (offset 116-147)
563
+ * ├─ 32 bytes: parentBeaconBlockRoot (offset 148-179) new in Gloas alpha.6 (consensus-specs#5152)
564
+ * └─ variable: payload data (starts at envelope + 80)
564
565
  * └─ ExecutionPayload fixed portion includes slotNumber at offset 532
565
566
  */
566
567
  const SIGNED_EXECUTION_PAYLOAD_ENVELOPE_MESSAGE_OFFSET = 4;
@@ -576,12 +577,13 @@ const BEACON_BLOCK_ROOT_OFFSET_IN_SIGNED_EXECUTION_PAYLOAD_ENVELOPE =
576
577
  EXECUTION_PAYLOAD_ENVELOPE_REQUESTS_OFFSET +
577
578
  EXECUTION_PAYLOAD_ENVELOPE_BUILDER_INDEX_SIZE; // 116
578
579
 
579
- // Envelope fixed portion (without slot): payload_offset(4) + requests_offset(4) + builderIndex(8) + beaconBlockRoot(32) = 48
580
+ // Envelope fixed portion: payload_offset(4) + requests_offset(4) + builderIndex(8) + beaconBlockRoot(32) + parentBeaconBlockRoot(32) = 80
580
581
  const EXECUTION_PAYLOAD_ENVELOPE_FIXED_SIZE =
581
582
  EXECUTION_PAYLOAD_ENVELOPE_PAYLOAD_OFFSET +
582
583
  EXECUTION_PAYLOAD_ENVELOPE_REQUESTS_OFFSET +
583
584
  EXECUTION_PAYLOAD_ENVELOPE_BUILDER_INDEX_SIZE +
584
- ROOT_SIZE; // 48
585
+ ROOT_SIZE +
586
+ ROOT_SIZE; // 80
585
587
 
586
588
  // slotNumber offset within ExecutionPayload fixed portion:
587
589
  // parentHash(32) + feeRecipient(20) + stateRoot(32) + receiptsRoot(32) + logsBloom(256) +
@@ -595,7 +597,7 @@ const ENVELOPE_START_IN_SIGNED =
595
597
  SIGNED_EXECUTION_PAYLOAD_ENVELOPE_MESSAGE_OFFSET + SIGNED_EXECUTION_PAYLOAD_ENVELOPE_SIGNATURE_SIZE; // 100
596
598
 
597
599
  const SLOT_OFFSET_IN_SIGNED_EXECUTION_PAYLOAD_ENVELOPE =
598
- ENVELOPE_START_IN_SIGNED + EXECUTION_PAYLOAD_ENVELOPE_FIXED_SIZE + SLOT_NUMBER_OFFSET_IN_EXECUTION_PAYLOAD; // 100 + 48 + 532 = 680
600
+ ENVELOPE_START_IN_SIGNED + EXECUTION_PAYLOAD_ENVELOPE_FIXED_SIZE + SLOT_NUMBER_OFFSET_IN_EXECUTION_PAYLOAD; // 100 + 80 + 532 = 712
599
601
 
600
602
  export function getSlotFromExecutionPayloadEnvelopeSerialized(data: Uint8Array): Slot | null {
601
603
  if (data.length < SLOT_OFFSET_IN_SIGNED_EXECUTION_PAYLOAD_ENVELOPE + SLOT_SIZE) {