@lodestar/beacon-node 1.50.0-dev.d99080f29a → 1.50.0-dev.e8dec5f2fe

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 (193) hide show
  1. package/lib/api/impl/beacon/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/index.js +13 -0
  3. package/lib/api/impl/beacon/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/index.js +23 -3
  6. package/lib/api/impl/beacon/state/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 +26 -18
  9. package/lib/api/impl/debug/index.js.map +1 -1
  10. package/lib/api/impl/validator/index.d.ts +1 -0
  11. package/lib/api/impl/validator/index.d.ts.map +1 -1
  12. package/lib/api/impl/validator/index.js +23 -1
  13. package/lib/api/impl/validator/index.js.map +1 -1
  14. package/lib/chain/archiveStore/archiveStore.d.ts +5 -0
  15. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  16. package/lib/chain/archiveStore/archiveStore.js +14 -24
  17. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  18. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +2 -2
  19. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  20. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +5 -7
  21. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  22. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -1
  23. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  24. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -2
  25. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  26. package/lib/chain/archiveStore/historicalState/worker.js +1 -1
  27. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  28. package/lib/chain/archiveStore/interface.d.ts +1 -1
  29. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  30. package/lib/chain/archiveStore/utils/pruneHistory.d.ts +1 -1
  31. package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -1
  32. package/lib/chain/archiveStore/utils/pruneHistory.js +2 -1
  33. package/lib/chain/archiveStore/utils/pruneHistory.js.map +1 -1
  34. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  35. package/lib/chain/blocks/importBlock.js +7 -3
  36. package/lib/chain/blocks/importBlock.js.map +1 -1
  37. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  38. package/lib/chain/blocks/verifyBlock.js +1 -1
  39. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  40. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +2 -1
  41. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  42. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +5 -4
  43. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  44. package/lib/chain/chain.d.ts +4 -1
  45. package/lib/chain/chain.d.ts.map +1 -1
  46. package/lib/chain/chain.js +42 -5
  47. package/lib/chain/chain.js.map +1 -1
  48. package/lib/chain/emitter.d.ts +7 -1
  49. package/lib/chain/emitter.d.ts.map +1 -1
  50. package/lib/chain/emitter.js +5 -0
  51. package/lib/chain/emitter.js.map +1 -1
  52. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  53. package/lib/chain/forkChoice/index.js +2 -0
  54. package/lib/chain/forkChoice/index.js.map +1 -1
  55. package/lib/chain/interface.d.ts +1 -0
  56. package/lib/chain/interface.d.ts.map +1 -1
  57. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -2
  58. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  59. package/lib/chain/opPools/aggregatedAttestationPool.js +30 -8
  60. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  61. package/lib/chain/opPools/proposerPreferencesPool.d.ts +4 -4
  62. package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -1
  63. package/lib/chain/opPools/proposerPreferencesPool.js +14 -11
  64. package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -1
  65. package/lib/chain/options.d.ts +2 -1
  66. package/lib/chain/options.d.ts.map +1 -1
  67. package/lib/chain/options.js +1 -1
  68. package/lib/chain/options.js.map +1 -1
  69. package/lib/chain/produceBlock/computeNewStateRoot.js +1 -1
  70. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  71. package/lib/chain/regen/regen.d.ts +2 -0
  72. package/lib/chain/regen/regen.d.ts.map +1 -1
  73. package/lib/chain/regen/regen.js +10 -4
  74. package/lib/chain/regen/regen.js.map +1 -1
  75. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -0
  76. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  77. package/lib/chain/seenCache/seenGossipBlockInput.js +21 -0
  78. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  79. package/lib/chain/shufflingCache.d.ts +1 -0
  80. package/lib/chain/shufflingCache.d.ts.map +1 -1
  81. package/lib/chain/shufflingCache.js +4 -0
  82. package/lib/chain/shufflingCache.js.map +1 -1
  83. package/lib/chain/validatorMonitor.d.ts +5 -1
  84. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  85. package/lib/chain/validatorMonitor.js +64 -54
  86. package/lib/chain/validatorMonitor.js.map +1 -1
  87. package/lib/db/beacon.d.ts +2 -0
  88. package/lib/db/beacon.d.ts.map +1 -1
  89. package/lib/db/beacon.js +3 -0
  90. package/lib/db/beacon.js.map +1 -1
  91. package/lib/db/buckets.d.ts +2 -1
  92. package/lib/db/buckets.d.ts.map +1 -1
  93. package/lib/db/buckets.js +1 -0
  94. package/lib/db/buckets.js.map +1 -1
  95. package/lib/db/interface.d.ts +2 -0
  96. package/lib/db/interface.d.ts.map +1 -1
  97. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  98. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  99. package/lib/db/repositories/earliestAvailableSlot.d.ts +11 -0
  100. package/lib/db/repositories/earliestAvailableSlot.d.ts.map +1 -0
  101. package/lib/db/repositories/earliestAvailableSlot.js +19 -0
  102. package/lib/db/repositories/earliestAvailableSlot.js.map +1 -0
  103. package/lib/execution/engine/disabled.d.ts +0 -2
  104. package/lib/execution/engine/disabled.d.ts.map +1 -1
  105. package/lib/execution/engine/disabled.js +0 -6
  106. package/lib/execution/engine/disabled.js.map +1 -1
  107. package/lib/execution/engine/http.d.ts +1 -3
  108. package/lib/execution/engine/http.d.ts.map +1 -1
  109. package/lib/execution/engine/http.js +2 -17
  110. package/lib/execution/engine/http.js.map +1 -1
  111. package/lib/execution/engine/interface.d.ts +2 -4
  112. package/lib/execution/engine/interface.d.ts.map +1 -1
  113. package/lib/execution/engine/mock.d.ts +0 -2
  114. package/lib/execution/engine/mock.d.ts.map +1 -1
  115. package/lib/execution/engine/mock.js +0 -8
  116. package/lib/execution/engine/mock.js.map +1 -1
  117. package/lib/execution/engine/types.d.ts +0 -8
  118. package/lib/execution/engine/types.d.ts.map +1 -1
  119. package/lib/execution/engine/types.js.map +1 -1
  120. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  121. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  122. package/lib/metrics/metrics/lodestar.js +4 -0
  123. package/lib/metrics/metrics/lodestar.js.map +1 -1
  124. package/lib/metrics/metrics.d.ts +7 -3
  125. package/lib/metrics/metrics.d.ts.map +1 -1
  126. package/lib/metrics/metrics.js +4 -4
  127. package/lib/metrics/metrics.js.map +1 -1
  128. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  129. package/lib/network/processor/gossipHandlers.js +59 -63
  130. package/lib/network/processor/gossipHandlers.js.map +1 -1
  131. package/lib/node/nodejs.d.ts +3 -1
  132. package/lib/node/nodejs.d.ts.map +1 -1
  133. package/lib/node/nodejs.js +27 -4
  134. package/lib/node/nodejs.js.map +1 -1
  135. package/lib/sync/range/batch.d.ts +6 -0
  136. package/lib/sync/range/batch.d.ts.map +1 -1
  137. package/lib/sync/range/batch.js +11 -0
  138. package/lib/sync/range/batch.js.map +1 -1
  139. package/lib/sync/range/chain.d.ts.map +1 -1
  140. package/lib/sync/range/chain.js +6 -1
  141. package/lib/sync/range/chain.js.map +1 -1
  142. package/lib/sync/unknownBlock.d.ts +5 -2
  143. package/lib/sync/unknownBlock.d.ts.map +1 -1
  144. package/lib/sync/unknownBlock.js +44 -20
  145. package/lib/sync/unknownBlock.js.map +1 -1
  146. package/lib/sync/utils/downloadByRange.d.ts +8 -0
  147. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  148. package/lib/sync/utils/downloadByRange.js +32 -9
  149. package/lib/sync/utils/downloadByRange.js.map +1 -1
  150. package/package.json +17 -17
  151. package/src/api/impl/beacon/index.ts +15 -0
  152. package/src/api/impl/beacon/state/index.ts +31 -3
  153. package/src/api/impl/debug/index.ts +28 -19
  154. package/src/api/impl/validator/index.ts +24 -2
  155. package/src/chain/archiveStore/archiveStore.ts +19 -25
  156. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +5 -7
  157. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +1 -1
  158. package/src/chain/archiveStore/historicalState/types.ts +2 -2
  159. package/src/chain/archiveStore/historicalState/worker.ts +1 -2
  160. package/src/chain/archiveStore/interface.ts +1 -1
  161. package/src/chain/archiveStore/utils/pruneHistory.ts +4 -1
  162. package/src/chain/blocks/importBlock.ts +9 -3
  163. package/src/chain/blocks/verifyBlock.ts +1 -0
  164. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -3
  165. package/src/chain/chain.ts +59 -4
  166. package/src/chain/emitter.ts +7 -1
  167. package/src/chain/forkChoice/index.ts +2 -0
  168. package/src/chain/interface.ts +1 -0
  169. package/src/chain/opPools/aggregatedAttestationPool.ts +34 -10
  170. package/src/chain/opPools/proposerPreferencesPool.ts +14 -10
  171. package/src/chain/options.ts +3 -3
  172. package/src/chain/produceBlock/computeNewStateRoot.ts +1 -1
  173. package/src/chain/regen/regen.ts +12 -4
  174. package/src/chain/seenCache/seenGossipBlockInput.ts +23 -0
  175. package/src/chain/shufflingCache.ts +5 -0
  176. package/src/chain/validatorMonitor.ts +75 -57
  177. package/src/db/beacon.ts +3 -0
  178. package/src/db/buckets.ts +1 -0
  179. package/src/db/interface.ts +2 -0
  180. package/src/db/repositories/earliestAvailableSlot.ts +19 -0
  181. package/src/execution/engine/disabled.ts +0 -8
  182. package/src/execution/engine/http.ts +1 -30
  183. package/src/execution/engine/interface.ts +2 -6
  184. package/src/execution/engine/mock.ts +1 -19
  185. package/src/execution/engine/types.ts +0 -10
  186. package/src/metrics/metrics/lodestar.ts +4 -0
  187. package/src/metrics/metrics.ts +21 -6
  188. package/src/network/processor/gossipHandlers.ts +90 -76
  189. package/src/node/nodejs.ts +35 -3
  190. package/src/sync/range/batch.ts +12 -0
  191. package/src/sync/range/chain.ts +7 -1
  192. package/src/sync/unknownBlock.ts +57 -21
  193. package/src/sync/utils/downloadByRange.ts +47 -8
