@lodestar/beacon-node 1.47.0-dev.0bcaaaebb5 → 1.47.0-dev.101e2c290d
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 +6 -8
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +25 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/events/index.d.ts +1 -1
- package/lib/api/impl/events/index.d.ts.map +1 -1
- package/lib/api/impl/events/index.js +12 -3
- package/lib/api/impl/events/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.js +1 -1
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +1 -1
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/rest/base.d.ts.map +1 -1
- package/lib/api/rest/base.js +7 -0
- package/lib/api/rest/base.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -1
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/metrics.js +21 -0
- package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +2 -7
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +3 -2
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +11 -9
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +14 -6
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +2 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +6 -2
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +14 -5
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.js +5 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +22 -12
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +2 -2
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
- package/lib/chain/bls/index.d.ts +1 -1
- package/lib/chain/bls/index.d.ts.map +1 -1
- package/lib/chain/bls/interface.d.ts +5 -5
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +5 -11
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +116 -101
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/jobItem.d.ts +5 -19
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
- package/lib/chain/bls/multithread/jobItem.js +10 -65
- package/lib/chain/bls/multithread/jobItem.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +29 -8
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/types.js +12 -0
- package/lib/chain/bls/multithread/types.js.map +1 -1
- package/lib/chain/bls/multithread/utils.d.ts +4 -0
- package/lib/chain/bls/multithread/utils.d.ts.map +1 -1
- package/lib/chain/bls/multithread/utils.js +10 -0
- package/lib/chain/bls/multithread/utils.js.map +1 -1
- package/lib/chain/bls/multithread/worker.js +49 -23
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.d.ts +4 -10
- package/lib/chain/bls/singleThread.d.ts.map +1 -1
- package/lib/chain/bls/singleThread.js +8 -45
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.d.ts +4 -4
- package/lib/chain/bls/utils.d.ts.map +1 -1
- package/lib/chain/bls/utils.js +18 -19
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/builderCircuitBreaker.d.ts +6 -5
- package/lib/chain/builderCircuitBreaker.d.ts.map +1 -1
- package/lib/chain/builderCircuitBreaker.js +28 -15
- package/lib/chain/builderCircuitBreaker.js.map +1 -1
- package/lib/chain/chain.d.ts +4 -2
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +16 -6
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +1 -0
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +6 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/proposerPreferences.d.ts +6 -0
- package/lib/chain/errors/proposerPreferences.d.ts.map +1 -1
- package/lib/chain/errors/proposerPreferences.js +1 -0
- package/lib/chain/errors/proposerPreferences.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +4 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/interface.d.ts +4 -2
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +1 -1
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts +16 -0
- package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts.map +1 -0
- package/lib/chain/opPools/deferredVoluntaryExitPool.js +57 -0
- package/lib/chain/opPools/deferredVoluntaryExitPool.js.map +1 -0
- package/lib/chain/opPools/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +3 -3
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +1 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +24 -6
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +4 -2
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +2 -0
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/regen/queued.d.ts +2 -2
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +5 -5
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenAttesters.d.ts +9 -5
- package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
- package/lib/chain/seenCache/seenAttesters.js +25 -4
- package/lib/chain/seenCache/seenAttesters.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +28 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +121 -13
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +5 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +6 -0
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +47 -5
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +117 -7
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +3 -3
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/validation/attestation.d.ts.map +1 -1
- package/lib/chain/validation/attestation.js +1 -4
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +1 -1
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +1 -2
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +1 -1
- 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 +5 -14
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validation/proposerPreferences.d.ts +1 -1
- package/lib/chain/validation/proposerPreferences.d.ts.map +1 -1
- package/lib/chain/validation/proposerPreferences.js +13 -4
- package/lib/chain/validation/proposerPreferences.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.d.ts +9 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +46 -1
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/execution/builder/http.d.ts +10 -7
- package/lib/execution/builder/http.d.ts.map +1 -1
- package/lib/execution/builder/http.js +11 -8
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +3 -3
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +9 -9
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +72 -22
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +130 -52
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -0
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +37 -0
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +10 -2
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +22 -43
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/constants.d.ts +7 -0
- package/lib/network/processor/constants.d.ts.map +1 -0
- package/lib/network/processor/constants.js +7 -0
- package/lib/network/processor/constants.js.map +1 -0
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +12 -3
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/index.d.ts +3 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +36 -15
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +5 -11
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/util.d.ts +0 -1
- package/lib/network/util.d.ts.map +1 -1
- package/lib/network/util.js +0 -4
- package/lib/network/util.js.map +1 -1
- package/lib/node/deferredVoluntaryExitPublisher.d.ts +15 -0
- package/lib/node/deferredVoluntaryExitPublisher.d.ts.map +1 -0
- package/lib/node/deferredVoluntaryExitPublisher.js +38 -0
- package/lib/node/deferredVoluntaryExitPublisher.js.map +1 -0
- package/lib/node/nodejs.d.ts +2 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +2 -0
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/range/batch.d.ts +23 -5
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +61 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +2 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +23 -10
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/types.d.ts +32 -0
- package/lib/sync/types.d.ts.map +1 -1
- package/lib/sync/types.js +33 -0
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +13 -2
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +218 -63
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +16 -11
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +3 -1
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/package.json +35 -35
- package/src/api/impl/beacon/blocks/index.ts +7 -8
- package/src/api/impl/beacon/pool/index.ts +27 -2
- package/src/api/impl/beacon/state/utils.ts +2 -1
- package/src/api/impl/events/index.ts +12 -4
- package/src/api/impl/lodestar/index.ts +1 -1
- package/src/api/impl/validator/index.ts +1 -1
- package/src/api/rest/base.ts +7 -0
- package/src/chain/archiveStore/archiveStore.ts +1 -1
- package/src/chain/archiveStore/historicalState/metrics.ts +22 -0
- package/src/chain/blocks/importBlock.ts +1 -6
- package/src/chain/blocks/importExecutionPayload.ts +12 -11
- package/src/chain/blocks/index.ts +18 -6
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +8 -2
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -4
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +25 -16
- package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +1 -9
- package/src/chain/bls/index.ts +1 -1
- package/src/chain/bls/interface.ts +7 -3
- package/src/chain/bls/multithread/index.ts +148 -120
- package/src/chain/bls/multithread/jobItem.ts +12 -82
- package/src/chain/bls/multithread/types.ts +33 -8
- package/src/chain/bls/multithread/utils.ts +11 -0
- package/src/chain/bls/multithread/worker.ts +85 -27
- package/src/chain/bls/singleThread.ts +11 -55
- package/src/chain/bls/utils.ts +23 -24
- package/src/chain/builderCircuitBreaker.ts +31 -17
- package/src/chain/chain.ts +17 -6
- package/src/chain/errors/blockError.ts +8 -2
- package/src/chain/errors/proposerPreferences.ts +7 -0
- package/src/chain/forkChoice/index.ts +4 -0
- package/src/chain/interface.ts +4 -1
- package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
- package/src/chain/opPools/attestationPool.ts +1 -1
- package/src/chain/opPools/deferredVoluntaryExitPool.ts +65 -0
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +3 -3
- package/src/chain/opPools/syncCommitteeMessagePool.ts +1 -1
- package/src/chain/opPools/syncContributionAndProofPool.ts +1 -1
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/options.ts +1 -1
- package/src/chain/prepareNextSlot.ts +24 -6
- package/src/chain/regen/interface.ts +4 -2
- package/src/chain/regen/queued.ts +5 -5
- package/src/chain/seenCache/seenAttesters.ts +31 -5
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +143 -14
- package/src/chain/stateCache/fifoBlockStateCache.ts +8 -1
- package/src/chain/stateCache/persistentCheckpointsCache.ts +133 -8
- package/src/chain/stateCache/types.ts +3 -3
- package/src/chain/validation/attestation.ts +1 -7
- package/src/chain/validation/attesterSlashing.ts +1 -8
- package/src/chain/validation/executionPayloadBid.ts +1 -2
- package/src/chain/validation/executionPayloadEnvelope.ts +0 -1
- package/src/chain/validation/payloadAttestationMessage.ts +6 -17
- package/src/chain/validation/proposerPreferences.ts +15 -5
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/chain/validation/voluntaryExit.ts +59 -2
- package/src/execution/builder/http.ts +11 -11
- package/src/metrics/metrics/beacon.ts +9 -9
- package/src/metrics/metrics/lodestar.ts +142 -57
- package/src/network/gossip/topic.ts +38 -0
- package/src/network/libp2p/index.ts +11 -2
- package/src/network/network.ts +27 -55
- package/src/network/processor/constants.ts +6 -0
- package/src/network/processor/gossipHandlers.ts +14 -1
- package/src/network/processor/index.ts +42 -19
- package/src/network/reqresp/score.ts +5 -11
- package/src/network/util.ts +0 -5
- package/src/node/deferredVoluntaryExitPublisher.ts +54 -0
- package/src/node/nodejs.ts +5 -1
- package/src/sync/range/batch.ts +83 -28
- package/src/sync/range/chain.ts +26 -11
- package/src/sync/types.ts +36 -1
- package/src/sync/unknownBlock.ts +255 -70
- package/src/sync/utils/downloadByRange.ts +21 -12
- package/src/sync/utils/downloadByRoot.ts +3 -1
- package/lib/chain/bls/maybeBatch.d.ts +0 -12
- package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
- package/lib/chain/bls/maybeBatch.js +0 -35
- package/lib/chain/bls/maybeBatch.js.map +0 -1
- package/src/chain/bls/maybeBatch.ts +0 -45
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { PayloadStatus } from "@lodestar/fork-choice";
|
|
2
|
+
import { SLOTS_PER_EPOCH, isForkPostGloas } from "@lodestar/params";
|
|
2
3
|
import { computeStartSlotAtEpoch } from "@lodestar/state-transition";
|
|
4
|
+
import { fromHex } from "@lodestar/utils";
|
|
5
|
+
import { MAX_LOOK_AHEAD_EPOCHS } from "../../sync/constants.js";
|
|
3
6
|
import { isDaOutOfRange } from "../blocks/blockInput/index.js";
|
|
4
|
-
import { PayloadEnvelopeInput } from "../blocks/payloadEnvelopeInput/index.js";
|
|
7
|
+
import { PayloadEnvelopeInput, PayloadEnvelopeInputSource, } from "../blocks/payloadEnvelopeInput/index.js";
|
|
5
8
|
import { ChainEvent } from "../emitter.js";
|
|
6
9
|
export { PayloadEnvelopeInput } from "../blocks/payloadEnvelopeInput/index.js";
|
|
10
|
+
// Bound this cache by this max size, this is the same to SeenBlockInput
|
|
11
|
+
const MAX_PAYLOAD_ENVELOPE_INPUT_CACHE_SIZE = (MAX_LOOK_AHEAD_EPOCHS + 1) * SLOTS_PER_EPOCH;
|
|
7
12
|
/**
|
|
8
13
|
* Cache for tracking PayloadEnvelopeInput instances, keyed by beacon block root.
|
|
9
14
|
*
|
|
@@ -20,16 +25,24 @@ export class SeenPayloadEnvelopeInput {
|
|
|
20
25
|
chainEvents;
|
|
21
26
|
signal;
|
|
22
27
|
serializedCache;
|
|
28
|
+
db;
|
|
29
|
+
seenBlockInputCache;
|
|
30
|
+
custodyConfig;
|
|
23
31
|
metrics;
|
|
24
32
|
logger;
|
|
25
33
|
payloadInputs = new Map();
|
|
26
|
-
|
|
34
|
+
// Dedup concurrent DB reloads of the same root so callers share one reconstructed object.
|
|
35
|
+
reloading = new Map();
|
|
36
|
+
constructor({ config, clock, forkChoice, chainEvents, signal, serializedCache, db, seenBlockInputCache, custodyConfig, metrics, logger, }) {
|
|
27
37
|
this.config = config;
|
|
28
38
|
this.clock = clock;
|
|
29
39
|
this.forkChoice = forkChoice;
|
|
30
40
|
this.chainEvents = chainEvents;
|
|
31
41
|
this.signal = signal;
|
|
32
42
|
this.serializedCache = serializedCache;
|
|
43
|
+
this.db = db;
|
|
44
|
+
this.seenBlockInputCache = seenBlockInputCache;
|
|
45
|
+
this.custodyConfig = custodyConfig;
|
|
33
46
|
this.metrics = metrics;
|
|
34
47
|
this.logger = logger;
|
|
35
48
|
if (metrics) {
|
|
@@ -48,7 +61,7 @@ export class SeenPayloadEnvelopeInput {
|
|
|
48
61
|
let deletedCount = 0;
|
|
49
62
|
for (const [, input] of this.payloadInputs) {
|
|
50
63
|
if (input.slot < finalizedSlot) {
|
|
51
|
-
this.evictPayloadInput(input);
|
|
64
|
+
this.evictPayloadInput(input, "finalized");
|
|
52
65
|
deletedCount++;
|
|
53
66
|
}
|
|
54
67
|
}
|
|
@@ -70,12 +83,13 @@ export class SeenPayloadEnvelopeInput {
|
|
|
70
83
|
const daOutOfRange = isDaOutOfRange(this.config, props.forkName, props.block.message.slot, this.clock.currentEpoch);
|
|
71
84
|
const input = PayloadEnvelopeInput.createFromBlock({ ...props, daOutOfRange });
|
|
72
85
|
this.payloadInputs.set(props.blockRootHex, input);
|
|
73
|
-
this.metrics?.seenCache.payloadEnvelopeInput.created.inc();
|
|
86
|
+
this.metrics?.seenCache.payloadEnvelopeInput.created.inc({ source: props.source });
|
|
74
87
|
this.logger?.verbose("SeenPayloadEnvelopeInput.add created new entry", {
|
|
75
88
|
slot: input.slot,
|
|
76
89
|
root: props.blockRootHex,
|
|
77
90
|
daOutOfRange,
|
|
78
91
|
});
|
|
92
|
+
this.pruneToMaxSize();
|
|
79
93
|
return input;
|
|
80
94
|
}
|
|
81
95
|
/**
|
|
@@ -90,17 +104,87 @@ export class SeenPayloadEnvelopeInput {
|
|
|
90
104
|
const daOutOfRange = isDaOutOfRange(this.config, props.forkName, props.slot, this.clock.currentEpoch);
|
|
91
105
|
const input = PayloadEnvelopeInput.createFromBid({ ...props, daOutOfRange });
|
|
92
106
|
this.payloadInputs.set(props.blockRootHex, input);
|
|
93
|
-
this.metrics?.seenCache.payloadEnvelopeInput.created.inc();
|
|
107
|
+
this.metrics?.seenCache.payloadEnvelopeInput.created.inc({ source: props.source });
|
|
94
108
|
this.logger?.verbose("SeenPayloadEnvelopeInput.addFromBid created new entry", {
|
|
95
109
|
slot: input.slot,
|
|
96
110
|
root: props.blockRootHex,
|
|
97
111
|
daOutOfRange,
|
|
98
112
|
});
|
|
113
|
+
this.pruneToMaxSize();
|
|
99
114
|
return input;
|
|
100
115
|
}
|
|
101
116
|
get(blockRootHex) {
|
|
102
117
|
return this.payloadInputs.get(blockRootHex);
|
|
103
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Like `get()`, but on a cache miss reconstruct the shell (bid + versionedHashes) from the block
|
|
121
|
+
* in `seenBlockInputCache` or the hot DB.
|
|
122
|
+
* This api is meant for BlockInputSync when a late/weird payloads for old blocks
|
|
123
|
+
*
|
|
124
|
+
* NOTE: the reconstructed entry is always EMPTY even when the block is actually FULL (its
|
|
125
|
+
* payload envelope + columns persisted in the DB). The consumer should consult fork choice if it needs to.
|
|
126
|
+
*/
|
|
127
|
+
async getOrReload(blockRootHex) {
|
|
128
|
+
const existing = this.payloadInputs.get(blockRootHex);
|
|
129
|
+
if (existing !== undefined) {
|
|
130
|
+
return existing;
|
|
131
|
+
}
|
|
132
|
+
// Without this dedup, two concurrent misses each db.block.get + createFromBlock a DIFFERENT shell
|
|
133
|
+
// for the same root; processPayloadEnvelopeJob's WeakMap (keyed by object) can't dedup the import.
|
|
134
|
+
const inflight = this.reloading.get(blockRootHex);
|
|
135
|
+
if (inflight !== undefined) {
|
|
136
|
+
return inflight;
|
|
137
|
+
}
|
|
138
|
+
const promise = this.reloadFromDb(blockRootHex);
|
|
139
|
+
this.reloading.set(blockRootHex, promise);
|
|
140
|
+
try {
|
|
141
|
+
return await promise;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
this.reloading.delete(blockRootHex);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async reloadFromDb(blockRootHex) {
|
|
148
|
+
// Only recover unfinalized, fork-choice-known blocks. Do not read the finalized archive. The gate
|
|
149
|
+
// also filters out un-imported blocks that may sit in seenBlockInputCache before validation.
|
|
150
|
+
if (!this.forkChoice.hasBlockHex(blockRootHex)) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
// In-memory first: persistBlockInput writes db.block THEN prunes seenBlockInputCache, so a
|
|
154
|
+
// just-imported block whose async write (unfinalizedBlockWrites) has not flushed yet is still here;
|
|
155
|
+
// older blocks (already pruned from the cache) fall through to the hot db.
|
|
156
|
+
const cachedBlockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
157
|
+
const block = cachedBlockInput?.hasBlock()
|
|
158
|
+
? cachedBlockInput.getBlock()
|
|
159
|
+
: await this.db.block.get(fromHex(blockRootHex));
|
|
160
|
+
if (block == null) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
const forkName = this.config.getForkName(block.message.slot);
|
|
164
|
+
if (!isForkPostGloas(forkName)) {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
const daOutOfRange = isDaOutOfRange(this.config, forkName, block.message.slot, this.clock.currentEpoch);
|
|
168
|
+
const input = PayloadEnvelopeInput.createFromBlock({
|
|
169
|
+
blockRootHex,
|
|
170
|
+
block: block,
|
|
171
|
+
forkName,
|
|
172
|
+
sampledColumns: this.custodyConfig.sampledColumns,
|
|
173
|
+
custodyColumns: this.custodyConfig.custodyColumns,
|
|
174
|
+
seenTimestampSec: Date.now() / 1000,
|
|
175
|
+
source: PayloadEnvelopeInputSource.reload,
|
|
176
|
+
daOutOfRange,
|
|
177
|
+
});
|
|
178
|
+
this.payloadInputs.set(blockRootHex, input);
|
|
179
|
+
this.metrics?.seenCache.payloadEnvelopeInput.created.inc({ source: PayloadEnvelopeInputSource.reload });
|
|
180
|
+
this.logger?.verbose("SeenPayloadEnvelopeInput.getOrReload reconstructed entry from db", {
|
|
181
|
+
slot: input.slot,
|
|
182
|
+
root: blockRootHex,
|
|
183
|
+
});
|
|
184
|
+
// Set above (entry is at the back of the insertion order), so the cap never evicts what we just reloaded.
|
|
185
|
+
this.pruneToMaxSize();
|
|
186
|
+
return input;
|
|
187
|
+
}
|
|
104
188
|
hasPayload(blockRootHex) {
|
|
105
189
|
return this.payloadInputs.get(blockRootHex)?.hasPayloadEnvelope() ?? false;
|
|
106
190
|
}
|
|
@@ -110,8 +194,7 @@ export class SeenPayloadEnvelopeInput {
|
|
|
110
194
|
prune(blockRootHex) {
|
|
111
195
|
const input = this.payloadInputs.get(blockRootHex);
|
|
112
196
|
if (input) {
|
|
113
|
-
this.evictPayloadInput(input);
|
|
114
|
-
this.logger?.verbose("SeenPayloadEnvelopeInput.prune deleted", { slot: input.slot, root: blockRootHex });
|
|
197
|
+
this.evictPayloadInput(input, "prune");
|
|
115
198
|
}
|
|
116
199
|
}
|
|
117
200
|
pruneBelowParent(parentBlock) {
|
|
@@ -124,16 +207,41 @@ export class SeenPayloadEnvelopeInput {
|
|
|
124
207
|
// ...and don't evict while columns are still being gathered: writeDataColumnsToDb awaits the
|
|
125
208
|
// same hasComputedAllData() before persisting. Such entries are pruned by a later call.
|
|
126
209
|
if (input?.hasComputedAllData()) {
|
|
127
|
-
this.evictPayloadInput(input);
|
|
128
|
-
this.logger?.verbose("SeenPayloadEnvelopeInput.pruneBelowParent deleted", {
|
|
129
|
-
slot: block.slot,
|
|
130
|
-
root: block.blockRoot,
|
|
131
|
-
});
|
|
210
|
+
this.evictPayloadInput(input, "belowParent");
|
|
132
211
|
}
|
|
133
212
|
}
|
|
134
213
|
}
|
|
135
214
|
}
|
|
136
|
-
|
|
215
|
+
/**
|
|
216
|
+
* Bound this cache to have at most MAX_PAYLOAD_ENVELOPE_INPUT_CACHE_SIZE items.
|
|
217
|
+
* Evicts by insertion order so a just-reloaded old-slot entry is not evicted right after.
|
|
218
|
+
* On unstable network, we may need to query an evicted item, UnknownBlockInput will recover
|
|
219
|
+
* it from db via getOrReload() api. Runs after every single insert, so it evicts ~1 per call.
|
|
220
|
+
*/
|
|
221
|
+
pruneToMaxSize() {
|
|
222
|
+
let evicted = 0;
|
|
223
|
+
for (const input of this.payloadInputs.values()) {
|
|
224
|
+
if (this.payloadInputs.size <= MAX_PAYLOAD_ENVELOPE_INPUT_CACHE_SIZE) {
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
this.evictPayloadInput(input, "cap");
|
|
228
|
+
evicted++;
|
|
229
|
+
}
|
|
230
|
+
if (evicted > 0) {
|
|
231
|
+
this.logger?.debug("SeenPayloadEnvelopeInput.pruneToMaxSize evicted", {
|
|
232
|
+
evicted,
|
|
233
|
+
size: this.payloadInputs.size,
|
|
234
|
+
max: MAX_PAYLOAD_ENVELOPE_INPUT_CACHE_SIZE,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
evictPayloadInput(payloadInput, reason) {
|
|
239
|
+
this.metrics?.seenCache.payloadEnvelopeInput.pruned.inc({ reason });
|
|
240
|
+
this.logger?.debug("SeenPayloadEnvelopeInput evicted", {
|
|
241
|
+
slot: payloadInput.slot,
|
|
242
|
+
root: payloadInput.blockRootHex,
|
|
243
|
+
reason,
|
|
244
|
+
});
|
|
137
245
|
this.serializedCache.delete(payloadInput.getSerializedCacheKeys());
|
|
138
246
|
this.payloadInputs.delete(payloadInput.blockRootHex);
|
|
139
247
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seenPayloadEnvelopeInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenPayloadEnvelopeInput.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,aAAa,EAAa,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"seenPayloadEnvelopeInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenPayloadEnvelopeInput.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,13 +66,17 @@ export declare class FIFOBlockStateCache implements BlockStateCache {
|
|
|
66
66
|
*/
|
|
67
67
|
add(item: IBeaconStateView, isHead?: boolean): void;
|
|
68
68
|
get size(): number;
|
|
69
|
+
/**
|
|
70
|
+
* On a checkpoint event, prune the cache while keeping the head state.
|
|
71
|
+
*/
|
|
72
|
+
onCheckpoint(headStateRootHex: string): void;
|
|
69
73
|
/**
|
|
70
74
|
* Prune the cache from tail to keep the most recent n states consistently.
|
|
71
75
|
* The tail of the list is the oldest state, in case regen adds back the same state,
|
|
72
76
|
* it should stay next to head so that it won't be pruned right away.
|
|
73
77
|
* The FIFO cache helps with this.
|
|
74
78
|
*/
|
|
75
|
-
prune
|
|
79
|
+
private prune;
|
|
76
80
|
/**
|
|
77
81
|
* ONLY FOR DEBUGGING PURPOSES. For lodestar debug API.
|
|
78
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fifoBlockStateCache.d.ts","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAG/C,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,YAAY,IAAI,EAAE,uBAAuB,EAAE,EAAC,OAAO,EAAC,EAAE;QAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAC,EAQ/E;IAED;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAIhD;IAED;;;;OAIG;IACH,YAAY,IAAI,gBAAgB,CAU/B;IAED;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAW7C;IAED;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAQ,GAAG,IAAI,CA+BhD;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED
|
|
1
|
+
{"version":3,"file":"fifoBlockStateCache.d.ts","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAG/C,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,YAAY,IAAI,EAAE,uBAAuB,EAAE,EAAC,OAAO,EAAC,EAAE;QAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAC,EAQ/E;IAED;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAIhD;IAED;;;;OAIG;IACH,YAAY,IAAI,gBAAgB,CAU/B;IAED;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAW7C;IAED;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAQ,GAAG,IAAI,CA+BhD;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAE3C;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAK;IAiBb;;OAEG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED,0DAA0D;IAC1D,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAQ9C;IAED,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAE9C;IAED;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,CAEvB;CACF"}
|
|
@@ -124,6 +124,12 @@ export class FIFOBlockStateCache {
|
|
|
124
124
|
get size() {
|
|
125
125
|
return this.cache.size;
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* On a checkpoint event, prune the cache while keeping the head state.
|
|
129
|
+
*/
|
|
130
|
+
onCheckpoint(headStateRootHex) {
|
|
131
|
+
this.prune(headStateRootHex);
|
|
132
|
+
}
|
|
127
133
|
/**
|
|
128
134
|
* Prune the cache from tail to keep the most recent n states consistently.
|
|
129
135
|
* The tail of the list is the oldest state, in case regen adds back the same state,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,11 @@ import { BlockStateCache, CheckpointHex, CheckpointStateCache } from "./types.js
|
|
|
11
11
|
export type PersistentCheckpointStateCacheOpts = {
|
|
12
12
|
/** Keep max n state epochs in memory, persist the rest to disk */
|
|
13
13
|
maxCPStateEpochsInMemory?: number;
|
|
14
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* On-disk retention of persisted checkpoint states. Selects one of two modes:
|
|
16
|
+
* - `Infinity` (default) -> tiered retention mode
|
|
17
|
+
* - any finite `n` (>= 0) -> legacy flat retention (keep the last n dense epochs)
|
|
18
|
+
*/
|
|
15
19
|
maxCPStateEpochsOnDisk?: number;
|
|
16
20
|
};
|
|
17
21
|
type PersistentCheckpointStateCacheModules = {
|
|
@@ -43,6 +47,7 @@ export declare const DEFAULT_MAX_CP_STATE_EPOCHS_IN_MEMORY = 3;
|
|
|
43
47
|
* and instead require a resync from last finalized checkpoint state which could be very far in the past.
|
|
44
48
|
*/
|
|
45
49
|
export declare const DEFAULT_MAX_CP_STATE_ON_DISK: number;
|
|
50
|
+
export declare const CP_STATE_TIER_BASE = 16;
|
|
46
51
|
/**
|
|
47
52
|
* An implementation of CheckpointStateCache that keep up to n epoch checkpoint states in memory and persist the rest to disk
|
|
48
53
|
* - If it's more than `maxEpochsInMemory` epochs old, it will persist n last epochs to disk based on the view of the block
|
|
@@ -88,6 +93,19 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
88
93
|
private preComputedCheckpointHits;
|
|
89
94
|
private readonly maxEpochsInMemory;
|
|
90
95
|
private readonly maxEpochsOnDisk;
|
|
96
|
+
/**
|
|
97
|
+
* Persist checkpoint states (epoch + root) by tiers
|
|
98
|
+
*
|
|
99
|
+
* ╔═════════ tier 2 ══════════╦═══════ tier 1 ═══════╦═══ tier 0 (dense) ══╗
|
|
100
|
+
* finalizedEpoch -> ║ keep 1 epoch per 256 ║ keep 1 epoch per 16 ║ keep every epoch ║ -> head
|
|
101
|
+
* ║ x·······x·······x······ ║ x···x···x···x··· ║ xxxxxxxxxxxxxxxxx ║
|
|
102
|
+
* ╚═══════════════════════════╩══════════════════════╩═════════════════════╝
|
|
103
|
+
*
|
|
104
|
+
* starting from tier 1, all epochs must be aligned to the finalized epoch
|
|
105
|
+
*/
|
|
106
|
+
private persistentTiers;
|
|
107
|
+
private finalizedEpoch;
|
|
108
|
+
private justifiedEpoch;
|
|
91
109
|
private readonly datastore;
|
|
92
110
|
private readonly blockStateCache;
|
|
93
111
|
private readonly bufferPool?;
|
|
@@ -138,9 +156,31 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
138
156
|
*/
|
|
139
157
|
updatePreComputedCheckpoint(rootHex: RootHex, epoch: Epoch): number | null;
|
|
140
158
|
/**
|
|
141
|
-
* This is
|
|
159
|
+
* This is called on every checkpoint event to refresh the pinned finalized/justified epochs.
|
|
160
|
+
*/
|
|
161
|
+
onCheckpoint(finalizedEpoch: Epoch, justifiedEpoch: Epoch): void;
|
|
162
|
+
/**
|
|
163
|
+
* This is called right after we persist a checkpoint state.
|
|
164
|
+
*/
|
|
165
|
+
private onPersist;
|
|
166
|
+
/**
|
|
167
|
+
* When tier `n` overflows (> CP_STATE_TIER_BASE epochs), evict its oldest epoch and either promote it to tier `n + 1` (if aligned there) or delete it.
|
|
168
|
+
*
|
|
169
|
+
* before: persistentTiers[n] = { ..., e_old }
|
|
170
|
+
* persistentTiers[n+1] = { ... }
|
|
171
|
+
*
|
|
172
|
+
* after, if e_old aligns to n+1: | after, if e_old does NOT align to n+1:
|
|
173
|
+
* persistentTiers[n] = { ... } | persistentTiers[n] = { ... }
|
|
174
|
+
* persistentTiers[n+1] = { ..., e_old } | e_old and all its roots deleted from disk
|
|
175
|
+
*
|
|
176
|
+
* Since pruning a tier[n] may push an item at tier[n+1], we must call the function recursively.
|
|
177
|
+
*/
|
|
178
|
+
private prunePersistentTier;
|
|
179
|
+
/**
|
|
180
|
+
* Starting from tier[1], it must be aligned to the finalized epoch
|
|
181
|
+
* ie given finalized epoch F, tier[n] only epochs of F + n*16, n = 1,2,3...
|
|
142
182
|
*/
|
|
143
|
-
|
|
183
|
+
private alignedForTier;
|
|
144
184
|
/**
|
|
145
185
|
* Prune all checkpoint states before the provided finalized epoch.
|
|
146
186
|
* Driven sequentially from processState() so it never interleaves with persist.
|
|
@@ -215,7 +255,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
215
255
|
* Use seed state from the block cache if cannot find any seed states within this cache.
|
|
216
256
|
*/
|
|
217
257
|
findSeedStateToReload(reloadedCp: CheckpointHex): IBeaconStateView;
|
|
218
|
-
clear(): void
|
|
258
|
+
clear(): Promise<void>;
|
|
219
259
|
/** ONLY FOR DEBUGGING PURPOSES. For lodestar debug API */
|
|
220
260
|
dumpSummary(): routes.lodestar.StateCacheItem[];
|
|
221
261
|
getStates(): IterableIterator<IBeaconStateView>;
|
|
@@ -264,7 +304,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
264
304
|
*/
|
|
265
305
|
private deleteAllEpochItems;
|
|
266
306
|
/**
|
|
267
|
-
*
|
|
307
|
+
* Legacy flat-window on-disk pruning, used only when a `maxEpochsOnDisk` is configured.
|
|
268
308
|
* Note that this should handle all possible errors and not throw.
|
|
269
309
|
*/
|
|
270
310
|
private prunePersistedStates;
|
|
@@ -275,6 +315,8 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
|
|
|
275
315
|
* This is 2x - 3x faster than allocating memory every time.
|
|
276
316
|
*/
|
|
277
317
|
private serializeStateValidators;
|
|
318
|
+
/** Tiered pruning is active with the default `Infinity` on-disk cap; a finite cap uses the flat path */
|
|
319
|
+
private get isTieredMode();
|
|
278
320
|
}
|
|
279
321
|
export declare function toCheckpointHex(checkpoint: phase0.Checkpoint): CheckpointHex;
|
|
280
322
|
export declare function toCheckpointKey(cp: CheckpointHex): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentCheckpointsCache.d.ts","sourceRoot":"","sources":["../../../src/chain/stateCache/persistentCheckpointsCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,gBAAgB,EAA0B,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,MAAM,EAA2C,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAc,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,gBAAgB,EAAE,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAC,eAAe,EAAiB,aAAa,EAAE,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAE/F,MAAM,MAAM,kCAAkC,GAAG;IAC/C,kEAAkE;IAClE,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC
|
|
1
|
+
{"version":3,"file":"persistentCheckpointsCache.d.ts","sourceRoot":"","sources":["../../../src/chain/stateCache/persistentCheckpointsCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,6 +69,17 @@ export const DEFAULT_MAX_CP_STATE_EPOCHS_IN_MEMORY = 3;
|
|
|
69
69
|
* and instead require a resync from last finalized checkpoint state which could be very far in the past.
|
|
70
70
|
*/
|
|
71
71
|
export const DEFAULT_MAX_CP_STATE_ON_DISK = Infinity;
|
|
72
|
+
// CP_STATE_TIER_BASE = spacing multiplier per tier AND per-tier capacity. Deciding capacity == base
|
|
73
|
+
// so that a full tier[n] always holds exactly ONE epoch aligned to tier[n+1]
|
|
74
|
+
// given tier[n] has span = 16 ^ n and tier[n+1] has span = 16 ^ (n+1)
|
|
75
|
+
// why 16?
|
|
76
|
+
// - tier 0 is the dense hot-regen window; it must exceed regen's MAX_EPOCH_TO_PROCESS (=5).
|
|
77
|
+
// - with a full 4 tiers = 64 epochs, we can cover ~ a year of continuous non-finality, and it'll grow very slowly after that
|
|
78
|
+
// - tier0 spans 16 epochs ≈ 1.7h, this is more than enough to handle reorg
|
|
79
|
+
// - tier1 spans 256 epochs ≈ 1.1d, ie we store 16 epochs of the previous day
|
|
80
|
+
// - tier2 spans 4096 epochs ≈ 18d, ie we store 16 epochs of the last ~2.5 weeks
|
|
81
|
+
// - tier3 spans 65536ep ≈ 291d, ie we store 16 epochs of the last 0.8 year
|
|
82
|
+
export const CP_STATE_TIER_BASE = 16;
|
|
72
83
|
// TODO GLOAS: re-evaluate this timing
|
|
73
84
|
const PROCESS_CHECKPOINT_STATES_BPS = 6667;
|
|
74
85
|
/**
|
|
@@ -116,6 +127,19 @@ export class PersistentCheckpointStateCache {
|
|
|
116
127
|
preComputedCheckpointHits = null;
|
|
117
128
|
maxEpochsInMemory;
|
|
118
129
|
maxEpochsOnDisk;
|
|
130
|
+
/**
|
|
131
|
+
* Persist checkpoint states (epoch + root) by tiers
|
|
132
|
+
*
|
|
133
|
+
* ╔═════════ tier 2 ══════════╦═══════ tier 1 ═══════╦═══ tier 0 (dense) ══╗
|
|
134
|
+
* finalizedEpoch -> ║ keep 1 epoch per 256 ║ keep 1 epoch per 16 ║ keep every epoch ║ -> head
|
|
135
|
+
* ║ x·······x·······x······ ║ x···x···x···x··· ║ xxxxxxxxxxxxxxxxx ║
|
|
136
|
+
* ╚═══════════════════════════╩══════════════════════╩═════════════════════╝
|
|
137
|
+
*
|
|
138
|
+
* starting from tier 1, all epochs must be aligned to the finalized epoch
|
|
139
|
+
*/
|
|
140
|
+
persistentTiers = [new Map()];
|
|
141
|
+
finalizedEpoch = 0;
|
|
142
|
+
justifiedEpoch = 0;
|
|
119
143
|
datastore;
|
|
120
144
|
blockStateCache;
|
|
121
145
|
bufferPool;
|
|
@@ -144,6 +168,13 @@ export class PersistentCheckpointStateCache {
|
|
|
144
168
|
metrics.cpStateCache.size.set({ type: CacheItemType.inMemory }, inMemoryCount);
|
|
145
169
|
metrics.cpStateCache.epochSize.set({ type: CacheItemType.persisted }, persistentEpochs.size);
|
|
146
170
|
metrics.cpStateCache.epochSize.set({ type: CacheItemType.inMemory }, memoryEpochs.size);
|
|
171
|
+
for (let tier = 0; tier < this.persistentTiers.length; tier++) {
|
|
172
|
+
let states = 0;
|
|
173
|
+
for (const roots of this.persistentTiers[tier].values())
|
|
174
|
+
states += roots.size;
|
|
175
|
+
metrics.cpStateCache.persistentTierEpochs.set({ tier }, this.persistentTiers[tier].size);
|
|
176
|
+
metrics.cpStateCache.persistentTierStates.set({ tier }, states);
|
|
177
|
+
}
|
|
147
178
|
});
|
|
148
179
|
}
|
|
149
180
|
this.logger = logger;
|
|
@@ -386,10 +417,74 @@ export class PersistentCheckpointStateCache {
|
|
|
386
417
|
return previousHits;
|
|
387
418
|
}
|
|
388
419
|
/**
|
|
389
|
-
* This is
|
|
420
|
+
* This is called on every checkpoint event to refresh the pinned finalized/justified epochs.
|
|
421
|
+
*/
|
|
422
|
+
onCheckpoint(finalizedEpoch, justifiedEpoch) {
|
|
423
|
+
this.finalizedEpoch = finalizedEpoch;
|
|
424
|
+
this.justifiedEpoch = justifiedEpoch;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* This is called right after we persist a checkpoint state.
|
|
428
|
+
*/
|
|
429
|
+
async onPersist(epoch, rootHex) {
|
|
430
|
+
let roots = this.persistentTiers[0].get(epoch);
|
|
431
|
+
if (roots === undefined) {
|
|
432
|
+
roots = new Set();
|
|
433
|
+
this.persistentTiers[0].set(epoch, roots);
|
|
434
|
+
}
|
|
435
|
+
roots.add(rootHex);
|
|
436
|
+
await this.prunePersistentTier(0);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* When tier `n` overflows (> CP_STATE_TIER_BASE epochs), evict its oldest epoch and either promote it to tier `n + 1` (if aligned there) or delete it.
|
|
440
|
+
*
|
|
441
|
+
* before: persistentTiers[n] = { ..., e_old }
|
|
442
|
+
* persistentTiers[n+1] = { ... }
|
|
443
|
+
*
|
|
444
|
+
* after, if e_old aligns to n+1: | after, if e_old does NOT align to n+1:
|
|
445
|
+
* persistentTiers[n] = { ... } | persistentTiers[n] = { ... }
|
|
446
|
+
* persistentTiers[n+1] = { ..., e_old } | e_old and all its roots deleted from disk
|
|
447
|
+
*
|
|
448
|
+
* Since pruning a tier[n] may push an item at tier[n+1], we must call the function recursively.
|
|
449
|
+
*/
|
|
450
|
+
async prunePersistentTier(tier) {
|
|
451
|
+
const tierMap = this.persistentTiers[tier];
|
|
452
|
+
while (tierMap.size > CP_STATE_TIER_BASE) {
|
|
453
|
+
// Evict the oldest epoch, but never the pinned justified epoch
|
|
454
|
+
const oldestEpoch = Math.min(...Array.from(tierMap.keys()).filter((epoch) => epoch !== this.justifiedEpoch));
|
|
455
|
+
const roots = tierMap.get(oldestEpoch);
|
|
456
|
+
tierMap.delete(oldestEpoch);
|
|
457
|
+
const rootHexes = Array.from(roots).join(",");
|
|
458
|
+
// `>= finalizedEpoch` guards the transient window where an epoch below the (fork-choice)
|
|
459
|
+
// finalized epoch has not yet been removed by pruneFinalized: its offset would be negative
|
|
460
|
+
// and JS `%` could spuriously report it as aligned. Such epochs are stale -> delete.
|
|
461
|
+
if (oldestEpoch >= this.finalizedEpoch && this.alignedForTier(oldestEpoch, tier + 1)) {
|
|
462
|
+
if (this.persistentTiers[tier + 1] === undefined) {
|
|
463
|
+
this.persistentTiers[tier + 1] = new Map();
|
|
464
|
+
}
|
|
465
|
+
this.persistentTiers[tier + 1].set(oldestEpoch, roots);
|
|
466
|
+
this.logger.verbose("Migrated persistent checkpoint states to lower tier", {
|
|
467
|
+
epoch: oldestEpoch,
|
|
468
|
+
fromTier: tier,
|
|
469
|
+
toTier: tier + 1,
|
|
470
|
+
rootHexes,
|
|
471
|
+
});
|
|
472
|
+
await this.prunePersistentTier(tier + 1);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
// the oldest epoch is not aligned to the next tier
|
|
476
|
+
await this.deleteAllEpochItems(oldestEpoch)
|
|
477
|
+
.then(() => this.logger.verbose("Pruned checkpoint states from disk", { epoch: oldestEpoch, tier, rootHexes }))
|
|
478
|
+
.catch((e) => this.logger.debug("Error delete all epoch items", { epoch: oldestEpoch, tier }, e));
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Starting from tier[1], it must be aligned to the finalized epoch
|
|
484
|
+
* ie given finalized epoch F, tier[n] only epochs of F + n*16, n = 1,2,3...
|
|
390
485
|
*/
|
|
391
|
-
|
|
392
|
-
|
|
486
|
+
alignedForTier(epoch, tier) {
|
|
487
|
+
return (epoch - this.finalizedEpoch) % CP_STATE_TIER_BASE ** tier === 0;
|
|
393
488
|
}
|
|
394
489
|
/**
|
|
395
490
|
* Prune all checkpoint states before the provided finalized epoch.
|
|
@@ -559,9 +654,10 @@ export class PersistentCheckpointStateCache {
|
|
|
559
654
|
this.logger.verbose("Reload: use default block state as seed state", { stateSlot: seedBlockState.slot, ...logCtx });
|
|
560
655
|
return seedBlockState;
|
|
561
656
|
}
|
|
562
|
-
clear() {
|
|
563
|
-
|
|
564
|
-
this.epochIndex.
|
|
657
|
+
async clear() {
|
|
658
|
+
// deleteAllEpochItems removes every root of an epoch from disk and clears the cache
|
|
659
|
+
await Promise.all(Array.from(this.epochIndex.keys()).map((epoch) => this.deleteAllEpochItems(epoch).catch((e) => this.logger.debug("Error delete all epoch items on clear", { epoch }, e))));
|
|
660
|
+
this.persistentTiers = [new Map()];
|
|
565
661
|
}
|
|
566
662
|
/** ONLY FOR DEBUGGING PURPOSES. For lodestar debug API */
|
|
567
663
|
dumpSummary() {
|
|
@@ -685,6 +781,9 @@ export class PersistentCheckpointStateCache {
|
|
|
685
781
|
}
|
|
686
782
|
// overwrite cpKey, this means the state is deleted from memory
|
|
687
783
|
this.cache.set(cpKey, { type: CacheItemType.persisted, value: persistedKey });
|
|
784
|
+
if (this.isTieredMode) {
|
|
785
|
+
await this.onPersist(epoch, rootHex);
|
|
786
|
+
}
|
|
688
787
|
}
|
|
689
788
|
else {
|
|
690
789
|
if (persistedKey) {
|
|
@@ -692,6 +791,9 @@ export class PersistentCheckpointStateCache {
|
|
|
692
791
|
// this also means the state is deleted from memory
|
|
693
792
|
this.cache.set(cpKey, { type: CacheItemType.persisted, value: persistedKey });
|
|
694
793
|
// do not update epochIndex
|
|
794
|
+
if (this.isTieredMode) {
|
|
795
|
+
await this.onPersist(epoch, rootHex);
|
|
796
|
+
}
|
|
695
797
|
}
|
|
696
798
|
else {
|
|
697
799
|
// delete the state from memory
|
|
@@ -731,6 +833,10 @@ export class PersistentCheckpointStateCache {
|
|
|
731
833
|
this.cache.delete(key);
|
|
732
834
|
}
|
|
733
835
|
this.epochIndex.delete(epoch);
|
|
836
|
+
// keep the on-disk retention tiers in sync so they never drift from epochIndex
|
|
837
|
+
for (const tierMap of this.persistentTiers) {
|
|
838
|
+
tierMap.delete(epoch);
|
|
839
|
+
}
|
|
734
840
|
this.logger.verbose("Pruned checkpoint states for epoch", {
|
|
735
841
|
epoch,
|
|
736
842
|
persistCount,
|
|
@@ -738,7 +844,7 @@ export class PersistentCheckpointStateCache {
|
|
|
738
844
|
});
|
|
739
845
|
}
|
|
740
846
|
/**
|
|
741
|
-
*
|
|
847
|
+
* Legacy flat-window on-disk pruning, used only when a `maxEpochsOnDisk` is configured.
|
|
742
848
|
* Note that this should handle all possible errors and not throw.
|
|
743
849
|
*/
|
|
744
850
|
prunePersistedStates() {
|
|
@@ -773,6 +879,10 @@ export class PersistentCheckpointStateCache {
|
|
|
773
879
|
}
|
|
774
880
|
return null;
|
|
775
881
|
}
|
|
882
|
+
/** Tiered pruning is active with the default `Infinity` on-disk cap; a finite cap uses the flat path */
|
|
883
|
+
get isTieredMode() {
|
|
884
|
+
return this.maxEpochsOnDisk === Infinity;
|
|
885
|
+
}
|
|
776
886
|
}
|
|
777
887
|
export function toCheckpointHex(checkpoint) {
|
|
778
888
|
return {
|