@lodestar/beacon-node 1.43.0-dev.aef3645690 → 1.43.0-dev.e5b13221e5
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 +1 -4
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +1 -4
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +1 -1
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +1 -2
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +27 -35
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +19 -26
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.js +1 -1
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +3 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +20 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +6 -4
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +1 -1
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +25 -0
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +17 -37
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +13 -1
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/attestationError.d.ts +8 -1
- package/lib/chain/errors/attestationError.d.ts.map +1 -1
- package/lib/chain/errors/attestationError.js +4 -0
- package/lib/chain/errors/attestationError.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +12 -4
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +22 -16
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -8
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +29 -19
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/errors.d.ts +1 -11
- package/lib/chain/regen/errors.d.ts.map +1 -1
- package/lib/chain/regen/errors.js +0 -2
- package/lib/chain/regen/errors.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +6 -12
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +6 -11
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +8 -40
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +0 -5
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +7 -34
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/stateCache/datastore/db.d.ts +5 -4
- package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
- package/lib/chain/stateCache/datastore/db.js +10 -32
- package/lib/chain/stateCache/datastore/db.js.map +1 -1
- package/lib/chain/stateCache/datastore/file.d.ts +1 -1
- package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
- package/lib/chain/stateCache/datastore/file.js +5 -5
- package/lib/chain/stateCache/datastore/file.js.map +1 -1
- package/lib/chain/stateCache/datastore/types.d.ts +1 -1
- package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -7
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +0 -8
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +13 -30
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +120 -216
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +8 -15
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.js +12 -0
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts.map +1 -1
- package/lib/chain/validation/attestation.js +12 -0
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +10 -10
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +4 -3
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
- package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +21 -14
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +1 -0
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +6 -0
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +20 -0
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +18 -0
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +23 -2
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/network.js +1 -1
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +22 -6
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +4 -2
- package/lib/node/nodejs.js.map +1 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +16 -3
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +16 -16
- package/src/api/impl/beacon/blocks/index.ts +1 -4
- package/src/api/impl/validator/index.ts +3 -6
- package/src/chain/GetBlobsTracker.ts +1 -2
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +2 -4
- package/src/chain/blocks/importBlock.ts +26 -39
- package/src/chain/blocks/importExecutionPayload.ts +20 -26
- package/src/chain/blocks/index.ts +1 -1
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +27 -0
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +6 -5
- package/src/chain/blocks/types.ts +1 -1
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +38 -0
- package/src/chain/chain.ts +16 -47
- package/src/chain/emitter.ts +12 -0
- package/src/chain/errors/attestationError.ts +6 -1
- package/src/chain/forkChoice/index.ts +12 -4
- package/src/chain/prepareNextSlot.ts +25 -16
- package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
- package/src/chain/produceBlock/produceBlockBody.ts +40 -20
- package/src/chain/regen/errors.ts +1 -6
- package/src/chain/regen/interface.ts +6 -12
- package/src/chain/regen/queued.ts +12 -48
- package/src/chain/regen/regen.ts +8 -36
- package/src/chain/stateCache/datastore/db.ts +10 -33
- package/src/chain/stateCache/datastore/file.ts +5 -6
- package/src/chain/stateCache/datastore/types.ts +2 -3
- package/src/chain/stateCache/fifoBlockStateCache.ts +1 -10
- package/src/chain/stateCache/persistentCheckpointsCache.ts +139 -247
- package/src/chain/stateCache/types.ts +8 -14
- package/src/chain/validation/aggregateAndProof.ts +13 -0
- package/src/chain/validation/attestation.ts +13 -0
- package/src/chain/validation/executionPayloadEnvelope.ts +10 -10
- package/src/chain/validation/payloadAttestationMessage.ts +5 -3
- package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
- package/src/execution/engine/http.ts +21 -14
- package/src/execution/engine/interface.ts +1 -0
- package/src/execution/engine/mock.ts +8 -1
- package/src/execution/engine/types.ts +41 -0
- package/src/network/network.ts +1 -1
- package/src/network/processor/gossipHandlers.ts +26 -10
- package/src/node/nodejs.ts +4 -2
- package/src/util/sszBytes.ts +21 -3
package/src/chain/regen/regen.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {IForkChoice,
|
|
3
|
-
import {
|
|
2
|
+
import {IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
|
|
3
|
+
import {SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
4
4
|
import {
|
|
5
5
|
DataAvailabilityStatus,
|
|
6
6
|
ExecutionPayloadStatus,
|
|
@@ -110,19 +110,9 @@ export class StateRegenerator implements IStateRegeneratorInternal {
|
|
|
110
110
|
const {checkpointStateCache} = this.modules;
|
|
111
111
|
const epoch = computeEpochAtSlot(slot);
|
|
112
112
|
|
|
113
|
-
// Convert PayloadStatus to payloadPresent boolean
|
|
114
|
-
if (block.payloadStatus === PayloadStatus.PENDING) {
|
|
115
|
-
throw new RegenError({
|
|
116
|
-
code: RegenErrorCode.UNEXPECTED_PAYLOAD_STATUS,
|
|
117
|
-
blockRoot: fromHex(blockRoot),
|
|
118
|
-
payloadStatus: block.payloadStatus,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
const payloadPresent = block.payloadStatus === PayloadStatus.FULL;
|
|
122
|
-
|
|
123
113
|
const latestCheckpointStateCtx = allowDiskReload
|
|
124
|
-
? await checkpointStateCache.getOrReloadLatest(blockRoot, epoch
|
|
125
|
-
: checkpointStateCache.getLatest(blockRoot, epoch
|
|
114
|
+
? await checkpointStateCache.getOrReloadLatest(blockRoot, epoch)
|
|
115
|
+
: checkpointStateCache.getLatest(blockRoot, epoch);
|
|
126
116
|
|
|
127
117
|
// If a checkpoint state exists with the given checkpoint root, it either is in requested epoch
|
|
128
118
|
// or needs to have empty slots processed until the requested epoch
|
|
@@ -176,18 +166,9 @@ export class StateRegenerator implements IStateRegeneratorInternal {
|
|
|
176
166
|
if (!lastBlockToReplay) continue;
|
|
177
167
|
const epoch = computeEpochAtSlot(lastBlockToReplay.slot - 1);
|
|
178
168
|
|
|
179
|
-
// Convert PayloadStatus to payloadPresent boolean
|
|
180
|
-
if (b.payloadStatus === PayloadStatus.PENDING) {
|
|
181
|
-
throw new RegenError({
|
|
182
|
-
code: RegenErrorCode.INTERNAL_ERROR,
|
|
183
|
-
message: `Unexpected PENDING payloadStatus for ancestor block ${b.blockRoot} at slot ${b.slot}`,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
const payloadPresent = b.payloadStatus === PayloadStatus.FULL;
|
|
187
|
-
|
|
188
169
|
state = allowDiskReload
|
|
189
|
-
? await checkpointStateCache.getOrReloadLatest(b.blockRoot, epoch
|
|
190
|
-
: checkpointStateCache.getLatest(b.blockRoot, epoch
|
|
170
|
+
? await checkpointStateCache.getOrReloadLatest(b.blockRoot, epoch)
|
|
171
|
+
: checkpointStateCache.getLatest(b.blockRoot, epoch);
|
|
191
172
|
if (state) {
|
|
192
173
|
break;
|
|
193
174
|
}
|
|
@@ -351,11 +332,6 @@ async function processSlotsByCheckpoint(
|
|
|
351
332
|
* emitting "checkpoint" events after every epoch processed.
|
|
352
333
|
*
|
|
353
334
|
* Stops processing after no more full epochs can be processed.
|
|
354
|
-
*
|
|
355
|
-
* Output state variant:
|
|
356
|
-
* - Post-Gloas: If slots are processed, returns block state (payloadPresent=false).
|
|
357
|
-
* If no slots processed, returns preState as-is (preserves variant).
|
|
358
|
-
* - Pre-Gloas: Always payloadPresent=true (no block/payload distinction).
|
|
359
335
|
*/
|
|
360
336
|
export async function processSlotsToNearestCheckpoint(
|
|
361
337
|
modules: {
|
|
@@ -375,7 +351,7 @@ export async function processSlotsToNearestCheckpoint(
|
|
|
375
351
|
const postSlot = slot;
|
|
376
352
|
const preEpoch = computeEpochAtSlot(preSlot);
|
|
377
353
|
let postState = preState;
|
|
378
|
-
const {
|
|
354
|
+
const {checkpointStateCache, emitter, metrics, logger} = modules;
|
|
379
355
|
let count = 0;
|
|
380
356
|
|
|
381
357
|
for (
|
|
@@ -399,11 +375,7 @@ export async function processSlotsToNearestCheckpoint(
|
|
|
399
375
|
// This may becomes the "official" checkpoint state if the 1st block of epoch is skipped
|
|
400
376
|
const checkpointState = postState;
|
|
401
377
|
const cp = getCheckpointFromState(checkpointState);
|
|
402
|
-
|
|
403
|
-
// Pre-Gloas: payloadPresent is always true (execution payload embedded in block)
|
|
404
|
-
// Post-Gloas: result is a block state (payloadPresent=false)
|
|
405
|
-
const isPayloadPresent = config.getForkSeq(checkpointState.slot) < ForkSeq.gloas;
|
|
406
|
-
checkpointStateCache.add(cp, checkpointState, isPayloadPresent);
|
|
378
|
+
checkpointStateCache.add(cp, checkpointState);
|
|
407
379
|
// consumers should not mutate state ever
|
|
408
380
|
emitter?.emit(ChainEvent.checkpoint, cp, checkpointState);
|
|
409
381
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
2
2
|
import {Epoch, phase0, ssz} from "@lodestar/types";
|
|
3
|
-
import {MapDef
|
|
3
|
+
import {MapDef} from "@lodestar/utils";
|
|
4
4
|
import {IBeaconDb} from "../../../db/interface.js";
|
|
5
5
|
import {
|
|
6
6
|
getLastProcessedSlotFromBeaconStateSerialized,
|
|
@@ -14,8 +14,8 @@ import {CPStateDatastore, DatastoreKey} from "./types.js";
|
|
|
14
14
|
export class DbCPStateDatastore implements CPStateDatastore {
|
|
15
15
|
constructor(private readonly db: IBeaconDb) {}
|
|
16
16
|
|
|
17
|
-
async write(cpKey: phase0.Checkpoint, stateBytes: Uint8Array
|
|
18
|
-
const serializedCheckpoint = checkpointToDatastoreKey(cpKey
|
|
17
|
+
async write(cpKey: phase0.Checkpoint, stateBytes: Uint8Array): Promise<DatastoreKey> {
|
|
18
|
+
const serializedCheckpoint = checkpointToDatastoreKey(cpKey);
|
|
19
19
|
await this.db.checkpointState.putBinary(serializedCheckpoint, stateBytes);
|
|
20
20
|
return serializedCheckpoint;
|
|
21
21
|
}
|
|
@@ -40,30 +40,18 @@ export class DbCPStateDatastore implements CPStateDatastore {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function extractCheckpointBytes(key: DatastoreKey): Uint8Array {
|
|
44
|
-
const fixedSize = ssz.phase0.Checkpoint.minSize;
|
|
45
|
-
return key.subarray(0, fixedSize);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
43
|
export function datastoreKeyToCheckpoint(key: DatastoreKey): phase0.Checkpoint {
|
|
49
|
-
return ssz.phase0.Checkpoint.deserialize(
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function checkpointToDatastoreKey(cp: phase0.Checkpoint, payloadPresent: boolean): DatastoreKey {
|
|
53
|
-
const cpBytes = ssz.phase0.Checkpoint.serialize(cp);
|
|
54
|
-
const key = new Uint8Array(cpBytes.length + 1);
|
|
55
|
-
key.set(cpBytes);
|
|
56
|
-
key[cpBytes.length] = payloadPresent ? 1 : 0;
|
|
57
|
-
return key;
|
|
44
|
+
return ssz.phase0.Checkpoint.deserialize(key);
|
|
58
45
|
}
|
|
59
46
|
|
|
60
|
-
function
|
|
61
|
-
return
|
|
47
|
+
export function checkpointToDatastoreKey(cp: phase0.Checkpoint): DatastoreKey {
|
|
48
|
+
return ssz.phase0.Checkpoint.serialize(cp);
|
|
62
49
|
}
|
|
63
50
|
|
|
64
51
|
/**
|
|
65
|
-
* Get the latest
|
|
66
|
-
* -
|
|
52
|
+
* Get the latest safe checkpoint state the node can use to boot from
|
|
53
|
+
* - it should be the checkpoint state that's unique in its epoch
|
|
54
|
+
* - its last processed block slot should be at epoch boundary or last slot of previous epoch
|
|
67
55
|
* - state slot should be at epoch boundary
|
|
68
56
|
* - state slot should be equal to epoch * SLOTS_PER_EPOCH
|
|
69
57
|
*
|
|
@@ -82,20 +70,9 @@ export async function getLatestSafeDatastoreKey(
|
|
|
82
70
|
|
|
83
71
|
const dataStoreKeyByEpoch: Map<Epoch, DatastoreKey> = new Map();
|
|
84
72
|
for (const [epoch, keys] of checkpointsByEpoch.entries()) {
|
|
73
|
+
// only consider epochs with a single checkpoint to avoid ambiguity from forks
|
|
85
74
|
if (keys.length === 1) {
|
|
86
|
-
// PRCS (skipped slot) or CRCS and no payloadPresent
|
|
87
|
-
// Pre-gloas always fall into this case
|
|
88
75
|
dataStoreKeyByEpoch.set(epoch, keys[0]);
|
|
89
|
-
} else if (keys.length === 2) {
|
|
90
|
-
// CRCS without payload and CRCS with payload
|
|
91
|
-
// ie Two keys for the same checkpoint with different payloadPresent suffix (FULL/EMPTY)
|
|
92
|
-
// TODO GLOAS: Here we pick FULL key, there is a chance that payload is orphaned hence we not be able to sync
|
|
93
|
-
const cp0 = extractCheckpointBytes(keys[0]);
|
|
94
|
-
const cp1 = extractCheckpointBytes(keys[1]);
|
|
95
|
-
if (byteArrayEquals(cp0, cp1)) {
|
|
96
|
-
const fullKey = isPayloadCheckpointState(keys[0]) ? keys[0] : keys[1];
|
|
97
|
-
dataStoreKeyByEpoch.set(epoch, fullKey);
|
|
98
|
-
}
|
|
99
76
|
}
|
|
100
77
|
}
|
|
101
78
|
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {phase0} from "@lodestar/types";
|
|
2
|
+
import {phase0, ssz} from "@lodestar/types";
|
|
3
3
|
import {fromHex, toHex} from "@lodestar/utils";
|
|
4
4
|
import {ensureDir, readFile, readFileNames, removeFile, writeIfNotExist} from "../../../util/file.js";
|
|
5
|
-
import {
|
|
5
|
+
import {getLatestSafeDatastoreKey} from "./db.js";
|
|
6
6
|
import {CPStateDatastore, DatastoreKey} from "./types.js";
|
|
7
7
|
|
|
8
8
|
const CHECKPOINT_STATES_FOLDER = "checkpoint_states";
|
|
9
|
-
|
|
10
|
-
const CHECKPOINT_FILE_NAME_LENGTH = 84;
|
|
9
|
+
const CHECKPOINT_FILE_NAME_LENGTH = 82;
|
|
11
10
|
|
|
12
11
|
/**
|
|
13
12
|
* Implementation of CPStateDatastore using file system, this is beneficial for debugging.
|
|
@@ -29,8 +28,8 @@ export class FileCPStateDatastore implements CPStateDatastore {
|
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
async write(cpKey: phase0.Checkpoint, stateBytes: Uint8Array
|
|
33
|
-
const serializedCheckpoint =
|
|
31
|
+
async write(cpKey: phase0.Checkpoint, stateBytes: Uint8Array): Promise<DatastoreKey> {
|
|
32
|
+
const serializedCheckpoint = ssz.phase0.Checkpoint.serialize(cpKey);
|
|
34
33
|
const filePath = path.join(this.folderPath, toHex(serializedCheckpoint));
|
|
35
34
|
await writeIfNotExist(filePath, stateBytes);
|
|
36
35
|
return serializedCheckpoint;
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import {phase0} from "@lodestar/types";
|
|
2
2
|
|
|
3
|
-
// With db implementation, persistedKey is serialized data of a checkpoint
|
|
4
|
-
// ie a fixed size of `ssz.phase0.Checkpoint.minSize + 1`
|
|
3
|
+
// With db implementation, persistedKey is serialized data of a checkpoint
|
|
5
4
|
export type DatastoreKey = Uint8Array;
|
|
6
5
|
|
|
7
6
|
// Make this generic to support testing
|
|
8
7
|
export interface CPStateDatastore {
|
|
9
|
-
write: (cpKey: phase0.Checkpoint, stateBytes: Uint8Array
|
|
8
|
+
write: (cpKey: phase0.Checkpoint, stateBytes: Uint8Array) => Promise<DatastoreKey>;
|
|
10
9
|
remove: (key: DatastoreKey) => Promise<void>;
|
|
11
10
|
read: (key: DatastoreKey) => Promise<Uint8Array | null>;
|
|
12
11
|
readLatestSafe: () => Promise<Uint8Array | null>;
|
|
@@ -20,11 +20,6 @@ export type FIFOBlockStateCacheOpts = {
|
|
|
20
20
|
* clock slot
|
|
21
21
|
*/
|
|
22
22
|
export const DEFAULT_MAX_BLOCK_STATES = 64;
|
|
23
|
-
/**
|
|
24
|
-
* For Gloas (ePBS), each block can have two states: block state and payload state.
|
|
25
|
-
* Double the cache size to maintain the same effective block depth.
|
|
26
|
-
*/
|
|
27
|
-
export const DEFAULT_MAX_BLOCK_STATES_GLOAS = 128;
|
|
28
23
|
|
|
29
24
|
/**
|
|
30
25
|
* New implementation of BlockStateCache that keeps the most recent n states consistently
|
|
@@ -46,7 +41,7 @@ export const DEFAULT_MAX_BLOCK_STATES_GLOAS = 128;
|
|
|
46
41
|
* The maintained key order would be: 11 -> 13 -> 12 -> 10, and state 10 will be pruned first.
|
|
47
42
|
*/
|
|
48
43
|
export class FIFOBlockStateCache implements BlockStateCache {
|
|
49
|
-
|
|
44
|
+
readonly maxStates: number;
|
|
50
45
|
|
|
51
46
|
private readonly cache: MapTracker<string, IBeaconStateView>;
|
|
52
47
|
/**
|
|
@@ -172,10 +167,6 @@ export class FIFOBlockStateCache implements BlockStateCache {
|
|
|
172
167
|
}
|
|
173
168
|
}
|
|
174
169
|
|
|
175
|
-
upgradeToGloas(): void {
|
|
176
|
-
this.maxStates = DEFAULT_MAX_BLOCK_STATES_GLOAS;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
170
|
/**
|
|
180
171
|
* No need for this implementation
|
|
181
172
|
* This is only to conform to the old api
|