@lodestar/beacon-node 1.39.0-dev.90493ebb47 → 1.39.0-dev.a2107436df

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 (132) hide show
  1. package/lib/api/impl/beacon/state/utils.d.ts +2 -7
  2. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  3. package/lib/api/impl/beacon/state/utils.js +0 -12
  4. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  5. package/lib/api/impl/lodestar/index.js +1 -1
  6. package/lib/api/impl/lodestar/index.js.map +1 -1
  7. package/lib/api/impl/proof/index.d.ts.map +1 -1
  8. package/lib/api/impl/proof/index.js +1 -2
  9. package/lib/api/impl/proof/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 +1 -3
  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 +12 -3
  15. package/lib/chain/blocks/importBlock.js.map +1 -1
  16. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  17. package/lib/chain/blocks/verifyBlock.js +8 -1
  18. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  19. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  20. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +1 -0
  21. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  22. package/lib/chain/chain.d.ts +3 -2
  23. package/lib/chain/chain.d.ts.map +1 -1
  24. package/lib/chain/chain.js +16 -6
  25. package/lib/chain/chain.js.map +1 -1
  26. package/lib/chain/interface.d.ts +2 -2
  27. package/lib/chain/interface.d.ts.map +1 -1
  28. package/lib/chain/lightClient/proofs.d.ts.map +1 -1
  29. package/lib/chain/lightClient/proofs.js +0 -2
  30. package/lib/chain/lightClient/proofs.js.map +1 -1
  31. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +5 -9
  32. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  33. package/lib/chain/opPools/aggregatedAttestationPool.js +12 -141
  34. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  35. package/lib/chain/opPools/opPool.js +5 -8
  36. package/lib/chain/opPools/opPool.js.map +1 -1
  37. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  38. package/lib/chain/prepareNextSlot.js +4 -7
  39. package/lib/chain/prepareNextSlot.js.map +1 -1
  40. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  41. package/lib/chain/produceBlock/produceBlockBody.js +1 -1
  42. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  43. package/lib/chain/regen/interface.d.ts +1 -5
  44. package/lib/chain/regen/interface.d.ts.map +1 -1
  45. package/lib/chain/regen/queued.d.ts +4 -7
  46. package/lib/chain/regen/queued.d.ts.map +1 -1
  47. package/lib/chain/regen/queued.js +15 -25
  48. package/lib/chain/regen/queued.js.map +1 -1
  49. package/lib/chain/regen/regen.d.ts +1 -1
  50. package/lib/chain/regen/regen.d.ts.map +1 -1
  51. package/lib/chain/regen/regen.js +13 -17
  52. package/lib/chain/regen/regen.js.map +1 -1
  53. package/lib/chain/shufflingCache.d.ts +16 -11
  54. package/lib/chain/shufflingCache.d.ts.map +1 -1
  55. package/lib/chain/shufflingCache.js +47 -41
  56. package/lib/chain/shufflingCache.js.map +1 -1
  57. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +1 -2
  58. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -1
  59. package/lib/chain/stateCache/blockStateCacheImpl.js +2 -2
  60. package/lib/chain/stateCache/blockStateCacheImpl.js.map +1 -1
  61. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -2
  62. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  63. package/lib/chain/stateCache/fifoBlockStateCache.js +4 -4
  64. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  65. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +4 -5
  66. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -1
  67. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +9 -10
  68. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
  69. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +5 -6
  70. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  71. package/lib/chain/stateCache/persistentCheckpointsCache.js +17 -17
  72. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  73. package/lib/chain/stateCache/types.d.ts +5 -6
  74. package/lib/chain/stateCache/types.d.ts.map +1 -1
  75. package/lib/chain/stateCache/types.js.map +1 -1
  76. package/lib/chain/validation/attestation.d.ts.map +1 -1
  77. package/lib/chain/validation/attestation.js +2 -2
  78. package/lib/chain/validation/attestation.js.map +1 -1
  79. package/lib/chain/validation/block.d.ts.map +1 -1
  80. package/lib/chain/validation/block.js +2 -0
  81. package/lib/chain/validation/block.js.map +1 -1
  82. package/lib/db/repositories/stateArchive.d.ts +1 -1
  83. package/lib/db/repositories/stateArchive.d.ts.map +1 -1
  84. package/lib/db/repositories/stateArchive.js +2 -2
  85. package/lib/db/repositories/stateArchive.js.map +1 -1
  86. package/lib/execution/engine/mock.d.ts +9 -6
  87. package/lib/execution/engine/mock.d.ts.map +1 -1
  88. package/lib/execution/engine/mock.js +34 -7
  89. package/lib/execution/engine/mock.js.map +1 -1
  90. package/lib/metrics/metrics/lodestar.d.ts +1 -6
  91. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  92. package/lib/metrics/metrics/lodestar.js +3 -17
  93. package/lib/metrics/metrics/lodestar.js.map +1 -1
  94. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +1 -1
  95. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  96. package/lib/node/nodejs.d.ts.map +1 -1
  97. package/lib/node/nodejs.js +17 -2
  98. package/lib/node/nodejs.js.map +1 -1
  99. package/lib/util/sszBytes.js +1 -1
  100. package/lib/util/sszBytes.js.map +1 -1
  101. package/package.json +15 -15
  102. package/src/api/impl/beacon/state/utils.ts +2 -22
  103. package/src/api/impl/lodestar/index.ts +1 -1
  104. package/src/api/impl/proof/index.ts +1 -2
  105. package/src/api/impl/validator/index.ts +1 -3
  106. package/src/chain/blocks/importBlock.ts +13 -3
  107. package/src/chain/blocks/verifyBlock.ts +9 -3
  108. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +1 -0
  109. package/src/chain/chain.ts +20 -9
  110. package/src/chain/interface.ts +2 -2
  111. package/src/chain/lightClient/proofs.ts +0 -2
  112. package/src/chain/opPools/aggregatedAttestationPool.ts +19 -191
  113. package/src/chain/opPools/opPool.ts +5 -7
  114. package/src/chain/prepareNextSlot.ts +2 -6
  115. package/src/chain/produceBlock/produceBlockBody.ts +6 -1
  116. package/src/chain/regen/interface.ts +1 -5
  117. package/src/chain/regen/queued.ts +15 -34
  118. package/src/chain/regen/regen.ts +12 -18
  119. package/src/chain/shufflingCache.ts +67 -50
  120. package/src/chain/stateCache/blockStateCacheImpl.ts +2 -3
  121. package/src/chain/stateCache/fifoBlockStateCache.ts +4 -5
  122. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +9 -15
  123. package/src/chain/stateCache/persistentCheckpointsCache.ts +17 -25
  124. package/src/chain/stateCache/types.ts +5 -10
  125. package/src/chain/validation/attestation.ts +3 -3
  126. package/src/chain/validation/block.ts +3 -0
  127. package/src/db/repositories/stateArchive.ts +2 -2
  128. package/src/execution/engine/mock.ts +40 -13
  129. package/src/metrics/metrics/lodestar.ts +3 -17
  130. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +1 -1
  131. package/src/node/nodejs.ts +18 -3
  132. package/src/util/sszBytes.ts +1 -1
