@chainsafe/lodestar 1.50.0-dev.6fb6c0bad4 → 1.50.0-dev.7df32d9c25
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.
- package/.git-data.json +1 -1
- package/lib/cmds/beacon/handler.d.ts.map +1 -1
- package/lib/cmds/beacon/handler.js +3 -16
- package/lib/cmds/beacon/handler.js.map +1 -1
- package/lib/cmds/beacon/initBeaconState.d.ts +11 -17
- package/lib/cmds/beacon/initBeaconState.d.ts.map +1 -1
- package/lib/cmds/beacon/initBeaconState.js +78 -274
- package/lib/cmds/beacon/initBeaconState.js.map +1 -1
- package/lib/cmds/beacon/options.d.ts +0 -1
- package/lib/cmds/beacon/options.d.ts.map +1 -1
- package/lib/cmds/beacon/options.js +0 -5
- package/lib/cmds/beacon/options.js.map +1 -1
- package/lib/cmds/beacon/stateInitialization/checkpointState.d.ts +7 -0
- package/lib/cmds/beacon/stateInitialization/checkpointState.d.ts.map +1 -0
- package/lib/cmds/beacon/stateInitialization/checkpointState.js +168 -0
- package/lib/cmds/beacon/stateInitialization/checkpointState.js.map +1 -0
- package/lib/cmds/beacon/stateInitialization/errors.d.ts +17 -0
- package/lib/cmds/beacon/stateInitialization/errors.d.ts.map +1 -0
- package/lib/cmds/beacon/stateInitialization/errors.js +16 -0
- package/lib/cmds/beacon/stateInitialization/errors.js.map +1 -0
- package/lib/cmds/beacon/stateInitialization/genesisState.d.ts +3 -0
- package/lib/cmds/beacon/stateInitialization/genesisState.d.ts.map +1 -0
- package/lib/cmds/beacon/stateInitialization/genesisState.js +65 -0
- package/lib/cmds/beacon/stateInitialization/genesisState.js.map +1 -0
- package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.d.ts +4 -0
- package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.d.ts.map +1 -0
- package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.js +52 -0
- package/lib/cmds/beacon/stateInitialization/prepareStateInitialization.js.map +1 -0
- package/lib/cmds/beacon/stateInitialization/types.d.ts +40 -0
- package/lib/cmds/beacon/stateInitialization/types.d.ts.map +1 -0
- package/lib/cmds/beacon/stateInitialization/types.js +2 -0
- package/lib/cmds/beacon/stateInitialization/types.js.map +1 -0
- package/lib/cmds/beacon/stateInitialization/validation.d.ts +4 -0
- package/lib/cmds/beacon/stateInitialization/validation.d.ts.map +1 -0
- package/lib/cmds/beacon/stateInitialization/validation.js +12 -0
- package/lib/cmds/beacon/stateInitialization/validation.js.map +1 -0
- package/lib/networks/index.d.ts +3 -9
- package/lib/networks/index.d.ts.map +1 -1
- package/lib/networks/index.js +15 -28
- package/lib/networks/index.js.map +1 -1
- package/lib/options/beaconNodeOptions/chain.js +2 -2
- package/lib/options/beaconNodeOptions/chain.js.map +1 -1
- package/package.json +14 -14
- package/src/cmds/beacon/handler.ts +4 -16
- package/src/cmds/beacon/initBeaconState.ts +119 -389
- package/src/cmds/beacon/options.ts +0 -7
- package/src/cmds/beacon/stateInitialization/checkpointState.ts +256 -0
- package/src/cmds/beacon/stateInitialization/errors.ts +15 -0
- package/src/cmds/beacon/stateInitialization/genesisState.ts +85 -0
- package/src/cmds/beacon/stateInitialization/prepareStateInitialization.ts +64 -0
- package/src/cmds/beacon/stateInitialization/types.ts +58 -0
- package/src/cmds/beacon/stateInitialization/validation.ts +16 -0
- package/src/networks/index.ts +25 -40
- package/src/options/beaconNodeOptions/chain.ts +2 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ArchivedStateBytes, StateInitialization, StateInitializationOptions, StatePreparationContext } from "./types.js";
|
|
2
|
+
type CheckpointOptions = Pick<StateInitializationOptions, "wssCheckpoint" | "forceCheckpointSync" | "ignoreWeakSubjectivityCheck">;
|
|
3
|
+
export declare function prepareCheckpointFileInitialization(checkpointState: string, options: CheckpointOptions, archived: ArchivedStateBytes | null, context: StatePreparationContext): Promise<StateInitialization>;
|
|
4
|
+
export declare function prepareCheckpointApiInitialization(checkpointSyncUrl: string, options: CheckpointOptions, archived: ArchivedStateBytes | null, context: StatePreparationContext): Promise<StateInitialization>;
|
|
5
|
+
export declare function prepareUnfinalizedCheckpointInitialization(options: CheckpointOptions & Pick<StateInitializationOptions, "lastPersistedCheckpointState" | "unsafeCheckpointState" | "chain.nHistoricalStatesFileDataStore">, archived: ArchivedStateBytes | null, context: StatePreparationContext): Promise<StateInitialization | null>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=checkpointState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointState.d.ts","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/checkpointState.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,kBAAkB,EAGlB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,KAAK,iBAAiB,GAAG,IAAI,CAC3B,0BAA0B,EAC1B,eAAe,GAAG,qBAAqB,GAAG,6BAA6B,CACxE,CAAC;AAEF,wBAAsB,mCAAmC,CACvD,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,GAAG,IAAI,EACnC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAmB9B;AAED,wBAAsB,kCAAkC,CACtD,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,GAAG,IAAI,EACnC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAuB9B;AAED,wBAAsB,0CAA0C,CAC9D,OAAO,EAAE,iBAAiB,GACxB,IAAI,CACF,0BAA0B,EAC1B,8BAA8B,GAAG,uBAAuB,GAAG,sCAAsC,CAClG,EACH,QAAQ,EAAE,kBAAkB,GAAG,IAAI,EACnC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAuCrC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { DbCPStateDatastore, FileCPStateDatastore, persistAnchorState } from "@lodestar/beacon-node";
|
|
2
|
+
import { createBeaconConfig } from "@lodestar/config";
|
|
3
|
+
import { computeEpochAtSlot, computeWeakSubjectivitySummaryFromStateBytes, getCurrentSlot, isWithinWeakSubjectivityPeriodFromSummary, readBeaconStateBytesMetadata, } from "@lodestar/state-transition";
|
|
4
|
+
import { ssz } from "@lodestar/types";
|
|
5
|
+
import { formatBytes, toRootHex } from "@lodestar/utils";
|
|
6
|
+
import { fetchWeakSubjectivityStateBytes, getCheckpointFromArg } from "../../../networks/index.js";
|
|
7
|
+
import { downloadOrLoadFile } from "../../../util/index.js";
|
|
8
|
+
import { StateInitializationError, StateInitializationErrorCode } from "./errors.js";
|
|
9
|
+
import { assertAnchorStateForkMatchesConfig } from "./validation.js";
|
|
10
|
+
export async function prepareCheckpointFileInitialization(checkpointState, options, archived, context) {
|
|
11
|
+
context.logger.info("Loading checkpoint state", { checkpointState });
|
|
12
|
+
const bytes = await downloadOrLoadFile(checkpointState);
|
|
13
|
+
const stateBytes = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
14
|
+
context.logger.info("Loaded checkpoint state", { checkpointState, size: formatBytes(stateBytes.length) });
|
|
15
|
+
return prepareCheckpointInitialization({
|
|
16
|
+
stateBytes,
|
|
17
|
+
expectedCheckpoint: options.wssCheckpoint ? getCheckpointFromArg(options.wssCheckpoint) : null,
|
|
18
|
+
source: "checkpoint file",
|
|
19
|
+
}, archived, {
|
|
20
|
+
isFinalized: true,
|
|
21
|
+
forceCheckpointSync: Boolean(options.forceCheckpointSync),
|
|
22
|
+
ignoreWeakSubjectivityCheck: Boolean(options.ignoreWeakSubjectivityCheck),
|
|
23
|
+
}, context);
|
|
24
|
+
}
|
|
25
|
+
export async function prepareCheckpointApiInitialization(checkpointSyncUrl, options, archived, context) {
|
|
26
|
+
const { chainForkConfig, logger } = context;
|
|
27
|
+
try {
|
|
28
|
+
const url = new URL(checkpointSyncUrl);
|
|
29
|
+
logger.info("Fetching checkpoint state", { checkpointSyncUrl: url.origin });
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
logger.error("Invalid checkpoint sync URL", { checkpointSyncUrl }, error);
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
const { stateBytes, expectedCheckpoint } = await fetchWeakSubjectivityStateBytes(chainForkConfig, logger, {
|
|
36
|
+
checkpointSyncUrl,
|
|
37
|
+
wssCheckpoint: options.wssCheckpoint,
|
|
38
|
+
});
|
|
39
|
+
return prepareCheckpointInitialization({ stateBytes, expectedCheckpoint, source: "checkpointSyncUrl" }, archived, {
|
|
40
|
+
isFinalized: true,
|
|
41
|
+
forceCheckpointSync: Boolean(options.forceCheckpointSync),
|
|
42
|
+
ignoreWeakSubjectivityCheck: Boolean(options.ignoreWeakSubjectivityCheck),
|
|
43
|
+
}, context);
|
|
44
|
+
}
|
|
45
|
+
export async function prepareUnfinalizedCheckpointInitialization(options, archived, context) {
|
|
46
|
+
const { db, dataDir, logger } = context;
|
|
47
|
+
let bytes = null;
|
|
48
|
+
if (options.lastPersistedCheckpointState && !options.forceCheckpointSync) {
|
|
49
|
+
const store = options["chain.nHistoricalStatesFileDataStore"]
|
|
50
|
+
? new FileCPStateDatastore(dataDir)
|
|
51
|
+
: new DbCPStateDatastore(db);
|
|
52
|
+
logger.verbose(`Finding last persisted checkpoint state from ${store.constructor.name}`);
|
|
53
|
+
bytes = await store.readLatestSafe();
|
|
54
|
+
if (bytes === null) {
|
|
55
|
+
logger.warn("Last persisted checkpoint state not found");
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
logger.info("Found last persisted checkpoint state", { size: formatBytes(bytes.length) });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (bytes === null && options.unsafeCheckpointState) {
|
|
62
|
+
logger.info("Loading checkpoint state", { unsafeCheckpointState: options.unsafeCheckpointState });
|
|
63
|
+
bytes = await downloadOrLoadFile(options.unsafeCheckpointState);
|
|
64
|
+
logger.info("Loaded checkpoint state", { size: formatBytes(bytes.length) });
|
|
65
|
+
}
|
|
66
|
+
if (bytes === null)
|
|
67
|
+
return null;
|
|
68
|
+
logger.warn("Initializing from unfinalized checkpoint state is unsafe and may cause the node to follow a minority chain");
|
|
69
|
+
const stateBytes = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
70
|
+
return prepareCheckpointInitialization({
|
|
71
|
+
stateBytes,
|
|
72
|
+
expectedCheckpoint: options.wssCheckpoint ? getCheckpointFromArg(options.wssCheckpoint) : null,
|
|
73
|
+
source: "unfinalized source",
|
|
74
|
+
}, archived, {
|
|
75
|
+
isFinalized: false,
|
|
76
|
+
forceCheckpointSync: Boolean(options.forceCheckpointSync),
|
|
77
|
+
ignoreWeakSubjectivityCheck: Boolean(options.ignoreWeakSubjectivityCheck),
|
|
78
|
+
}, context);
|
|
79
|
+
}
|
|
80
|
+
function prepareCheckpointInitialization(candidate, archived, policy, { chainForkConfig, db, logger }) {
|
|
81
|
+
const candidateMetadata = readBeaconStateBytesMetadata(candidate.stateBytes);
|
|
82
|
+
if (candidateMetadata === null) {
|
|
83
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.MALFORMED_STATE_BYTES }, `Cannot read state metadata from ${candidate.source}`);
|
|
84
|
+
}
|
|
85
|
+
if (archived !== null &&
|
|
86
|
+
(archived.metadata.genesisTime !== candidateMetadata.genesisTime ||
|
|
87
|
+
!ssz.Root.equals(archived.metadata.genesisValidatorsRoot, candidateMetadata.genesisValidatorsRoot))) {
|
|
88
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.INCOMPATIBLE_GENESIS }, "Db state and checkpoint state are not compatible, either clear the db or verify your checkpoint source");
|
|
89
|
+
}
|
|
90
|
+
const useArchived = archived !== null && archived.metadata.slot > candidateMetadata.slot && !policy.forceCheckpointSync;
|
|
91
|
+
if (useArchived) {
|
|
92
|
+
logger.verbose("Db state is ahead of the provided checkpoint state, using the db state to initialize the beacon chain");
|
|
93
|
+
}
|
|
94
|
+
const { stateBytes, metadata, weakSubjectivity } = useArchived
|
|
95
|
+
? archived
|
|
96
|
+
: {
|
|
97
|
+
stateBytes: candidate.stateBytes,
|
|
98
|
+
metadata: candidateMetadata,
|
|
99
|
+
weakSubjectivity: computeWeakSubjectivitySummaryFromStateBytes(chainForkConfig, candidate.stateBytes, candidateMetadata),
|
|
100
|
+
};
|
|
101
|
+
if (weakSubjectivity === null) {
|
|
102
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.MALFORMED_STATE_BYTES }, `Cannot extract weak subjectivity summary from ${candidate.source}, expected ${chainForkConfig.getForkName(metadata.slot)} state at slot ${metadata.slot}, possible fork or network mismatch`);
|
|
103
|
+
}
|
|
104
|
+
const expectedCheckpoint = useArchived ? null : candidate.expectedCheckpoint;
|
|
105
|
+
const source = useArchived ? "db" : candidate.source;
|
|
106
|
+
const { isFinalized, ignoreWeakSubjectivityCheck } = policy;
|
|
107
|
+
const config = createBeaconConfig(chainForkConfig, metadata.genesisValidatorsRoot);
|
|
108
|
+
const archivedWithinWeakSubjectivityPeriod = useArchived ? archived.isWithinWeakSubjectivityPeriod : null;
|
|
109
|
+
// DB-selected anchors need no persistence, including at slot zero.
|
|
110
|
+
const shouldPersist = isFinalized && !useArchived;
|
|
111
|
+
return {
|
|
112
|
+
stateBytes,
|
|
113
|
+
config,
|
|
114
|
+
isFinalized,
|
|
115
|
+
validate(state) {
|
|
116
|
+
// A supplied checkpoint must match even when the period check is ignored.
|
|
117
|
+
if (expectedCheckpoint !== null)
|
|
118
|
+
assertStateMatchesCheckpoint(state, expectedCheckpoint);
|
|
119
|
+
const passedValidation = archivedWithinWeakSubjectivityPeriod ?? isWithinWeakSubjectivityPeriodFromSummary(config, weakSubjectivity);
|
|
120
|
+
if (!passedValidation && !ignoreWeakSubjectivityCheck) {
|
|
121
|
+
const clockEpoch = computeEpochAtSlot(getCurrentSlot(config, weakSubjectivity.genesisTime));
|
|
122
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.STALE_CHECKPOINT }, `The selected state with epoch ${weakSubjectivity.checkpointEpoch} is not within weak subjectivity period of ${weakSubjectivity.period} epochs from the current epoch ${clockEpoch}. Please verify your checkpoint source`);
|
|
123
|
+
}
|
|
124
|
+
assertAnchorStateForkMatchesConfig(config, state);
|
|
125
|
+
if (isFinalized) {
|
|
126
|
+
const source = useArchived ? "db" : "checkpoint";
|
|
127
|
+
const logData = {
|
|
128
|
+
slot: state.slot,
|
|
129
|
+
epoch: computeEpochAtSlot(state.slot),
|
|
130
|
+
stateSize: formatBytes(stateBytes.length),
|
|
131
|
+
stateRoot: toRootHex(state.hashTreeRoot()),
|
|
132
|
+
isWithinWeakSubjectivityPeriod: passedValidation,
|
|
133
|
+
};
|
|
134
|
+
if (passedValidation) {
|
|
135
|
+
logger.info(`Initializing beacon from a valid ${source} state`, logData);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
logger.warn(`Initializing from a stale ${source} state vulnerable to long range attacks`, logData);
|
|
139
|
+
logger.warn("Checkpoint sync recommended, please use --help to see checkpoint sync options");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
persist: shouldPersist ? (state, bytes) => persistAnchorState(config, db, state, bytes) : null,
|
|
144
|
+
log(state) {
|
|
145
|
+
const { checkpoint } = state.computeAnchorCheckpoint();
|
|
146
|
+
logger.info("Initialized checkpoint state", {
|
|
147
|
+
source,
|
|
148
|
+
slot: state.slot,
|
|
149
|
+
epoch: checkpoint.epoch,
|
|
150
|
+
stateSize: formatBytes(stateBytes.length),
|
|
151
|
+
stateRoot: toRootHex(state.hashTreeRoot()),
|
|
152
|
+
checkpointRoot: toRootHex(checkpoint.root),
|
|
153
|
+
isFinalized,
|
|
154
|
+
...(isFinalized ? {} : { lastProcessedSlot: state.latestBlockHeader.slot }),
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function assertStateMatchesCheckpoint(state, checkpoint) {
|
|
160
|
+
const { root: blockRoot, epoch: stateEpoch } = state.computeAnchorCheckpoint().checkpoint;
|
|
161
|
+
if (!ssz.Root.equals(blockRoot, checkpoint.root)) {
|
|
162
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.CHECKPOINT_ROOT_MISMATCH }, `Roots do not match. expected=${toRootHex(checkpoint.root)}, actual=${toRootHex(blockRoot)}`);
|
|
163
|
+
}
|
|
164
|
+
if (!ssz.Epoch.equals(stateEpoch, checkpoint.epoch)) {
|
|
165
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.CHECKPOINT_EPOCH_MISMATCH }, `Epochs do not match. expected=${checkpoint.epoch}, actual=${stateEpoch}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=checkpointState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointState.js","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/checkpointState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LodestarError } from "@lodestar/utils";
|
|
2
|
+
export declare enum StateInitializationErrorCode {
|
|
3
|
+
INVALID_CHECKPOINT_SOURCE = "INVALID_CHECKPOINT_SOURCE",
|
|
4
|
+
MALFORMED_STATE_BYTES = "MALFORMED_STATE_BYTES",
|
|
5
|
+
INCOMPATIBLE_GENESIS = "INCOMPATIBLE_GENESIS",
|
|
6
|
+
CHECKPOINT_ROOT_MISMATCH = "CHECKPOINT_ROOT_MISMATCH",
|
|
7
|
+
CHECKPOINT_EPOCH_MISMATCH = "CHECKPOINT_EPOCH_MISMATCH",
|
|
8
|
+
STALE_CHECKPOINT = "STALE_CHECKPOINT",
|
|
9
|
+
ANCHOR_STATE_FORK_MISMATCH = "ANCHOR_STATE_FORK_MISMATCH",
|
|
10
|
+
GENESIS_ROOT_MISMATCH = "GENESIS_ROOT_MISMATCH",
|
|
11
|
+
MISSING_INITIALIZATION_SOURCE = "MISSING_INITIALIZATION_SOURCE"
|
|
12
|
+
}
|
|
13
|
+
export declare class StateInitializationError extends LodestarError<{
|
|
14
|
+
code: StateInitializationErrorCode;
|
|
15
|
+
}> {
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,oBAAY,4BAA4B;IACtC,yBAAyB,8BAA8B;IACvD,qBAAqB,0BAA0B;IAC/C,oBAAoB,yBAAyB;IAC7C,wBAAwB,6BAA6B;IACrD,yBAAyB,8BAA8B;IACvD,gBAAgB,qBAAqB;IACrC,0BAA0B,+BAA+B;IACzD,qBAAqB,0BAA0B;IAC/C,6BAA6B,kCAAkC;CAChE;AAED,qBAAa,wBAAyB,SAAQ,aAAa,CAAC;IAAC,IAAI,EAAE,4BAA4B,CAAA;CAAC,CAAC;CAAG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LodestarError } from "@lodestar/utils";
|
|
2
|
+
export var StateInitializationErrorCode;
|
|
3
|
+
(function (StateInitializationErrorCode) {
|
|
4
|
+
StateInitializationErrorCode["INVALID_CHECKPOINT_SOURCE"] = "INVALID_CHECKPOINT_SOURCE";
|
|
5
|
+
StateInitializationErrorCode["MALFORMED_STATE_BYTES"] = "MALFORMED_STATE_BYTES";
|
|
6
|
+
StateInitializationErrorCode["INCOMPATIBLE_GENESIS"] = "INCOMPATIBLE_GENESIS";
|
|
7
|
+
StateInitializationErrorCode["CHECKPOINT_ROOT_MISMATCH"] = "CHECKPOINT_ROOT_MISMATCH";
|
|
8
|
+
StateInitializationErrorCode["CHECKPOINT_EPOCH_MISMATCH"] = "CHECKPOINT_EPOCH_MISMATCH";
|
|
9
|
+
StateInitializationErrorCode["STALE_CHECKPOINT"] = "STALE_CHECKPOINT";
|
|
10
|
+
StateInitializationErrorCode["ANCHOR_STATE_FORK_MISMATCH"] = "ANCHOR_STATE_FORK_MISMATCH";
|
|
11
|
+
StateInitializationErrorCode["GENESIS_ROOT_MISMATCH"] = "GENESIS_ROOT_MISMATCH";
|
|
12
|
+
StateInitializationErrorCode["MISSING_INITIALIZATION_SOURCE"] = "MISSING_INITIALIZATION_SOURCE";
|
|
13
|
+
})(StateInitializationErrorCode || (StateInitializationErrorCode = {}));
|
|
14
|
+
export class StateInitializationError extends LodestarError {
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAN,IAAY,4BAUX;AAVD,WAAY,4BAA4B;IACtC,uFAAuD,CAAA;IACvD,+EAA+C,CAAA;IAC/C,6EAA6C,CAAA;IAC7C,qFAAqD,CAAA;IACrD,uFAAuD,CAAA;IACvD,qEAAqC,CAAA;IACrC,yFAAyD,CAAA;IACzD,+EAA+C,CAAA;IAC/C,+FAA+D,CAAA;AACjE,CAAC,EAVW,4BAA4B,KAA5B,4BAA4B,QAUvC;AAED,MAAM,OAAO,wBAAyB,SAAQ,aAAmD;CAAG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { StateInitialization, StateInitializationOptions, StatePreparationContext } from "./types.js";
|
|
2
|
+
export declare function prepareGenesisInitialization(options: Pick<StateInitializationOptions, "genesisStateFile" | "network">, { chainForkConfig, db, logger }: StatePreparationContext): Promise<StateInitialization>;
|
|
3
|
+
//# sourceMappingURL=genesisState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesisState.d.ts","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/genesisState.ts"],"names":[],"mappings":"AAaA,OAAO,EAAC,mBAAmB,EAAE,0BAA0B,EAAE,uBAAuB,EAAC,MAAM,YAAY,CAAC;AAGpG,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,kBAAkB,GAAG,SAAS,CAAC,EACzE,EAAC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAC,EAAE,uBAAuB,GACrD,OAAO,CAAC,mBAAmB,CAAC,CAiE9B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { persistAnchorState } from "@lodestar/beacon-node";
|
|
2
|
+
import { createBeaconConfig } from "@lodestar/config";
|
|
3
|
+
import { computeEpochAtSlot, computeWeakSubjectivitySummaryFromStateBytes, isWithinWeakSubjectivityPeriodFromSummary, readBeaconStateBytesMetadata, } from "@lodestar/state-transition";
|
|
4
|
+
import { formatBytes, toRootHex } from "@lodestar/utils";
|
|
5
|
+
import { getGenesisFileUrl, getGenesisStateRoot } from "../../../networks/index.js";
|
|
6
|
+
import { defaultNetwork } from "../../../options/globalOptions.js";
|
|
7
|
+
import { downloadOrLoadFile } from "../../../util/index.js";
|
|
8
|
+
import { StateInitializationError, StateInitializationErrorCode } from "./errors.js";
|
|
9
|
+
import { assertAnchorStateForkMatchesConfig } from "./validation.js";
|
|
10
|
+
export async function prepareGenesisInitialization(options, { chainForkConfig, db, logger }) {
|
|
11
|
+
const source = options.genesisStateFile || getGenesisFileUrl(options.network || defaultNetwork);
|
|
12
|
+
if (!source) {
|
|
13
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.MISSING_INITIALIZATION_SOURCE }, "Failed to initialize beacon state, please provide a genesis state file or use checkpoint sync");
|
|
14
|
+
}
|
|
15
|
+
logger.info("Loading genesis state", { genesisStateFile: source });
|
|
16
|
+
const bytes = await downloadOrLoadFile(source);
|
|
17
|
+
const stateBytes = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
18
|
+
logger.info("Loaded genesis state", { size: formatBytes(stateBytes.length) });
|
|
19
|
+
const metadata = readBeaconStateBytesMetadata(stateBytes);
|
|
20
|
+
if (metadata === null) {
|
|
21
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.MALFORMED_STATE_BYTES }, "Cannot read metadata from genesis state bytes");
|
|
22
|
+
}
|
|
23
|
+
const weakSubjectivity = computeWeakSubjectivitySummaryFromStateBytes(chainForkConfig, stateBytes, metadata);
|
|
24
|
+
if (weakSubjectivity === null) {
|
|
25
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.MALFORMED_STATE_BYTES }, `Cannot extract weak subjectivity summary from genesis state bytes, expected ${chainForkConfig.getForkName(metadata.slot)} state at slot ${metadata.slot}, possible fork or network mismatch`);
|
|
26
|
+
}
|
|
27
|
+
const config = createBeaconConfig(chainForkConfig, metadata.genesisValidatorsRoot);
|
|
28
|
+
const expectedRoot = getGenesisStateRoot(options.network);
|
|
29
|
+
return {
|
|
30
|
+
stateBytes,
|
|
31
|
+
config,
|
|
32
|
+
isFinalized: true,
|
|
33
|
+
validate(state) {
|
|
34
|
+
const stateRoot = toRootHex(state.hashTreeRoot());
|
|
35
|
+
if (expectedRoot !== null && stateRoot !== expectedRoot) {
|
|
36
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.GENESIS_ROOT_MISMATCH }, `Genesis state root mismatch expected=${expectedRoot} received=${stateRoot}`);
|
|
37
|
+
}
|
|
38
|
+
assertAnchorStateForkMatchesConfig(config, state);
|
|
39
|
+
const passedValidation = isWithinWeakSubjectivityPeriodFromSummary(config, weakSubjectivity);
|
|
40
|
+
const logData = {
|
|
41
|
+
slot: state.slot,
|
|
42
|
+
epoch: computeEpochAtSlot(state.slot),
|
|
43
|
+
stateSize: formatBytes(stateBytes.length),
|
|
44
|
+
stateRoot,
|
|
45
|
+
isWithinWeakSubjectivityPeriod: passedValidation,
|
|
46
|
+
};
|
|
47
|
+
if (passedValidation) {
|
|
48
|
+
logger.info("Initializing beacon from a valid checkpoint state", logData);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
logger.warn("Initializing from a stale checkpoint state vulnerable to long range attacks", logData);
|
|
52
|
+
logger.warn("Checkpoint sync recommended, please use --help to see checkpoint sync options");
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
persist: (state, bytes) => persistAnchorState(config, db, state, bytes),
|
|
56
|
+
log(state) {
|
|
57
|
+
logger.info("Initialized genesis state", {
|
|
58
|
+
slot: state.slot,
|
|
59
|
+
stateRoot: toRootHex(state.hashTreeRoot()),
|
|
60
|
+
isFinalized: true,
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=genesisState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesisState.js","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/genesisState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ArchivedStateBytes, StateInitialization, StateInitializationOptions, StatePreparationContext } from "./types.js";
|
|
2
|
+
export declare function prepareArchivedStateInitialization({ stateBytes, metadata, isWithinWeakSubjectivityPeriod }: ArchivedStateBytes, { chainForkConfig, logger }: StatePreparationContext): StateInitialization;
|
|
3
|
+
export declare function prepareCheckpointSourceInitialization(options: StateInitializationOptions, archived: ArchivedStateBytes | null, context: StatePreparationContext): Promise<StateInitialization | null>;
|
|
4
|
+
//# sourceMappingURL=prepareStateInitialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareStateInitialization.d.ts","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/prepareStateInitialization.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,kBAAkB,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,uBAAuB,EAAC,MAAM,YAAY,CAAC;AAGxH,wBAAgB,kCAAkC,CAChD,EAAC,UAAU,EAAE,QAAQ,EAAE,8BAA8B,EAAC,EAAE,kBAAkB,EAC1E,EAAC,eAAe,EAAE,MAAM,EAAC,EAAE,uBAAuB,GACjD,mBAAmB,CAgCrB;AAED,wBAAsB,qCAAqC,CACzD,OAAO,EAAE,0BAA0B,EACnC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,EACnC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAWrC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createBeaconConfig } from "@lodestar/config";
|
|
2
|
+
import { computeEpochAtSlot } from "@lodestar/state-transition";
|
|
3
|
+
import { formatBytes, toRootHex } from "@lodestar/utils";
|
|
4
|
+
import { prepareCheckpointApiInitialization, prepareCheckpointFileInitialization, prepareUnfinalizedCheckpointInitialization, } from "./checkpointState.js";
|
|
5
|
+
import { assertAnchorStateForkMatchesConfig } from "./validation.js";
|
|
6
|
+
export function prepareArchivedStateInitialization({ stateBytes, metadata, isWithinWeakSubjectivityPeriod }, { chainForkConfig, logger }) {
|
|
7
|
+
const config = createBeaconConfig(chainForkConfig, metadata.genesisValidatorsRoot);
|
|
8
|
+
return {
|
|
9
|
+
stateBytes,
|
|
10
|
+
config,
|
|
11
|
+
isFinalized: true,
|
|
12
|
+
validate(state) {
|
|
13
|
+
assertAnchorStateForkMatchesConfig(config, state);
|
|
14
|
+
const logData = {
|
|
15
|
+
slot: state.slot,
|
|
16
|
+
epoch: computeEpochAtSlot(state.slot),
|
|
17
|
+
stateSize: formatBytes(stateBytes.length),
|
|
18
|
+
stateRoot: toRootHex(state.hashTreeRoot()),
|
|
19
|
+
isWithinWeakSubjectivityPeriod,
|
|
20
|
+
};
|
|
21
|
+
if (isWithinWeakSubjectivityPeriod) {
|
|
22
|
+
logger.info("Initializing beacon from a valid db state", logData);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
logger.warn("Initializing from a stale db state vulnerable to long range attacks", logData);
|
|
26
|
+
logger.warn("Checkpoint sync recommended, please use --help to see checkpoint sync options");
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
persist: null,
|
|
30
|
+
log(state) {
|
|
31
|
+
logger.info("Initialized state from db", {
|
|
32
|
+
slot: state.slot,
|
|
33
|
+
epoch: computeEpochAtSlot(state.slot),
|
|
34
|
+
stateRoot: toRootHex(state.hashTreeRoot()),
|
|
35
|
+
isFinalized: true,
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function prepareCheckpointSourceInitialization(options, archived, context) {
|
|
41
|
+
if (options.checkpointState) {
|
|
42
|
+
return prepareCheckpointFileInitialization(options.checkpointState, options, archived, context);
|
|
43
|
+
}
|
|
44
|
+
if (options.checkpointSyncUrl) {
|
|
45
|
+
return prepareCheckpointApiInitialization(options.checkpointSyncUrl, options, archived, context);
|
|
46
|
+
}
|
|
47
|
+
if (options.lastPersistedCheckpointState || options.unsafeCheckpointState) {
|
|
48
|
+
return prepareUnfinalizedCheckpointInitialization(options, archived, context);
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=prepareStateInitialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareStateInitialization.js","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/prepareStateInitialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,kCAAkC,EAClC,mCAAmC,EACnC,0CAA0C,GAC3C,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,kCAAkC,EAAC,MAAM,iBAAiB,CAAC;AAEnE,MAAM,UAAU,kCAAkC,CAChD,EAAC,UAAU,EAAE,QAAQ,EAAE,8BAA8B,EAAqB,EAC1E,EAAC,eAAe,EAAE,MAAM,EAA0B;IAElD,MAAM,MAAM,GAAG,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACnF,OAAO;QACL,UAAU;QACV,MAAM;QACN,WAAW,EAAE,IAAI;QACjB,QAAQ,CAAC,KAAK;YACZ,kCAAkC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;gBACrC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;gBACzC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC1C,8BAA8B;aAC/B,CAAC;YACF,IAAI,8BAA8B,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,OAAO,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,qEAAqE,EAAE,OAAO,CAAC,CAAC;gBAC5F,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,KAAK;YACP,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACvC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;gBACrC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC1C,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qCAAqC,CACzD,OAAmC,EACnC,QAAmC,EACnC,OAAgC;IAEhC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,mCAAmC,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,OAAO,kCAAkC,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,OAAO,CAAC,4BAA4B,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC1E,OAAO,0CAA0C,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { IBeaconDb } from "@lodestar/beacon-node";
|
|
2
|
+
import { BeaconConfig, ChainForkConfig } from "@lodestar/config";
|
|
3
|
+
import { IBeaconStateView, StateBytesMetadata, WeakSubjectivitySummary } from "@lodestar/state-transition";
|
|
4
|
+
import { Checkpoint } from "@lodestar/types/phase0";
|
|
5
|
+
import { Logger } from "@lodestar/utils";
|
|
6
|
+
import { GlobalArgs } from "../../../options/globalOptions.js";
|
|
7
|
+
import { BeaconArgs } from "../options.js";
|
|
8
|
+
export type StateInitializationOptions = Pick<BeaconArgs & GlobalArgs, "checkpointState" | "checkpointSyncUrl" | "unsafeCheckpointState" | "lastPersistedCheckpointState" | "genesisStateFile" | "wssCheckpoint" | "forceCheckpointSync" | "ignoreWeakSubjectivityCheck" | "network" | "chain.nHistoricalStatesFileDataStore" | "chain.nativeStateView">;
|
|
9
|
+
export type StatePreparationContext = {
|
|
10
|
+
chainForkConfig: ChainForkConfig;
|
|
11
|
+
db: IBeaconDb;
|
|
12
|
+
dataDir: string;
|
|
13
|
+
logger: Logger;
|
|
14
|
+
};
|
|
15
|
+
export type ArchivedStateBytes = {
|
|
16
|
+
stateBytes: Uint8Array;
|
|
17
|
+
metadata: StateBytesMetadata;
|
|
18
|
+
weakSubjectivity: WeakSubjectivitySummary;
|
|
19
|
+
isWithinWeakSubjectivityPeriod: boolean;
|
|
20
|
+
};
|
|
21
|
+
export type CheckpointStateBytesCandidate = {
|
|
22
|
+
stateBytes: Uint8Array;
|
|
23
|
+
expectedCheckpoint: Checkpoint | null;
|
|
24
|
+
source: "checkpoint file" | "checkpointSyncUrl" | "unfinalized source";
|
|
25
|
+
};
|
|
26
|
+
export type CheckpointStartupPolicy = {
|
|
27
|
+
isFinalized: boolean;
|
|
28
|
+
forceCheckpointSync: boolean;
|
|
29
|
+
ignoreWeakSubjectivityCheck: boolean;
|
|
30
|
+
};
|
|
31
|
+
/** Selected state bytes and source-specific initialization steps. */
|
|
32
|
+
export type StateInitialization = {
|
|
33
|
+
stateBytes: Uint8Array;
|
|
34
|
+
config: BeaconConfig;
|
|
35
|
+
isFinalized: boolean;
|
|
36
|
+
validate: (state: IBeaconStateView) => void;
|
|
37
|
+
persist: ((state: IBeaconStateView, stateBytes: Uint8Array) => Promise<void>) | null;
|
|
38
|
+
log: (state: IBeaconStateView) => void;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAC,gBAAgB,EAAE,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AACzG,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,mCAAmC,CAAC;AAC7D,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,UAAU,GAAG,UAAU,EACrB,iBAAiB,GACjB,mBAAmB,GACnB,uBAAuB,GACvB,8BAA8B,GAC9B,kBAAkB,GAClB,eAAe,GACf,qBAAqB,GACrB,6BAA6B,GAC7B,SAAS,GACT,sCAAsC,GACtC,uBAAuB,CAC1B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,eAAe,CAAC;IACjC,EAAE,EAAE,SAAS,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,8BAA8B,EAAE,OAAO,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,EAAE,UAAU,CAAC;IACvB,kBAAkB,EAAE,UAAU,GAAG,IAAI,CAAC;IACtC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,oBAAoB,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,2BAA2B,EAAE,OAAO,CAAC;CACtC,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACrF,GAAG,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ChainForkConfig } from "@lodestar/config";
|
|
2
|
+
import { IBeaconStateView } from "@lodestar/state-transition";
|
|
3
|
+
export declare function assertAnchorStateForkMatchesConfig(config: ChainForkConfig, anchorState: IBeaconStateView): void;
|
|
4
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,gBAAgB,EAA0B,MAAM,4BAA4B,CAAC;AAIrF,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAU/G"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { computeStartSlotAtEpoch } from "@lodestar/state-transition";
|
|
2
|
+
import { toHex } from "@lodestar/utils";
|
|
3
|
+
import { StateInitializationError, StateInitializationErrorCode } from "./errors.js";
|
|
4
|
+
export function assertAnchorStateForkMatchesConfig(config, anchorState) {
|
|
5
|
+
const expectedFork = config.getForkInfo(computeStartSlotAtEpoch(anchorState.fork.epoch));
|
|
6
|
+
const expectedForkVersion = toHex(expectedFork.version);
|
|
7
|
+
const stateFork = toHex(anchorState.fork.currentVersion);
|
|
8
|
+
if (stateFork !== expectedForkVersion) {
|
|
9
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.ANCHOR_STATE_FORK_MISMATCH }, `State current fork version ${stateFork} not equal to current config ${expectedForkVersion}. Maybe caused by importing a state from a different network`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAC,wBAAwB,EAAE,4BAA4B,EAAC,MAAM,aAAa,CAAC;AAEnF,MAAM,UAAU,kCAAkC,CAAC,MAAuB,EAAE,WAA6B;IACvG,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,MAAM,mBAAmB,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzD,IAAI,SAAS,KAAK,mBAAmB,EAAE,CAAC;QACtC,MAAM,IAAI,wBAAwB,CAChC,EAAC,IAAI,EAAE,4BAA4B,CAAC,0BAA0B,EAAC,EAC/D,8BAA8B,SAAS,gCAAgC,mBAAmB,8DAA8D,CACzJ,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/lib/networks/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ChainConfig, ChainForkConfig } from "@lodestar/config";
|
|
2
|
-
import { BeaconStateAllForks } from "@lodestar/state-transition";
|
|
3
2
|
import { Checkpoint } from "@lodestar/types/phase0";
|
|
4
3
|
import { Logger } from "@lodestar/utils";
|
|
5
4
|
export type NetworkName = "mainnet" | "dev" | "gnosis" | "sepolia" | "hoodi" | "plataberget" | "chiado" | "ephemery";
|
|
@@ -40,17 +39,12 @@ export declare function readBootnodes(bootnodesFilePath: string): string[];
|
|
|
40
39
|
/**
|
|
41
40
|
* Fetch weak subjectivity state from a remote beacon node
|
|
42
41
|
*/
|
|
43
|
-
export declare function
|
|
42
|
+
export declare function fetchWeakSubjectivityStateBytes(config: ChainForkConfig, logger: Logger, { checkpointSyncUrl, wssCheckpoint }: {
|
|
44
43
|
checkpointSyncUrl: string;
|
|
45
44
|
wssCheckpoint?: string;
|
|
46
|
-
}, { lastDbState, lastDbValidatorsBytes, }: {
|
|
47
|
-
lastDbState: BeaconStateAllForks | null;
|
|
48
|
-
lastDbValidatorsBytes: Uint8Array | null;
|
|
49
45
|
}): Promise<{
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
wsCheckpoint: Checkpoint;
|
|
46
|
+
stateBytes: Uint8Array;
|
|
47
|
+
expectedCheckpoint: Checkpoint | null;
|
|
53
48
|
}>;
|
|
54
49
|
export declare function getCheckpointFromArg(checkpointStr: string): Checkpoint;
|
|
55
|
-
export declare function getCheckpointFromState(state: BeaconStateAllForks): Checkpoint;
|
|
56
50
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/networks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/networks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAgB,MAAM,EAA+C,MAAM,iBAAiB,CAAC;AAWpG,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AACrH,eAAO,MAAM,YAAY,EAAE,WAAW,EAWrC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI,WAAW,CAE1E;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC,CAAC;AAKF,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG;IACpD,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAqBA;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAExE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAErE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKnF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY5E;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAcjF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBjE;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,EAAC,iBAAiB,EAAE,aAAa,EAAC,EAAE;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAC,GACtF,OAAO,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,kBAAkB,EAAE,UAAU,GAAG,IAAI,CAAA;CAAC,CAAC,CAkD1E;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAOtE"}
|
package/lib/networks/index.js
CHANGED
|
@@ -3,9 +3,7 @@ import { ENR } from "@chainsafe/enr";
|
|
|
3
3
|
import { WireFormat, getClient } from "@lodestar/api";
|
|
4
4
|
import { getStateSlotFromBytes } from "@lodestar/beacon-node";
|
|
5
5
|
import { SLOTS_PER_EPOCH } from "@lodestar/params";
|
|
6
|
-
import {
|
|
7
|
-
import { sszTypesFor } from "@lodestar/types";
|
|
8
|
-
import { callFnWhenAwait, fetch, formatBytes, fromHex } from "@lodestar/utils";
|
|
6
|
+
import { LodestarError, callFnWhenAwait, fetch, formatBytes, fromHex } from "@lodestar/utils";
|
|
9
7
|
import { parseBootnodesFile } from "../util/format.js";
|
|
10
8
|
import * as chiado from "./chiado.js";
|
|
11
9
|
import * as dev from "./dev.js";
|
|
@@ -125,7 +123,7 @@ export function readBootnodes(bootnodesFilePath) {
|
|
|
125
123
|
/**
|
|
126
124
|
* Fetch weak subjectivity state from a remote beacon node
|
|
127
125
|
*/
|
|
128
|
-
export async function
|
|
126
|
+
export async function fetchWeakSubjectivityStateBytes(config, logger, { checkpointSyncUrl, wssCheckpoint }) {
|
|
129
127
|
try {
|
|
130
128
|
let wsCheckpoint;
|
|
131
129
|
let stateId;
|
|
@@ -135,50 +133,39 @@ export async function fetchWeakSubjectivityState(config, logger, { checkpointSyn
|
|
|
135
133
|
stateId = wsCheckpoint.epoch * SLOTS_PER_EPOCH;
|
|
136
134
|
}
|
|
137
135
|
else {
|
|
138
|
-
//
|
|
136
|
+
// Checkpoint identity can be derived after the selected state is constructed.
|
|
139
137
|
stateId = "finalized";
|
|
140
138
|
wsCheckpoint = null;
|
|
141
139
|
}
|
|
142
140
|
// getStateV2 should be available for all forks including phase0
|
|
143
141
|
const getStatePromise = api.debug.getStateV2({ stateId }, { responseWireFormat: WireFormat.ssz });
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
});
|
|
142
|
+
const response = await callFnWhenAwait(getStatePromise, () => logger.info("Download in progress, please wait..."), GET_STATE_LOG_INTERVAL);
|
|
143
|
+
const wsStateBytes = response.ssz();
|
|
144
|
+
const { version } = response.meta();
|
|
147
145
|
const wsSlot = getStateSlotFromBytes(wsStateBytes);
|
|
148
146
|
const logData = { stateId, size: formatBytes(wsStateBytes.length) };
|
|
149
147
|
logger.info("Download completed", typeof stateId === "number" ? logData : { ...logData, slot: wsSlot });
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
|
|
153
|
-
wsState = loadState(config, lastDbState, wsStateBytes, lastDbValidatorsBytes).state;
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
wsState = sszTypesFor(fork).BeaconState.deserializeToViewDU(wsStateBytes);
|
|
148
|
+
const expectedFork = config.getForkName(wsSlot);
|
|
149
|
+
if (version !== expectedFork) {
|
|
150
|
+
throw new LodestarError({ code: "CHECKPOINT_FORK_MISMATCH" }, `Checkpoint sync server returned ${version} state at slot ${wsSlot} but local config expects ${expectedFork}, verify --network or the chain config`);
|
|
157
151
|
}
|
|
158
152
|
return {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
wsCheckpoint: wsCheckpoint ?? getCheckpointFromState(wsState),
|
|
153
|
+
stateBytes: new Uint8Array(wsStateBytes.buffer, wsStateBytes.byteOffset, wsStateBytes.byteLength),
|
|
154
|
+
expectedCheckpoint: wsCheckpoint,
|
|
162
155
|
};
|
|
163
156
|
}
|
|
164
157
|
catch (e) {
|
|
165
|
-
|
|
158
|
+
const error = new LodestarError({ code: "CHECKPOINT_DOWNLOAD_FAILED" }, "Unable to fetch weak subjectivity state: " + e.message);
|
|
159
|
+
error.cause = e;
|
|
160
|
+
throw error;
|
|
166
161
|
}
|
|
167
162
|
}
|
|
168
163
|
export function getCheckpointFromArg(checkpointStr) {
|
|
169
164
|
const checkpointRegex = /^(?:0x)?([0-9a-f]{64}):([0-9]+)$/;
|
|
170
165
|
const match = checkpointRegex.exec(checkpointStr.toLowerCase());
|
|
171
166
|
if (!match) {
|
|
172
|
-
throw new
|
|
167
|
+
throw new LodestarError({ code: "INVALID_CHECKPOINT" }, `Could not parse checkpoint string: ${checkpointStr}`);
|
|
173
168
|
}
|
|
174
169
|
return { root: fromHex(match[1]), epoch: parseInt(match[2]) };
|
|
175
170
|
}
|
|
176
|
-
export function getCheckpointFromState(state) {
|
|
177
|
-
return {
|
|
178
|
-
// the correct checkpoint is based on state's slot, its latestBlockHeader's slot's epoch can be
|
|
179
|
-
// behind the state
|
|
180
|
-
epoch: computeCheckpointEpochAtStateSlot(state.slot),
|
|
181
|
-
root: getLatestBlockRoot(state),
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
171
|
//# sourceMappingURL=index.js.map
|