@chainsafe/lodestar 1.50.0-dev.7f24e06bb6 → 1.50.0-dev.9c3f7bebe9
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/initBeaconState.d.ts +1 -12
- package/lib/cmds/beacon/initBeaconState.d.ts.map +1 -1
- package/lib/cmds/beacon/initBeaconState.js +59 -278
- package/lib/cmds/beacon/initBeaconState.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 +169 -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 +55 -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 +11 -29
- package/lib/networks/index.js.map +1 -1
- package/lib/options/beaconNodeOptions/chain.js +1 -1
- package/lib/options/beaconNodeOptions/chain.js.map +1 -1
- package/package.json +14 -14
- package/src/cmds/beacon/initBeaconState.ts +91 -393
- package/src/cmds/beacon/stateInitialization/checkpointState.ts +260 -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 +66 -0
- package/src/cmds/beacon/stateInitialization/types.ts +58 -0
- package/src/cmds/beacon/stateInitialization/validation.ts +16 -0
- package/src/networks/index.ts +18 -42
- package/src/options/beaconNodeOptions/chain.ts +1 -1
package/.git-data.json
CHANGED
|
@@ -4,18 +4,7 @@ import { BeaconStateAllForks } from "@lodestar/state-transition";
|
|
|
4
4
|
import { Logger } from "@lodestar/utils";
|
|
5
5
|
import { GlobalArgs } from "../../options/globalOptions.js";
|
|
6
6
|
import { BeaconArgs } from "./options.js";
|
|
7
|
-
/**
|
|
8
|
-
* Initialize a beacon state, picking the strategy based on the `IBeaconArgs`
|
|
9
|
-
*
|
|
10
|
-
* State is initialized in one of three ways:
|
|
11
|
-
* 1. restore from weak subjectivity state (possibly downloaded from a remote beacon node)
|
|
12
|
-
* 2. restore from db
|
|
13
|
-
* 3. restore from genesis state (possibly downloaded via URL)
|
|
14
|
-
*
|
|
15
|
-
* The returned anchorState could be finalized or not.
|
|
16
|
-
* - if we load from checkpointState, checkpointSyncUrl, genesisStateFile or archived db, it is finalized
|
|
17
|
-
* - it's not finalized if we load from unsafeCheckpointState or lastPersistedCheckpointState
|
|
18
|
-
*/
|
|
7
|
+
/** Select serialized anchor bytes before constructing the state used for validation, persistence, and return. */
|
|
19
8
|
export declare function initBeaconState(args: BeaconArgs & GlobalArgs, dataDir: string, chainForkConfig: ChainForkConfig, db: IBeaconDb, logger: Logger): Promise<{
|
|
20
9
|
anchorState: BeaconStateAllForks;
|
|
21
10
|
stateBytes: Uint8Array;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initBeaconState.d.ts","sourceRoot":"","sources":["../../../src/cmds/beacon/initBeaconState.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"initBeaconState.d.ts","sourceRoot":"","sources":["../../../src/cmds/beacon/initBeaconState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAwB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,mBAAmB,EAIpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,MAAM,EAAc,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAC,UAAU,EAAC,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAaxC,iHAAiH;AACjH,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,GAAG,UAAU,EAC7B,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,eAAe,EAChC,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAC,CAAC,CAgC3F"}
|
|
@@ -1,290 +1,71 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import { defaultNetwork } from "../../options/globalOptions.js";
|
|
8
|
-
import { downloadOrLoadFile, wrapFnError } from "../../util/index.js";
|
|
9
|
-
async function initAndVerifyWeakSubjectivityState(config, db, logger, dbStateBytes, wsStateBytes, isWsStateFinalized, wsCheckpoint, opts = {}) {
|
|
10
|
-
const dbState = dbStateBytes.state;
|
|
11
|
-
const wsState = wsStateBytes.state;
|
|
12
|
-
// Check if the store's state and wsState are compatible
|
|
13
|
-
if (dbState.genesisTime !== wsState.genesisTime ||
|
|
14
|
-
!ssz.Root.equals(dbState.genesisValidatorsRoot, wsState.genesisValidatorsRoot)) {
|
|
15
|
-
throw new Error("Db state and checkpoint state are not compatible, either clear the db or verify your checkpoint source");
|
|
16
|
-
}
|
|
17
|
-
// Pick the state which is ahead as an anchor to initialize the beacon chain
|
|
18
|
-
let anchorState = wsStateBytes;
|
|
19
|
-
let anchorCheckpoint = wsCheckpoint;
|
|
20
|
-
let isCheckpointState = true;
|
|
21
|
-
if (dbState.slot > wsState.slot && !opts.forceCheckpointSync) {
|
|
22
|
-
anchorState = dbStateBytes;
|
|
23
|
-
anchorCheckpoint = getCheckpointFromState(dbState);
|
|
24
|
-
isCheckpointState = false;
|
|
25
|
-
logger.verbose("Db state is ahead of the provided checkpoint state, using the db state to initialize the beacon chain");
|
|
26
|
-
}
|
|
27
|
-
// Throw error unless user explicitly asked not to, in testnets can happen that wss period is too small
|
|
28
|
-
// that even some epochs of non finalization can cause finalized checkpoint to be out of valid range
|
|
29
|
-
const wssCheck = wrapFnError(() => ensureWithinWeakSubjectivityPeriod(config, anchorState.state, anchorCheckpoint));
|
|
30
|
-
const isWithinWeakSubjectivityPeriod = wssCheck.err === null;
|
|
31
|
-
if (!isWithinWeakSubjectivityPeriod && !opts.ignoreWeakSubjectivityCheck) {
|
|
32
|
-
throw wssCheck.err;
|
|
33
|
-
}
|
|
34
|
-
if (isWsStateFinalized) {
|
|
35
|
-
await checkAndPersistAnchorState(config, db, logger, anchorState.state, anchorState.stateBytes, {
|
|
36
|
-
isWithinWeakSubjectivityPeriod,
|
|
37
|
-
isCheckpointState,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
return { anchorState: anchorState.state, stateBytes: anchorState.stateBytes };
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Initialize a beacon state, picking the strategy based on the `IBeaconArgs`
|
|
44
|
-
*
|
|
45
|
-
* State is initialized in one of three ways:
|
|
46
|
-
* 1. restore from weak subjectivity state (possibly downloaded from a remote beacon node)
|
|
47
|
-
* 2. restore from db
|
|
48
|
-
* 3. restore from genesis state (possibly downloaded via URL)
|
|
49
|
-
*
|
|
50
|
-
* The returned anchorState could be finalized or not.
|
|
51
|
-
* - if we load from checkpointState, checkpointSyncUrl, genesisStateFile or archived db, it is finalized
|
|
52
|
-
* - it's not finalized if we load from unsafeCheckpointState or lastPersistedCheckpointState
|
|
53
|
-
*/
|
|
1
|
+
import { getStateTypeFromBytes } from "@lodestar/beacon-node";
|
|
2
|
+
import { computeWeakSubjectivitySummaryFromStateBytes, isWithinWeakSubjectivityPeriodFromSummary, readBeaconStateBytesMetadata, } from "@lodestar/state-transition";
|
|
3
|
+
import { formatBytes } from "@lodestar/utils";
|
|
4
|
+
import { StateInitializationError, StateInitializationErrorCode } from "./stateInitialization/errors.js";
|
|
5
|
+
import { prepareArchivedStateInitialization, prepareCheckpointOrGenesisInitialization, } from "./stateInitialization/prepareStateInitialization.js";
|
|
6
|
+
/** Select serialized anchor bytes before constructing the state used for validation, persistence, and return. */
|
|
54
7
|
export async function initBeaconState(args, dataDir, chainForkConfig, db, logger) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
// i) used directly as the anchor state
|
|
60
|
-
// ii) used to load and verify a weak subjectivity state,
|
|
61
|
-
const lastDbSlot = await db.stateArchive.lastKey();
|
|
62
|
-
let stateBytes = lastDbSlot !== null ? await db.stateArchive.getBinary(lastDbSlot) : null;
|
|
63
|
-
// Convert to `Uint8Array` to avoid unexpected behavior such as `Buffer.prototype.slice` not copying memory
|
|
64
|
-
stateBytes = stateBytes ? new Uint8Array(stateBytes.buffer, stateBytes.byteOffset, stateBytes.byteLength) : null;
|
|
65
|
-
let lastDbState = null;
|
|
66
|
-
let lastDbValidatorsBytes = null;
|
|
67
|
-
let lastDbStateWithBytes = null;
|
|
68
|
-
if (stateBytes) {
|
|
69
|
-
logger.verbose("Found the last archived state", { slot: lastDbSlot, size: formatBytes(stateBytes.length) });
|
|
70
|
-
const { state, validatorsBytes } = loadStateAndValidators(chainForkConfig, stateBytes);
|
|
71
|
-
lastDbState = state;
|
|
72
|
-
lastDbValidatorsBytes = validatorsBytes;
|
|
73
|
-
lastDbStateWithBytes = { state, stateBytes: stateBytes };
|
|
74
|
-
}
|
|
75
|
-
if (lastDbState) {
|
|
76
|
-
// state from archive db is finalized
|
|
77
|
-
const isFinalized = true;
|
|
78
|
-
const config = createBeaconConfig(chainForkConfig, lastDbState.genesisValidatorsRoot);
|
|
79
|
-
const wssCheck = isWithinWeakSubjectivityPeriod(config, lastDbState, getCheckpointFromState(lastDbState));
|
|
80
|
-
// Explicitly force syncing from checkpoint state
|
|
81
|
-
if (args.forceCheckpointSync) {
|
|
82
|
-
// Forcing to sync from checkpoint is only recommended if node is taking too long to sync from last db state.
|
|
83
|
-
// It is important to remind the user to remove this flag again unless it is absolutely necessary.
|
|
84
|
-
if (wssCheck) {
|
|
85
|
-
logger.warn(`Forced syncing from checkpoint even though db state at slot ${lastDbState.slot} is within weak subjectivity period`);
|
|
86
|
-
logger.warn("Please consider removing --forceCheckpointSync flag unless absolutely necessary");
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
// All cases when we want to directly use lastDbState as the anchor state:
|
|
91
|
-
// - if no checkpoint sync args provided, or
|
|
92
|
-
// - the lastDbState is within weak subjectivity period:
|
|
93
|
-
if ((!args.checkpointState &&
|
|
94
|
-
!args.checkpointSyncUrl &&
|
|
95
|
-
!args.unsafeCheckpointState &&
|
|
96
|
-
!args.lastPersistedCheckpointState) ||
|
|
97
|
-
wssCheck) {
|
|
98
|
-
if (stateBytes === null) {
|
|
99
|
-
// this never happens
|
|
100
|
-
throw Error(`There is no stateBytes for the lastDbState at slot ${lastDbState.slot}`);
|
|
101
|
-
}
|
|
102
|
-
await checkAndPersistAnchorState(config, db, logger, lastDbState, stateBytes, {
|
|
103
|
-
isWithinWeakSubjectivityPeriod: wssCheck,
|
|
104
|
-
isCheckpointState: false,
|
|
105
|
-
});
|
|
106
|
-
logger.info("Initialized state from db", {
|
|
107
|
-
slot: lastDbState.slot,
|
|
108
|
-
epoch: computeEpochAtSlot(lastDbState.slot),
|
|
109
|
-
stateRoot: toRootHex(lastDbState.hashTreeRoot()),
|
|
110
|
-
isFinalized,
|
|
111
|
-
});
|
|
112
|
-
return { anchorState: lastDbState, stateBytes, isFinalized };
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// See if we can sync state using checkpoint sync args or else start from genesis
|
|
117
|
-
if (args.checkpointState) {
|
|
118
|
-
// state is trusted to be finalized
|
|
119
|
-
const isFinalized = true;
|
|
120
|
-
logger.info("Loading checkpoint state", { checkpointState: args.checkpointState });
|
|
121
|
-
const stateBytes = await downloadOrLoadFile(args.checkpointState);
|
|
122
|
-
logger.info("Loaded checkpoint state", {
|
|
123
|
-
size: formatBytes(stateBytes.length),
|
|
124
|
-
});
|
|
125
|
-
const stateAndCp = await readWSState(lastDbStateWithBytes, lastDbValidatorsBytes, {
|
|
126
|
-
stateBytes,
|
|
127
|
-
isFinalized,
|
|
128
|
-
wssCheckpoint: args.wssCheckpoint,
|
|
129
|
-
forceCheckpointSync: args.forceCheckpointSync,
|
|
130
|
-
ignoreWeakSubjectivityCheck: args.ignoreWeakSubjectivityCheck,
|
|
131
|
-
}, chainForkConfig, db, logger);
|
|
132
|
-
const { checkpoint } = computeAnchorCheckpoint(chainForkConfig, stateAndCp.anchorState);
|
|
133
|
-
logger.info("Initialized checkpoint state", {
|
|
134
|
-
slot: stateAndCp.anchorState.slot,
|
|
135
|
-
epoch: checkpoint.epoch,
|
|
136
|
-
checkpointRoot: toRootHex(checkpoint.root),
|
|
137
|
-
isFinalized,
|
|
138
|
-
});
|
|
139
|
-
return { ...stateAndCp, isFinalized };
|
|
8
|
+
const options = args;
|
|
9
|
+
if (options.forceCheckpointSync &&
|
|
10
|
+
!(options.checkpointState || options.checkpointSyncUrl || options.unsafeCheckpointState)) {
|
|
11
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.INVALID_CHECKPOINT_SOURCE }, "Forced checkpoint sync without specifying a checkpointState, checkpointSyncUrl or unsafeCheckpointState");
|
|
140
12
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
forceCheckpointSync: args.forceCheckpointSync,
|
|
148
|
-
ignoreWeakSubjectivityCheck: args.ignoreWeakSubjectivityCheck,
|
|
149
|
-
}, chainForkConfig, db, logger);
|
|
150
|
-
const { checkpoint } = computeAnchorCheckpoint(chainForkConfig, stateAndCp.anchorState);
|
|
151
|
-
logger.info("Initialized checkpoint state", {
|
|
152
|
-
slot: stateAndCp.anchorState.slot,
|
|
153
|
-
epoch: checkpoint.epoch,
|
|
154
|
-
checkpointRoot: toRootHex(checkpoint.root),
|
|
155
|
-
isFinalized,
|
|
156
|
-
});
|
|
157
|
-
return { ...stateAndCp, isFinalized };
|
|
158
|
-
}
|
|
159
|
-
if (args.unsafeCheckpointState || args.lastPersistedCheckpointState) {
|
|
160
|
-
// state is supposed to be not yet finalized
|
|
161
|
-
const isFinalized = false;
|
|
162
|
-
let stateBytes = null;
|
|
163
|
-
// prioritize lastPersistedCheckpointState over unsafeCheckpointState, unless forceCheckpointSync is set
|
|
164
|
-
if (args.lastPersistedCheckpointState && !args.forceCheckpointSync) {
|
|
165
|
-
// find the last persisted checkpoint state to load
|
|
166
|
-
const cpDataStore = args["chain.nHistoricalStatesFileDataStore"]
|
|
167
|
-
? new FileCPStateDatastore(dataDir)
|
|
168
|
-
: new DbCPStateDatastore(db);
|
|
169
|
-
logger.verbose(`Finding last persisted checkpoint state from ${cpDataStore.constructor.name}`);
|
|
170
|
-
stateBytes = await cpDataStore.readLatestSafe();
|
|
171
|
-
if (stateBytes === null) {
|
|
172
|
-
logger.warn("Last persisted checkpoint state not found");
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
logger.info("Found last persisted checkpoint state", { size: formatBytes(stateBytes.length) });
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
if (stateBytes === null && args.unsafeCheckpointState) {
|
|
179
|
-
logger.info("Loading checkpoint state", { unsafeCheckpointState: args.unsafeCheckpointState });
|
|
180
|
-
stateBytes = await downloadOrLoadFile(args.unsafeCheckpointState);
|
|
181
|
-
logger.info("Loaded checkpoint state", {
|
|
182
|
-
size: formatBytes(stateBytes.length),
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
if (stateBytes !== null) {
|
|
186
|
-
logger.warn("Initializing from unfinalized checkpoint state is unsafe and may cause the node to follow a minority chain");
|
|
187
|
-
const stateAndCp = await readWSState(lastDbStateWithBytes, lastDbValidatorsBytes, {
|
|
188
|
-
stateBytes,
|
|
189
|
-
isFinalized,
|
|
190
|
-
wssCheckpoint: args.wssCheckpoint,
|
|
191
|
-
forceCheckpointSync: args.forceCheckpointSync,
|
|
192
|
-
ignoreWeakSubjectivityCheck: args.ignoreWeakSubjectivityCheck,
|
|
193
|
-
}, chainForkConfig, db, logger);
|
|
194
|
-
const lastProcessedSlot = stateAndCp.anchorState.latestBlockHeader.slot;
|
|
195
|
-
const { checkpoint } = computeAnchorCheckpoint(chainForkConfig, stateAndCp.anchorState);
|
|
196
|
-
logger.info("Initialized checkpoint state", {
|
|
197
|
-
slot: stateAndCp.anchorState.slot,
|
|
198
|
-
epoch: checkpoint.epoch,
|
|
199
|
-
checkpointRoot: toRootHex(checkpoint.root),
|
|
200
|
-
lastProcessedSlot,
|
|
201
|
-
isFinalized,
|
|
13
|
+
const context = { chainForkConfig, db, dataDir, logger };
|
|
14
|
+
const archived = await readLatestArchivedStateBytes(context);
|
|
15
|
+
if (archived !== null) {
|
|
16
|
+
if (options.forceCheckpointSync && archived.isWithinWeakSubjectivityPeriod) {
|
|
17
|
+
logger.warn("Forced syncing from checkpoint even though db state is within weak subjectivity period", {
|
|
18
|
+
slot: archived.metadata.slot,
|
|
202
19
|
});
|
|
203
|
-
|
|
20
|
+
logger.warn("Please consider removing --forceCheckpointSync flag unless absolutely necessary");
|
|
204
21
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
let stateBytes = await downloadOrLoadFile(genesisStateFile);
|
|
212
|
-
logger.info("Loaded genesis state", { size: formatBytes(stateBytes.length) });
|
|
213
|
-
// Convert to `Uint8Array` to avoid unexpected behavior such as `Buffer.prototype.slice` not copying memory
|
|
214
|
-
stateBytes = new Uint8Array(stateBytes.buffer, stateBytes.byteOffset, stateBytes.byteLength);
|
|
215
|
-
const anchorState = getStateTypeFromBytes(chainForkConfig, stateBytes).deserializeToViewDU(stateBytes);
|
|
216
|
-
// Validate genesis state root
|
|
217
|
-
const stateRoot = toRootHex(anchorState.hashTreeRoot());
|
|
218
|
-
const expectedRoot = getGenesisStateRoot(args.network);
|
|
219
|
-
if (expectedRoot !== null && stateRoot !== expectedRoot) {
|
|
220
|
-
throw Error(`Genesis state root mismatch expected=${expectedRoot} received=${stateRoot}`);
|
|
22
|
+
const hasCheckpointSource = Boolean(options.checkpointState ||
|
|
23
|
+
options.checkpointSyncUrl ||
|
|
24
|
+
options.unsafeCheckpointState ||
|
|
25
|
+
options.lastPersistedCheckpointState);
|
|
26
|
+
if (!options.forceCheckpointSync && (!hasCheckpointSource || archived.isWithinWeakSubjectivityPeriod)) {
|
|
27
|
+
return executeStateInitialization(prepareArchivedStateInitialization(archived, context));
|
|
221
28
|
}
|
|
222
|
-
const config = createBeaconConfig(chainForkConfig, anchorState.genesisValidatorsRoot);
|
|
223
|
-
const wssCheck = isWithinWeakSubjectivityPeriod(config, anchorState, getCheckpointFromState(anchorState));
|
|
224
|
-
await checkAndPersistAnchorState(config, db, logger, anchorState, stateBytes, {
|
|
225
|
-
isWithinWeakSubjectivityPeriod: wssCheck,
|
|
226
|
-
isCheckpointState: true,
|
|
227
|
-
});
|
|
228
|
-
logger.info("Initialized genesis state", {
|
|
229
|
-
slot: anchorState.slot,
|
|
230
|
-
stateRoot,
|
|
231
|
-
isFinalized,
|
|
232
|
-
});
|
|
233
|
-
return { anchorState, stateBytes, isFinalized };
|
|
234
29
|
}
|
|
235
|
-
|
|
30
|
+
const stateInit = await prepareCheckpointOrGenesisInitialization(options, archived, context);
|
|
31
|
+
return executeStateInitialization(stateInit);
|
|
236
32
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
if (
|
|
245
|
-
|
|
246
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Read the archived DB anchor without constructing a state. Retain its metadata, weak-subjectivity summary,
|
|
35
|
+
* and period verdict so selection and initialization use the same result without rescanning or checking time again.
|
|
36
|
+
*/
|
|
37
|
+
async function readLatestArchivedStateBytes({ chainForkConfig, db, logger, }) {
|
|
38
|
+
const slot = await db.stateArchive.lastKey();
|
|
39
|
+
const bytes = slot === null ? null : await db.stateArchive.getBinary(slot);
|
|
40
|
+
if (bytes === null)
|
|
41
|
+
return null;
|
|
42
|
+
logger.verbose("Found the last archived state", { slot, size: formatBytes(bytes.length) });
|
|
43
|
+
const stateBytes = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
44
|
+
const metadata = readBeaconStateBytesMetadata(stateBytes);
|
|
45
|
+
if (metadata === null) {
|
|
46
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.MALFORMED_STATE_BYTES }, "Cannot read metadata from archived state bytes");
|
|
247
47
|
}
|
|
248
|
-
|
|
249
|
-
|
|
48
|
+
const weakSubjectivity = computeWeakSubjectivitySummaryFromStateBytes(chainForkConfig, stateBytes, metadata);
|
|
49
|
+
if (weakSubjectivity === null) {
|
|
50
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.MALFORMED_STATE_BYTES }, "Cannot extract weak subjectivity summary from archived state bytes");
|
|
250
51
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
ignoreWeakSubjectivityCheck,
|
|
258
|
-
});
|
|
52
|
+
return {
|
|
53
|
+
stateBytes,
|
|
54
|
+
metadata,
|
|
55
|
+
weakSubjectivity,
|
|
56
|
+
isWithinWeakSubjectivityPeriod: isWithinWeakSubjectivityPeriodFromSummary(chainForkConfig, weakSubjectivity),
|
|
57
|
+
};
|
|
259
58
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
catch (e) {
|
|
273
|
-
logger.error("Invalid", { checkpointSyncUrl: wssOpts.checkpointSyncUrl }, e);
|
|
274
|
-
throw e;
|
|
275
|
-
}
|
|
276
|
-
const { wsState, wsStateBytes, wsCheckpoint } = await fetchWeakSubjectivityState(chainForkConfig, logger, wssOpts, {
|
|
277
|
-
lastDbState: lastDbStateBytes?.state ?? null,
|
|
278
|
-
lastDbValidatorsBytes,
|
|
279
|
-
});
|
|
280
|
-
const config = createBeaconConfig(chainForkConfig, wsState.genesisValidatorsRoot);
|
|
281
|
-
const wsStateWithBytes = { state: wsState, stateBytes: wsStateBytes };
|
|
282
|
-
const store = lastDbStateBytes ?? wsStateWithBytes;
|
|
283
|
-
// a fetched ws state is trusted to be finalized
|
|
284
|
-
const isFinalized = true;
|
|
285
|
-
return initAndVerifyWeakSubjectivityState(config, db, logger, store, wsStateWithBytes, isFinalized, wsCheckpoint, {
|
|
286
|
-
forceCheckpointSync: wssOpts.forceCheckpointSync,
|
|
287
|
-
ignoreWeakSubjectivityCheck: wssOpts.ignoreWeakSubjectivityCheck,
|
|
288
|
-
});
|
|
59
|
+
/**
|
|
60
|
+
* Shared completion template for all sources: construct only the selected state, exactly once.
|
|
61
|
+
* Validate before persistence, and log success only after any required writes succeed.
|
|
62
|
+
*/
|
|
63
|
+
async function executeStateInitialization(stateInit) {
|
|
64
|
+
const stateType = getStateTypeFromBytes(stateInit.config, stateInit.stateBytes);
|
|
65
|
+
const anchorState = stateType.deserializeToViewDU(stateInit.stateBytes);
|
|
66
|
+
stateInit.validate(anchorState);
|
|
67
|
+
await stateInit.persist?.(anchorState, stateInit.stateBytes);
|
|
68
|
+
stateInit.log(anchorState);
|
|
69
|
+
return { anchorState, stateBytes: stateInit.stateBytes, isFinalized: stateInit.isFinalized };
|
|
289
70
|
}
|
|
290
71
|
//# sourceMappingURL=initBeaconState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initBeaconState.js","sourceRoot":"","sources":["../../../src/cmds/beacon/initBeaconState.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EAEpB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAgC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAEL,uBAAuB,EACvB,kBAAkB,EAClB,kCAAkC,EAClC,8BAA8B,EAC9B,SAAS,EACT,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEpC,OAAO,EAAS,WAAW,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAa,cAAc,EAAC,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAC,kBAAkB,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAKpE,KAAK,UAAU,kCAAkC,CAC/C,MAAoB,EACpB,EAAa,EACb,MAAc,EACd,YAA4B,EAC5B,YAA4B,EAC5B,kBAA2B,EAC3B,YAAwB,EACxB,IAAI,GAA2E,EAAE;IAEjF,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;IACnC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;IACnC,wDAAwD;IACxD,IACE,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW;QAC3C,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,CAAC,EAC9E,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,IAAI,WAAW,GAAG,YAAY,CAAC;IAC/B,IAAI,gBAAgB,GAAG,YAAY,CAAC;IACpC,IAAI,iBAAiB,GAAG,IAAI,CAAC;IAC7B,IAAI,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7D,WAAW,GAAG,YAAY,CAAC;QAC3B,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACnD,iBAAiB,GAAG,KAAK,CAAC;QAC1B,MAAM,CAAC,OAAO,CACZ,uGAAuG,CACxG,CAAC;IACJ,CAAC;IAED,uGAAuG;IACvG,oGAAoG;IACpG,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,kCAAkC,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACpH,MAAM,8BAA8B,GAAG,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;IAC7D,IAAI,CAAC,8BAA8B,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACzE,MAAM,QAAQ,CAAC,GAAG,CAAC;IACrB,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,0BAA0B,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,EAAE;YAC9F,8BAA8B;YAC9B,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAC,WAAW,EAAE,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,UAAU,EAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAA6B,EAC7B,OAAe,EACf,eAAgC,EAChC,EAAa,EACb,MAAc;IAMd,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAChH,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACtG,CAAC;IACD,gGAAgG;IAChG,0CAA0C;IAC1C,2DAA2D;IAC3D,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IACnD,IAAI,UAAU,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1F,2GAA2G;IAC3G,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjH,IAAI,WAAW,GAA+B,IAAI,CAAC;IACnD,IAAI,qBAAqB,GAAsB,IAAI,CAAC;IACpD,IAAI,oBAAoB,GAA0B,IAAI,CAAC;IACvD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;QAC1G,MAAM,EAAC,KAAK,EAAE,eAAe,EAAC,GAAG,sBAAsB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACrF,WAAW,GAAG,KAAK,CAAC;QACpB,qBAAqB,GAAG,eAAe,CAAC;QACxC,oBAAoB,GAAG,EAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;IACzD,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,qCAAqC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,kBAAkB,CAAC,eAAe,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,8BAA8B,CAAC,MAAM,EAAE,WAAW,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC;QAE1G,iDAAiD;QACjD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,6GAA6G;YAC7G,kGAAkG;YAClG,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CACT,+DAA+D,WAAW,CAAC,IAAI,qCAAqC,CACrH,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;aAAM,CAAC;YACN,0EAA0E;YAC1E,6CAA6C;YAC7C,yDAAyD;YACzD,IACE,CAAC,CAAC,IAAI,CAAC,eAAe;gBACpB,CAAC,IAAI,CAAC,iBAAiB;gBACvB,CAAC,IAAI,CAAC,qBAAqB;gBAC3B,CAAC,IAAI,CAAC,4BAA4B,CAAC;gBACrC,QAAQ,EACR,CAAC;gBACD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACxB,qBAAqB;oBACrB,MAAM,KAAK,CAAC,sDAAsD,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxF,CAAC;gBACD,MAAM,0BAA0B,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;oBAC5E,8BAA8B,EAAE,QAAQ;oBACxC,iBAAiB,EAAE,KAAK;iBACzB,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;oBACvC,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,KAAK,EAAE,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC;oBAC3C,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;oBAChD,WAAW;iBACZ,CAAC,CAAC;gBACH,OAAO,EAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,mCAAmC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAC,CAAC,CAAC;QACjF,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,WAAW,CAClC,oBAAoB,EACpB,qBAAqB,EACrB;YACE,UAAU;YACV,WAAW;YACX,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,2BAA2B,EAAE,IAAI,CAAC,2BAA2B;SAC9D,EACD,eAAe,EACf,EAAE,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAC,UAAU,EAAC,GAAG,uBAAuB,CAAC,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAEtF,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC1C,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI;YACjC,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,cAAc,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1C,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO,EAAC,GAAG,UAAU,EAAE,WAAW,EAAC,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,mCAAmC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAChD,oBAAoB,EACpB,qBAAqB,EACrB;YACE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,2BAA2B,EAAE,IAAI,CAAC,2BAA2B;SAC9D,EACD,eAAe,EACf,EAAE,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAC,UAAU,EAAC,GAAG,uBAAuB,CAAC,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAEtF,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC1C,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI;YACjC,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,cAAc,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1C,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO,EAAC,GAAG,UAAU,EAAE,WAAW,EAAC,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpE,4CAA4C;QAC5C,MAAM,WAAW,GAAG,KAAK,CAAC;QAC1B,IAAI,UAAU,GAAsB,IAAI,CAAC;QACzC,wGAAwG;QACxG,IAAI,IAAI,CAAC,4BAA4B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnE,mDAAmD;YACnD,MAAM,WAAW,GAAG,IAAI,CAAC,sCAAsC,CAAC;gBAC9D,CAAC,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC;gBACnC,CAAC,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,gDAAgD,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/F,UAAU,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,CAAC;YAChD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QAED,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,EAAC,CAAC,CAAC;YAC7F,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;aACrC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CACT,4GAA4G,CAC7G,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,WAAW,CAClC,oBAAoB,EACpB,qBAAqB,EACrB;gBACE,UAAU;gBACV,WAAW;gBACX,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,2BAA2B,EAAE,IAAI,CAAC,2BAA2B;aAC9D,EACD,eAAe,EACf,EAAE,EACF,MAAM,CACP,CAAC;YAEF,MAAM,iBAAiB,GAAG,UAAU,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC;YACxE,MAAM,EAAC,UAAU,EAAC,GAAG,uBAAuB,CAAC,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;YAEtF,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBAC1C,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI;gBACjC,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,cAAc,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC1C,iBAAiB;gBACjB,WAAW;aACZ,CAAC,CAAC;YAEH,OAAO,EAAC,GAAG,UAAU,EAAE,WAAW,EAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;IACpG,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,wCAAwC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAC,gBAAgB,EAAC,CAAC,CAAC;QACzD,IAAI,UAAU,GAAG,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;QAC5E,2GAA2G;QAC3G,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7F,MAAM,WAAW,GAAG,qBAAqB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACvG,8BAA8B;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,YAAY,KAAK,IAAI,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YACxD,MAAM,KAAK,CAAC,wCAAwC,YAAY,aAAa,SAAS,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,eAAe,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,8BAA8B,CAAC,MAAM,EAAE,WAAW,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC;QAC1G,MAAM,0BAA0B,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;YAC5E,8BAA8B,EAAE,QAAQ;YACxC,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;YACvC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,SAAS;YACT,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,CAAC,+FAA+F,CAAC,CAAC;AAC/G,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,gBAAuC,EACvC,qBAAwC,EACxC,OAMC,EACD,eAAgC,EAChC,EAAa,EACb,MAAc;IAEd,qDAAqD;IACrD,8FAA8F;IAC9F,yHAAyH;IACzH,MAAM,EAAC,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,2BAA2B,EAAC,GAAG,OAAO,CAAC;IAC3G,MAAM,WAAW,GAAG,gBAAgB,EAAE,KAAK,IAAI,IAAI,CAAC;IAEpD,IAAI,OAA4B,CAAC;IACjC,IAAI,WAAW,IAAI,qBAAqB,EAAE,CAAC;QACzC,2EAA2E;QAC3E,OAAO,GAAG,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC,KAAK,CAAC;IAC7F,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,qBAAqB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClF,MAAM,YAAY,GAAG,EAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAC,CAAC;IAClD,MAAM,KAAK,GAAG,gBAAgB,IAAI,YAAY,CAAC;IAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACzG,OAAO,kCAAkC,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE;QAC1G,mBAAmB;QACnB,2BAA2B;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,gBAAuC,EACvC,qBAAwC,EACxC,OAKC,EACD,eAAgC,EAChC,EAAa,EACb,MAAc;IAEd,gEAAgE;IAChE,yIAAyI;IACzI,+IAA+I;IAC/I,IAAI,CAAC;QACH,6EAA6E;QAC7E,gCAAgC;QAChC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;YACvC,iBAAiB,EAAE,iBAAiB,CAAC,MAAM;SAC5C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAC,EAAE,CAAU,CAAC,CAAC;QACpF,MAAM,CAAC,CAAC;IACV,CAAC;IAED,MAAM,EAAC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAC,GAAG,MAAM,0BAA0B,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;QAC/G,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,IAAI;QAC5C,qBAAqB;KACtB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClF,MAAM,gBAAgB,GAAG,EAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAC,CAAC;IACpE,MAAM,KAAK,GAAG,gBAAgB,IAAI,gBAAgB,CAAC;IACnD,gDAAgD;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC;IACzB,OAAO,kCAAkC,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE;QAChH,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,2BAA2B,EAAE,OAAO,CAAC,2BAA2B;KACjE,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"initBeaconState.js","sourceRoot":"","sources":["../../../src/cmds/beacon/initBeaconState.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAmBA,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,169 @@
|
|
|
1
|
+
import { DbCPStateDatastore, FileCPStateDatastore, persistAnchorState } from "@lodestar/beacon-node";
|
|
2
|
+
import { createBeaconConfig } from "@lodestar/config";
|
|
3
|
+
import { computeAnchorCheckpoint, computeCheckpointEpochAtStateSlot, computeEpochAtSlot, computeWeakSubjectivitySummaryFromStateBytes, getCurrentSlot, getLatestBlockRoot, 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}`);
|
|
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
|
+
if (isFinalized) {
|
|
125
|
+
assertAnchorStateForkMatchesConfig(config, state);
|
|
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 } = computeAnchorCheckpoint(config, state);
|
|
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 stateEpoch = computeCheckpointEpochAtStateSlot(state.slot);
|
|
161
|
+
const blockRoot = getLatestBlockRoot(state);
|
|
162
|
+
if (!ssz.Root.equals(blockRoot, checkpoint.root)) {
|
|
163
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.CHECKPOINT_ROOT_MISMATCH }, `Roots do not match. expected=${toRootHex(checkpoint.root)}, actual=${toRootHex(blockRoot)}`);
|
|
164
|
+
}
|
|
165
|
+
if (!ssz.Epoch.equals(stateEpoch, checkpoint.epoch)) {
|
|
166
|
+
throw new StateInitializationError({ code: StateInitializationErrorCode.CHECKPOINT_EPOCH_MISMATCH }, `Epochs do not match. expected=${checkpoint.epoch}, actual=${stateEpoch}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=checkpointState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointState.js","sourceRoot":"","sources":["../../../../src/cmds/beacon/stateInitialization/checkpointState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AACnG,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAEL,uBAAuB,EACvB,iCAAiC,EACjC,kBAAkB,EAClB,4CAA4C,EAC5C,cAAc,EACd,kBAAkB,EAClB,yCAAyC,EACzC,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEpC,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,+BAA+B,EAAE,oBAAoB,EAAC,MAAM,4BAA4B,CAAC;AACjG,OAAO,EAAC,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAC,wBAAwB,EAAE,4BAA4B,EAAC,MAAM,aAAa,CAAC;AASnF,OAAO,EAAC,kCAAkC,EAAC,MAAM,iBAAiB,CAAC;AAOnE,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,eAAuB,EACvB,OAA0B,EAC1B,QAAmC,EACnC,OAAgC;IAEhC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAC,eAAe,EAAC,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACpF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAC,eAAe,EAAE,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;IACxG,OAAO,+BAA+B,CACpC;QACE,UAAU;QACV,kBAAkB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9F,MAAM,EAAE,iBAAiB;KAC1B,EACD,QAAQ,EACR;QACE,WAAW,EAAE,IAAI;QACjB,mBAAmB,EAAE,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACzD,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC;KAC1E,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,iBAAyB,EACzB,OAA0B,EAC1B,QAAmC,EACnC,OAAgC;IAEhC,MAAM,EAAC,eAAe,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAC,iBAAiB,EAAC,EAAE,KAAc,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,EAAC,UAAU,EAAE,kBAAkB,EAAC,GAAG,MAAM,+BAA+B,CAAC,eAAe,EAAE,MAAM,EAAE;QACtG,iBAAiB;QACjB,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;IACH,OAAO,+BAA+B,CACpC,EAAC,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,EAAC,EAC7D,QAAQ,EACR;QACE,WAAW,EAAE,IAAI;QACjB,mBAAmB,EAAE,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACzD,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC;KAC1E,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0CAA0C,CAC9D,OAIG,EACH,QAAmC,EACnC,OAAgC;IAEhC,MAAM,EAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC;IACtC,IAAI,KAAK,GAAsB,IAAI,CAAC;IACpC,IAAI,OAAO,CAAC,4BAA4B,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,OAAO,CAAC,sCAAsC,CAAC;YAC3D,CAAC,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC;YACnC,CAAC,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,gDAAgD,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACzF,KAAK,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QACrC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAC,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAC,CAAC,CAAC;QAChG,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,IAAI,CACT,4GAA4G,CAC7G,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACpF,OAAO,+BAA+B,CACpC;QACE,UAAU;QACV,kBAAkB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9F,MAAM,EAAE,oBAAoB;KAC7B,EACD,QAAQ,EACR;QACE,WAAW,EAAE,KAAK;QAClB,mBAAmB,EAAE,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACzD,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC;KAC1E,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CACtC,SAAwC,EACxC,QAAmC,EACnC,MAA+B,EAC/B,EAAC,eAAe,EAAE,EAAE,EAAE,MAAM,EAA0B;IAEtD,MAAM,iBAAiB,GAAG,4BAA4B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7E,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,wBAAwB,CAChC,EAAC,IAAI,EAAE,4BAA4B,CAAC,qBAAqB,EAAC,EAC1D,mCAAmC,SAAS,CAAC,MAAM,EAAE,CACtD,CAAC;IACJ,CAAC;IACD,IACE,QAAQ,KAAK,IAAI;QACjB,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,KAAK,iBAAiB,CAAC,WAAW;YAC9D,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,qBAAqB,CAAC,CAAC,EACrG,CAAC;QACD,MAAM,IAAI,wBAAwB,CAChC,EAAC,IAAI,EAAE,4BAA4B,CAAC,oBAAoB,EAAC,EACzD,wGAAwG,CACzG,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GACf,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACtG,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CACZ,uGAAuG,CACxG,CAAC;IACJ,CAAC;IACD,MAAM,EAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAC,GAAG,WAAW;QAC1D,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC;YACE,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,QAAQ,EAAE,iBAAiB;YAC3B,gBAAgB,EAAE,4CAA4C,CAC5D,eAAe,EACf,SAAS,CAAC,UAAU,EACpB,iBAAiB,CAClB;SACF,CAAC;IACN,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,wBAAwB,CAChC,EAAC,IAAI,EAAE,4BAA4B,CAAC,qBAAqB,EAAC,EAC1D,iDAAiD,SAAS,CAAC,MAAM,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC;IAC7E,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;IACrD,MAAM,EAAC,WAAW,EAAE,2BAA2B,EAAC,GAAG,MAAM,CAAC;IAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACnF,MAAM,oCAAoC,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1G,mEAAmE;IACnE,MAAM,aAAa,GAAG,WAAW,IAAI,CAAC,WAAW,CAAC;IAClD,OAAO;QACL,UAAU;QACV,MAAM;QACN,WAAW;QACX,QAAQ,CAAC,KAAK;YACZ,0EAA0E;YAC1E,IAAI,kBAAkB,KAAK,IAAI;gBAAE,4BAA4B,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;YACzF,MAAM,gBAAgB,GACpB,oCAAoC,IAAI,yCAAyC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC9G,IAAI,CAAC,gBAAgB,IAAI,CAAC,2BAA2B,EAAE,CAAC;gBACtD,MAAM,UAAU,GAAG,kBAAkB,CAAC,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5F,MAAM,IAAI,wBAAwB,CAChC,EAAC,IAAI,EAAE,4BAA4B,CAAC,gBAAgB,EAAC,EACrD,iCAAiC,gBAAgB,CAAC,eAAe,8CAA8C,gBAAgB,CAAC,MAAM,kCAAkC,UAAU,wCAAwC,CAC3N,CAAC;YACJ,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,kCAAkC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;gBACjD,MAAM,OAAO,GAAG;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;oBACrC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;oBACzC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;oBAC1C,8BAA8B,EAAE,gBAAgB;iBACjD,CAAC;gBACF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,oCAAoC,MAAM,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC3E,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,yCAAyC,EAAE,OAAO,CAAC,CAAC;oBACnG,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;gBAC/F,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9F,GAAG,CAAC,KAAK;YACP,MAAM,EAAC,UAAU,EAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBAC1C,MAAM;gBACN,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;gBACzC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC1C,cAAc,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC1C,WAAW;gBACX,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAC,CAAC;aAC1E,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,KAA0B,EAAE,UAAsB;IACtF,MAAM,UAAU,GAAG,iCAAiC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,wBAAwB,CAChC,EAAC,IAAI,EAAE,4BAA4B,CAAC,wBAAwB,EAAC,EAC7D,iCAAiC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,SAAS,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,wBAAwB,CAChC,EAAC,IAAI,EAAE,4BAA4B,CAAC,yBAAyB,EAAC,EAC9D,kCAAkC,UAAU,CAAC,KAAK,YAAY,UAAU,EAAE,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC"}
|