@lodestar/beacon-node 1.40.0-dev.cc503f86cb → 1.40.0-dev.cd347a28d7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/lib/api/impl/validator/index.d.ts.map +1 -1
  2. package/lib/api/impl/validator/index.js.map +1 -1
  3. package/lib/chain/blocks/blockInput/blockInput.d.ts +28 -0
  4. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  5. package/lib/chain/blocks/blockInput/blockInput.js +36 -1
  6. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  7. package/lib/chain/blocks/importBlock.js +1 -1
  8. package/lib/chain/blocks/importBlock.js.map +1 -1
  9. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  10. package/lib/chain/blocks/writeBlockInputToDb.js +8 -0
  11. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  12. package/lib/chain/chain.d.ts +1 -1
  13. package/lib/chain/chain.d.ts.map +1 -1
  14. package/lib/chain/chain.js +12 -25
  15. package/lib/chain/chain.js.map +1 -1
  16. package/lib/chain/options.d.ts +0 -1
  17. package/lib/chain/options.d.ts.map +1 -1
  18. package/lib/chain/options.js +0 -1
  19. package/lib/chain/options.js.map +1 -1
  20. package/lib/chain/regen/interface.d.ts +1 -1
  21. package/lib/chain/regen/queued.d.ts +1 -1
  22. package/lib/chain/regen/queued.d.ts.map +1 -1
  23. package/lib/chain/regen/queued.js.map +1 -1
  24. package/lib/chain/stateCache/index.d.ts +0 -2
  25. package/lib/chain/stateCache/index.d.ts.map +1 -1
  26. package/lib/chain/stateCache/index.js +0 -2
  27. package/lib/chain/stateCache/index.js.map +1 -1
  28. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +2 -1
  29. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  30. package/lib/chain/stateCache/persistentCheckpointsCache.js +3 -0
  31. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  32. package/lib/chain/validation/block.d.ts.map +1 -1
  33. package/lib/chain/validation/block.js +1 -2
  34. package/lib/chain/validation/block.js.map +1 -1
  35. package/lib/network/gossip/gossipsub.d.ts +19 -0
  36. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  37. package/lib/network/gossip/gossipsub.js +71 -0
  38. package/lib/network/gossip/gossipsub.js.map +1 -1
  39. package/lib/network/options.d.ts +6 -0
  40. package/lib/network/options.d.ts.map +1 -1
  41. package/lib/network/options.js.map +1 -1
  42. package/lib/network/peers/peerManager.d.ts.map +1 -1
  43. package/lib/network/peers/peerManager.js +9 -0
  44. package/lib/network/peers/peerManager.js.map +1 -1
  45. package/lib/network/processor/gossipHandlers.js +1 -1
  46. package/lib/network/processor/gossipHandlers.js.map +1 -1
  47. package/package.json +15 -15
  48. package/src/api/impl/validator/index.ts +2 -1
  49. package/src/chain/blocks/blockInput/blockInput.ts +45 -2
  50. package/src/chain/blocks/importBlock.ts +1 -1
  51. package/src/chain/blocks/writeBlockInputToDb.ts +9 -0
  52. package/src/chain/chain.ts +17 -29
  53. package/src/chain/options.ts +0 -2
  54. package/src/chain/regen/interface.ts +1 -1
  55. package/src/chain/regen/queued.ts +1 -2
  56. package/src/chain/stateCache/index.ts +0 -2
  57. package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
  58. package/src/chain/validation/block.ts +1 -2
  59. package/src/network/gossip/gossipsub.ts +86 -1
  60. package/src/network/options.ts +6 -0
  61. package/src/network/peers/peerManager.ts +11 -0
  62. package/src/network/processor/gossipHandlers.ts +1 -1
  63. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -54
  64. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
  65. package/lib/chain/stateCache/blockStateCacheImpl.js +0 -130
  66. package/lib/chain/stateCache/blockStateCacheImpl.js.map +0 -1
  67. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +0 -60
  68. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
  69. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -156
  70. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
  71. package/src/chain/stateCache/blockStateCacheImpl.ts +0 -149
  72. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -192