@@ -16,6 +16,7 @@ import {
16
16
  deneb,
17
17
  fulu,
18
18
  gloas,
19
+ isGloasBeaconBlock,
19
20
  isGloasDataColumnSidecar,
20
21
  phase0,
21
22
  } from "@lodestar/types";
@@ -62,6 +63,7 @@ export type DownloadByRangeRequests = {
62
63
  export type ParentPayloadCommitments = {
63
64
  blockRoot: Uint8Array;
64
65
  blockRootHex: RootHex;
66
+ blockHash: Uint8Array;
65
67
  kzgCommitments: deneb.BlobKzgCommitments;
66
68
  };
67
69
 
@@ -1171,6 +1173,8 @@ export enum DownloadByRangeErrorCode {
1171
1173
 
1172
1174
  /** Envelope beaconBlockRoot does not match the block's root */
1173
1175
  INVALID_ENVELOPE_BEACON_BLOCK_ROOT = "DOWNLOAD_BY_RANGE_ERROR_INVALID_ENVELOPE_BEACON_BLOCK_ROOT",
1176
+ /** Envelope payload.blockHash does not match the block's bid */
1177
+ INVALID_ENVELOPE_BLOCK_HASH = "DOWNLOAD_BY_RANGE_ERROR_INVALID_ENVELOPE_BLOCK_HASH",
1174
1178
 
1175
1179
  /** Block segment + envelopes failed chain-segment linearity / FULL-chain checks */
1176
1180
  INVALID_CHAIN_SEGMENT = "DOWNLOAD_BY_RANGE_ERROR_INVALID_CHAIN_SEGMENT",
@@ -1272,6 +1276,12 @@ export type DownloadByRangeErrorType =
1272
1276
  expected: string;
1273
1277
  actual: string;
1274
1278
  }
1279
+ | {
1280
+ code: DownloadByRangeErrorCode.INVALID_ENVELOPE_BLOCK_HASH;
1281
+ slot: Slot;
1282
+ expected: string;
1283
+ actual: string;
1284
+ }
1275
1285
  | {
1276
1286
  code: DownloadByRangeErrorCode.INVALID_CHAIN_SEGMENT;
1277
1287
  slot: Slot;
@@ -1295,47 +1305,76 @@ export function validateEnvelopesByRangeResponse(
1295
1305
  payloadEnvelopes: gloas.SignedExecutionPayloadEnvelope[],
1296
1306
  parentPayloadCommitments?: ParentPayloadCommitments
1297
1307
  ): Map<Slot, gloas.SignedExecutionPayloadEnvelope> {
1298
- // Build a map of slot -> blockRoot for all blocks in the batch
1299
- const batchBlockRoots = new Map<Slot, Uint8Array>();
1308
+ // Build a map of slot -> block root and bid block hash for all blocks in the batch
1309
+ const batchBlocksBySlot = new Map<Slot, {blockRoot: Uint8Array; block: SignedBeaconBlock | null}>();
1300
1310
  if (batchBlocks) {
1301
1311
  for (const blockInput of batchBlocks) {
1302
- batchBlockRoots.set(blockInput.slot, fromHex(blockInput.blockRootHex));
1312
+ batchBlocksBySlot.set(blockInput.slot, {
1313
+ blockRoot: fromHex(blockInput.blockRootHex),
1314
+ block: blockInput.hasBlock() ? blockInput.getBlock() : null,
1315
+ });
1303
1316
  }
1304
1317
  }
1305
1318
  for (const {block, blockRoot} of validatedBlocks) {
1306
- batchBlockRoots.set(block.message.slot, blockRoot);
1319
+ batchBlocksBySlot.set(block.message.slot, {blockRoot, block});
1307
1320
  }
1308
1321
 
1309
1322
  const payloadEnvelopeMap = new Map<Slot, gloas.SignedExecutionPayloadEnvelope>();
1310
1323
 
1311
1324
  for (const payloadEnvelope of payloadEnvelopes) {
1312
1325
  const slot = payloadEnvelope.message.payload.slotNumber;
1313
- const batchBlockRoot = batchBlockRoots.get(slot);
1326
+ const batchBlock = batchBlocksBySlot.get(slot);
1314
1327
 
1315
- if (batchBlockRoot === undefined) {
1328
+ if (batchBlock === undefined) {
1316
1329
  // Keep the requested dangling-parent envelope only when its beaconBlockRoot matches
1317
1330
  // exactly. All other unrelated envelopes are dropped.
1318
1331
  if (
1319
1332
  parentPayloadCommitments !== undefined &&
1320
1333
  byteArrayEquals(payloadEnvelope.message.beaconBlockRoot, parentPayloadCommitments.blockRoot)
1321
1334
  ) {
1335
+ assertEnvelopeBlockHash(payloadEnvelope, parentPayloadCommitments.blockHash);
1322
1336
  payloadEnvelopeMap.set(slot, payloadEnvelope);
1323
1337
  }
1324
1338
  continue;
1325
1339
  }
1326
1340
 
1327
1341
  // Verify beaconBlockRoot matches the block's root
1328
- if (!byteArrayEquals(payloadEnvelope.message.beaconBlockRoot, batchBlockRoot)) {
1342
+ if (!byteArrayEquals(payloadEnvelope.message.beaconBlockRoot, batchBlock.blockRoot)) {
1329
1343
  throw new DownloadByRangeError({
1330
1344
  code: DownloadByRangeErrorCode.INVALID_ENVELOPE_BEACON_BLOCK_ROOT,
1331
1345
  slot,
1332
- expected: toRootHex(batchBlockRoot),
1346
+ expected: toRootHex(batchBlock.blockRoot),
1333
1347
  actual: toRootHex(payloadEnvelope.message.beaconBlockRoot),
1334
1348
  });
1335
1349
  }
1336
1350
 
1351
+ if (batchBlock.block !== null && isGloasBeaconBlock(batchBlock.block.message)) {
1352
+ assertEnvelopeBlockHash(
1353
+ payloadEnvelope,
1354
+ batchBlock.block.message.body.signedExecutionPayloadBid.message.blockHash
1355
+ );
1356
+ }
1357
+
1337
1358
  payloadEnvelopeMap.set(slot, payloadEnvelope);
1338
1359
  }
1339
1360
 
1340
1361
  return payloadEnvelopeMap;
1341
1362
  }
1363
+
1364
+ /**
1365
+ * Rejected before it is cached. In-batch, `assertLinearChainSegment` fails on a wrong hash without evicting the
1366
+ * envelope. For the dangling parent, the import evicts the parent's entry and range sync cannot recreate it.
1367
+ */
1368
+ function assertEnvelopeBlockHash(
1369
+ payloadEnvelope: gloas.SignedExecutionPayloadEnvelope,
1370
+ bidBlockHash: Uint8Array
1371
+ ): void {
1372
+ if (!byteArrayEquals(payloadEnvelope.message.payload.blockHash, bidBlockHash)) {
1373
+ throw new DownloadByRangeError({
1374
+ code: DownloadByRangeErrorCode.INVALID_ENVELOPE_BLOCK_HASH,
1375
+ slot: payloadEnvelope.message.payload.slotNumber,
1376
+ expected: toRootHex(bidBlockHash),
1377
+ actual: toRootHex(payloadEnvelope.message.payload.blockHash),
1378
+ });
1379
+ }
1380
+ }