@@ -1,4 +1,5 @@
1
1
  import crypto from "node:crypto";
2
+ import {ChainConfig} from "@lodestar/config";
2
3
  import {
3
4
  BLOB_TX_TYPE,
4
5
  BYTES_PER_FIELD_ELEMENT,
@@ -7,7 +8,9 @@ import {
7
8
  ForkPostBellatrix,
8
9
  ForkPostCapella,
9
10
  ForkSeq,
11
+ SLOTS_PER_EPOCH,
10
12
  } from "@lodestar/params";
13
+ import {computeTimeAtSlot} from "@lodestar/state-transition";
11
14
  import {ExecutionPayload, RootHex, bellatrix, deneb, ssz} from "@lodestar/types";
12
15
  import {fromHex, toRootHex} from "@lodestar/utils";
13
16
  import {ZERO_HASH_HEX} from "../../constants/index.js";
@@ -34,14 +37,11 @@ const INTEROP_GAS_LIMIT = 30e6;
34
37
  const PRUNE_PAYLOAD_ID_AFTER_MS = 5000;
35
38
 
36
39
  export type ExecutionEngineMockOpts = {
37
- genesisBlockHash: string;
40
+ genesisBlockHash?: string;
38
41
  eth1BlockHash?: string;
39
42
  onlyPredefinedResponses?: boolean;
40
- capellaForkTimestamp?: number;
41
- denebForkTimestamp?: number;
42
- electraForkTimestamp?: number;
43
- fuluForkTimestamp?: number;
44
- gloasForkTimestamp?: number;
43
+ genesisTime?: number;
44
+ config?: ChainConfig;
45
45
  };
46
46
 
47
47
  type ExecutionBlock = {
@@ -74,17 +74,21 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
74
74
  /** Preparing payloads to be retrieved via engine_getPayloadV1 */
75
75
  private readonly preparingPayloads = new Map<number, PreparedPayload>();
76
76
  private readonly payloadsForDeletion = new Map<number, number>();
77
-
78
77
  private readonly predefinedPayloadStatuses = new Map<RootHex, PayloadStatus>();
79
78
 
80
79
  private payloadId = 0;
80
+ private capellaForkTimestamp: number;
81
+ private denebForkTimestamp: number;
82
+ private electraForkTimestamp: number;
83
+ private fuluForkTimestamp: number;
84
+ private gloasForkTimestamp: number;
81
85
 
82
86
  readonly handlers: {
83
87
  [K in keyof EngineApiRpcParamTypes]: (...args: EngineApiRpcParamTypes[K]) => EngineApiRpcReturnTypes[K];
84
88
  };
85
89
 
86
90
  constructor(private readonly opts: ExecutionEngineMockOpts) {
87
- this.validBlocks.set(opts.genesisBlockHash, {
91
+ this.validBlocks.set(opts.genesisBlockHash ?? ZERO_HASH_HEX, {
88
92
  parentHash: ZERO_HASH_HEX,
89
93
  blockHash: ZERO_HASH_HEX,
90
94
  timestamp: 0,
@@ -100,6 +104,29 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
100
104
  blockNumber: 1,
101
105
  });
102
106
 
107
+ const {config} = opts;
108
+
109
+ this.capellaForkTimestamp =
110
+ opts.genesisTime && config
111
+ ? computeTimeAtSlot(config, config.CAPELLA_FORK_EPOCH * SLOTS_PER_EPOCH, opts.genesisTime)
112
+ : Infinity;
113
+ this.denebForkTimestamp =
114
+ opts.genesisTime && config
115
+ ? computeTimeAtSlot(config, config.DENEB_FORK_EPOCH * SLOTS_PER_EPOCH, opts.genesisTime)
116
+ : Infinity;
117
+ this.electraForkTimestamp =
118
+ opts.genesisTime && config
119
+ ? computeTimeAtSlot(config, config.ELECTRA_FORK_EPOCH * SLOTS_PER_EPOCH, opts.genesisTime)
120
+ : Infinity;
121
+ this.fuluForkTimestamp =
122
+ opts.genesisTime && config
123
+ ? computeTimeAtSlot(config, config.FULU_FORK_EPOCH * SLOTS_PER_EPOCH, opts.genesisTime)
124
+ : Infinity;
125
+ this.gloasForkTimestamp =
126
+ opts.genesisTime && config
127
+ ? computeTimeAtSlot(config, config.GLOAS_FORK_EPOCH * SLOTS_PER_EPOCH, opts.genesisTime)
128
+ : Infinity;
129
+
103
130
  this.handlers = {
104
131
  engine_newPayloadV1: this.notifyNewPayload.bind(this),
105
132
  engine_newPayloadV2: this.notifyNewPayload.bind(this),
@@ -448,11 +475,11 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
448
475
  }
449
476
 
450
477
  private timestampToFork(timestamp: number): ForkPostBellatrix {
451
- if (timestamp >= (this.opts.gloasForkTimestamp ?? Infinity)) return ForkName.gloas;
452
- if (timestamp >= (this.opts.fuluForkTimestamp ?? Infinity)) return ForkName.fulu;
453
- if (timestamp >= (this.opts.electraForkTimestamp ?? Infinity)) return ForkName.electra;
454
- if (timestamp >= (this.opts.denebForkTimestamp ?? Infinity)) return ForkName.deneb;
455
- if (timestamp >= (this.opts.capellaForkTimestamp ?? Infinity)) return ForkName.capella;
478
+ if (timestamp >= this.gloasForkTimestamp) return ForkName.gloas;
479
+ if (timestamp >= this.fuluForkTimestamp) return ForkName.fulu;
480
+ if (timestamp >= this.electraForkTimestamp) return ForkName.electra;
481
+ if (timestamp >= this.denebForkTimestamp) return ForkName.deneb;
482
+ if (timestamp >= this.capellaForkTimestamp) return ForkName.capella;
456
483
  return ForkName.bellatrix;
457
484
  }
458
485
  }
@@ -1308,33 +1308,19 @@ export function createLodestarMetrics(
1308
1308
  name: "lodestar_shuffling_cache_miss_count",
1309
1309
  help: "Count of shuffling cache miss",
1310
1310
  }),
1311
- shufflingBuiltMultipleTimes: register.gauge({
1312
- name: "lodestar_shuffling_cache_recalculated_shuffling_count",
1313
- help: "Count of shuffling that were build multiple times",
1314
- }),
1315
- shufflingPromiseNotResolvedAndThrownAway: register.gauge({
1316
- name: "lodestar_shuffling_cache_promise_not_resolved_and_thrown_away_count",
1317
- help: "Count of shuffling cache promises that were discarded and the shuffling was built synchronously",
1311
+ shufflingSetMultipleTimes: register.gauge({
1312
+ name: "lodestar_shuffling_cache_set_multiple_times_count",
1313
+ help: "Count of shuffling that were set multiple times",
1318
1314
  }),
1319
1315
  shufflingPromiseNotResolved: register.gauge({
1320
1316
  name: "lodestar_shuffling_cache_promise_not_resolved_count",
1321
1317
  help: "Count of shuffling cache promises that were requested before the promise was resolved",
1322
1318
  }),
1323
- nextShufflingNotOnEpochCache: register.gauge({
1324
- name: "lodestar_shuffling_cache_next_shuffling_not_on_epoch_cache",
1325
- help: "The next shuffling was not on the epoch cache before the epoch transition",
1326
- }),
1327
1319
  shufflingPromiseResolutionTime: register.histogram({
1328
1320
  name: "lodestar_shuffling_cache_promise_resolution_time_seconds",
1329
1321
  help: "Time from promise insertion until promise resolution when shuffling was ready in seconds",
1330
1322
  buckets: [0.5, 1, 1.5, 2],
1331
1323
  }),
1332
- shufflingCalculationTime: register.histogram<{source: "build" | "getSync"}>({
1333
- name: "lodestar_shuffling_cache_shuffling_calculation_time_seconds",
1334
- help: "Run time of shuffling calculation",
1335
- buckets: [0.5, 0.75, 1, 1.25, 1.5],
1336
- labelNames: ["source"],
1337
- }),
1338
1324
  },
1339
1325
 
1340
1326
  seenCache: {
@@ -55,7 +55,7 @@ export async function handleColumnSidecarUnavailability({
55
55
  const blobsCount = getBlobKzgCommitmentsCountFromSignedBeaconBlockSerialized(chain.config, blockBytes);
56
56
 
57
57
  // There are zero blobs for that column index, so we can safely return without any error
58
- if (blobsCount > 0) return;
58
+ if (blobsCount === 0) return;
59
59
 
60
60
  // There are blobs for that column index so we should have synced for it
61
61
  // We need to inform to peers that we don't have that expected data
@@ -6,9 +6,10 @@ import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
6
6
  import {BeaconApiMethods} from "@lodestar/api/beacon/server";
7
7
  import {BeaconConfig} from "@lodestar/config";
8
8
  import type {LoggerNode} from "@lodestar/logger/node";
9
- import {CachedBeaconStateAllForks, Index2PubkeyCache} from "@lodestar/state-transition";
9
+ import {ZERO_HASH_HEX} from "@lodestar/params";
10
+ import {CachedBeaconStateAllForks, Index2PubkeyCache, isExecutionCachedStateType} from "@lodestar/state-transition";
10
11
  import {phase0} from "@lodestar/types";
11
- import {sleep} from "@lodestar/utils";
12
+ import {sleep, toRootHex} from "@lodestar/utils";
12
13
  import {ProcessShutdownCallback} from "@lodestar/validator";
13
14
  import {BeaconRestApiServer, getApi} from "../api/index.js";
14
15
  import {BeaconChain, IBeaconChain, initBeaconMetrics} from "../chain/index.js";
@@ -221,6 +222,20 @@ export class BeaconNode {
221
222
  )
222
223
  : null;
223
224
 
225
+ let executionEngineOpts = opts.executionEngine;
226
+ if (opts.executionEngine.mode === "mock") {
227
+ const eth1BlockHash = isExecutionCachedStateType(anchorState)
228
+ ? toRootHex(anchorState.latestExecutionPayloadHeader.blockHash)
229
+ : undefined;
230
+ executionEngineOpts = {
231
+ ...opts.executionEngine,
232
+ genesisBlockHash: ZERO_HASH_HEX,
233
+ eth1BlockHash,
234
+ genesisTime: anchorState.genesisTime,
235
+ config,
236
+ };
237
+ }
238
+
224
239
  const chain = new BeaconChain(opts.chain, {
225
240
  privateKey,
226
241
  config,
@@ -236,7 +251,7 @@ export class BeaconNode {
236
251
  validatorMonitor,
237
252
  anchorState,
238
253
  isAnchorStateFinalized,
239
- executionEngine: initializeExecutionEngine(opts.executionEngine, {
254
+ executionEngine: initializeExecutionEngine(executionEngineOpts, {
240
255
  metrics,
241
256
  signal,
242
257
  logger: logger.child({module: LoggerModule.execution}),
@@ -479,7 +479,7 @@ export function getBlobKzgCommitmentsCountFromSignedBeaconBlockSerialized(
479
479
  blockBytes: Uint8Array
480
480
  ): number {
481
481
  const slot = getSlotFromSignedBeaconBlockSerialized(blockBytes);
482
- if (!slot) throw new Error("Can not parse the slot from block bytes");
482
+ if (slot === null) throw new Error("Can not parse the slot from block bytes");
483
483
 
484
484
  if (config.getForkSeq(slot) < ForkSeq.deneb) return 0;
485
485