@chainsafe/lodestar 1.50.0-dev.ebecebb9ba → 1.50.0-dev.f0a5c36612

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 (75) hide show
  1. package/.git-data.json +1 -1
  2. package/lib/cmds/beacon/handler.d.ts +1 -0
  3. package/lib/cmds/beacon/handler.d.ts.map +1 -1
  4. package/lib/cmds/beacon/handler.js +13 -21
  5. package/lib/cmds/beacon/handler.js.map +1 -1
  6. package/lib/cmds/beacon/initBeaconState.d.ts +13 -17
  7. package/lib/cmds/beacon/initBeaconState.d.ts.map +1 -1
  8. package/lib/cmds/beacon/initBeaconState.js +84 -275
  9. package/lib/cmds/beacon/initBeaconState.js.map +1 -1
  10. package/lib/cmds/beacon/options.d.ts +1 -1
  11. package/lib/cmds/beacon/options.d.ts.map +1 -1
  12. package/lib/cmds/beacon/options.js +6 -5
  13. package/lib/cmds/beacon/options.js.map +1 -1
  14. package/lib/cmds/beacon/paths.d.ts +4 -0
  15. package/lib/cmds/beacon/paths.d.ts.map +1 -1
  16. package/lib/cmds/beacon/paths.js +3 -0
  17. package/lib/cmds/beacon/paths.js.map +1 -1
  18. package/lib/cmds/beacon/pubkeysFile.d.ts +10 -0
  19. package/lib/cmds/beacon/pubkeysFile.d.ts.map +1 -0
  20. package/lib/cmds/beacon/pubkeysFile.js +39 -0
  21. package/lib/cmds/beacon/pubkeysFile.js.map +1 -0
  22. package/lib/cmds/beacon/stateInitialization/checkpointState.d.ts +7 -0
  23. package/lib/cmds/beacon/stateInitialization/checkpointState.d.ts.map +1 -0
  24. package/lib/cmds/beacon/stateInitialization/checkpointState.js +184 -0
  25. package/lib/cmds/beacon/stateInitialization/checkpointState.js.map +1 -0
  26. package/lib/cmds/beacon/stateInitialization/errors.d.ts +17 -0
  27. package/lib/cmds/beacon/stateInitialization/errors.d.ts.map +1 -0
  28. package/lib/cmds/beacon/stateInitialization/errors.js +16 -0
  29. package/lib/cmds/beacon/stateInitialization/errors.js.map +1 -0
  30. package/lib/cmds/beacon/stateInitialization/genesisState.d.ts +3 -0
  31. package/lib/cmds/beacon/stateInitialization/genesisState.d.ts.map +1 -0
  32. package/lib/cmds/beacon/stateInitialization/genesisState.js +79 -0
  33. package/lib/cmds/beacon/stateInitialization/genesisState.js.map +1 -0
  34. package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.d.ts +4 -0
  35. package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.d.ts.map +1 -0
  36. package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.js +67 -0
  37. package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.js.map +1 -0
  38. package/lib/cmds/beacon/stateInitialization/types.d.ts +42 -0
  39. package/lib/cmds/beacon/stateInitialization/types.d.ts.map +1 -0
  40. package/lib/cmds/beacon/stateInitialization/types.js +2 -0
  41. package/lib/cmds/beacon/stateInitialization/types.js.map +1 -0
  42. package/lib/cmds/beacon/stateInitialization/validation.d.ts +4 -0
  43. package/lib/cmds/beacon/stateInitialization/validation.d.ts.map +1 -0
  44. package/lib/cmds/beacon/stateInitialization/validation.js +12 -0
  45. package/lib/cmds/beacon/stateInitialization/validation.js.map +1 -0
  46. package/lib/cmds/dev/handler.d.ts.map +1 -1
  47. package/lib/cmds/dev/handler.js +3 -1
  48. package/lib/cmds/dev/handler.js.map +1 -1
  49. package/lib/cmds/dev/options.d.ts +2 -1
  50. package/lib/cmds/dev/options.d.ts.map +1 -1
  51. package/lib/networks/index.d.ts +3 -9
  52. package/lib/networks/index.d.ts.map +1 -1
  53. package/lib/networks/index.js +15 -28
  54. package/lib/networks/index.js.map +1 -1
  55. package/lib/options/beaconNodeOptions/chain.d.ts +2 -1
  56. package/lib/options/beaconNodeOptions/chain.d.ts.map +1 -1
  57. package/lib/options/beaconNodeOptions/chain.js +12 -5
  58. package/lib/options/beaconNodeOptions/chain.js.map +1 -1
  59. package/lib/options/beaconNodeOptions/index.d.ts +2 -1
  60. package/lib/options/beaconNodeOptions/index.d.ts.map +1 -1
  61. package/package.json +15 -15
  62. package/src/cmds/beacon/handler.ts +19 -22
  63. package/src/cmds/beacon/initBeaconState.ts +136 -387
  64. package/src/cmds/beacon/options.ts +8 -7
  65. package/src/cmds/beacon/paths.ts +5 -0
  66. package/src/cmds/beacon/pubkeysFile.ts +50 -0
  67. package/src/cmds/beacon/stateInitialization/checkpointState.ts +272 -0
  68. package/src/cmds/beacon/stateInitialization/errors.ts +15 -0
  69. package/src/cmds/beacon/stateInitialization/genesisState.ts +99 -0
  70. package/src/cmds/beacon/stateInitialization/prepareStateInitialization.ts +79 -0
  71. package/src/cmds/beacon/stateInitialization/types.ts +60 -0
  72. package/src/cmds/beacon/stateInitialization/validation.ts +16 -0
  73. package/src/cmds/dev/handler.ts +3 -1
  74. package/src/networks/index.ts +25 -40
  75. package/src/options/beaconNodeOptions/chain.ts +15 -6
