@lodestar/beacon-node 1.40.0-dev.cfd894719f → 1.40.0-dev.d2e683b6d2
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/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +7 -7
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.d.ts.map +1 -1
- package/lib/api/impl/lodestar/index.js +10 -0
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.js +7 -3
- package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +28 -0
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +36 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +1 -1
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +8 -0
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +1 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +17 -28
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/options.d.ts +0 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +1 -1
- package/lib/chain/regen/queued.d.ts +1 -1
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +2 -0
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +4 -1
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
- package/lib/chain/stateCache/index.d.ts +0 -2
- package/lib/chain/stateCache/index.d.ts.map +1 -1
- package/lib/chain/stateCache/index.js +0 -2
- package/lib/chain/stateCache/index.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +2 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +3 -0
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +1 -2
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +4 -3
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +7 -4
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js +9 -0
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +1 -1
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/package.json +15 -15
- package/src/api/impl/beacon/blocks/index.ts +9 -7
- package/src/api/impl/lodestar/index.ts +12 -0
- package/src/api/impl/validator/index.ts +2 -1
- package/src/chain/ColumnReconstructionTracker.ts +8 -4
- package/src/chain/blocks/blockInput/blockInput.ts +45 -2
- package/src/chain/blocks/importBlock.ts +1 -1
- package/src/chain/blocks/writeBlockInputToDb.ts +9 -0
- package/src/chain/chain.ts +21 -31
- package/src/chain/options.ts +0 -2
- package/src/chain/regen/interface.ts +1 -1
- package/src/chain/regen/queued.ts +1 -2
- package/src/chain/regen/regen.ts +6 -1
- package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
- package/src/chain/stateCache/index.ts +0 -2
- package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
- package/src/chain/validation/block.ts +1 -2
- package/src/chain/validation/executionPayloadBid.ts +5 -4
- package/src/chain/validation/payloadAttestationMessage.ts +1 -1
- package/src/chain/validatorMonitor.ts +10 -5
- package/src/network/peers/peerManager.ts +11 -0
- package/src/network/processor/gossipHandlers.ts +1 -1
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -54
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
- package/lib/chain/stateCache/blockStateCacheImpl.js +0 -130
- package/lib/chain/stateCache/blockStateCacheImpl.js.map +0 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +0 -60
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -156
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
- package/src/chain/stateCache/blockStateCacheImpl.ts +0 -149
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -192
|
@@ -31,7 +31,7 @@ type PersistentCheckpointStateCacheModules = {
|
|
|
31
31
|
signal?: AbortSignal;
|
|
32
32
|
datastore: CPStateDatastore;
|
|
33
33
|
blockStateCache: BlockStateCache;
|
|
34
|
-
bufferPool?: BufferPool
|
|
34
|
+
bufferPool?: BufferPool;
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
/** checkpoint serialized as a string */
|
|
@@ -119,7 +119,7 @@ export class PersistentCheckpointStateCache implements CheckpointStateCache {
|
|
|
119
119
|
private readonly maxEpochsOnDisk: number;
|
|
120
120
|
private readonly datastore: CPStateDatastore;
|
|
121
121
|
private readonly blockStateCache: BlockStateCache;
|
|
122
|
-
private readonly bufferPool?: BufferPool
|
|
122
|
+
private readonly bufferPool?: BufferPool;
|
|
123
123
|
|
|
124
124
|
constructor(
|
|
125
125
|
{
|
|
@@ -851,6 +851,10 @@ export function toCheckpointHex(checkpoint: phase0.Checkpoint): CheckpointHex {
|
|
|
851
851
|
};
|
|
852
852
|
}
|
|
853
853
|
|
|
854
|
+
export function toCheckpointKey(cp: CheckpointHex): string {
|
|
855
|
+
return `${cp.rootHex}:${cp.epoch}`;
|
|
856
|
+
}
|
|
857
|
+
|
|
854
858
|
function toCacheKey(cp: CheckpointHex | phase0.Checkpoint): CacheKey {
|
|
855
859
|
if (isCheckpointHex(cp)) {
|
|
856
860
|
return `${cp.rootHex}_${cp.epoch}`;
|
|
@@ -138,11 +138,10 @@ export async function validateGossipBlock(
|
|
|
138
138
|
// in forky condition, make sure to populate ShufflingCache with regened state
|
|
139
139
|
chain.shufflingCache.processState(blockState);
|
|
140
140
|
|
|
141
|
-
// Extra conditions for merge fork blocks
|
|
142
141
|
// [REJECT] The block's execution payload timestamp is correct with respect to the slot
|
|
143
142
|
// -- i.e. execution_payload.timestamp == compute_timestamp_at_slot(state, block.slot).
|
|
144
143
|
if (isForkPostBellatrix(fork) && !isForkPostGloas(fork)) {
|
|
145
|
-
if (!isExecutionBlockBodyType(block.body)) throw Error("Not
|
|
144
|
+
if (!isExecutionBlockBodyType(block.body)) throw Error("Not execution block body type");
|
|
146
145
|
const executionPayload = block.body.executionPayload;
|
|
147
146
|
if (isExecutionStateType(blockState) && isExecutionEnabled(blockState, block)) {
|
|
148
147
|
const expectedTimestamp = computeTimeAtSlot(config, blockSlot, chain.genesisTime);
|
|
@@ -53,7 +53,8 @@ async function validateExecutionPayloadBid(
|
|
|
53
53
|
|
|
54
54
|
// [REJECT] `bid.builder_index` is a valid/active builder index -- i.e.
|
|
55
55
|
// `is_active_builder(state, bid.builder_index)` returns `True`.
|
|
56
|
-
|
|
56
|
+
const builder = state.builders.getReadonly(bid.builderIndex);
|
|
57
|
+
if (!isActiveBuilder(builder, state.finalizedCheckpoint.epoch)) {
|
|
57
58
|
throw new ExecutionPayloadBidError(GossipAction.REJECT, {
|
|
58
59
|
code: ExecutionPayloadBidErrorCode.BUILDER_NOT_ELIGIBLE,
|
|
59
60
|
builderIndex: bid.builderIndex,
|
|
@@ -102,7 +103,7 @@ async function validateExecutionPayloadBid(
|
|
|
102
103
|
throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
|
|
103
104
|
code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH,
|
|
104
105
|
bidValue: bid.value,
|
|
105
|
-
builderBalance:
|
|
106
|
+
builderBalance: builder.balance,
|
|
106
107
|
});
|
|
107
108
|
}
|
|
108
109
|
|
|
@@ -122,8 +123,8 @@ async function validateExecutionPayloadBid(
|
|
|
122
123
|
|
|
123
124
|
// [REJECT] `signed_execution_payload_bid.signature` is valid with respect to the `bid.builder_index`.
|
|
124
125
|
const signatureSet = createSingleSignatureSetFromComponents(
|
|
125
|
-
PublicKey.fromBytes(
|
|
126
|
-
getExecutionPayloadBidSigningRoot(chain.config, state
|
|
126
|
+
PublicKey.fromBytes(builder.pubkey),
|
|
127
|
+
getExecutionPayloadBidSigningRoot(chain.config, state.slot, bid),
|
|
127
128
|
signedExecutionPayloadBid.signature
|
|
128
129
|
);
|
|
129
130
|
|
|
@@ -89,7 +89,7 @@ async function validatePayloadAttestationMessage(
|
|
|
89
89
|
// [REJECT] `payload_attestation_message.signature` is valid with respect to the validator's public key.
|
|
90
90
|
const signatureSet = createSingleSignatureSetFromComponents(
|
|
91
91
|
chain.index2pubkey[validatorIndex],
|
|
92
|
-
getPayloadAttestationDataSigningRoot(state, data),
|
|
92
|
+
getPayloadAttestationDataSigningRoot(chain.config, state.slot, data),
|
|
93
93
|
payloadAttestationMessage.signature
|
|
94
94
|
);
|
|
95
95
|
|
|
@@ -347,6 +347,9 @@ export function createValidatorMonitor(
|
|
|
347
347
|
return;
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
+
// Track total balance instead of per-validator balance to reduce metric cardinality
|
|
351
|
+
let totalBalance = 0;
|
|
352
|
+
|
|
350
353
|
for (const [index, monitoredValidator] of validators.entries()) {
|
|
351
354
|
// We subtract two from the state of the epoch that generated these summaries.
|
|
352
355
|
//
|
|
@@ -405,7 +408,7 @@ export function createValidatorMonitor(
|
|
|
405
408
|
|
|
406
409
|
const balance = balances?.[index];
|
|
407
410
|
if (balance !== undefined) {
|
|
408
|
-
|
|
411
|
+
totalBalance += balance;
|
|
409
412
|
}
|
|
410
413
|
|
|
411
414
|
if (!summary.isPrevSourceAttester || !summary.isPrevTargetAttester || !summary.isPrevHeadAttester) {
|
|
@@ -420,6 +423,10 @@ export function createValidatorMonitor(
|
|
|
420
423
|
});
|
|
421
424
|
}
|
|
422
425
|
}
|
|
426
|
+
|
|
427
|
+
if (balances !== undefined) {
|
|
428
|
+
validatorMonitorMetrics?.prevEpochOnChainBalance.set(totalBalance);
|
|
429
|
+
}
|
|
423
430
|
},
|
|
424
431
|
|
|
425
432
|
registerBeaconBlock(src, delaySec, block) {
|
|
@@ -1153,11 +1160,9 @@ function createValidatorMonitorMetrics(register: RegistryMetricCreator) {
|
|
|
1153
1160
|
}),
|
|
1154
1161
|
|
|
1155
1162
|
// Validator Monitor Metrics (per-epoch summaries)
|
|
1156
|
-
|
|
1157
|
-
prevEpochOnChainBalance: register.gauge<{index: number}>({
|
|
1163
|
+
prevEpochOnChainBalance: register.gauge({
|
|
1158
1164
|
name: "validator_monitor_prev_epoch_on_chain_balance",
|
|
1159
|
-
help: "
|
|
1160
|
-
labelNames: ["index"],
|
|
1165
|
+
help: "Total balance of all monitored validators after an epoch",
|
|
1161
1166
|
}),
|
|
1162
1167
|
prevEpochOnChainAttesterHit: register.gauge({
|
|
1163
1168
|
name: "validator_monitor_prev_epoch_on_chain_attester_hit_total",
|
|
@@ -721,6 +721,17 @@ export class PeerManager {
|
|
|
721
721
|
// NOTE: libp2p may emit two "peer:connect" events: One for inbound, one for outbound
|
|
722
722
|
// If that happens, it's okay. Only the "outbound" connection triggers immediate action
|
|
723
723
|
const now = Date.now();
|
|
724
|
+
|
|
725
|
+
// Ethereum uses secp256k1 for node IDs, reject peers with other key types
|
|
726
|
+
if (remotePeer.type !== "secp256k1") {
|
|
727
|
+
this.logger.debug("Peer does not have secp256k1 key, disconnecting", {
|
|
728
|
+
peer: remotePeerPrettyStr,
|
|
729
|
+
type: remotePeer.type,
|
|
730
|
+
});
|
|
731
|
+
void this.goodbyeAndDisconnect(remotePeer, GoodByeReasonCode.IRRELEVANT_NETWORK);
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
|
|
724
735
|
const nodeId = computeNodeId(remotePeer);
|
|
725
736
|
const peerData: PeerData = {
|
|
726
737
|
lastReceivedMsgUnixTsMs: direction === "outbound" ? 0 : now,
|
|
@@ -579,7 +579,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
579
579
|
break;
|
|
580
580
|
}
|
|
581
581
|
|
|
582
|
-
if (!blockInput.
|
|
582
|
+
if (!blockInput.hasComputedAllData()) {
|
|
583
583
|
// immediately attempt fetch of data columns from execution engine
|
|
584
584
|
chain.getBlobsTracker.triggerGetBlobs(blockInput);
|
|
585
585
|
// if we've received at least half of the columns, trigger reconstruction of the rest
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { routes } from "@lodestar/api";
|
|
2
|
-
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
3
|
-
import { Epoch, RootHex } from "@lodestar/types";
|
|
4
|
-
import { Metrics } from "../../metrics/index.js";
|
|
5
|
-
import { BlockStateCache } from "./types.js";
|
|
6
|
-
/**
|
|
7
|
-
* Old implementation of StateCache (used to call `StateContextCache`)
|
|
8
|
-
* - Prune per checkpoint so number of states ranges from 96 to 128
|
|
9
|
-
* - Keep a separate head state to make sure it is always available
|
|
10
|
-
*/
|
|
11
|
-
export declare class BlockStateCacheImpl implements BlockStateCache {
|
|
12
|
-
/**
|
|
13
|
-
* Max number of states allowed in the cache
|
|
14
|
-
*/
|
|
15
|
-
readonly maxStates: number;
|
|
16
|
-
private readonly cache;
|
|
17
|
-
/** Epoch -> Set<blockRoot> */
|
|
18
|
-
private readonly epochIndex;
|
|
19
|
-
private readonly metrics;
|
|
20
|
-
/**
|
|
21
|
-
* Strong reference to prevent head state from being pruned.
|
|
22
|
-
* null if head state is being regen and not available at the moment.
|
|
23
|
-
*/
|
|
24
|
-
private head;
|
|
25
|
-
constructor({ maxStates, metrics }: {
|
|
26
|
-
maxStates?: number;
|
|
27
|
-
metrics?: Metrics | null;
|
|
28
|
-
});
|
|
29
|
-
get(rootHex: RootHex): CachedBeaconStateAllForks | null;
|
|
30
|
-
add(item: CachedBeaconStateAllForks): void;
|
|
31
|
-
setHeadState(item: CachedBeaconStateAllForks | null): void;
|
|
32
|
-
/**
|
|
33
|
-
* Get a seed state for state reload.
|
|
34
|
-
* This is to conform to the api only as this cache is not used in n-historical state.
|
|
35
|
-
* See ./fifoBlockStateCache.ts for implementation
|
|
36
|
-
*/
|
|
37
|
-
getSeedState(): CachedBeaconStateAllForks;
|
|
38
|
-
clear(): void;
|
|
39
|
-
get size(): number;
|
|
40
|
-
/**
|
|
41
|
-
* TODO make this more robust.
|
|
42
|
-
* Without more thought, this currently breaks our assumptions about recent state availablity
|
|
43
|
-
*/
|
|
44
|
-
prune(headStateRootHex: RootHex): void;
|
|
45
|
-
/**
|
|
46
|
-
* Prune per finalized epoch.
|
|
47
|
-
*/
|
|
48
|
-
deleteAllBeforeEpoch(finalizedEpoch: Epoch): void;
|
|
49
|
-
/** ONLY FOR DEBUGGING PURPOSES. For lodestar debug API */
|
|
50
|
-
dumpSummary(): routes.lodestar.StateCacheItem[];
|
|
51
|
-
getStates(): IterableIterator<CachedBeaconStateAllForks>;
|
|
52
|
-
private deleteAllEpochItems;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=blockStateCacheImpl.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blockStateCacheImpl.d.ts","sourceRoot":"","sources":["../../../src/chain/stateCache/blockStateCacheImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,yBAAyB,EAAC,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAC,KAAK,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAI3C;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgD;IACtE,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE;;;OAGG;IACH,OAAO,CAAC,IAAI,CAAuE;gBAEvE,EAAC,SAAsB,EAAE,OAAO,EAAC,EAAE;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAC;IAS7F,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,yBAAyB,GAAG,IAAI;IAavD,GAAG,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI;IAgB1C,YAAY,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,GAAG,IAAI;IAS1D;;;;OAIG;IACH,YAAY,IAAI,yBAAyB;IAIzC,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,EAAE,OAAO,GAAG,IAAI;IAgBtC;;OAEG;IACH,oBAAoB,CAAC,cAAc,EAAE,KAAK,GAAG,IAAI;IAQjD,0DAA0D;IAC1D,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;IAU/C,SAAS,IAAI,gBAAgB,CAAC,yBAAyB,CAAC;IAIxD,OAAO,CAAC,mBAAmB;CAM5B"}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { toRootHex } from "@lodestar/utils";
|
|
2
|
-
import { MapTracker } from "./mapMetrics.js";
|
|
3
|
-
const MAX_STATES = 3 * 32;
|
|
4
|
-
/**
|
|
5
|
-
* Old implementation of StateCache (used to call `StateContextCache`)
|
|
6
|
-
* - Prune per checkpoint so number of states ranges from 96 to 128
|
|
7
|
-
* - Keep a separate head state to make sure it is always available
|
|
8
|
-
*/
|
|
9
|
-
export class BlockStateCacheImpl {
|
|
10
|
-
/**
|
|
11
|
-
* Max number of states allowed in the cache
|
|
12
|
-
*/
|
|
13
|
-
maxStates;
|
|
14
|
-
cache;
|
|
15
|
-
/** Epoch -> Set<blockRoot> */
|
|
16
|
-
epochIndex = new Map();
|
|
17
|
-
metrics;
|
|
18
|
-
/**
|
|
19
|
-
* Strong reference to prevent head state from being pruned.
|
|
20
|
-
* null if head state is being regen and not available at the moment.
|
|
21
|
-
*/
|
|
22
|
-
head = null;
|
|
23
|
-
constructor({ maxStates = MAX_STATES, metrics }) {
|
|
24
|
-
this.maxStates = maxStates;
|
|
25
|
-
this.cache = new MapTracker(metrics?.stateCache);
|
|
26
|
-
if (metrics) {
|
|
27
|
-
this.metrics = metrics.stateCache;
|
|
28
|
-
metrics.stateCache.size.addCollect(() => metrics.stateCache.size.set(this.cache.size));
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
get(rootHex) {
|
|
32
|
-
this.metrics?.lookups.inc();
|
|
33
|
-
const item = this.head?.stateRoot === rootHex ? this.head.state : this.cache.get(rootHex);
|
|
34
|
-
if (!item) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
this.metrics?.hits.inc();
|
|
38
|
-
this.metrics?.stateClonedCount.observe(item.clonedCount);
|
|
39
|
-
return item;
|
|
40
|
-
}
|
|
41
|
-
add(item) {
|
|
42
|
-
const key = toRootHex(item.hashTreeRoot());
|
|
43
|
-
if (this.cache.get(key)) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
this.metrics?.adds.inc();
|
|
47
|
-
this.cache.set(key, item);
|
|
48
|
-
const epoch = item.epochCtx.epoch;
|
|
49
|
-
const blockRoots = this.epochIndex.get(epoch);
|
|
50
|
-
if (blockRoots) {
|
|
51
|
-
blockRoots.add(key);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
this.epochIndex.set(epoch, new Set([key]));
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
setHeadState(item) {
|
|
58
|
-
if (item) {
|
|
59
|
-
const key = toRootHex(item.hashTreeRoot());
|
|
60
|
-
this.head = { state: item, stateRoot: key };
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
this.head = null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Get a seed state for state reload.
|
|
68
|
-
* This is to conform to the api only as this cache is not used in n-historical state.
|
|
69
|
-
* See ./fifoBlockStateCache.ts for implementation
|
|
70
|
-
*/
|
|
71
|
-
getSeedState() {
|
|
72
|
-
throw Error("Not implemented for BlockStateCacheImpl");
|
|
73
|
-
}
|
|
74
|
-
clear() {
|
|
75
|
-
this.cache.clear();
|
|
76
|
-
this.epochIndex.clear();
|
|
77
|
-
}
|
|
78
|
-
get size() {
|
|
79
|
-
return this.cache.size;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* TODO make this more robust.
|
|
83
|
-
* Without more thought, this currently breaks our assumptions about recent state availablity
|
|
84
|
-
*/
|
|
85
|
-
prune(headStateRootHex) {
|
|
86
|
-
const keys = Array.from(this.cache.keys());
|
|
87
|
-
if (keys.length > this.maxStates) {
|
|
88
|
-
// object keys are stored in insertion order, delete keys starting from the front
|
|
89
|
-
for (const key of keys.slice(0, keys.length - this.maxStates)) {
|
|
90
|
-
if (key !== headStateRootHex) {
|
|
91
|
-
const item = this.cache.get(key);
|
|
92
|
-
if (item) {
|
|
93
|
-
this.epochIndex.get(item.epochCtx.epoch)?.delete(key);
|
|
94
|
-
this.cache.delete(key);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Prune per finalized epoch.
|
|
102
|
-
*/
|
|
103
|
-
deleteAllBeforeEpoch(finalizedEpoch) {
|
|
104
|
-
for (const epoch of this.epochIndex.keys()) {
|
|
105
|
-
if (epoch < finalizedEpoch) {
|
|
106
|
-
this.deleteAllEpochItems(epoch);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/** ONLY FOR DEBUGGING PURPOSES. For lodestar debug API */
|
|
111
|
-
dumpSummary() {
|
|
112
|
-
return Array.from(this.cache.entries()).map(([key, state]) => ({
|
|
113
|
-
slot: state.slot,
|
|
114
|
-
root: toRootHex(state.hashTreeRoot()),
|
|
115
|
-
reads: this.cache.readCount.get(key) ?? 0,
|
|
116
|
-
lastRead: this.cache.lastRead.get(key) ?? 0,
|
|
117
|
-
checkpointState: false,
|
|
118
|
-
}));
|
|
119
|
-
}
|
|
120
|
-
getStates() {
|
|
121
|
-
return this.cache.values();
|
|
122
|
-
}
|
|
123
|
-
deleteAllEpochItems(epoch) {
|
|
124
|
-
for (const rootHex of this.epochIndex.get(epoch) || []) {
|
|
125
|
-
this.cache.delete(rootHex);
|
|
126
|
-
}
|
|
127
|
-
this.epochIndex.delete(epoch);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=blockStateCacheImpl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blockStateCacheImpl.js","sourceRoot":"","sources":["../../../src/chain/stateCache/blockStateCacheImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { routes } from "@lodestar/api";
|
|
2
|
-
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
3
|
-
import { Epoch, RootHex, phase0 } from "@lodestar/types";
|
|
4
|
-
import { Metrics } from "../../metrics/index.js";
|
|
5
|
-
import { CheckpointStateCache } from "./types.js";
|
|
6
|
-
export type CheckpointHex = {
|
|
7
|
-
epoch: Epoch;
|
|
8
|
-
rootHex: RootHex;
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* In memory cache of CachedBeaconState
|
|
12
|
-
* belonging to checkpoint
|
|
13
|
-
*
|
|
14
|
-
* Similar API to Repository
|
|
15
|
-
*/
|
|
16
|
-
export declare class InMemoryCheckpointStateCache implements CheckpointStateCache {
|
|
17
|
-
private readonly cache;
|
|
18
|
-
/** Epoch -> Set<blockRoot> */
|
|
19
|
-
private readonly epochIndex;
|
|
20
|
-
/**
|
|
21
|
-
* Max number of epochs allowed in the cache
|
|
22
|
-
*/
|
|
23
|
-
private readonly maxEpochs;
|
|
24
|
-
private readonly metrics;
|
|
25
|
-
private preComputedCheckpoint;
|
|
26
|
-
private preComputedCheckpointHits;
|
|
27
|
-
constructor({ metrics }: {
|
|
28
|
-
metrics?: Metrics | null;
|
|
29
|
-
}, { maxEpochs }?: {
|
|
30
|
-
maxEpochs?: number;
|
|
31
|
-
});
|
|
32
|
-
getOrReload(cp: CheckpointHex): Promise<CachedBeaconStateAllForks | null>;
|
|
33
|
-
getStateOrBytes(cp: CheckpointHex): Promise<Uint8Array | CachedBeaconStateAllForks | null>;
|
|
34
|
-
getOrReloadLatest(rootHex: string, maxEpoch: number): Promise<CachedBeaconStateAllForks | null>;
|
|
35
|
-
processState(): Promise<number>;
|
|
36
|
-
get(cp: CheckpointHex): CachedBeaconStateAllForks | null;
|
|
37
|
-
add(cp: phase0.Checkpoint, item: CachedBeaconStateAllForks): void;
|
|
38
|
-
/**
|
|
39
|
-
* Searches for the latest cached state with a `root`, starting with `epoch` and descending
|
|
40
|
-
*/
|
|
41
|
-
getLatest(rootHex: RootHex, maxEpoch: Epoch): CachedBeaconStateAllForks | null;
|
|
42
|
-
/**
|
|
43
|
-
* Update the precomputed checkpoint and return the number of his for the
|
|
44
|
-
* previous one (if any).
|
|
45
|
-
*/
|
|
46
|
-
updatePreComputedCheckpoint(rootHex: RootHex, epoch: Epoch): number | null;
|
|
47
|
-
pruneFinalized(finalizedEpoch: Epoch): void;
|
|
48
|
-
prune(finalizedEpoch: Epoch, justifiedEpoch: Epoch): void;
|
|
49
|
-
delete(cp: phase0.Checkpoint): void;
|
|
50
|
-
deleteAllEpochItems(epoch: Epoch): void;
|
|
51
|
-
clear(): void;
|
|
52
|
-
/** ONLY FOR DEBUGGING PURPOSES. For lodestar debug API */
|
|
53
|
-
dumpSummary(): routes.lodestar.StateCacheItem[];
|
|
54
|
-
getStates(): IterableIterator<CachedBeaconStateAllForks>;
|
|
55
|
-
/** ONLY FOR DEBUGGING PURPOSES. For spec tests on error */
|
|
56
|
-
dumpCheckpointKeys(): string[];
|
|
57
|
-
}
|
|
58
|
-
export declare function toCheckpointHex(checkpoint: phase0.Checkpoint): CheckpointHex;
|
|
59
|
-
export declare function toCheckpointKey(cp: CheckpointHex): string;
|
|
60
|
-
//# sourceMappingURL=inMemoryCheckpointsCache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inMemoryCheckpointsCache.d.ts","sourceRoot":"","sources":["../../../src/chain/stateCache/inMemoryCheckpointsCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,yBAAyB,EAAC,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAgB,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAE/D,MAAM,MAAM,aAAa,GAAG;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAC,CAAC;AAG7D;;;;;GAKG;AACH,qBAAa,4BAA6B,YAAW,oBAAoB;IACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgD;IACtE,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2D;IACtF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,yBAAyB,CAAuB;gBAE5C,EAAC,OAAc,EAAC,EAAE;QAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAC,EAAE,EAAC,SAAsB,EAAC,GAAE;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAM;IAcvG,WAAW,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAIzE,eAAe,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,GAAG,yBAAyB,GAAG,IAAI,CAAC;IAI1F,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAI/F,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAKrC,GAAG,CAAC,EAAE,EAAE,aAAa,GAAG,yBAAyB,GAAG,IAAI;IAoBxD,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,yBAAyB,GAAG,IAAI;IAWjE;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,yBAAyB,GAAG,IAAI;IAa9E;;;OAGG;IACH,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI;IAO1E,cAAc,CAAC,cAAc,EAAE,KAAK,GAAG,IAAI;IAQ3C,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,GAAG,IAAI;IAWzD,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI;IAYnC,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOvC,KAAK,IAAI,IAAI;IAKb,0DAA0D;IAC1D,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;IAU/C,SAAS,IAAI,gBAAgB,CAAC,yBAAyB,CAAC;IAIxD,2DAA2D;IAC3D,kBAAkB,IAAI,MAAM,EAAE;CAG/B;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,aAAa,CAK5E;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAEzD"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { MapDef, toRootHex } from "@lodestar/utils";
|
|
2
|
-
import { MapTracker } from "./mapMetrics.js";
|
|
3
|
-
import { CacheItemType } from "./types.js";
|
|
4
|
-
const MAX_EPOCHS = 10;
|
|
5
|
-
/**
|
|
6
|
-
* In memory cache of CachedBeaconState
|
|
7
|
-
* belonging to checkpoint
|
|
8
|
-
*
|
|
9
|
-
* Similar API to Repository
|
|
10
|
-
*/
|
|
11
|
-
export class InMemoryCheckpointStateCache {
|
|
12
|
-
cache;
|
|
13
|
-
/** Epoch -> Set<blockRoot> */
|
|
14
|
-
epochIndex = new MapDef(() => new Set());
|
|
15
|
-
/**
|
|
16
|
-
* Max number of epochs allowed in the cache
|
|
17
|
-
*/
|
|
18
|
-
maxEpochs;
|
|
19
|
-
metrics;
|
|
20
|
-
preComputedCheckpoint = null;
|
|
21
|
-
preComputedCheckpointHits = null;
|
|
22
|
-
constructor({ metrics = null }, { maxEpochs = MAX_EPOCHS } = {}) {
|
|
23
|
-
this.cache = new MapTracker(metrics?.cpStateCache);
|
|
24
|
-
if (metrics) {
|
|
25
|
-
this.metrics = metrics.cpStateCache;
|
|
26
|
-
metrics.cpStateCache.size.addCollect(() => metrics.cpStateCache.size.set({ type: CacheItemType.inMemory }, this.cache.size));
|
|
27
|
-
metrics.cpStateCache.epochSize.addCollect(() => metrics.cpStateCache.epochSize.set({ type: CacheItemType.inMemory }, this.epochIndex.size));
|
|
28
|
-
}
|
|
29
|
-
this.maxEpochs = maxEpochs;
|
|
30
|
-
}
|
|
31
|
-
async getOrReload(cp) {
|
|
32
|
-
return this.get(cp);
|
|
33
|
-
}
|
|
34
|
-
async getStateOrBytes(cp) {
|
|
35
|
-
return this.get(cp);
|
|
36
|
-
}
|
|
37
|
-
async getOrReloadLatest(rootHex, maxEpoch) {
|
|
38
|
-
return this.getLatest(rootHex, maxEpoch);
|
|
39
|
-
}
|
|
40
|
-
async processState() {
|
|
41
|
-
// do nothing, this class does not support prunning
|
|
42
|
-
return 0;
|
|
43
|
-
}
|
|
44
|
-
get(cp) {
|
|
45
|
-
this.metrics?.lookups.inc();
|
|
46
|
-
const cpKey = toCheckpointKey(cp);
|
|
47
|
-
const item = this.cache.get(cpKey);
|
|
48
|
-
if (!item) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
this.metrics?.hits.inc();
|
|
52
|
-
if (cpKey === this.preComputedCheckpoint) {
|
|
53
|
-
this.preComputedCheckpointHits = (this.preComputedCheckpointHits ?? 0) + 1;
|
|
54
|
-
}
|
|
55
|
-
this.metrics?.stateClonedCount.observe(item.clonedCount);
|
|
56
|
-
return item;
|
|
57
|
-
}
|
|
58
|
-
add(cp, item) {
|
|
59
|
-
const cpHex = toCheckpointHex(cp);
|
|
60
|
-
const key = toCheckpointKey(cpHex);
|
|
61
|
-
if (this.cache.has(key)) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
this.metrics?.adds.inc();
|
|
65
|
-
this.cache.set(key, item);
|
|
66
|
-
this.epochIndex.getOrDefault(cp.epoch).add(cpHex.rootHex);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Searches for the latest cached state with a `root`, starting with `epoch` and descending
|
|
70
|
-
*/
|
|
71
|
-
getLatest(rootHex, maxEpoch) {
|
|
72
|
-
// sort epochs in descending order, only consider epochs lte `epoch`
|
|
73
|
-
const epochs = Array.from(this.epochIndex.keys())
|
|
74
|
-
.sort((a, b) => b - a)
|
|
75
|
-
.filter((e) => e <= maxEpoch);
|
|
76
|
-
for (const epoch of epochs) {
|
|
77
|
-
if (this.epochIndex.get(epoch)?.has(rootHex)) {
|
|
78
|
-
return this.get({ rootHex, epoch });
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Update the precomputed checkpoint and return the number of his for the
|
|
85
|
-
* previous one (if any).
|
|
86
|
-
*/
|
|
87
|
-
updatePreComputedCheckpoint(rootHex, epoch) {
|
|
88
|
-
const previousHits = this.preComputedCheckpointHits;
|
|
89
|
-
this.preComputedCheckpoint = toCheckpointKey({ rootHex, epoch });
|
|
90
|
-
this.preComputedCheckpointHits = 0;
|
|
91
|
-
return previousHits;
|
|
92
|
-
}
|
|
93
|
-
pruneFinalized(finalizedEpoch) {
|
|
94
|
-
for (const epoch of this.epochIndex.keys()) {
|
|
95
|
-
if (epoch < finalizedEpoch) {
|
|
96
|
-
this.deleteAllEpochItems(epoch);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
prune(finalizedEpoch, justifiedEpoch) {
|
|
101
|
-
const epochs = Array.from(this.epochIndex.keys()).filter((epoch) => epoch !== finalizedEpoch && epoch !== justifiedEpoch);
|
|
102
|
-
if (epochs.length > this.maxEpochs) {
|
|
103
|
-
for (const epoch of epochs.slice(0, epochs.length - this.maxEpochs)) {
|
|
104
|
-
this.deleteAllEpochItems(epoch);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
delete(cp) {
|
|
109
|
-
this.cache.delete(toCheckpointKey(toCheckpointHex(cp)));
|
|
110
|
-
const epochKey = toRootHex(cp.root);
|
|
111
|
-
const value = this.epochIndex.get(cp.epoch);
|
|
112
|
-
if (value) {
|
|
113
|
-
value.delete(epochKey);
|
|
114
|
-
if (value.size === 0) {
|
|
115
|
-
this.epochIndex.delete(cp.epoch);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
deleteAllEpochItems(epoch) {
|
|
120
|
-
for (const rootHex of this.epochIndex.get(epoch) || []) {
|
|
121
|
-
this.cache.delete(toCheckpointKey({ rootHex, epoch }));
|
|
122
|
-
}
|
|
123
|
-
this.epochIndex.delete(epoch);
|
|
124
|
-
}
|
|
125
|
-
clear() {
|
|
126
|
-
this.cache.clear();
|
|
127
|
-
this.epochIndex.clear();
|
|
128
|
-
}
|
|
129
|
-
/** ONLY FOR DEBUGGING PURPOSES. For lodestar debug API */
|
|
130
|
-
dumpSummary() {
|
|
131
|
-
return Array.from(this.cache.entries()).map(([key, state]) => ({
|
|
132
|
-
slot: state.slot,
|
|
133
|
-
root: toRootHex(state.hashTreeRoot()),
|
|
134
|
-
reads: this.cache.readCount.get(key) ?? 0,
|
|
135
|
-
lastRead: this.cache.lastRead.get(key) ?? 0,
|
|
136
|
-
checkpointState: true,
|
|
137
|
-
}));
|
|
138
|
-
}
|
|
139
|
-
getStates() {
|
|
140
|
-
return this.cache.values();
|
|
141
|
-
}
|
|
142
|
-
/** ONLY FOR DEBUGGING PURPOSES. For spec tests on error */
|
|
143
|
-
dumpCheckpointKeys() {
|
|
144
|
-
return Array.from(this.cache.keys());
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
export function toCheckpointHex(checkpoint) {
|
|
148
|
-
return {
|
|
149
|
-
epoch: checkpoint.epoch,
|
|
150
|
-
rootHex: toRootHex(checkpoint.root),
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
export function toCheckpointKey(cp) {
|
|
154
|
-
return `${cp.rootHex}:${cp.epoch}`;
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=inMemoryCheckpointsCache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inMemoryCheckpointsCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/inMemoryCheckpointsCache.ts"],"names":[],"mappings":"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"}
|