@@ -15,6 +15,12 @@ export interface NetworkOptions
15
15
  Omit<Eth2GossipsubOpts, "disableLightClientServer"> {
16
16
  localMultiaddrs: string[];
17
17
  bootMultiaddrs?: string[];
18
+ /**
19
+ * Direct peers for GossipSub - these peers maintain permanent mesh connections without GRAFT/PRUNE.
20
+ * Format: multiaddr strings with peer ID, e.g., "/ip4/192.168.1.1/tcp/9000/p2p/16Uiu2HAmKLhW7..."
21
+ * Both peers must configure each other as direct peers for the feature to work properly.
22
+ */
23
+ directPeers?: string[];
18
24
  subscribeAllSubnets?: boolean;
19
25
  mdns?: boolean;
20
26
  connectToDiscv5Bootnodes?: boolean;
@@ -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.hasAllData()) {
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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"}
@@ -1,149 +0,0 @@
1
- import {routes} from "@lodestar/api";
2
- import {CachedBeaconStateAllForks} from "@lodestar/state-transition";
3
- import {Epoch, RootHex} from "@lodestar/types";
4
- import {toRootHex} from "@lodestar/utils";
5
- import {Metrics} from "../../metrics/index.js";
6
- import {MapTracker} from "./mapMetrics.js";
7
- import {BlockStateCache} from "./types.js";
8
-
9
- const MAX_STATES = 3 * 32;
10
-
11
- /**
12
- * Old implementation of StateCache (used to call `StateContextCache`)
13
- * - Prune per checkpoint so number of states ranges from 96 to 128
14
- * - Keep a separate head state to make sure it is always available
15
- */
16
- export class BlockStateCacheImpl implements BlockStateCache {
17
- /**
18
- * Max number of states allowed in the cache
19
- */
20
- readonly maxStates: number;
21
-
22
- private readonly cache: MapTracker<string, CachedBeaconStateAllForks>;
23
- /** Epoch -> Set<blockRoot> */
24
- private readonly epochIndex = new Map<Epoch, Set<string>>();
25
- private readonly metrics: Metrics["stateCache"] | null | undefined;
26
- /**
27
- * Strong reference to prevent head state from being pruned.
28
- * null if head state is being regen and not available at the moment.
29
- */
30
- private head: {state: CachedBeaconStateAllForks; stateRoot: RootHex} | null = null;
31
-
32
- constructor({maxStates = MAX_STATES, metrics}: {maxStates?: number; metrics?: Metrics | null}) {
33
- this.maxStates = maxStates;
34
- this.cache = new MapTracker(metrics?.stateCache);
35
- if (metrics) {
36
- this.metrics = metrics.stateCache;
37
- metrics.stateCache.size.addCollect(() => metrics.stateCache.size.set(this.cache.size));
38
- }
39
- }
40
-
41
- get(rootHex: RootHex): CachedBeaconStateAllForks | null {
42
- this.metrics?.lookups.inc();
43
- const item = this.head?.stateRoot === rootHex ? this.head.state : this.cache.get(rootHex);
44
- if (!item) {
45
- return null;
46
- }
47
-
48
- this.metrics?.hits.inc();
49
- this.metrics?.stateClonedCount.observe(item.clonedCount);
50
-
51
- return item;
52
- }
53
-
54
- add(item: CachedBeaconStateAllForks): void {
55
- const key = toRootHex(item.hashTreeRoot());
56
- if (this.cache.get(key)) {
57
- return;
58
- }
59
- this.metrics?.adds.inc();
60
- this.cache.set(key, item);
61
- const epoch = item.epochCtx.epoch;
62
- const blockRoots = this.epochIndex.get(epoch);
63
- if (blockRoots) {
64
- blockRoots.add(key);
65
- } else {
66
- this.epochIndex.set(epoch, new Set([key]));
67
- }
68
- }
69
-
70
- setHeadState(item: CachedBeaconStateAllForks | null): void {
71
- if (item) {
72
- const key = toRootHex(item.hashTreeRoot());
73
- this.head = {state: item, stateRoot: key};
74
- } else {
75
- this.head = null;
76
- }
77
- }
78
-
79
- /**
80
- * Get a seed state for state reload.
81
- * This is to conform to the api only as this cache is not used in n-historical state.
82
- * See ./fifoBlockStateCache.ts for implementation
83
- */
84
- getSeedState(): CachedBeaconStateAllForks {
85
- throw Error("Not implemented for BlockStateCacheImpl");
86
- }
87
-
88
- clear(): void {
89
- this.cache.clear();
90
- this.epochIndex.clear();
91
- }
92
-
93
- get size(): number {
94
- return this.cache.size;
95
- }
96
-
97
- /**
98
- * TODO make this more robust.
99
- * Without more thought, this currently breaks our assumptions about recent state availablity
100
- */
101
- prune(headStateRootHex: RootHex): void {
102
- const keys = Array.from(this.cache.keys());
103
- if (keys.length > this.maxStates) {
104
- // object keys are stored in insertion order, delete keys starting from the front
105
- for (const key of keys.slice(0, keys.length - this.maxStates)) {
106
- if (key !== headStateRootHex) {
107
- const item = this.cache.get(key);
108
- if (item) {
109
- this.epochIndex.get(item.epochCtx.epoch)?.delete(key);
110
- this.cache.delete(key);
111
- }
112
- }
113
- }
114
- }
115
- }
116
-
117
- /**
118
- * Prune per finalized epoch.
119
- */
120
- deleteAllBeforeEpoch(finalizedEpoch: Epoch): void {
121
- for (const epoch of this.epochIndex.keys()) {
122
- if (epoch < finalizedEpoch) {
123
- this.deleteAllEpochItems(epoch);
124
- }
125
- }
126
- }
127
-
128
- /** ONLY FOR DEBUGGING PURPOSES. For lodestar debug API */
129
- dumpSummary(): routes.lodestar.StateCacheItem[] {
130
- return Array.from(this.cache.entries()).map(([key, state]) => ({
131
- slot: state.slot,
132
- root: toRootHex(state.hashTreeRoot()),
133
- reads: this.cache.readCount.get(key) ?? 0,
134
- lastRead: this.cache.lastRead.get(key) ?? 0,
135
- checkpointState: false,
136
- }));
137
- }
138
-
139
- getStates(): IterableIterator<CachedBeaconStateAllForks> {
140
- return this.cache.values();
141
- }
142
-
143
- private deleteAllEpochItems(epoch: Epoch): void {
144
- for (const rootHex of this.epochIndex.get(epoch) || []) {
145
- this.cache.delete(rootHex);
146
- }
147
- this.epochIndex.delete(epoch);
148
- }
149
- }