@@ -31,7 +31,7 @@ export async function devHandler(args: IDevArgs & GlobalArgs): Promise<void> {
31
31
 
32
32
  // Note: defaults to network "dev", to all paths are custom and don't conflict with networks.
33
33
  // Flag --reset cleans up the custom dirs on dev stop
34
- const beaconDbDir = getBeaconPaths(args, network).dbDir;
34
+ const {dbDir: beaconDbDir, pubkeysFile} = getBeaconPaths(args, network);
35
35
  const validatorsDbDir = getValidatorPaths(args, network).validatorsDbDir;
36
36
 
37
37
  // Remove slashing protection db. Otherwise the validators won't be able to propose nor attest
@@ -39,6 +39,8 @@ export async function devHandler(args: IDevArgs & GlobalArgs): Promise<void> {
39
39
  if (args.genesisTime === undefined) {
40
40
  await rimraf(beaconDbDir);
41
41
  await rimraf(validatorsDbDir);
42
+ // Validators deposited in the previous run do not exist on the new chain
43
+ await rimraf(pubkeysFile);
42
44
  }
43
45
 
44
46
  mkdir(beaconDbDir);
@@ -4,15 +4,9 @@ import {WireFormat, getClient} from "@lodestar/api";
4
4
  import {getStateSlotFromBytes} from "@lodestar/beacon-node";
5
5
  import {ChainConfig, ChainForkConfig} from "@lodestar/config";
6
6
  import {SLOTS_PER_EPOCH} from "@lodestar/params";
7
- import {
8
- BeaconStateAllForks,
9
- computeCheckpointEpochAtStateSlot,
10
- getLatestBlockRoot,
11
- loadState,
12
- } from "@lodestar/state-transition";
13
- import {Slot, sszTypesFor} from "@lodestar/types";
7
+ import {Slot} from "@lodestar/types";
14
8
  import {Checkpoint} from "@lodestar/types/phase0";
15
- import {Logger, callFnWhenAwait, fetch, formatBytes, fromHex} from "@lodestar/utils";
9
+ import {LodestarError, Logger, callFnWhenAwait, fetch, formatBytes, fromHex} from "@lodestar/utils";
16
10
  import {parseBootnodesFile} from "../util/format.js";
17
11
  import * as chiado from "./chiado.js";
18
12
  import * as dev from "./dev.js";
@@ -160,15 +154,11 @@ export function readBootnodes(bootnodesFilePath: string): string[] {
160
154
  /**
161
155
  * Fetch weak subjectivity state from a remote beacon node
162
156
  */
163
- export async function fetchWeakSubjectivityState(
157
+ export async function fetchWeakSubjectivityStateBytes(
164
158
  config: ChainForkConfig,
165
159
  logger: Logger,
166
- {checkpointSyncUrl, wssCheckpoint}: {checkpointSyncUrl: string; wssCheckpoint?: string},
167
- {
168
- lastDbState,
169
- lastDbValidatorsBytes,
170
- }: {lastDbState: BeaconStateAllForks | null; lastDbValidatorsBytes: Uint8Array | null}
171
- ): Promise<{wsState: BeaconStateAllForks; wsStateBytes: Uint8Array; wsCheckpoint: Checkpoint}> {
160
+ {checkpointSyncUrl, wssCheckpoint}: {checkpointSyncUrl: string; wssCheckpoint?: string}
161
+ ): Promise<{stateBytes: Uint8Array; expectedCheckpoint: Checkpoint | null}> {
172
162
  try {
173
163
  let wsCheckpoint: Checkpoint | null;
174
164
  let stateId: Slot | "finalized";
@@ -178,7 +168,7 @@ export async function fetchWeakSubjectivityState(
178
168
  wsCheckpoint = getCheckpointFromArg(wssCheckpoint);
179
169
  stateId = wsCheckpoint.epoch * SLOTS_PER_EPOCH;
180
170
  } else {
181
- // Fetch current finalized state and extract checkpoint from it
171
+ // Checkpoint identity can be derived after the selected state is constructed.
182
172
  stateId = "finalized";
183
173
  wsCheckpoint = null;
184
174
  }
@@ -186,33 +176,37 @@ export async function fetchWeakSubjectivityState(
186
176
  // getStateV2 should be available for all forks including phase0
187
177
  const getStatePromise = api.debug.getStateV2({stateId}, {responseWireFormat: WireFormat.ssz});
188
178
 
189
- const {wsStateBytes, fork} = await callFnWhenAwait(
179
+ const response = await callFnWhenAwait(
190
180
  getStatePromise,
191
181
  () => logger.info("Download in progress, please wait..."),
192
182
  GET_STATE_LOG_INTERVAL
193
- ).then((res) => {
194
- return {wsStateBytes: res.ssz(), fork: res.meta().version};
195
- });
183
+ );
184
+ const wsStateBytes = response.ssz();
185
+ const {version} = response.meta();
196
186
 
197
187
  const wsSlot = getStateSlotFromBytes(wsStateBytes);
198
188
  const logData = {stateId, size: formatBytes(wsStateBytes.length)};
199
189
  logger.info("Download completed", typeof stateId === "number" ? logData : {...logData, slot: wsSlot});
200
190
 
201
- let wsState: BeaconStateAllForks;
202
- if (lastDbState && lastDbValidatorsBytes) {
203
- // use lastDbState to load wsState if possible to share the same state tree
204
- wsState = loadState(config, lastDbState, wsStateBytes, lastDbValidatorsBytes).state;
205
- } else {
206
- wsState = sszTypesFor(fork).BeaconState.deserializeToViewDU(wsStateBytes);
191
+ const expectedFork = config.getForkName(wsSlot);
192
+ if (version !== expectedFork) {
193
+ throw new LodestarError(
194
+ {code: "CHECKPOINT_FORK_MISMATCH"},
195
+ `Checkpoint sync server returned ${version} state at slot ${wsSlot} but local config expects ${expectedFork}, verify --network or the chain config`
196
+ );
207
197
  }
208
198
 
209
199
  return {
210
- wsState,
211
- wsStateBytes,
212
- wsCheckpoint: wsCheckpoint ?? getCheckpointFromState(wsState),
200
+ stateBytes: new Uint8Array(wsStateBytes.buffer, wsStateBytes.byteOffset, wsStateBytes.byteLength),
201
+ expectedCheckpoint: wsCheckpoint,
213
202
  };
214
203
  } catch (e) {
215
- throw new Error("Unable to fetch weak subjectivity state: " + (e as Error).message);
204
+ const error = new LodestarError(
205
+ {code: "CHECKPOINT_DOWNLOAD_FAILED"},
206
+ "Unable to fetch weak subjectivity state: " + (e as Error).message
207
+ );
208
+ error.cause = e;
209
+ throw error;
216
210
  }
217
211
  }
218
212
 
@@ -220,16 +214,7 @@ export function getCheckpointFromArg(checkpointStr: string): Checkpoint {
220
214
  const checkpointRegex = /^(?:0x)?([0-9a-f]{64}):([0-9]+)$/;
221
215
  const match = checkpointRegex.exec(checkpointStr.toLowerCase());
222
216
  if (!match) {
223
- throw new Error(`Could not parse checkpoint string: ${checkpointStr}`);
217
+ throw new LodestarError({code: "INVALID_CHECKPOINT"}, `Could not parse checkpoint string: ${checkpointStr}`);
224
218
  }
225
219
  return {root: fromHex(match[1]), epoch: parseInt(match[2])};
226
220
  }
227
-
228
- export function getCheckpointFromState(state: BeaconStateAllForks): Checkpoint {
229
- return {
230
- // the correct checkpoint is based on state's slot, its latestBlockHeader's slot's epoch can be
231
- // behind the state
232
- epoch: computeCheckpointEpochAtStateSlot(state.slot),
233
- root: getLatestBlockRoot(state),
234
- };
235
- }
@@ -12,6 +12,7 @@ export type ChainArgs = {
12
12
  "chain.blsVerifyAllMainThread"?: boolean;
13
13
  "chain.disableBlsBatchVerify"?: boolean;
14
14
  "chain.persistProducedBlocks"?: boolean;
15
+ "chain.persistProducedPayloadEnvelopes"?: boolean;
15
16
  "chain.persistInvalidSszObjects"?: boolean;
16
17
  // No need to define chain.persistInvalidSszObjects as part of ChainArgs
17
18
  // as this is defined as part of BeaconPaths
@@ -35,7 +36,7 @@ export type ChainArgs = {
35
36
  "chain.archiveDataEpochs"?: number;
36
37
  "chain.archiveMode": ArchiveMode;
37
38
  "chain.nHistoricalStatesFileDataStore"?: boolean;
38
- "chain.nativeStateView"?: boolean;
39
+ "chain.nativeStateTransition"?: boolean;
39
40
  "chain.maxBlockStates"?: number;
40
41
  "chain.maxCPStateEpochsInMemory"?: number;
41
42
  "chain.maxCPStateEpochsOnDisk"?: number;
@@ -53,6 +54,7 @@ export function parseArgs(args: ChainArgs & CircuitBreakerArgs): IBeaconNodeOpti
53
54
  blsVerifyAllMainThread: args["chain.blsVerifyAllMainThread"],
54
55
  disableBlsBatchVerify: args["chain.disableBlsBatchVerify"],
55
56
  persistProducedBlocks: args["chain.persistProducedBlocks"],
57
+ persistProducedPayloadEnvelopes: args["chain.persistProducedPayloadEnvelopes"],
56
58
  persistInvalidSszObjects: args["chain.persistInvalidSszObjects"],
57
59
  // biome-ignore lint/suspicious/noExplicitAny: We need to use `any` type here
58
60
  persistInvalidSszObjectsDir: undefined as any,
@@ -79,7 +81,7 @@ export function parseArgs(args: ChainArgs & CircuitBreakerArgs): IBeaconNodeOpti
79
81
  archiveMode: args["chain.archiveMode"] ?? defaultOptions.chain.archiveMode,
80
82
  nHistoricalStatesFileDataStore:
81
83
  args["chain.nHistoricalStatesFileDataStore"] ?? defaultOptions.chain.nHistoricalStatesFileDataStore,
82
- nativeStateView: args["chain.nativeStateView"] ?? defaultOptions.chain.nativeStateView,
84
+ nativeStateTransition: args["chain.nativeStateTransition"] ?? defaultOptions.chain.nativeStateTransition,
83
85
  maxBlockStates: args["chain.maxBlockStates"] ?? defaultOptions.chain.maxBlockStates,
84
86
  maxCPStateEpochsInMemory: args["chain.maxCPStateEpochsInMemory"] ?? defaultOptions.chain.maxCPStateEpochsInMemory,
85
87
  maxCPStateEpochsOnDisk: args["chain.maxCPStateEpochsOnDisk"] ?? defaultOptions.chain.maxCPStateEpochsOnDisk,
@@ -170,6 +172,13 @@ Will double processing times. Use only for debugging purposes.",
170
172
  group: "chain",
171
173
  },
172
174
 
175
+ "chain.persistProducedPayloadEnvelopes": {
176
+ hidden: true,
177
+ type: "boolean",
178
+ description: "Persist produced execution payload envelopes as SSZ files for debugging",
179
+ group: "chain",
180
+ },
181
+
173
182
  "chain.persistInvalidSszObjects": {
174
183
  hidden: true,
175
184
  type: "boolean",
@@ -240,7 +249,7 @@ Will double processing times. Use only for debugging purposes.",
240
249
 
241
250
  "chain.fastConfirmation": {
242
251
  type: "boolean",
243
- description: "Enable Fast Confirmation Rule for faster block confirmation (experimental)",
252
+ description: "Enable Fast Confirmation Rule for faster block confirmation",
244
253
  defaultDescription: String(defaultOptions.chain.fastConfirmation),
245
254
  group: "chain",
246
255
  },
@@ -318,11 +327,11 @@ Will double processing times. Use only for debugging purposes.",
318
327
  group: "chain",
319
328
  },
320
329
 
321
- "chain.nativeStateView": {
330
+ "chain.nativeStateTransition": {
322
331
  hidden: true,
323
- description: "Use native (Zig) BeaconStateView instead of JS implementation",
332
+ description: "Use native (Zig) state transition instead of JS implementation",
324
333
  type: "boolean",
325
- default: defaultOptions.chain.nativeStateView,
334
+ default: defaultOptions.chain.nativeStateTransition,
326
335
  group: "chain",
327
336
  },
328
337