@lodestar/beacon-node 1.23.0-dev.bb40ef7eb7 → 1.23.0-dev.be0d971386
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.js +15 -19
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/blocks/utils.js +1 -1
- package/lib/api/impl/beacon/blocks/utils.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +13 -23
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts +1 -1
- package/lib/api/impl/beacon/state/index.js +45 -5
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -6
- package/lib/api/impl/beacon/state/utils.js +24 -36
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/config/constants.d.ts +0 -1
- package/lib/api/impl/config/constants.js +1 -3
- package/lib/api/impl/config/constants.js.map +1 -1
- package/lib/api/impl/debug/index.js +30 -0
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/errors.d.ts +8 -0
- package/lib/api/impl/errors.js +7 -0
- package/lib/api/impl/errors.js.map +1 -1
- package/lib/api/impl/events/index.js +1 -2
- package/lib/api/impl/events/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.js +3 -3
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/node/index.js +2 -4
- package/lib/api/impl/node/index.js.map +1 -1
- package/lib/api/impl/node/utils.js +1 -0
- package/lib/api/impl/node/utils.js.map +1 -1
- package/lib/api/impl/validator/index.js +95 -87
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/rest/activeSockets.js +1 -1
- package/lib/api/rest/activeSockets.js.map +1 -1
- package/lib/api/rest/base.d.ts +1 -0
- package/lib/api/rest/base.js +31 -4
- package/lib/api/rest/base.js.map +1 -1
- package/lib/api/rest/index.js +1 -0
- package/lib/api/rest/index.js.map +1 -1
- package/lib/api/rest/swaggerUI.js +1 -4
- package/lib/api/rest/swaggerUI.js.map +1 -1
- package/lib/chain/archiver/archiveStates.d.ts +3 -2
- package/lib/chain/archiver/archiveStates.js +8 -4
- package/lib/chain/archiver/archiveStates.js.map +1 -1
- package/lib/chain/archiver/index.d.ts +3 -1
- package/lib/chain/archiver/index.js +3 -2
- package/lib/chain/archiver/index.js.map +1 -1
- package/lib/chain/balancesCache.js +1 -1
- package/lib/chain/balancesCache.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +2 -7
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/index.js +3 -5
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +2 -2
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +2 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +5 -13
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +3 -3
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/poolSize.js +1 -1
- package/lib/chain/bls/multithread/poolSize.js.map +1 -1
- package/lib/chain/bls/multithread/worker.js +1 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/chain.d.ts +4 -42
- package/lib/chain/chain.js +50 -44
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +1 -1
- package/lib/chain/emitter.js +1 -1
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +4 -0
- package/lib/chain/forkChoice/index.js +6 -2
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/genesis/genesis.js +2 -6
- package/lib/chain/genesis/genesis.js.map +1 -1
- package/lib/chain/historicalState/getHistoricalState.d.ts +2 -1
- package/lib/chain/historicalState/getHistoricalState.js +3 -0
- package/lib/chain/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/historicalState/worker.js +1 -1
- package/lib/chain/historicalState/worker.js.map +1 -1
- package/lib/chain/initState.d.ts +2 -6
- package/lib/chain/initState.js +3 -31
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +4 -2
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/lightClient/index.js +3 -5
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +32 -36
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.js +3 -5
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/opPool.js +2 -4
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +3 -5
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +2 -4
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/options.js +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.js +2 -1
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +18 -17
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.js +1 -1
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/rewards/attestationsRewards.d.ts +1 -1
- package/lib/chain/rewards/attestationsRewards.js +3 -2
- package/lib/chain/rewards/attestationsRewards.js.map +1 -1
- package/lib/chain/rewards/blockRewards.js +1 -3
- package/lib/chain/rewards/blockRewards.js.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.js +1 -3
- package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +21 -25
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/serializeState.js +63 -10
- package/lib/chain/serializeState.js.map +1 -1
- package/lib/chain/shufflingCache.d.ts +37 -13
- package/lib/chain/shufflingCache.js +88 -79
- package/lib/chain/shufflingCache.js.map +1 -1
- package/lib/chain/stateCache/datastore/file.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +7 -2
- package/lib/chain/stateCache/fifoBlockStateCache.js +7 -2
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +4 -3
- package/lib/chain/stateCache/persistentCheckpointsCache.js +26 -29
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.d.ts +1 -1
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts +3 -17
- package/lib/chain/validation/attestation.js +28 -53
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts +1 -1
- package/lib/chain/validation/blsToExecutionChange.d.ts +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.js +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.d.ts +1 -1
- package/lib/chain/validation/voluntaryExit.d.ts +1 -1
- package/lib/db/buckets.js +3 -5
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/repositories/backfilledRanges.d.ts +1 -1
- package/lib/db/repositories/backfilledRanges.js +1 -2
- package/lib/db/repositories/backfilledRanges.js.map +1 -1
- package/lib/db/repositories/blockArchive.js +1 -1
- package/lib/db/repositories/blockArchive.js.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.js +1 -1
- package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
- package/lib/db/repositories/checkpointState.js +0 -1
- package/lib/db/repositories/checkpointState.js.map +1 -1
- package/lib/db/repositories/depositDataRoot.d.ts +1 -1
- package/lib/db/repositories/depositDataRoot.js +2 -3
- package/lib/db/repositories/depositDataRoot.js.map +1 -1
- package/lib/db/repositories/eth1Data.d.ts +1 -1
- package/lib/db/repositories/eth1Data.js +1 -2
- package/lib/db/repositories/eth1Data.js.map +1 -1
- package/lib/db/repositories/stateArchive.js +1 -1
- package/lib/db/repositories/stateArchive.js.map +1 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts +1 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.js +1 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.js.map +1 -1
- package/lib/eth1/eth1DataCache.js +1 -1
- package/lib/eth1/eth1DataCache.js.map +1 -1
- package/lib/eth1/eth1DepositDataTracker.js +9 -13
- package/lib/eth1/eth1DepositDataTracker.js.map +1 -1
- package/lib/eth1/eth1DepositsCache.js +2 -2
- package/lib/eth1/eth1DepositsCache.js.map +1 -1
- package/lib/eth1/eth1MergeBlockTracker.js +40 -50
- package/lib/eth1/eth1MergeBlockTracker.js.map +1 -1
- package/lib/eth1/index.js +4 -8
- package/lib/eth1/index.js.map +1 -1
- package/lib/eth1/provider/eth1Provider.js.map +1 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts +1 -1
- package/lib/eth1/provider/jsonRpcHttpClient.js +6 -12
- package/lib/eth1/provider/jsonRpcHttpClient.js.map +1 -1
- package/lib/eth1/provider/jwt.js +0 -1
- package/lib/eth1/provider/jwt.js.map +1 -1
- package/lib/eth1/provider/utils.js +1 -1
- package/lib/eth1/provider/utils.js.map +1 -1
- package/lib/eth1/utils/deposits.js +1 -1
- package/lib/eth1/utils/deposits.js.map +1 -1
- package/lib/eth1/utils/eth1Vote.js +3 -5
- package/lib/eth1/utils/eth1Vote.js.map +1 -1
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.js +1 -3
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.js.map +1 -1
- package/lib/execution/builder/http.js +6 -1
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/index.js +1 -0
- package/lib/execution/builder/index.js.map +1 -1
- package/lib/execution/engine/http.d.ts +5 -4
- package/lib/execution/engine/http.js +31 -18
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.js +1 -0
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +5 -4
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.js +8 -13
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +0 -17
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/types.d.ts +29 -25
- package/lib/execution/engine/types.js +28 -42
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.js +1 -1
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +1 -1
- package/lib/metrics/metrics/beacon.js +3 -4
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +13 -4
- package/lib/metrics/metrics/lodestar.js +43 -20
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/validatorMonitor.js +37 -49
- package/lib/metrics/validatorMonitor.js.map +1 -1
- package/lib/monitoring/properties.js +2 -4
- package/lib/monitoring/properties.js.map +1 -1
- package/lib/monitoring/service.js +3 -5
- package/lib/monitoring/service.js.map +1 -1
- package/lib/monitoring/system.js +0 -1
- package/lib/monitoring/system.js.map +1 -1
- package/lib/network/core/metrics.js +0 -2
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +3 -3
- package/lib/network/core/networkCore.js +16 -5
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +5 -4
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -2
- package/lib/network/core/networkCoreWorkerHandler.js +4 -4
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +1 -1
- package/lib/network/discv5/index.d.ts +3 -4
- package/lib/network/discv5/index.js +5 -6
- package/lib/network/discv5/index.js.map +1 -1
- package/lib/network/discv5/types.d.ts +1 -1
- package/lib/network/discv5/worker.js +7 -7
- package/lib/network/discv5/worker.js.map +1 -1
- package/lib/network/events.js +1 -1
- package/lib/network/events.js.map +1 -1
- package/lib/network/forks.js +0 -1
- package/lib/network/forks.js.map +1 -1
- package/lib/network/gossip/encoding.js +1 -3
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/gossip/gossipsub.js +10 -7
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -6
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/metrics.js +0 -1
- package/lib/network/gossip/metrics.js.map +1 -1
- package/lib/network/gossip/scoringParameters.js +0 -1
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +0 -27
- package/lib/network/gossip/topic.js +3 -4
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +3 -2
- package/lib/network/libp2p/index.d.ts +2 -2
- package/lib/network/libp2p/index.js +9 -9
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +4 -4
- package/lib/network/network.js +7 -5
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.js +0 -2
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/datastore.d.ts +2 -1
- package/lib/network/peers/datastore.js +2 -3
- package/lib/network/peers/datastore.js.map +1 -1
- package/lib/network/peers/discover.d.ts +2 -0
- package/lib/network/peers/discover.js +10 -16
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +2 -1
- package/lib/network/peers/peerManager.js +11 -8
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/getConnectedPeerIds.js +2 -2
- package/lib/network/peers/utils/getConnectedPeerIds.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts +0 -2
- package/lib/network/processor/gossipHandlers.js +15 -62
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts +1 -1
- package/lib/network/processor/gossipQueues/index.js +7 -22
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipQueues/indexed.js +1 -3
- package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
- package/lib/network/processor/gossipQueues/linear.js +5 -7
- package/lib/network/processor/gossipQueues/linear.js.map +1 -1
- package/lib/network/processor/gossipQueues/types.d.ts +1 -2
- package/lib/network/processor/gossipQueues/types.js +0 -6
- package/lib/network/processor/gossipQueues/types.js.map +1 -1
- package/lib/network/processor/index.js +4 -2
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +5 -5
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/lightClientBootstrap.js +1 -3
- package/lib/network/reqresp/handlers/lightClientBootstrap.js.map +1 -1
- package/lib/network/reqresp/handlers/lightClientFinalityUpdate.js +6 -8
- package/lib/network/reqresp/handlers/lightClientFinalityUpdate.js.map +1 -1
- package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.js +6 -8
- package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.js.map +1 -1
- package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js +1 -3
- package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js.map +1 -1
- package/lib/network/reqresp/protocols.js +0 -1
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +1 -1
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.js +0 -1
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.js +3 -7
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/util.d.ts +4 -1
- package/lib/network/util.js +2 -2
- package/lib/network/util.js.map +1 -1
- package/lib/node/nodejs.d.ts +3 -3
- package/lib/node/nodejs.js +3 -3
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.js +16 -26
- package/lib/node/notifier.js.map +1 -1
- package/lib/node/utils/interop/state.js +1 -0
- package/lib/node/utils/interop/state.js.map +1 -1
- package/lib/node/utils/state.d.ts +3 -0
- package/lib/node/utils/state.js +3 -0
- package/lib/node/utils/state.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts +2 -2
- package/lib/sync/backfill/backfill.js +5 -4
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/range/range.d.ts +1 -1
- package/lib/sync/range/range.js +3 -7
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/batches.js +1 -3
- package/lib/sync/range/utils/batches.js.map +1 -1
- package/lib/sync/sync.js +24 -24
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.js +2 -6
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/remoteSyncType.js +25 -36
- package/lib/sync/utils/remoteSyncType.js.map +1 -1
- package/lib/util/asyncIterableToEvents.js +0 -2
- package/lib/util/asyncIterableToEvents.js.map +1 -1
- package/lib/util/binarySearch.js +1 -1
- package/lib/util/binarySearch.js.map +1 -1
- package/lib/util/bitArray.js +1 -2
- package/lib/util/bitArray.js.map +1 -1
- package/lib/util/kzg.js +1 -4
- package/lib/util/kzg.js.map +1 -1
- package/lib/util/map.js +0 -1
- package/lib/util/map.js.map +1 -1
- package/lib/util/peerId.js +1 -1
- package/lib/util/peerId.js.map +1 -1
- package/lib/util/profile.js +1 -1
- package/lib/util/profile.js.map +1 -1
- package/lib/util/queue/errors.d.ts +0 -1
- package/lib/util/queue/errors.js +0 -3
- package/lib/util/queue/errors.js.map +1 -1
- package/lib/util/queue/fnQueue.js +1 -1
- package/lib/util/queue/fnQueue.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/package.json +39 -39
- package/lib/network/processor/gossipQueues/indexedAvgTime.d.ts +0 -31
- package/lib/network/processor/gossipQueues/indexedAvgTime.js +0 -115
- package/lib/network/processor/gossipQueues/indexedAvgTime.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BeaconStateAllForks, EpochShuffling, IShufflingCache, ShufflingBuildProps } from "@lodestar/state-transition";
|
|
2
2
|
import { Epoch, RootHex } from "@lodestar/types";
|
|
3
|
+
import { LodestarError, Logger } from "@lodestar/utils";
|
|
3
4
|
import { Metrics } from "../metrics/metrics.js";
|
|
4
5
|
export type ShufflingCacheOpts = {
|
|
5
6
|
maxShufflingCacheEpochs?: number;
|
|
@@ -10,31 +11,54 @@ export type ShufflingCacheOpts = {
|
|
|
10
11
|
* - if a shuffling is not available (which does not happen with default chain option of maxSkipSlots = 32), track a promise to make sure we don't compute the same shuffling twice
|
|
11
12
|
* - skip computing shuffling when loading state bytes from disk
|
|
12
13
|
*/
|
|
13
|
-
export declare class ShufflingCache {
|
|
14
|
-
|
|
14
|
+
export declare class ShufflingCache implements IShufflingCache {
|
|
15
|
+
readonly metrics: Metrics | null;
|
|
16
|
+
readonly logger: Logger | null;
|
|
15
17
|
/** LRU cache implemented as a map, pruned every time we add an item */
|
|
16
18
|
private readonly itemsByDecisionRootByEpoch;
|
|
17
19
|
private readonly maxEpochs;
|
|
18
|
-
constructor(metrics?: Metrics | null, opts?: ShufflingCacheOpts
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
processState(state: CachedBeaconStateAllForks, shufflingEpoch: Epoch): EpochShuffling;
|
|
20
|
+
constructor(metrics?: Metrics | null, logger?: Logger | null, opts?: ShufflingCacheOpts, precalculatedShufflings?: {
|
|
21
|
+
shuffling: EpochShuffling | null;
|
|
22
|
+
decisionRoot: RootHex;
|
|
23
|
+
}[]);
|
|
23
24
|
/**
|
|
24
25
|
* Insert a promise to make sure we don't regen state for the same shuffling.
|
|
25
26
|
* Bound by MAX_SHUFFLING_PROMISE to make sure our node does not blow up.
|
|
26
27
|
*/
|
|
27
|
-
insertPromise(
|
|
28
|
+
insertPromise(epoch: Epoch, decisionRoot: RootHex): void;
|
|
28
29
|
/**
|
|
29
30
|
* Most of the time, this should return a shuffling immediately.
|
|
30
31
|
* If there's a promise, it means we are computing the same shuffling, so we wait for the promise to resolve.
|
|
31
32
|
* Return null if we don't have a shuffling for this epoch and dependentRootHex.
|
|
32
33
|
*/
|
|
33
|
-
get(
|
|
34
|
+
get(epoch: Epoch, decisionRoot: RootHex): Promise<EpochShuffling | null>;
|
|
34
35
|
/**
|
|
35
|
-
*
|
|
36
|
+
* Gets a cached shuffling via the epoch and decision root. If the shuffling is not
|
|
37
|
+
* available it will build it synchronously and return the shuffling.
|
|
38
|
+
*
|
|
39
|
+
* NOTE: If a shuffling is already queued and not calculated it will build and resolve
|
|
40
|
+
* the promise but the already queued build will happen at some later time
|
|
36
41
|
*/
|
|
37
|
-
getSync(
|
|
38
|
-
|
|
42
|
+
getSync<T extends ShufflingBuildProps | undefined>(epoch: Epoch, decisionRoot: RootHex, buildProps?: T): T extends ShufflingBuildProps ? EpochShuffling : EpochShuffling | null;
|
|
43
|
+
/**
|
|
44
|
+
* Queue asynchronous build for an EpochShuffling, triggered from state-transition
|
|
45
|
+
*/
|
|
46
|
+
build(epoch: number, decisionRoot: string, state: BeaconStateAllForks, activeIndices: Uint32Array): void;
|
|
47
|
+
/**
|
|
48
|
+
* Add an EpochShuffling to the ShufflingCache. If a promise for the shuffling is present it will
|
|
49
|
+
* resolve the promise with the built shuffling
|
|
50
|
+
*/
|
|
51
|
+
private set;
|
|
52
|
+
}
|
|
53
|
+
export declare enum ShufflingCacheErrorCode {
|
|
54
|
+
NO_SHUFFLING_FOUND = "SHUFFLING_CACHE_ERROR_NO_SHUFFLING_FOUND"
|
|
55
|
+
}
|
|
56
|
+
type ShufflingCacheErrorType = {
|
|
57
|
+
code: ShufflingCacheErrorCode.NO_SHUFFLING_FOUND;
|
|
58
|
+
epoch: Epoch;
|
|
59
|
+
decisionRoot: RootHex;
|
|
60
|
+
};
|
|
61
|
+
export declare class ShufflingCacheError extends LodestarError<ShufflingCacheErrorType> {
|
|
39
62
|
}
|
|
63
|
+
export {};
|
|
40
64
|
//# sourceMappingURL=shufflingCache.d.ts.map
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { MapDef, pruneSetToMax, toRootHex } from "@lodestar/utils";
|
|
4
|
-
import { GENESIS_SLOT } from "@lodestar/params";
|
|
5
|
-
import { computeAnchorCheckpoint } from "./initState.js";
|
|
1
|
+
import { computeEpochShuffling, computeEpochShufflingAsync, } from "@lodestar/state-transition";
|
|
2
|
+
import { LodestarError, MapDef, pruneSetToMax } from "@lodestar/utils";
|
|
6
3
|
/**
|
|
7
4
|
* Same value to CheckpointBalancesCache, with the assumption that we don't have to use it for old epochs. In the worse case:
|
|
8
5
|
* - when loading state bytes from disk, we need to compute shuffling for all epochs (~1s as of Sep 2023)
|
|
@@ -27,71 +24,31 @@ var CacheItemType;
|
|
|
27
24
|
* - skip computing shuffling when loading state bytes from disk
|
|
28
25
|
*/
|
|
29
26
|
export class ShufflingCache {
|
|
30
|
-
constructor(metrics = null, opts = {}) {
|
|
27
|
+
constructor(metrics = null, logger = null, opts = {}, precalculatedShufflings) {
|
|
31
28
|
this.metrics = metrics;
|
|
29
|
+
this.logger = logger;
|
|
32
30
|
/** LRU cache implemented as a map, pruned every time we add an item */
|
|
33
31
|
this.itemsByDecisionRootByEpoch = new MapDef(() => new Map());
|
|
34
32
|
if (metrics) {
|
|
35
33
|
metrics.shufflingCache.size.addCollect(() => metrics.shufflingCache.size.set(Array.from(this.itemsByDecisionRootByEpoch.values()).reduce((total, innerMap) => total + innerMap.size, 0)));
|
|
36
34
|
}
|
|
37
35
|
this.maxEpochs = opts.maxShufflingCacheEpochs ?? MAX_EPOCHS;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
*/
|
|
42
|
-
processState(state, shufflingEpoch) {
|
|
43
|
-
const decisionBlockHex = getDecisionBlock(state, shufflingEpoch);
|
|
44
|
-
let shuffling;
|
|
45
|
-
switch (shufflingEpoch) {
|
|
46
|
-
case state.epochCtx.nextShuffling.epoch:
|
|
47
|
-
shuffling = state.epochCtx.nextShuffling;
|
|
48
|
-
break;
|
|
49
|
-
case state.epochCtx.currentShuffling.epoch:
|
|
50
|
-
shuffling = state.epochCtx.currentShuffling;
|
|
51
|
-
break;
|
|
52
|
-
case state.epochCtx.previousShuffling.epoch:
|
|
53
|
-
shuffling = state.epochCtx.previousShuffling;
|
|
54
|
-
break;
|
|
55
|
-
default:
|
|
56
|
-
throw new Error(`Shuffling not found from state ${state.slot} for epoch ${shufflingEpoch}`);
|
|
57
|
-
}
|
|
58
|
-
let cacheItem = this.itemsByDecisionRootByEpoch.getOrDefault(shufflingEpoch).get(decisionBlockHex);
|
|
59
|
-
if (cacheItem !== undefined) {
|
|
60
|
-
// update existing promise
|
|
61
|
-
if (isPromiseCacheItem(cacheItem)) {
|
|
62
|
-
// unblock consumers of this promise
|
|
63
|
-
cacheItem.resolveFn(shuffling);
|
|
64
|
-
// then update item type to shuffling
|
|
65
|
-
cacheItem = {
|
|
66
|
-
type: CacheItemType.shuffling,
|
|
67
|
-
shuffling,
|
|
68
|
-
};
|
|
69
|
-
this.add(shufflingEpoch, decisionBlockHex, cacheItem);
|
|
70
|
-
// we updated type to CacheItemType.shuffling so the above fields are not used anyway
|
|
71
|
-
this.metrics?.shufflingCache.processStateUpdatePromise.inc();
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
// ShufflingCacheItem, do nothing
|
|
75
|
-
this.metrics?.shufflingCache.processStateNoOp.inc();
|
|
36
|
+
precalculatedShufflings?.map(({ shuffling, decisionRoot }) => {
|
|
37
|
+
if (shuffling !== null) {
|
|
38
|
+
this.set(shuffling, decisionRoot);
|
|
76
39
|
}
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
// not found, new shuffling
|
|
80
|
-
this.add(shufflingEpoch, decisionBlockHex, { type: CacheItemType.shuffling, shuffling });
|
|
81
|
-
this.metrics?.shufflingCache.processStateInsertNew.inc();
|
|
82
|
-
}
|
|
83
|
-
return shuffling;
|
|
40
|
+
});
|
|
84
41
|
}
|
|
85
42
|
/**
|
|
86
43
|
* Insert a promise to make sure we don't regen state for the same shuffling.
|
|
87
44
|
* Bound by MAX_SHUFFLING_PROMISE to make sure our node does not blow up.
|
|
88
45
|
*/
|
|
89
|
-
insertPromise(
|
|
46
|
+
insertPromise(epoch, decisionRoot) {
|
|
90
47
|
const promiseCount = Array.from(this.itemsByDecisionRootByEpoch.values())
|
|
91
48
|
.flatMap((innerMap) => Array.from(innerMap.values()))
|
|
92
49
|
.filter((item) => isPromiseCacheItem(item)).length;
|
|
93
50
|
if (promiseCount >= MAX_PROMISES) {
|
|
94
|
-
throw new Error(`Too many shuffling promises: ${promiseCount}, shufflingEpoch: ${
|
|
51
|
+
throw new Error(`Too many shuffling promises: ${promiseCount}, shufflingEpoch: ${epoch}, decisionRootHex: ${decisionRoot}`);
|
|
95
52
|
}
|
|
96
53
|
let resolveFn = null;
|
|
97
54
|
const promise = new Promise((resolve) => {
|
|
@@ -102,10 +59,11 @@ export class ShufflingCache {
|
|
|
102
59
|
}
|
|
103
60
|
const cacheItem = {
|
|
104
61
|
type: CacheItemType.promise,
|
|
62
|
+
timeInsertedMs: Date.now(),
|
|
105
63
|
promise,
|
|
106
64
|
resolveFn,
|
|
107
65
|
};
|
|
108
|
-
this.
|
|
66
|
+
this.itemsByDecisionRootByEpoch.getOrDefault(epoch).set(decisionRoot, cacheItem);
|
|
109
67
|
this.metrics?.shufflingCache.insertPromiseCount.inc();
|
|
110
68
|
}
|
|
111
69
|
/**
|
|
@@ -113,35 +71,90 @@ export class ShufflingCache {
|
|
|
113
71
|
* If there's a promise, it means we are computing the same shuffling, so we wait for the promise to resolve.
|
|
114
72
|
* Return null if we don't have a shuffling for this epoch and dependentRootHex.
|
|
115
73
|
*/
|
|
116
|
-
async get(
|
|
117
|
-
const cacheItem = this.itemsByDecisionRootByEpoch.getOrDefault(
|
|
74
|
+
async get(epoch, decisionRoot) {
|
|
75
|
+
const cacheItem = this.itemsByDecisionRootByEpoch.getOrDefault(epoch).get(decisionRoot);
|
|
118
76
|
if (cacheItem === undefined) {
|
|
77
|
+
this.metrics?.shufflingCache.miss.inc();
|
|
119
78
|
return null;
|
|
120
79
|
}
|
|
121
80
|
if (isShufflingCacheItem(cacheItem)) {
|
|
81
|
+
this.metrics?.shufflingCache.hit.inc();
|
|
122
82
|
return cacheItem.shuffling;
|
|
123
83
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
return cacheItem.promise;
|
|
127
|
-
}
|
|
84
|
+
this.metrics?.shufflingCache.shufflingPromiseNotResolved.inc();
|
|
85
|
+
return cacheItem.promise;
|
|
128
86
|
}
|
|
129
87
|
/**
|
|
130
|
-
*
|
|
88
|
+
* Gets a cached shuffling via the epoch and decision root. If the shuffling is not
|
|
89
|
+
* available it will build it synchronously and return the shuffling.
|
|
90
|
+
*
|
|
91
|
+
* NOTE: If a shuffling is already queued and not calculated it will build and resolve
|
|
92
|
+
* the promise but the already queued build will happen at some later time
|
|
131
93
|
*/
|
|
132
|
-
getSync(
|
|
133
|
-
const cacheItem = this.itemsByDecisionRootByEpoch.getOrDefault(
|
|
134
|
-
if (cacheItem
|
|
135
|
-
|
|
94
|
+
getSync(epoch, decisionRoot, buildProps) {
|
|
95
|
+
const cacheItem = this.itemsByDecisionRootByEpoch.getOrDefault(epoch).get(decisionRoot);
|
|
96
|
+
if (!cacheItem) {
|
|
97
|
+
this.metrics?.shufflingCache.miss.inc();
|
|
136
98
|
}
|
|
137
|
-
if (isShufflingCacheItem(cacheItem)) {
|
|
99
|
+
else if (isShufflingCacheItem(cacheItem)) {
|
|
100
|
+
this.metrics?.shufflingCache.hit.inc();
|
|
138
101
|
return cacheItem.shuffling;
|
|
139
102
|
}
|
|
140
|
-
|
|
141
|
-
|
|
103
|
+
else if (buildProps) {
|
|
104
|
+
// TODO: (@matthewkeil) This should possible log a warning??
|
|
105
|
+
this.metrics?.shufflingCache.shufflingPromiseNotResolvedAndThrownAway.inc();
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.metrics?.shufflingCache.shufflingPromiseNotResolved.inc();
|
|
109
|
+
}
|
|
110
|
+
let shuffling = null;
|
|
111
|
+
if (buildProps) {
|
|
112
|
+
const timer = this.metrics?.shufflingCache.shufflingCalculationTime.startTimer({ source: "getSync" });
|
|
113
|
+
shuffling = computeEpochShuffling(buildProps.state, buildProps.activeIndices, epoch);
|
|
114
|
+
timer?.();
|
|
115
|
+
this.set(shuffling, decisionRoot);
|
|
116
|
+
}
|
|
117
|
+
return shuffling;
|
|
142
118
|
}
|
|
143
|
-
|
|
144
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Queue asynchronous build for an EpochShuffling, triggered from state-transition
|
|
121
|
+
*/
|
|
122
|
+
build(epoch, decisionRoot, state, activeIndices) {
|
|
123
|
+
this.insertPromise(epoch, decisionRoot);
|
|
124
|
+
/**
|
|
125
|
+
* TODO: (@matthewkeil) This will get replaced by a proper build queue and a worker to do calculations
|
|
126
|
+
* on a NICE thread
|
|
127
|
+
*/
|
|
128
|
+
const timer = this.metrics?.shufflingCache.shufflingCalculationTime.startTimer({ source: "build" });
|
|
129
|
+
computeEpochShufflingAsync(state, activeIndices, epoch)
|
|
130
|
+
.then((shuffling) => {
|
|
131
|
+
this.set(shuffling, decisionRoot);
|
|
132
|
+
})
|
|
133
|
+
.catch((err) => this.logger?.error(`error building shuffling for epoch ${epoch} at decisionRoot ${decisionRoot}`, {}, err))
|
|
134
|
+
.finally(() => {
|
|
135
|
+
timer?.();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Add an EpochShuffling to the ShufflingCache. If a promise for the shuffling is present it will
|
|
140
|
+
* resolve the promise with the built shuffling
|
|
141
|
+
*/
|
|
142
|
+
set(shuffling, decisionRoot) {
|
|
143
|
+
const shufflingAtEpoch = this.itemsByDecisionRootByEpoch.getOrDefault(shuffling.epoch);
|
|
144
|
+
// if a pending shuffling promise exists, resolve it
|
|
145
|
+
const cacheItem = shufflingAtEpoch.get(decisionRoot);
|
|
146
|
+
if (cacheItem) {
|
|
147
|
+
if (isPromiseCacheItem(cacheItem)) {
|
|
148
|
+
cacheItem.resolveFn(shuffling);
|
|
149
|
+
this.metrics?.shufflingCache.shufflingPromiseResolutionTime.observe((Date.now() - cacheItem.timeInsertedMs) / 1000);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.metrics?.shufflingCache.shufflingBuiltMultipleTimes.inc();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// set the shuffling
|
|
156
|
+
shufflingAtEpoch.set(decisionRoot, { type: CacheItemType.shuffling, shuffling });
|
|
157
|
+
// prune the cache
|
|
145
158
|
pruneSetToMax(this.itemsByDecisionRootByEpoch, this.maxEpochs);
|
|
146
159
|
}
|
|
147
160
|
}
|
|
@@ -151,14 +164,10 @@ function isShufflingCacheItem(item) {
|
|
|
151
164
|
function isPromiseCacheItem(item) {
|
|
152
165
|
return item.type === CacheItemType.promise;
|
|
153
166
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
function getDecisionBlock(state, epoch) {
|
|
160
|
-
return state.slot > GENESIS_SLOT
|
|
161
|
-
? getShufflingDecisionBlock(state, epoch)
|
|
162
|
-
: toRootHex(ssz.phase0.BeaconBlockHeader.hashTreeRoot(computeAnchorCheckpoint(state.config, state).blockHeader));
|
|
167
|
+
export var ShufflingCacheErrorCode;
|
|
168
|
+
(function (ShufflingCacheErrorCode) {
|
|
169
|
+
ShufflingCacheErrorCode["NO_SHUFFLING_FOUND"] = "SHUFFLING_CACHE_ERROR_NO_SHUFFLING_FOUND";
|
|
170
|
+
})(ShufflingCacheErrorCode || (ShufflingCacheErrorCode = {}));
|
|
171
|
+
export class ShufflingCacheError extends LodestarError {
|
|
163
172
|
}
|
|
164
173
|
//# sourceMappingURL=shufflingCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shufflingCache.js","sourceRoot":"","sources":["../../src/chain/shufflingCache.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"shufflingCache.js","sourceRoot":"","sources":["../../src/chain/shufflingCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../../src/chain/stateCache/datastore/file.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAS,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAGtG,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AACrD,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAEvC;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAG/B,YAAY,
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../../src/chain/stateCache/datastore/file.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAS,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAGtG,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AACrD,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAEvC;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAG/B,YAAY,SAAS,GAAG,GAAG;QACzB,+DAA+D;QAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,aAAa;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAwB,EAAE,UAAsB;QAC1D,MAAM,oBAAoB,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACzE,MAAM,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5C,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,oBAAkC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACzE,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,oBAAkC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACzE,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvD,OAAO,SAAS;aACb,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,2BAA2B,CAAC;aAClG,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -8,9 +8,14 @@ export type FIFOBlockStateCacheOpts = {
|
|
|
8
8
|
maxBlockStates?: number;
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Given `maxSkipSlots` = 32 and `DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE` = 32, lodestar doesn't need to
|
|
12
|
+
* reload states in order to process a gossip block.
|
|
13
|
+
*
|
|
14
|
+
* |-----------------------------------------------|-----------------------------------------------|
|
|
15
|
+
* maxSkipSlots DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE ^
|
|
16
|
+
* clock slot
|
|
12
17
|
*/
|
|
13
|
-
export declare const DEFAULT_MAX_BLOCK_STATES =
|
|
18
|
+
export declare const DEFAULT_MAX_BLOCK_STATES = 64;
|
|
14
19
|
/**
|
|
15
20
|
* New implementation of BlockStateCache that keeps the most recent n states consistently
|
|
16
21
|
* - Maintain a linked list (FIFO) with special handling for head state, which is always the first item in the list
|
|
@@ -2,9 +2,14 @@ import { toRootHex } from "@lodestar/utils";
|
|
|
2
2
|
import { LinkedList } from "../../util/array.js";
|
|
3
3
|
import { MapTracker } from "./mapMetrics.js";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Given `maxSkipSlots` = 32 and `DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE` = 32, lodestar doesn't need to
|
|
6
|
+
* reload states in order to process a gossip block.
|
|
7
|
+
*
|
|
8
|
+
* |-----------------------------------------------|-----------------------------------------------|
|
|
9
|
+
* maxSkipSlots DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE ^
|
|
10
|
+
* clock slot
|
|
6
11
|
*/
|
|
7
|
-
export const DEFAULT_MAX_BLOCK_STATES =
|
|
12
|
+
export const DEFAULT_MAX_BLOCK_STATES = 64;
|
|
8
13
|
/**
|
|
9
14
|
* New implementation of BlockStateCache that keeps the most recent n states consistently
|
|
10
15
|
* - Maintain a linked list (FIFO) with special handling for head state, which is always the first item in the list
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAO3C
|
|
1
|
+
{"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,10 +30,11 @@ type LoadedStateBytesData = {
|
|
|
30
30
|
stateBytes: Uint8Array;
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
|
-
* Before n-historical states, lodestar keeps
|
|
34
|
-
* Since
|
|
33
|
+
* Before n-historical states, lodestar keeps all checkpoint states since finalized
|
|
34
|
+
* Since Sep 2024, lodestar stores 3 most recent checkpoint states in memory and the rest on disk. The finalized state
|
|
35
|
+
* may not be available in memory, and stay on disk instead.
|
|
35
36
|
*/
|
|
36
|
-
export declare const DEFAULT_MAX_CP_STATE_EPOCHS_IN_MEMORY =
|
|
37
|
+
export declare const DEFAULT_MAX_CP_STATE_EPOCHS_IN_MEMORY = 3;
|
|
37
38
|
/**
|
|
38
39
|
* An implementation of CheckpointStateCache that keep up to n epoch checkpoint states in memory and persist the rest to disk
|
|
39
40
|
* - If it's more than `maxEpochsInMemory` epochs old, it will persist n last epochs to disk based on the view of the block
|
|
@@ -53,10 +53,11 @@ import { MapTracker } from "./mapMetrics.js";
|
|
|
53
53
|
import { datastoreKeyToCheckpoint } from "./datastore/index.js";
|
|
54
54
|
import { CacheItemType } from "./types.js";
|
|
55
55
|
/**
|
|
56
|
-
* Before n-historical states, lodestar keeps
|
|
57
|
-
* Since
|
|
56
|
+
* Before n-historical states, lodestar keeps all checkpoint states since finalized
|
|
57
|
+
* Since Sep 2024, lodestar stores 3 most recent checkpoint states in memory and the rest on disk. The finalized state
|
|
58
|
+
* may not be available in memory, and stay on disk instead.
|
|
58
59
|
*/
|
|
59
|
-
export const DEFAULT_MAX_CP_STATE_EPOCHS_IN_MEMORY =
|
|
60
|
+
export const DEFAULT_MAX_CP_STATE_EPOCHS_IN_MEMORY = 3;
|
|
60
61
|
/**
|
|
61
62
|
* An implementation of CheckpointStateCache that keep up to n epoch checkpoint states in memory and persist the rest to disk
|
|
62
63
|
* - If it's more than `maxEpochsInMemory` epochs old, it will persist n last epochs to disk based on the view of the block
|
|
@@ -97,7 +98,7 @@ export class PersistentCheckpointStateCache {
|
|
|
97
98
|
this.preComputedCheckpointHits = null;
|
|
98
99
|
this.cache = new MapTracker(metrics?.cpStateCache);
|
|
99
100
|
if (metrics) {
|
|
100
|
-
this.metrics = metrics
|
|
101
|
+
this.metrics = metrics;
|
|
101
102
|
metrics.cpStateCache.size.addCollect(() => {
|
|
102
103
|
let persistCount = 0;
|
|
103
104
|
let inMemoryCount = 0;
|
|
@@ -167,34 +168,26 @@ export class PersistentCheckpointStateCache {
|
|
|
167
168
|
const { persistedKey, stateBytes } = stateOrStateBytesData;
|
|
168
169
|
const logMeta = { persistedKey: toHex(persistedKey) };
|
|
169
170
|
this.logger.debug("Reload: read state successful", logMeta);
|
|
170
|
-
this.metrics?.stateReloadSecFromSlot.observe(this.clock?.secFromSlot(this.clock?.currentSlot ?? 0) ?? 0);
|
|
171
|
+
this.metrics?.cpStateCache.stateReloadSecFromSlot.observe(this.clock?.secFromSlot(this.clock?.currentSlot ?? 0) ?? 0);
|
|
171
172
|
const seedState = this.findSeedStateToReload(cp);
|
|
172
|
-
this.metrics?.stateReloadEpochDiff.observe(Math.abs(seedState.epochCtx.epoch - cp.epoch));
|
|
173
|
+
this.metrics?.cpStateCache.stateReloadEpochDiff.observe(Math.abs(seedState.epochCtx.epoch - cp.epoch));
|
|
173
174
|
this.logger.debug("Reload: found seed state", { ...logMeta, seedSlot: seedState.slot });
|
|
174
175
|
try {
|
|
175
176
|
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
176
177
|
try {
|
|
177
178
|
// 80% of validators serialization time comes from memory allocation, this is to avoid it
|
|
178
|
-
const sszTimer = this.metrics?.stateReloadValidatorsSerializeDuration.startTimer();
|
|
179
|
+
const sszTimer = this.metrics?.cpStateCache.stateReloadValidatorsSerializeDuration.startTimer();
|
|
179
180
|
// automatically free the buffer pool after this scope
|
|
180
181
|
const validatorsBytesWithKey = __addDisposableResource(env_1, this.serializeStateValidators(seedState), false);
|
|
181
182
|
let validatorsBytes = validatorsBytesWithKey?.buffer;
|
|
182
183
|
if (validatorsBytes == null) {
|
|
183
184
|
// fallback logic in case we can't use the buffer pool
|
|
184
|
-
this.metrics?.stateReloadValidatorsSerializeAllocCount.inc();
|
|
185
|
+
this.metrics?.cpStateCache.stateReloadValidatorsSerializeAllocCount.inc();
|
|
185
186
|
validatorsBytes = seedState.validators.serialize();
|
|
186
187
|
}
|
|
187
188
|
sszTimer?.();
|
|
188
|
-
const timer = this.metrics?.stateReloadDuration.startTimer();
|
|
189
|
-
const newCachedState = loadCachedBeaconState(seedState, stateBytes, {
|
|
190
|
-
shufflingGetter: (shufflingEpoch, decisionRootHex) => {
|
|
191
|
-
const shuffling = this.shufflingCache.getSync(shufflingEpoch, decisionRootHex);
|
|
192
|
-
if (shuffling == null) {
|
|
193
|
-
this.metrics?.stateReloadShufflingCacheMiss.inc();
|
|
194
|
-
}
|
|
195
|
-
return shuffling;
|
|
196
|
-
},
|
|
197
|
-
}, validatorsBytes);
|
|
189
|
+
const timer = this.metrics?.cpStateCache.stateReloadDuration.startTimer();
|
|
190
|
+
const newCachedState = loadCachedBeaconState(seedState, stateBytes, {}, validatorsBytes);
|
|
198
191
|
newCachedState.commit();
|
|
199
192
|
const stateRoot = toRootHex(newCachedState.hashTreeRoot());
|
|
200
193
|
timer?.();
|
|
@@ -256,7 +249,7 @@ export class PersistentCheckpointStateCache {
|
|
|
256
249
|
throw new Error("Expected persistent key");
|
|
257
250
|
}
|
|
258
251
|
const persistedKey = cacheItem.value;
|
|
259
|
-
const dbReadTimer = this.metrics?.stateReloadDbReadTime.startTimer();
|
|
252
|
+
const dbReadTimer = this.metrics?.cpStateCache.stateReloadDbReadTime.startTimer();
|
|
260
253
|
const stateBytes = await this.datastore.read(persistedKey);
|
|
261
254
|
dbReadTimer?.();
|
|
262
255
|
if (stateBytes === null) {
|
|
@@ -268,19 +261,19 @@ export class PersistentCheckpointStateCache {
|
|
|
268
261
|
* Similar to get() api without reloading from disk
|
|
269
262
|
*/
|
|
270
263
|
get(cpOrKey, opts) {
|
|
271
|
-
this.metrics?.lookups.inc();
|
|
264
|
+
this.metrics?.cpStateCache.lookups.inc();
|
|
272
265
|
const cpKey = typeof cpOrKey === "string" ? cpOrKey : toCacheKey(cpOrKey);
|
|
273
266
|
const cacheItem = this.cache.get(cpKey);
|
|
274
267
|
if (cacheItem === undefined) {
|
|
275
268
|
return null;
|
|
276
269
|
}
|
|
277
|
-
this.metrics?.hits.inc();
|
|
270
|
+
this.metrics?.cpStateCache.hits.inc();
|
|
278
271
|
if (cpKey === this.preComputedCheckpoint) {
|
|
279
272
|
this.preComputedCheckpointHits = (this.preComputedCheckpointHits ?? 0) + 1;
|
|
280
273
|
}
|
|
281
274
|
if (isInMemoryCacheItem(cacheItem)) {
|
|
282
275
|
const { state } = cacheItem;
|
|
283
|
-
this.metrics?.stateClonedCount.observe(state.clonedCount);
|
|
276
|
+
this.metrics?.cpStateCache.stateClonedCount.observe(state.clonedCount);
|
|
284
277
|
return state.clone(opts?.dontTransferCache);
|
|
285
278
|
}
|
|
286
279
|
return null;
|
|
@@ -292,7 +285,7 @@ export class PersistentCheckpointStateCache {
|
|
|
292
285
|
const cpHex = toCheckpointHex(cp);
|
|
293
286
|
const key = toCacheKey(cpHex);
|
|
294
287
|
const cacheItem = this.cache.get(key);
|
|
295
|
-
this.metrics?.adds.inc();
|
|
288
|
+
this.metrics?.cpStateCache.adds.inc();
|
|
296
289
|
if (cacheItem !== undefined && isPersistedCacheItem(cacheItem)) {
|
|
297
290
|
const persistedKey = cacheItem.value;
|
|
298
291
|
// was persisted to disk, set back to memory
|
|
@@ -622,7 +615,7 @@ export class PersistentCheckpointStateCache {
|
|
|
622
615
|
}
|
|
623
616
|
else {
|
|
624
617
|
// persist and do not update epochIndex
|
|
625
|
-
this.metrics?.statePersistSecFromSlot.observe(this.clock?.secFromSlot(this.clock?.currentSlot ?? 0) ?? 0);
|
|
618
|
+
this.metrics?.cpStateCache.statePersistSecFromSlot.observe(this.clock?.secFromSlot(this.clock?.currentSlot ?? 0) ?? 0);
|
|
626
619
|
const cpPersist = { epoch: epoch, root: fromHex(rootHex) };
|
|
627
620
|
// It's not sustainable to allocate ~240MB for each state every epoch, so we use buffer pool to reuse the memory.
|
|
628
621
|
// As monitored on holesky as of Jan 2024:
|
|
@@ -630,9 +623,13 @@ export class PersistentCheckpointStateCache {
|
|
|
630
623
|
// - It helps stabilize persist time and save ~300ms in average (1.5s vs 1.2s)
|
|
631
624
|
// - It also helps the state reload to save ~500ms in average (4.3s vs 3.8s)
|
|
632
625
|
// - Also `serializeState.test.ts` perf test shows a lot of differences allocating ~240MB once vs per state serialization
|
|
633
|
-
const timer = this.metrics?.stateSerializeDuration.startTimer(
|
|
634
|
-
|
|
635
|
-
|
|
626
|
+
const timer = this.metrics?.stateSerializeDuration.startTimer({
|
|
627
|
+
source: AllocSource.PERSISTENT_CHECKPOINTS_CACHE_STATE,
|
|
628
|
+
});
|
|
629
|
+
persistedKey = await serializeState(state, AllocSource.PERSISTENT_CHECKPOINTS_CACHE_STATE, (stateBytes) => {
|
|
630
|
+
timer?.();
|
|
631
|
+
return this.datastore.write(cpPersist, stateBytes);
|
|
632
|
+
}, this.bufferPool);
|
|
636
633
|
persistCount++;
|
|
637
634
|
this.logger.verbose("Pruned checkpoint state from memory and persisted to disk", {
|
|
638
635
|
...logMeta,
|
|
@@ -654,7 +651,7 @@ export class PersistentCheckpointStateCache {
|
|
|
654
651
|
this.cache.delete(cpKey);
|
|
655
652
|
this.epochIndex.get(epoch)?.delete(rootHex);
|
|
656
653
|
}
|
|
657
|
-
this.metrics?.statePruneFromMemoryCount.inc();
|
|
654
|
+
this.metrics?.cpStateCache.statePruneFromMemoryCount.inc();
|
|
658
655
|
this.logger.verbose("Pruned checkpoint state from memory", logMeta);
|
|
659
656
|
}
|
|
660
657
|
}
|
|
@@ -675,7 +672,7 @@ export class PersistentCheckpointStateCache {
|
|
|
675
672
|
if (persistedKey) {
|
|
676
673
|
await this.datastore.remove(persistedKey);
|
|
677
674
|
persistCount++;
|
|
678
|
-
this.metrics?.persistedStateRemoveCount.inc();
|
|
675
|
+
this.metrics?.cpStateCache.persistedStateRemoveCount.inc();
|
|
679
676
|
}
|
|
680
677
|
}
|
|
681
678
|
this.cache.delete(key);
|