@lodestar/beacon-node 1.17.0-dev.3ef43ef0fe → 1.17.0-dev.4857f4354f
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/lib/api/impl/beacon/rewards/index.js +5 -0
- package/lib/api/impl/beacon/rewards/index.js.map +1 -1
- package/lib/chain/archiver/archiveStates.js +21 -6
- package/lib/chain/archiver/archiveStates.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +2 -1
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +3 -1
- package/lib/chain/blocks/types.js +16 -1
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +1 -0
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +4 -3
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/chain.d.ts +2 -0
- package/lib/chain/chain.js +9 -1
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -0
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -5
- package/lib/chain/opPools/aggregatedAttestationPool.js +5 -3
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/prepareNextSlot.js +1 -0
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/errors.d.ts +7 -1
- package/lib/chain/regen/errors.js +1 -0
- package/lib/chain/regen/errors.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +2 -1
- package/lib/chain/regen/queued.d.ts +19 -4
- package/lib/chain/regen/queued.js +42 -13
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +15 -6
- package/lib/chain/regen/regen.js +62 -24
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.d.ts +6 -0
- package/lib/chain/rewards/syncCommitteeRewards.js +36 -0
- package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -0
- package/lib/chain/seenCache/seenAttestationData.d.ts +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +6 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +9 -17
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +2 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +2 -2
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +6 -5
- package/lib/chain/stateCache/persistentCheckpointsCache.js +18 -17
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/stateContextCache.d.ts +2 -1
- package/lib/chain/stateCache/stateContextCache.js +2 -2
- package/lib/chain/stateCache/stateContextCache.js.map +1 -1
- package/lib/chain/stateCache/stateContextCheckpointsCache.d.ts +5 -4
- package/lib/chain/stateCache/stateContextCheckpointsCache.js +10 -9
- package/lib/chain/stateCache/stateContextCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +6 -5
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.d.ts +2 -2
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts +1 -1
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +8 -1
- package/lib/metrics/metrics/lodestar.js +10 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/events.d.ts +5 -0
- package/lib/network/events.js +2 -0
- package/lib/network/events.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +7 -4
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +2 -0
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +39 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/sync/interface.d.ts +15 -4
- package/lib/sync/interface.js +1 -0
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +9 -0
- package/lib/sync/unknownBlock.js +127 -14
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/pendingBlocksTree.js +5 -2
- package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
- package/lib/util/multifork.d.ts +2 -1
- package/lib/util/multifork.js +4 -1
- package/lib/util/multifork.js.map +1 -1
- package/package.json +16 -18
package/lib/chain/regen/regen.js
CHANGED
|
@@ -7,6 +7,10 @@ import { ChainEvent } from "../emitter.js";
|
|
|
7
7
|
import { RegenError, RegenErrorCode } from "./errors.js";
|
|
8
8
|
/**
|
|
9
9
|
* Regenerates states that have already been processed by the fork choice
|
|
10
|
+
* Since Feb 2024, we support reloading checkpoint state from disk via allowDiskReload flag. Due to its performance impact
|
|
11
|
+
* this flag is only set to true in this case:
|
|
12
|
+
* - getPreState: this is for block processing, it's important to reload state in unfinality time
|
|
13
|
+
* - updateHeadState: rarely happen, but it's important to make sure we always can regen head state
|
|
10
14
|
*/
|
|
11
15
|
export class StateRegenerator {
|
|
12
16
|
constructor(modules) {
|
|
@@ -16,8 +20,9 @@ export class StateRegenerator {
|
|
|
16
20
|
* Get the state to run with `block`. May be:
|
|
17
21
|
* - If parent is in same epoch -> Exact state at `block.parentRoot`
|
|
18
22
|
* - If parent is in prev epoch -> State after `block.parentRoot` dialed forward through epoch transition
|
|
23
|
+
* - reload state if needed in this flow
|
|
19
24
|
*/
|
|
20
|
-
async getPreState(block, opts,
|
|
25
|
+
async getPreState(block, opts, regenCaller) {
|
|
21
26
|
const parentBlock = this.modules.forkChoice.getBlock(block.parentRoot);
|
|
22
27
|
if (!parentBlock) {
|
|
23
28
|
throw new RegenError({
|
|
@@ -27,28 +32,30 @@ export class StateRegenerator {
|
|
|
27
32
|
}
|
|
28
33
|
const parentEpoch = computeEpochAtSlot(parentBlock.slot);
|
|
29
34
|
const blockEpoch = computeEpochAtSlot(block.slot);
|
|
35
|
+
const allowDiskReload = true;
|
|
30
36
|
// This may save us at least one epoch transition.
|
|
31
37
|
// If the requested state crosses an epoch boundary
|
|
32
38
|
// then we may use the checkpoint state before the block
|
|
33
39
|
// We may have the checkpoint state with parent root inside the checkpoint state cache
|
|
34
40
|
// through gossip validation.
|
|
35
41
|
if (parentEpoch < blockEpoch) {
|
|
36
|
-
return this.getCheckpointState({ root: block.parentRoot, epoch: blockEpoch }, opts,
|
|
42
|
+
return this.getCheckpointState({ root: block.parentRoot, epoch: blockEpoch }, opts, regenCaller, allowDiskReload);
|
|
37
43
|
}
|
|
38
44
|
// Otherwise, get the state normally.
|
|
39
|
-
return this.getState(parentBlock.stateRoot,
|
|
45
|
+
return this.getState(parentBlock.stateRoot, regenCaller, opts, allowDiskReload);
|
|
40
46
|
}
|
|
41
47
|
/**
|
|
42
48
|
* Get state after block `cp.root` dialed forward to first slot of `cp.epoch`
|
|
43
49
|
*/
|
|
44
|
-
async getCheckpointState(cp, opts,
|
|
50
|
+
async getCheckpointState(cp, opts, regenCaller, allowDiskReload = false) {
|
|
45
51
|
const checkpointStartSlot = computeStartSlotAtEpoch(cp.epoch);
|
|
46
|
-
return this.getBlockSlotState(toHexString(cp.root), checkpointStartSlot, opts,
|
|
52
|
+
return this.getBlockSlotState(toHexString(cp.root), checkpointStartSlot, opts, regenCaller, allowDiskReload);
|
|
47
53
|
}
|
|
48
54
|
/**
|
|
49
55
|
* Get state after block `blockRoot` dialed forward to `slot`
|
|
56
|
+
* - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
|
|
50
57
|
*/
|
|
51
|
-
async getBlockSlotState(blockRoot, slot, opts,
|
|
58
|
+
async getBlockSlotState(blockRoot, slot, opts, regenCaller, allowDiskReload = false) {
|
|
52
59
|
const block = this.modules.forkChoice.getBlockHex(blockRoot);
|
|
53
60
|
if (!block) {
|
|
54
61
|
throw new RegenError({
|
|
@@ -63,25 +70,32 @@ export class StateRegenerator {
|
|
|
63
70
|
blockSlot: block.slot,
|
|
64
71
|
});
|
|
65
72
|
}
|
|
66
|
-
const
|
|
73
|
+
const { checkpointStateCache } = this.modules;
|
|
74
|
+
const epoch = computeEpochAtSlot(slot);
|
|
75
|
+
const latestCheckpointStateCtx = allowDiskReload
|
|
76
|
+
? await checkpointStateCache.getOrReloadLatest(blockRoot, epoch, opts)
|
|
77
|
+
: checkpointStateCache.getLatest(blockRoot, epoch, opts);
|
|
67
78
|
// If a checkpoint state exists with the given checkpoint root, it either is in requested epoch
|
|
68
79
|
// or needs to have empty slots processed until the requested epoch
|
|
69
80
|
if (latestCheckpointStateCtx) {
|
|
70
|
-
return processSlotsByCheckpoint(this.modules, latestCheckpointStateCtx, slot, opts);
|
|
81
|
+
return processSlotsByCheckpoint(this.modules, latestCheckpointStateCtx, slot, regenCaller, opts);
|
|
71
82
|
}
|
|
72
83
|
// Otherwise, use the fork choice to get the stateRoot from block at the checkpoint root
|
|
73
84
|
// regenerate that state,
|
|
74
85
|
// then process empty slots until the requested epoch
|
|
75
|
-
const blockStateCtx = await this.getState(block.stateRoot,
|
|
76
|
-
return processSlotsByCheckpoint(this.modules, blockStateCtx, slot, opts);
|
|
86
|
+
const blockStateCtx = await this.getState(block.stateRoot, regenCaller, opts, allowDiskReload);
|
|
87
|
+
return processSlotsByCheckpoint(this.modules, blockStateCtx, slot, regenCaller, opts);
|
|
77
88
|
}
|
|
78
89
|
/**
|
|
79
90
|
* Get state by exact root. If not in cache directly, requires finding the block that references the state from the
|
|
80
91
|
* forkchoice and replaying blocks to get to it.
|
|
92
|
+
* - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
|
|
81
93
|
*/
|
|
82
|
-
async getState(stateRoot, _rCaller
|
|
94
|
+
async getState(stateRoot, _rCaller, opts,
|
|
95
|
+
// internal option, don't want to expose to external caller
|
|
96
|
+
allowDiskReload = false) {
|
|
83
97
|
// Trivial case, state at stateRoot is already cached
|
|
84
|
-
const cachedStateCtx = this.modules.stateCache.get(stateRoot);
|
|
98
|
+
const cachedStateCtx = this.modules.stateCache.get(stateRoot, opts);
|
|
85
99
|
if (cachedStateCtx) {
|
|
86
100
|
return cachedStateCtx;
|
|
87
101
|
}
|
|
@@ -93,12 +107,17 @@ export class StateRegenerator {
|
|
|
93
107
|
// gets reversed when replayed
|
|
94
108
|
const blocksToReplay = [block];
|
|
95
109
|
let state = null;
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
const { checkpointStateCache } = this.modules;
|
|
111
|
+
// iterateAncestorBlocks only returns ancestor blocks, not the block itself
|
|
112
|
+
for (const b of this.modules.forkChoice.iterateAncestorBlocks(block.blockRoot)) {
|
|
113
|
+
state = this.modules.stateCache.get(b.stateRoot, opts);
|
|
98
114
|
if (state) {
|
|
99
115
|
break;
|
|
100
116
|
}
|
|
101
|
-
|
|
117
|
+
const epoch = computeEpochAtSlot(blocksToReplay[blocksToReplay.length - 1].slot - 1);
|
|
118
|
+
state = allowDiskReload
|
|
119
|
+
? await checkpointStateCache.getOrReloadLatest(b.blockRoot, epoch, opts)
|
|
120
|
+
: checkpointStateCache.getLatest(b.blockRoot, epoch, opts);
|
|
102
121
|
if (state) {
|
|
103
122
|
break;
|
|
104
123
|
}
|
|
@@ -116,6 +135,8 @@ export class StateRegenerator {
|
|
|
116
135
|
stateRoot,
|
|
117
136
|
});
|
|
118
137
|
}
|
|
138
|
+
const replaySlots = blocksToReplay.map((b) => b.slot).join(",");
|
|
139
|
+
this.modules.logger.debug("Replaying blocks to get state", { stateRoot, replaySlots });
|
|
119
140
|
for (const b of blocksToReplay.reverse()) {
|
|
120
141
|
const block = await this.modules.db.block.get(fromHexString(b.blockRoot));
|
|
121
142
|
if (!block) {
|
|
@@ -134,9 +155,20 @@ export class StateRegenerator {
|
|
|
134
155
|
verifyStateRoot: false,
|
|
135
156
|
verifyProposer: false,
|
|
136
157
|
verifySignatures: false,
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
|
|
158
|
+
}, this.modules.metrics);
|
|
159
|
+
const stateRoot = toHexString(state.hashTreeRoot());
|
|
160
|
+
if (b.stateRoot !== stateRoot) {
|
|
161
|
+
throw new RegenError({
|
|
162
|
+
slot: b.slot,
|
|
163
|
+
code: RegenErrorCode.INVALID_STATE_ROOT,
|
|
164
|
+
actual: stateRoot,
|
|
165
|
+
expected: b.stateRoot,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (allowDiskReload) {
|
|
169
|
+
// also with allowDiskReload flag, we "reload" it to the state cache too
|
|
170
|
+
this.modules.stateCache.add(state);
|
|
171
|
+
}
|
|
140
172
|
// this avoids keeping our node busy processing blocks
|
|
141
173
|
await sleep(0);
|
|
142
174
|
}
|
|
@@ -147,11 +179,12 @@ export class StateRegenerator {
|
|
|
147
179
|
});
|
|
148
180
|
}
|
|
149
181
|
}
|
|
182
|
+
this.modules.logger.debug("Replayed blocks to get state", { stateRoot, replaySlots });
|
|
150
183
|
return state;
|
|
151
184
|
}
|
|
152
185
|
findFirstStateBlock(stateRoot) {
|
|
153
186
|
for (const block of this.modules.forkChoice.forwarditerateAncestorBlocks()) {
|
|
154
|
-
if (block
|
|
187
|
+
if (block.stateRoot === stateRoot) {
|
|
155
188
|
return block;
|
|
156
189
|
}
|
|
157
190
|
}
|
|
@@ -166,8 +199,8 @@ export class StateRegenerator {
|
|
|
166
199
|
* process slots forward towards `slot`,
|
|
167
200
|
* emitting "checkpoint" events after every epoch processed.
|
|
168
201
|
*/
|
|
169
|
-
async function processSlotsByCheckpoint(modules, preState, slot, opts) {
|
|
170
|
-
let postState = await processSlotsToNearestCheckpoint(modules, preState, slot, opts);
|
|
202
|
+
async function processSlotsByCheckpoint(modules, preState, slot, regenCaller, opts) {
|
|
203
|
+
let postState = await processSlotsToNearestCheckpoint(modules, preState, slot, regenCaller, opts);
|
|
171
204
|
if (postState.slot < slot) {
|
|
172
205
|
postState = processSlots(postState, slot, opts, modules.metrics);
|
|
173
206
|
}
|
|
@@ -180,7 +213,7 @@ async function processSlotsByCheckpoint(modules, preState, slot, opts) {
|
|
|
180
213
|
*
|
|
181
214
|
* Stops processing after no more full epochs can be processed.
|
|
182
215
|
*/
|
|
183
|
-
async function processSlotsToNearestCheckpoint(modules, preState, slot, opts) {
|
|
216
|
+
async function processSlotsToNearestCheckpoint(modules, preState, slot, regenCaller, opts) {
|
|
184
217
|
const preSlot = preState.slot;
|
|
185
218
|
const postSlot = slot;
|
|
186
219
|
const preEpoch = computeEpochAtSlot(preSlot);
|
|
@@ -189,11 +222,16 @@ async function processSlotsToNearestCheckpoint(modules, preState, slot, opts) {
|
|
|
189
222
|
for (let nextEpochSlot = computeStartSlotAtEpoch(preEpoch + 1); nextEpochSlot <= postSlot; nextEpochSlot += SLOTS_PER_EPOCH) {
|
|
190
223
|
// processSlots calls .clone() before mutating
|
|
191
224
|
postState = processSlots(postState, nextEpochSlot, opts, metrics);
|
|
192
|
-
|
|
225
|
+
modules.metrics?.epochTransitionByCaller.inc({ caller: regenCaller });
|
|
226
|
+
// this is usually added when we prepare for next slot or validate gossip block
|
|
227
|
+
// then when we process the 1st block of epoch, we don't have to do state transition again
|
|
228
|
+
// This adds Previous Root Checkpoint State to the checkpoint state cache
|
|
229
|
+
// This may becomes the "official" checkpoint state if the 1st block of epoch is skipped
|
|
193
230
|
const checkpointState = postState;
|
|
194
231
|
const cp = getCheckpointFromState(checkpointState);
|
|
195
232
|
checkpointStateCache.add(cp, checkpointState);
|
|
196
|
-
|
|
233
|
+
// consumers should not mutate or get the transfered cache
|
|
234
|
+
emitter.emit(ChainEvent.checkpoint, cp, checkpointState.clone(true));
|
|
197
235
|
// this avoids keeping our node busy processing blocks
|
|
198
236
|
await sleep(0);
|
|
199
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regen.js","sourceRoot":"","sources":["../../../src/chain/regen/regen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAEL,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,YAAY,EACZ,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,
|
|
1
|
+
{"version":3,"file":"regen.js","sourceRoot":"","sources":["../../../src/chain/regen/regen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
2
|
+
import { ValidatorIndex, allForks } from "@lodestar/types";
|
|
3
|
+
import { routes } from "@lodestar/api";
|
|
4
|
+
export type SyncCommitteeRewards = routes.beacon.SyncCommitteeRewards;
|
|
5
|
+
export declare function computeSyncCommitteeRewards(block: allForks.BeaconBlock, preState: CachedBeaconStateAllForks, validatorIds?: (ValidatorIndex | string)[]): Promise<SyncCommitteeRewards>;
|
|
6
|
+
//# sourceMappingURL=syncCommitteeRewards.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ForkName, SYNC_COMMITTEE_SIZE } from "@lodestar/params";
|
|
2
|
+
export async function computeSyncCommitteeRewards(block, preState, validatorIds) {
|
|
3
|
+
const fork = preState.config.getForkName(block.slot);
|
|
4
|
+
if (fork === ForkName.phase0) {
|
|
5
|
+
throw Error("Cannot get sync rewards as phase0 block does not have sync committee");
|
|
6
|
+
}
|
|
7
|
+
const altairBlock = block;
|
|
8
|
+
const preStateAltair = preState;
|
|
9
|
+
const { index2pubkey } = preStateAltair.epochCtx;
|
|
10
|
+
// Bound committeeIndices in case it goes beyond SYNC_COMMITTEE_SIZE just to be safe
|
|
11
|
+
const committeeIndices = preStateAltair.epochCtx.currentSyncCommitteeIndexed.validatorIndices.slice(0, SYNC_COMMITTEE_SIZE);
|
|
12
|
+
const { syncParticipantReward } = preStateAltair.epochCtx;
|
|
13
|
+
const { syncCommitteeBits } = altairBlock.body.syncAggregate;
|
|
14
|
+
// Use balance of each committee as starting point such that we cap the penalty to avoid balance dropping below 0
|
|
15
|
+
const balances = new Map(committeeIndices.map((i) => [i, { val: preStateAltair.balances.get(i) }]));
|
|
16
|
+
for (const i of committeeIndices) {
|
|
17
|
+
const balanceRecord = balances.get(i);
|
|
18
|
+
if (syncCommitteeBits.get(i)) {
|
|
19
|
+
// Positive rewards for participants
|
|
20
|
+
balanceRecord.val += syncParticipantReward;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Negative rewards for non participants
|
|
24
|
+
balanceRecord.val = Math.max(0, balanceRecord.val - syncParticipantReward);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const rewards = Array.from(balances, ([validatorIndex, v]) => ({ validatorIndex, reward: v.val }));
|
|
28
|
+
if (validatorIds !== undefined) {
|
|
29
|
+
const filtersSet = new Set(validatorIds);
|
|
30
|
+
return rewards.filter((reward) => filtersSet.has(reward.validatorIndex) || filtersSet.has(index2pubkey[reward.validatorIndex].toHex()));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return rewards;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=syncCommitteeRewards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncCommitteeRewards.js","sourceRoot":"","sources":["../../../src/chain/rewards/syncCommitteeRewards.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,QAAQ,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAM/D,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAA2B,EAC3B,QAAmC,EACnC,YAA0C;IAE1C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,WAAW,GAAG,KAA2B,CAAC;IAChD,MAAM,cAAc,GAAG,QAAmC,CAAC;IAC3D,MAAM,EAAC,YAAY,EAAC,GAAG,cAAc,CAAC,QAAQ,CAAC;IAE/C,oFAAoF;IACpF,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,KAAK,CACjG,CAAC,EACD,mBAAmB,CACpB,CAAC;IACF,MAAM,EAAC,qBAAqB,EAAC,GAAG,cAAc,CAAC,QAAQ,CAAC;IACxD,MAAM,EAAC,iBAAiB,EAAC,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;IAE3D,iHAAiH;IACjH,MAAM,QAAQ,GAAuC,IAAI,GAAG,CAC1D,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CACxE,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAkB,CAAC;QACvD,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,oCAAoC;YACpC,aAAa,CAAC,GAAG,IAAI,qBAAqB,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,wCAAwC;YACxC,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,GAAG,qBAAqB,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,EAAC,CAAC,CAAC,CAAC;IAEjG,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC,CACjH,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { Metrics } from "../../metrics/metrics.js";
|
|
|
3
3
|
import { AttDataBase64 } from "../../util/sszBytes.js";
|
|
4
4
|
import { InsertOutcome } from "../opPools/types.js";
|
|
5
5
|
export type AttestationDataCacheEntry = {
|
|
6
|
-
committeeIndices:
|
|
6
|
+
committeeIndices: Uint32Array;
|
|
7
7
|
signingRoot: Uint8Array;
|
|
8
8
|
attDataRootHex: RootHex;
|
|
9
9
|
attestationData: phase0.AttestationData;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { deneb, RootHex, allForks } from "@lodestar/types";
|
|
2
2
|
import { ChainForkConfig } from "@lodestar/config";
|
|
3
3
|
import { BlockInput, GossipedInputType } from "../blocks/types.js";
|
|
4
|
+
import { Metrics } from "../../metrics/index.js";
|
|
5
|
+
export declare enum BlockInputAvailabilitySource {
|
|
6
|
+
GOSSIP = "gossip",
|
|
7
|
+
UNKNOWN_SYNC = "unknown_sync"
|
|
8
|
+
}
|
|
4
9
|
type GossipedBlockInput = {
|
|
5
10
|
type: GossipedInputType.block;
|
|
6
11
|
signedBlock: allForks.SignedBeaconBlock;
|
|
@@ -25,7 +30,7 @@ export declare class SeenGossipBlockInput {
|
|
|
25
30
|
private blockInputCache;
|
|
26
31
|
prune(): void;
|
|
27
32
|
hasBlock(blockRoot: RootHex): boolean;
|
|
28
|
-
getGossipBlockInput(config: ChainForkConfig, gossipedInput: GossipedBlockInput): {
|
|
33
|
+
getGossipBlockInput(config: ChainForkConfig, gossipedInput: GossipedBlockInput, metrics: Metrics | null): {
|
|
29
34
|
blockInput: BlockInput;
|
|
30
35
|
blockInputMeta: {
|
|
31
36
|
pending: GossipedInputType.blob | null;
|
|
@@ -2,7 +2,12 @@ import { toHexString } from "@chainsafe/ssz";
|
|
|
2
2
|
import { ssz } from "@lodestar/types";
|
|
3
3
|
import { pruneSetToMax } from "@lodestar/utils";
|
|
4
4
|
import { BLOBSIDECAR_FIXED_SIZE, ForkSeq } from "@lodestar/params";
|
|
5
|
-
import { getBlockInput, BlockSource, GossipedInputType, } from "../blocks/types.js";
|
|
5
|
+
import { getBlockInput, BlockSource, GossipedInputType, getBlockInputBlobs, } from "../blocks/types.js";
|
|
6
|
+
export var BlockInputAvailabilitySource;
|
|
7
|
+
(function (BlockInputAvailabilitySource) {
|
|
8
|
+
BlockInputAvailabilitySource["GOSSIP"] = "gossip";
|
|
9
|
+
BlockInputAvailabilitySource["UNKNOWN_SYNC"] = "unknown_sync";
|
|
10
|
+
})(BlockInputAvailabilitySource || (BlockInputAvailabilitySource = {}));
|
|
6
11
|
const MAX_GOSSIPINPUT_CACHE = 5;
|
|
7
12
|
/**
|
|
8
13
|
* For predeneb, SeenGossipBlockInput only tracks and caches block so that we don't need to download known block
|
|
@@ -25,7 +30,7 @@ export class SeenGossipBlockInput {
|
|
|
25
30
|
hasBlock(blockRoot) {
|
|
26
31
|
return this.blockInputCache.has(blockRoot);
|
|
27
32
|
}
|
|
28
|
-
getGossipBlockInput(config, gossipedInput) {
|
|
33
|
+
getGossipBlockInput(config, gossipedInput, metrics) {
|
|
29
34
|
let blockHex;
|
|
30
35
|
let blockCache;
|
|
31
36
|
if (gossipedInput.type === GossipedInputType.block) {
|
|
@@ -68,6 +73,7 @@ export class SeenGossipBlockInput {
|
|
|
68
73
|
if (blobKzgCommitments.length === blobsCache.size) {
|
|
69
74
|
const allBlobs = getBlockInputBlobs(blobsCache);
|
|
70
75
|
resolveAvailability(allBlobs);
|
|
76
|
+
metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({ source: BlockInputAvailabilitySource.GOSSIP });
|
|
71
77
|
const { blobs, blobsBytes } = allBlobs;
|
|
72
78
|
return {
|
|
73
79
|
blockInput: getBlockInput.postDeneb(config, signedBlock, BlockSource.gossip, blobs, blockBytes ?? null, blobsBytes),
|
|
@@ -76,7 +82,7 @@ export class SeenGossipBlockInput {
|
|
|
76
82
|
}
|
|
77
83
|
else {
|
|
78
84
|
return {
|
|
79
|
-
blockInput: getBlockInput.blobsPromise(config, signedBlock, BlockSource.gossip, blobsCache, blockBytes ?? null, availabilityPromise),
|
|
85
|
+
blockInput: getBlockInput.blobsPromise(config, signedBlock, BlockSource.gossip, blobsCache, blockBytes ?? null, availabilityPromise, resolveAvailability),
|
|
80
86
|
blockInputMeta: {
|
|
81
87
|
pending: GossipedInputType.blob,
|
|
82
88
|
haveBlobs: blobsCache.size,
|
|
@@ -107,18 +113,4 @@ function getEmptyBlockInputCacheEntry() {
|
|
|
107
113
|
const blobsCache = new Map();
|
|
108
114
|
return { availabilityPromise, resolveAvailability, blobsCache };
|
|
109
115
|
}
|
|
110
|
-
function getBlockInputBlobs(blobsCache) {
|
|
111
|
-
const blobs = [];
|
|
112
|
-
const blobsBytes = [];
|
|
113
|
-
for (let index = 0; index < blobsCache.size; index++) {
|
|
114
|
-
const blobCache = blobsCache.get(index);
|
|
115
|
-
if (blobCache === undefined) {
|
|
116
|
-
throw Error(`Missing blobSidecar at index=${index}`);
|
|
117
|
-
}
|
|
118
|
-
const { blobSidecar, blobBytes } = blobCache;
|
|
119
|
-
blobs.push(blobSidecar);
|
|
120
|
-
blobsBytes.push(blobBytes);
|
|
121
|
-
}
|
|
122
|
-
return { blobs, blobsBytes };
|
|
123
|
-
}
|
|
124
116
|
//# sourceMappingURL=seenGossipBlockInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seenGossipBlockInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenGossipBlockInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAiB,GAAG,EAAW,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,sBAAsB,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAEL,aAAa,EACb,WAAW,EAGX,iBAAiB,
|
|
1
|
+
{"version":3,"file":"seenGossipBlockInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenGossipBlockInput.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { RootHex } from "@lodestar/types";
|
|
|
2
2
|
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
3
3
|
import { routes } from "@lodestar/api";
|
|
4
4
|
import { Metrics } from "../../metrics/index.js";
|
|
5
|
+
import { StateCloneOpts } from "../regen/interface.js";
|
|
5
6
|
import { BlockStateCache } from "./types.js";
|
|
6
7
|
export type FIFOBlockStateCacheOpts = {
|
|
7
8
|
maxBlockStates?: number;
|
|
@@ -50,7 +51,7 @@ export declare class FIFOBlockStateCache implements BlockStateCache {
|
|
|
50
51
|
/**
|
|
51
52
|
* Get a state from this cache given a state root hex.
|
|
52
53
|
*/
|
|
53
|
-
get(rootHex: RootHex): CachedBeaconStateAllForks | null;
|
|
54
|
+
get(rootHex: RootHex, opts?: StateCloneOpts): CachedBeaconStateAllForks | null;
|
|
54
55
|
/**
|
|
55
56
|
* Add a state to this cache.
|
|
56
57
|
* @param isHead if true, move it to the head of the list. Otherwise add to the 2nd position.
|
|
@@ -45,7 +45,7 @@ export class FIFOBlockStateCache {
|
|
|
45
45
|
/**
|
|
46
46
|
* Get a state from this cache given a state root hex.
|
|
47
47
|
*/
|
|
48
|
-
get(rootHex) {
|
|
48
|
+
get(rootHex, opts) {
|
|
49
49
|
this.metrics?.lookups.inc();
|
|
50
50
|
const item = this.cache.get(rootHex);
|
|
51
51
|
if (!item) {
|
|
@@ -53,7 +53,7 @@ export class FIFOBlockStateCache {
|
|
|
53
53
|
}
|
|
54
54
|
this.metrics?.hits.inc();
|
|
55
55
|
this.metrics?.stateClonedCount.observe(item.clonedCount);
|
|
56
|
-
return item;
|
|
56
|
+
return item.clone(opts?.dontTransferCache);
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Add a state to this cache.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAK3C,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { Metrics } from "../../metrics/index.js";
|
|
|
6
6
|
import { IClock } from "../../util/clock.js";
|
|
7
7
|
import { ShufflingCache } from "../shufflingCache.js";
|
|
8
8
|
import { BufferPool } from "../../util/bufferPool.js";
|
|
9
|
+
import { StateCloneOpts } from "../regen/interface.js";
|
|
9
10
|
import { CPStateDatastore, DatastoreKey } from "./datastore/index.js";
|
|
10
11
|
import { CheckpointHex, CheckpointStateCache } from "./types.js";
|
|
11
12
|
export type PersistentCheckpointStateCacheOpts = {
|
|
@@ -92,7 +93,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
92
93
|
* - Get block for processing
|
|
93
94
|
* - Regen head state
|
|
94
95
|
*/
|
|
95
|
-
getOrReload(cp: CheckpointHex): Promise<CachedBeaconStateAllForks | null>;
|
|
96
|
+
getOrReload(cp: CheckpointHex, opts?: StateCloneOpts): Promise<CachedBeaconStateAllForks | null>;
|
|
96
97
|
/**
|
|
97
98
|
* Return either state or state bytes loaded from db.
|
|
98
99
|
*/
|
|
@@ -100,11 +101,11 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
100
101
|
/**
|
|
101
102
|
* Return either state or state bytes with persisted key loaded from db.
|
|
102
103
|
*/
|
|
103
|
-
getStateOrLoadDb(cp: CheckpointHex): Promise<CachedBeaconStateAllForks | LoadedStateBytesData | null>;
|
|
104
|
+
getStateOrLoadDb(cp: CheckpointHex, opts?: StateCloneOpts): Promise<CachedBeaconStateAllForks | LoadedStateBytesData | null>;
|
|
104
105
|
/**
|
|
105
106
|
* Similar to get() api without reloading from disk
|
|
106
107
|
*/
|
|
107
|
-
get(cpOrKey: CheckpointHex | string): CachedBeaconStateAllForks | null;
|
|
108
|
+
get(cpOrKey: CheckpointHex | string, opts?: StateCloneOpts): CachedBeaconStateAllForks | null;
|
|
108
109
|
/**
|
|
109
110
|
* Add a state of a checkpoint to this cache, prune from memory if necessary.
|
|
110
111
|
*/
|
|
@@ -112,7 +113,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
112
113
|
/**
|
|
113
114
|
* Searches in-memory state for the latest cached state with a `root` without reload, starting with `epoch` and descending
|
|
114
115
|
*/
|
|
115
|
-
getLatest(rootHex: RootHex, maxEpoch: Epoch): CachedBeaconStateAllForks | null;
|
|
116
|
+
getLatest(rootHex: RootHex, maxEpoch: Epoch, opts?: StateCloneOpts): CachedBeaconStateAllForks | null;
|
|
116
117
|
/**
|
|
117
118
|
* Searches state for the latest cached state with a `root`, reload if needed, starting with `epoch` and descending
|
|
118
119
|
* This is expensive api, should only be called in some important flows:
|
|
@@ -120,7 +121,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
120
121
|
* - Get block for processing
|
|
121
122
|
* - Regen head state
|
|
122
123
|
*/
|
|
123
|
-
getOrReloadLatest(rootHex: RootHex, maxEpoch: Epoch): Promise<CachedBeaconStateAllForks | null>;
|
|
124
|
+
getOrReloadLatest(rootHex: RootHex, maxEpoch: Epoch, opts?: StateCloneOpts): Promise<CachedBeaconStateAllForks | null>;
|
|
124
125
|
/**
|
|
125
126
|
* Update the precomputed checkpoint and return the number of his for the
|
|
126
127
|
* previous one (if any).
|
|
@@ -156,10 +156,10 @@ export class PersistentCheckpointStateCache {
|
|
|
156
156
|
* - Get block for processing
|
|
157
157
|
* - Regen head state
|
|
158
158
|
*/
|
|
159
|
-
async getOrReload(cp) {
|
|
160
|
-
const stateOrStateBytesData = await this.getStateOrLoadDb(cp);
|
|
159
|
+
async getOrReload(cp, opts) {
|
|
160
|
+
const stateOrStateBytesData = await this.getStateOrLoadDb(cp, opts);
|
|
161
161
|
if (stateOrStateBytesData === null || isCachedBeaconState(stateOrStateBytesData)) {
|
|
162
|
-
return stateOrStateBytesData;
|
|
162
|
+
return stateOrStateBytesData?.clone(opts?.dontTransferCache) ?? null;
|
|
163
163
|
}
|
|
164
164
|
const { persistedKey, stateBytes } = stateOrStateBytesData;
|
|
165
165
|
const logMeta = { persistedKey: toHexString(persistedKey) };
|
|
@@ -209,7 +209,7 @@ export class PersistentCheckpointStateCache {
|
|
|
209
209
|
this.cache.set(cpKey, { type: CacheItemType.inMemory, state: newCachedState, persistedKey });
|
|
210
210
|
this.epochIndex.getOrDefault(cp.epoch).add(cp.rootHex);
|
|
211
211
|
// don't prune from memory here, call it at the last 1/3 of slot 0 of an epoch
|
|
212
|
-
return newCachedState;
|
|
212
|
+
return newCachedState.clone(opts?.dontTransferCache);
|
|
213
213
|
}
|
|
214
214
|
catch (e_1) {
|
|
215
215
|
env_1.error = e_1;
|
|
@@ -228,7 +228,8 @@ export class PersistentCheckpointStateCache {
|
|
|
228
228
|
* Return either state or state bytes loaded from db.
|
|
229
229
|
*/
|
|
230
230
|
async getStateOrBytes(cp) {
|
|
231
|
-
|
|
231
|
+
// don't have to transfer cache for this specific api
|
|
232
|
+
const stateOrLoadedState = await this.getStateOrLoadDb(cp, { dontTransferCache: true });
|
|
232
233
|
if (stateOrLoadedState === null || isCachedBeaconState(stateOrLoadedState)) {
|
|
233
234
|
return stateOrLoadedState;
|
|
234
235
|
}
|
|
@@ -237,9 +238,9 @@ export class PersistentCheckpointStateCache {
|
|
|
237
238
|
/**
|
|
238
239
|
* Return either state or state bytes with persisted key loaded from db.
|
|
239
240
|
*/
|
|
240
|
-
async getStateOrLoadDb(cp) {
|
|
241
|
+
async getStateOrLoadDb(cp, opts) {
|
|
241
242
|
const cpKey = toCacheKey(cp);
|
|
242
|
-
const inMemoryState = this.get(cpKey);
|
|
243
|
+
const inMemoryState = this.get(cpKey, opts);
|
|
243
244
|
if (inMemoryState) {
|
|
244
245
|
return inMemoryState;
|
|
245
246
|
}
|
|
@@ -263,7 +264,7 @@ export class PersistentCheckpointStateCache {
|
|
|
263
264
|
/**
|
|
264
265
|
* Similar to get() api without reloading from disk
|
|
265
266
|
*/
|
|
266
|
-
get(cpOrKey) {
|
|
267
|
+
get(cpOrKey, opts) {
|
|
267
268
|
this.metrics?.lookups.inc();
|
|
268
269
|
const cpKey = typeof cpOrKey === "string" ? cpOrKey : toCacheKey(cpOrKey);
|
|
269
270
|
const cacheItem = this.cache.get(cpKey);
|
|
@@ -277,7 +278,7 @@ export class PersistentCheckpointStateCache {
|
|
|
277
278
|
if (isInMemoryCacheItem(cacheItem)) {
|
|
278
279
|
const { state } = cacheItem;
|
|
279
280
|
this.metrics?.stateClonedCount.observe(state.clonedCount);
|
|
280
|
-
return state;
|
|
281
|
+
return state.clone(opts?.dontTransferCache);
|
|
281
282
|
}
|
|
282
283
|
return null;
|
|
283
284
|
}
|
|
@@ -308,16 +309,16 @@ export class PersistentCheckpointStateCache {
|
|
|
308
309
|
/**
|
|
309
310
|
* Searches in-memory state for the latest cached state with a `root` without reload, starting with `epoch` and descending
|
|
310
311
|
*/
|
|
311
|
-
getLatest(rootHex, maxEpoch) {
|
|
312
|
+
getLatest(rootHex, maxEpoch, opts) {
|
|
312
313
|
// sort epochs in descending order, only consider epochs lte `epoch`
|
|
313
314
|
const epochs = Array.from(this.epochIndex.keys())
|
|
314
315
|
.sort((a, b) => b - a)
|
|
315
316
|
.filter((e) => e <= maxEpoch);
|
|
316
317
|
for (const epoch of epochs) {
|
|
317
318
|
if (this.epochIndex.get(epoch)?.has(rootHex)) {
|
|
318
|
-
const
|
|
319
|
-
if (
|
|
320
|
-
return
|
|
319
|
+
const inMemoryClonedState = this.get({ rootHex, epoch }, opts);
|
|
320
|
+
if (inMemoryClonedState) {
|
|
321
|
+
return inMemoryClonedState;
|
|
321
322
|
}
|
|
322
323
|
}
|
|
323
324
|
}
|
|
@@ -330,7 +331,7 @@ export class PersistentCheckpointStateCache {
|
|
|
330
331
|
* - Get block for processing
|
|
331
332
|
* - Regen head state
|
|
332
333
|
*/
|
|
333
|
-
async getOrReloadLatest(rootHex, maxEpoch) {
|
|
334
|
+
async getOrReloadLatest(rootHex, maxEpoch, opts) {
|
|
334
335
|
// sort epochs in descending order, only consider epochs lte `epoch`
|
|
335
336
|
const epochs = Array.from(this.epochIndex.keys())
|
|
336
337
|
.sort((a, b) => b - a)
|
|
@@ -338,9 +339,9 @@ export class PersistentCheckpointStateCache {
|
|
|
338
339
|
for (const epoch of epochs) {
|
|
339
340
|
if (this.epochIndex.get(epoch)?.has(rootHex)) {
|
|
340
341
|
try {
|
|
341
|
-
const
|
|
342
|
-
if (
|
|
343
|
-
return
|
|
342
|
+
const clonedState = await this.getOrReload({ rootHex, epoch }, opts);
|
|
343
|
+
if (clonedState) {
|
|
344
|
+
return clonedState;
|
|
344
345
|
}
|
|
345
346
|
}
|
|
346
347
|
catch (e) {
|