@lodestar/beacon-node 1.35.0-dev.83de5b8dea → 1.35.0-dev.8689cc3545
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/api.d.ts.map +1 -0
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/blocks/utils.d.ts.map +1 -0
- package/lib/api/impl/beacon/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/rewards/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -0
- package/lib/api/impl/config/constants.d.ts.map +1 -0
- package/lib/api/impl/config/index.d.ts.map +1 -0
- package/lib/api/impl/debug/index.d.ts.map +1 -0
- package/lib/api/impl/errors.d.ts.map +1 -0
- package/lib/api/impl/events/index.d.ts.map +1 -0
- package/lib/api/impl/index.d.ts.map +1 -0
- package/lib/api/impl/lightclient/index.d.ts.map +1 -0
- package/lib/api/impl/lodestar/index.d.ts.map +1 -0
- package/lib/api/impl/node/index.d.ts.map +1 -0
- package/lib/api/impl/node/utils.d.ts.map +1 -0
- package/lib/api/impl/proof/index.d.ts.map +1 -0
- package/lib/api/impl/types.d.ts.map +1 -0
- package/lib/api/impl/utils.d.ts.map +1 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -0
- package/lib/api/impl/validator/utils.d.ts.map +1 -0
- package/lib/api/index.d.ts.map +1 -0
- package/lib/api/options.d.ts.map +1 -0
- package/lib/api/rest/activeSockets.d.ts.map +1 -0
- package/lib/api/rest/base.d.ts.map +1 -0
- package/lib/api/rest/index.d.ts.map +1 -0
- package/lib/api/rest/swaggerUI.d.ts.map +1 -0
- package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +1 -0
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -0
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -0
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -0
- package/lib/chain/archiveStore/constants.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/worker.d.ts.map +1 -0
- package/lib/chain/archiveStore/index.d.ts.map +1 -0
- package/lib/chain/archiveStore/interface.d.ts.map +1 -0
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +1 -0
- package/lib/chain/balancesCache.d.ts.map +1 -0
- package/lib/chain/beaconProposerCache.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/index.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/utils.d.ts.map +1 -0
- package/lib/chain/blocks/importBlock.d.ts.map +1 -0
- package/lib/chain/blocks/index.d.ts.map +1 -0
- package/lib/chain/blocks/types.d.ts.map +1 -0
- package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -0
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -0
- package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/ownBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/zebraBanner.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -0
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -0
- package/lib/chain/bls/index.d.ts.map +1 -0
- package/lib/chain/bls/interface.d.ts.map +1 -0
- package/lib/chain/bls/maybeBatch.d.ts.map +1 -0
- package/lib/chain/bls/multithread/index.d.ts.map +1 -0
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -0
- package/lib/chain/bls/multithread/poolSize.d.ts.map +1 -0
- package/lib/chain/bls/multithread/types.d.ts.map +1 -0
- package/lib/chain/bls/multithread/utils.d.ts.map +1 -0
- package/lib/chain/bls/multithread/worker.d.ts.map +1 -0
- package/lib/chain/bls/singleThread.d.ts.map +1 -0
- package/lib/chain/bls/utils.d.ts.map +1 -0
- package/lib/chain/chain.d.ts.map +1 -0
- package/lib/chain/emitter.d.ts.map +1 -0
- package/lib/chain/errors/attestationError.d.ts.map +1 -0
- package/lib/chain/errors/attesterSlashingError.d.ts.map +1 -0
- package/lib/chain/errors/blobSidecarError.d.ts.map +1 -0
- package/lib/chain/errors/blockError.d.ts.map +1 -0
- package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +1 -0
- package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -0
- package/lib/chain/errors/gossipValidation.d.ts.map +1 -0
- package/lib/chain/errors/index.d.ts.map +1 -0
- package/lib/chain/errors/lightClientError.d.ts.map +1 -0
- package/lib/chain/errors/proposerSlashingError.d.ts.map +1 -0
- package/lib/chain/errors/syncCommitteeError.d.ts.map +1 -0
- package/lib/chain/errors/voluntaryExitError.d.ts.map +1 -0
- package/lib/chain/forkChoice/index.d.ts.map +1 -0
- package/lib/chain/genesis/genesis.d.ts.map +1 -0
- package/lib/chain/genesis/interface.d.ts.map +1 -0
- package/lib/chain/index.d.ts.map +1 -0
- package/lib/chain/initState.d.ts.map +1 -0
- package/lib/chain/interface.d.ts.map +1 -0
- package/lib/chain/lightClient/index.d.ts.map +1 -0
- package/lib/chain/lightClient/proofs.d.ts.map +1 -0
- package/lib/chain/lightClient/types.d.ts.map +1 -0
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -0
- package/lib/chain/opPools/opPool.d.ts.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -0
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -0
- package/lib/chain/opPools/types.d.ts.map +1 -0
- package/lib/chain/opPools/utils.d.ts.map +1 -0
- package/lib/chain/options.d.ts.map +1 -0
- package/lib/chain/prepareNextSlot.d.ts.map +1 -0
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -0
- package/lib/chain/produceBlock/index.d.ts.map +1 -0
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -0
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +1 -0
- package/lib/chain/regen/errors.d.ts.map +1 -0
- package/lib/chain/regen/index.d.ts.map +1 -0
- package/lib/chain/regen/interface.d.ts.map +1 -0
- package/lib/chain/regen/queued.d.ts.map +1 -0
- package/lib/chain/regen/regen.d.ts.map +1 -0
- package/lib/chain/reprocess.d.ts.map +1 -0
- package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -0
- package/lib/chain/rewards/blockRewards.d.ts.map +1 -0
- package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -0
- package/lib/chain/seenCache/index.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAttestationData.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -0
- package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +1 -0
- package/lib/chain/seenCache/seenBlockProposers.d.ts.map +1 -0
- package/lib/chain/seenCache/seenCommittee.d.ts.map +1 -0
- package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +1 -0
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -0
- package/lib/chain/serializeState.d.ts.map +1 -0
- package/lib/chain/shufflingCache.d.ts.map +1 -0
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/db.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/file.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/index.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/types.d.ts.map +1 -0
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -0
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -0
- package/lib/chain/stateCache/index.d.ts.map +1 -0
- package/lib/chain/stateCache/mapMetrics.d.ts.map +1 -0
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -0
- package/lib/chain/stateCache/types.d.ts.map +1 -0
- package/lib/chain/validation/aggregateAndProof.d.ts.map +1 -0
- package/lib/chain/validation/attestation.d.ts.map +1 -0
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -0
- package/lib/chain/validation/blobSidecar.d.ts.map +1 -0
- package/lib/chain/validation/block.d.ts.map +1 -0
- package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -0
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -0
- package/lib/chain/validation/index.d.ts.map +1 -0
- package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +1 -0
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +1 -0
- package/lib/chain/validation/proposerSlashing.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/index.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -0
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -0
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -0
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -0
- package/lib/chain/validatorMonitor.d.ts.map +1 -0
- package/lib/constants/constants.d.ts.map +1 -0
- package/lib/constants/index.d.ts.map +1 -0
- package/lib/constants/network.d.ts.map +1 -0
- package/lib/db/beacon.d.ts.map +1 -0
- package/lib/db/buckets.d.ts.map +1 -0
- package/lib/db/index.d.ts.map +1 -0
- package/lib/db/interface.d.ts.map +1 -0
- package/lib/db/options.d.ts.map +1 -0
- package/lib/db/repositories/attesterSlashing.d.ts.map +1 -0
- package/lib/db/repositories/backfilledRanges.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecarsArchive.d.ts.map +1 -0
- package/lib/db/repositories/block.d.ts.map +1 -0
- package/lib/db/repositories/blockArchive.d.ts.map +1 -0
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -0
- package/lib/db/repositories/blsToExecutionChange.d.ts.map +1 -0
- package/lib/db/repositories/checkpointState.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -0
- package/lib/db/repositories/depositDataRoot.d.ts.map +1 -0
- package/lib/db/repositories/depositEvent.d.ts.map +1 -0
- package/lib/db/repositories/eth1Data.d.ts.map +1 -0
- package/lib/db/repositories/index.d.ts.map +1 -0
- package/lib/db/repositories/lightclientBestUpdate.d.ts.map +1 -0
- package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +1 -0
- package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +1 -0
- package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +1 -0
- package/lib/db/repositories/proposerSlashing.d.ts.map +1 -0
- package/lib/db/repositories/stateArchive.d.ts.map +1 -0
- package/lib/db/repositories/stateArchiveIndex.d.ts.map +1 -0
- package/lib/db/repositories/voluntaryExit.d.ts.map +1 -0
- package/lib/db/single/index.d.ts.map +1 -0
- package/lib/db/single/preGenesisState.d.ts.map +1 -0
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +1 -0
- package/lib/eth1/errors.d.ts.map +1 -0
- package/lib/eth1/eth1DataCache.d.ts.map +1 -0
- package/lib/eth1/eth1DepositDataTracker.d.ts.map +1 -0
- package/lib/eth1/eth1DepositsCache.d.ts.map +1 -0
- package/lib/eth1/eth1MergeBlockTracker.d.ts.map +1 -0
- package/lib/eth1/index.d.ts.map +1 -0
- package/lib/eth1/interface.d.ts.map +1 -0
- package/lib/eth1/options.d.ts.map +1 -0
- package/lib/eth1/provider/eth1Provider.d.ts.map +1 -0
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +1 -0
- package/lib/eth1/provider/jwt.d.ts.map +1 -0
- package/lib/eth1/provider/utils.d.ts.map +1 -0
- package/lib/eth1/stream.d.ts.map +1 -0
- package/lib/eth1/utils/depositContract.d.ts.map +1 -0
- package/lib/eth1/utils/deposits.d.ts.map +1 -0
- package/lib/eth1/utils/eth1Data.d.ts.map +1 -0
- package/lib/eth1/utils/eth1DepositEvent.d.ts.map +1 -0
- package/lib/eth1/utils/eth1Vote.d.ts.map +1 -0
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +1 -0
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +1 -0
- package/lib/execution/builder/cache.d.ts.map +1 -0
- package/lib/execution/builder/http.d.ts.map +1 -0
- package/lib/execution/builder/index.d.ts.map +1 -0
- package/lib/execution/builder/interface.d.ts.map +1 -0
- package/lib/execution/builder/utils.d.ts.map +1 -0
- package/lib/execution/engine/disabled.d.ts.map +1 -0
- package/lib/execution/engine/http.d.ts.map +1 -0
- package/lib/execution/engine/index.d.ts.map +1 -0
- package/lib/execution/engine/interface.d.ts.map +1 -0
- package/lib/execution/engine/mock.d.ts.map +1 -0
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -0
- package/lib/execution/engine/types.d.ts.map +1 -0
- package/lib/execution/engine/utils.d.ts.map +1 -0
- package/lib/execution/index.d.ts.map +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/metrics/index.d.ts.map +1 -0
- package/lib/metrics/metrics/beacon.d.ts.map +1 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -0
- package/lib/metrics/metrics.d.ts.map +1 -0
- package/lib/metrics/nodeJsMetrics.d.ts.map +1 -0
- package/lib/metrics/options.d.ts.map +1 -0
- package/lib/metrics/server/http.d.ts.map +1 -0
- package/lib/metrics/server/index.d.ts.map +1 -0
- package/lib/metrics/utils/avgMinMax.d.ts.map +1 -0
- package/lib/metrics/utils/gauge.d.ts.map +1 -0
- package/lib/metrics/utils/registryMetricCreator.d.ts.map +1 -0
- package/lib/monitoring/clientStats.d.ts.map +1 -0
- package/lib/monitoring/index.d.ts.map +1 -0
- package/lib/monitoring/options.d.ts.map +1 -0
- package/lib/monitoring/properties.d.ts.map +1 -0
- package/lib/monitoring/service.d.ts.map +1 -0
- package/lib/monitoring/system.d.ts.map +1 -0
- package/lib/monitoring/types.d.ts.map +1 -0
- package/lib/network/core/events.d.ts.map +1 -0
- package/lib/network/core/index.d.ts.map +1 -0
- package/lib/network/core/metrics.d.ts.map +1 -0
- package/lib/network/core/networkCore.d.ts.map +1 -0
- package/lib/network/core/networkCoreWorker.d.ts.map +1 -0
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -0
- package/lib/network/core/types.d.ts.map +1 -0
- package/lib/network/discv5/index.d.ts.map +1 -0
- package/lib/network/discv5/types.d.ts.map +1 -0
- package/lib/network/discv5/utils.d.ts.map +1 -0
- package/lib/network/discv5/worker.d.ts.map +1 -0
- package/lib/network/events.d.ts.map +1 -0
- package/lib/network/forks.d.ts.map +1 -0
- package/lib/network/gossip/constants.d.ts.map +1 -0
- package/lib/network/gossip/encoding.d.ts.map +1 -0
- package/lib/network/gossip/errors.d.ts.map +1 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -0
- package/lib/network/gossip/index.d.ts.map +1 -0
- package/lib/network/gossip/interface.d.ts.map +1 -0
- package/lib/network/gossip/metrics.d.ts.map +1 -0
- package/lib/network/gossip/scoringParameters.d.ts.map +1 -0
- package/lib/network/gossip/topic.d.ts.map +1 -0
- package/lib/network/index.d.ts.map +1 -0
- package/lib/network/interface.d.ts.map +1 -0
- package/lib/network/libp2p/error.d.ts.map +1 -0
- package/lib/network/libp2p/index.d.ts.map +1 -0
- package/lib/network/metadata.d.ts.map +1 -0
- package/lib/network/network.d.ts.map +1 -0
- package/lib/network/networkConfig.d.ts.map +1 -0
- package/lib/network/options.d.ts.map +1 -0
- package/lib/network/peers/client.d.ts.map +1 -0
- package/lib/network/peers/datastore.d.ts.map +1 -0
- package/lib/network/peers/discover.d.ts.map +1 -0
- package/lib/network/peers/index.d.ts.map +1 -0
- package/lib/network/peers/peerManager.d.ts.map +1 -0
- package/lib/network/peers/peersData.d.ts.map +1 -0
- package/lib/network/peers/score/constants.d.ts.map +1 -0
- package/lib/network/peers/score/index.d.ts.map +1 -0
- package/lib/network/peers/score/interface.d.ts.map +1 -0
- package/lib/network/peers/score/score.d.ts.map +1 -0
- package/lib/network/peers/score/store.d.ts.map +1 -0
- package/lib/network/peers/score/utils.d.ts.map +1 -0
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -0
- package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -0
- package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +1 -0
- package/lib/network/peers/utils/index.d.ts.map +1 -0
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -0
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -0
- package/lib/network/processor/aggregatorTracker.d.ts.map +1 -0
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -0
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/linear.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/types.d.ts.map +1 -0
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -0
- package/lib/network/processor/index.d.ts.map +1 -0
- package/lib/network/processor/types.d.ts.map +1 -0
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +1 -0
- package/lib/network/reqresp/index.d.ts.map +1 -0
- package/lib/network/reqresp/interface.d.ts.map +1 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -0
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -0
- package/lib/network/reqresp/score.d.ts.map +1 -0
- package/lib/network/reqresp/types.d.ts.map +1 -0
- package/lib/network/reqresp/utils/collect.d.ts.map +1 -0
- package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +1 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -0
- package/lib/network/statusCache.d.ts.map +1 -0
- package/lib/network/subnets/attnetsService.d.ts.map +1 -0
- package/lib/network/subnets/index.d.ts.map +1 -0
- package/lib/network/subnets/interface.d.ts.map +1 -0
- package/lib/network/subnets/syncnetsService.d.ts.map +1 -0
- package/lib/network/subnets/util.d.ts.map +1 -0
- package/lib/network/util.d.ts.map +1 -0
- package/lib/node/index.d.ts.map +1 -0
- package/lib/node/nodejs.d.ts.map +1 -0
- package/lib/node/notifier.d.ts.map +1 -0
- package/lib/node/options.d.ts.map +1 -0
- package/lib/node/utils/interop/deposits.d.ts.map +1 -0
- package/lib/node/utils/interop/state.d.ts.map +1 -0
- package/lib/node/utils/lightclient.d.ts.map +1 -0
- package/lib/node/utils/state.d.ts.map +1 -0
- package/lib/sync/backfill/backfill.d.ts.map +1 -0
- package/lib/sync/backfill/errors.d.ts.map +1 -0
- package/lib/sync/backfill/index.d.ts.map +1 -0
- package/lib/sync/backfill/verify.d.ts.map +1 -0
- package/lib/sync/constants.d.ts.map +1 -0
- package/lib/sync/index.d.ts.map +1 -0
- package/lib/sync/interface.d.ts.map +1 -0
- package/lib/sync/options.d.ts.map +1 -0
- package/lib/sync/range/batch.d.ts.map +1 -0
- package/lib/sync/range/chain.d.ts.map +1 -0
- package/lib/sync/range/range.d.ts.map +1 -0
- package/lib/sync/range/utils/batches.d.ts.map +1 -0
- package/lib/sync/range/utils/chainTarget.d.ts.map +1 -0
- package/lib/sync/range/utils/hashBlocks.d.ts.map +1 -0
- package/lib/sync/range/utils/index.d.ts.map +1 -0
- package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -0
- package/lib/sync/range/utils/updateChains.d.ts.map +1 -0
- package/lib/sync/sync.d.ts.map +1 -0
- package/lib/sync/types.d.ts.map +1 -0
- package/lib/sync/unknownBlock.d.ts.map +1 -0
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -0
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -0
- package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -0
- package/lib/sync/utils/remoteSyncType.d.ts.map +1 -0
- package/lib/util/address.d.ts.map +1 -0
- package/lib/util/array.d.ts.map +1 -0
- package/lib/util/asyncIterableToEvents.d.ts.map +1 -0
- package/lib/util/binarySearch.d.ts.map +1 -0
- package/lib/util/bitArray.d.ts.map +1 -0
- package/lib/util/blobs.d.ts.map +1 -0
- package/lib/util/blobs.js +5 -3
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/bufferPool.d.ts.map +1 -0
- package/lib/util/bytes.d.ts.map +1 -0
- package/lib/util/chunkify.d.ts.map +1 -0
- package/lib/util/clock.d.ts.map +1 -0
- package/lib/util/dataColumns.d.ts.map +1 -0
- package/lib/util/dependentRoot.d.ts.map +1 -0
- package/lib/util/enum.d.ts.map +1 -0
- package/lib/util/error.d.ts.map +1 -0
- package/lib/util/eventLoop.d.ts.map +1 -0
- package/lib/util/execution.d.ts.map +1 -0
- package/lib/util/file.d.ts.map +1 -0
- package/lib/util/forkChoice.d.ts.map +1 -0
- package/lib/util/forkName.d.ts.map +1 -0
- package/lib/util/graffiti.d.ts.map +1 -0
- package/lib/util/hex.d.ts.map +1 -0
- package/lib/util/index.d.ts.map +1 -0
- package/lib/util/ip.d.ts.map +1 -0
- package/lib/util/itTrigger.d.ts.map +1 -0
- package/lib/util/kzg.d.ts.map +1 -0
- package/lib/util/map.d.ts.map +1 -0
- package/lib/util/metadata.d.ts.map +1 -0
- package/lib/util/multifork.d.ts.map +1 -0
- package/lib/util/numpy.d.ts.map +1 -0
- package/lib/util/peerId.d.ts.map +1 -0
- package/lib/util/profile.d.ts.map +1 -0
- package/lib/util/promises.d.ts.map +1 -0
- package/lib/util/queue/errors.d.ts.map +1 -0
- package/lib/util/queue/fnQueue.d.ts.map +1 -0
- package/lib/util/queue/index.d.ts.map +1 -0
- package/lib/util/queue/itemQueue.d.ts.map +1 -0
- package/lib/util/queue/options.d.ts.map +1 -0
- package/lib/util/serializedCache.d.ts.map +1 -0
- package/lib/util/set.d.ts.map +1 -0
- package/lib/util/shuffle.d.ts.map +1 -0
- package/lib/util/sortBy.d.ts.map +1 -0
- package/lib/util/sszBytes.d.ts.map +1 -0
- package/lib/util/strictEvents.d.ts.map +1 -0
- package/lib/util/time.d.ts.map +1 -0
- package/lib/util/timeSeries.d.ts.map +1 -0
- package/lib/util/types.d.ts.map +1 -0
- package/lib/util/workerEvents.d.ts.map +1 -0
- package/lib/util/wrapError.d.ts.map +1 -0
- package/package.json +17 -19
- package/src/api/impl/api.ts +26 -0
- package/src/api/impl/beacon/blocks/index.ts +744 -0
- package/src/api/impl/beacon/blocks/utils.ts +75 -0
- package/src/api/impl/beacon/index.ts +35 -0
- package/src/api/impl/beacon/pool/index.ts +314 -0
- package/src/api/impl/beacon/rewards/index.ts +30 -0
- package/src/api/impl/beacon/state/index.ts +406 -0
- package/src/api/impl/beacon/state/utils.ts +189 -0
- package/src/api/impl/config/constants.ts +127 -0
- package/src/api/impl/config/index.ts +59 -0
- package/src/api/impl/debug/index.ts +131 -0
- package/src/api/impl/errors.ts +50 -0
- package/src/api/impl/events/index.ts +33 -0
- package/src/api/impl/index.ts +6 -0
- package/src/api/impl/lightclient/index.ts +64 -0
- package/src/api/impl/lodestar/index.ts +257 -0
- package/src/api/impl/node/index.ts +88 -0
- package/src/api/impl/node/utils.ts +51 -0
- package/src/api/impl/proof/index.ts +60 -0
- package/src/api/impl/types.ts +17 -0
- package/src/api/impl/utils.ts +25 -0
- package/src/api/impl/validator/index.ts +1538 -0
- package/src/api/impl/validator/utils.ts +85 -0
- package/src/api/index.ts +2 -0
- package/src/api/options.ts +16 -0
- package/src/api/rest/activeSockets.ts +109 -0
- package/src/api/rest/base.ts +216 -0
- package/src/api/rest/index.ts +63 -0
- package/src/api/rest/swaggerUI.ts +80 -0
- package/src/bun-wrappers/prometheus-gc-stats.ts +7 -0
- package/src/chain/ColumnReconstructionTracker.ts +90 -0
- package/src/chain/GetBlobsTracker.ts +115 -0
- package/src/chain/archiveStore/archiveStore.ts +222 -0
- package/src/chain/archiveStore/constants.ts +5 -0
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +116 -0
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +68 -0
- package/src/chain/archiveStore/historicalState/metrics.ts +214 -0
- package/src/chain/archiveStore/historicalState/types.ts +41 -0
- package/src/chain/archiveStore/historicalState/worker.ts +77 -0
- package/src/chain/archiveStore/index.ts +3 -0
- package/src/chain/archiveStore/interface.ts +75 -0
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +138 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +437 -0
- package/src/chain/archiveStore/utils/pruneHistory.ts +56 -0
- package/src/chain/archiveStore/utils/updateBackfillRange.ts +50 -0
- package/src/chain/balancesCache.ts +52 -0
- package/src/chain/beaconProposerCache.ts +43 -0
- package/src/chain/blocks/blockInput/blockInput.ts +851 -0
- package/src/chain/blocks/blockInput/errors.ts +48 -0
- package/src/chain/blocks/blockInput/index.ts +4 -0
- package/src/chain/blocks/blockInput/types.ts +145 -0
- package/src/chain/blocks/blockInput/utils.ts +21 -0
- package/src/chain/blocks/importBlock.ts +603 -0
- package/src/chain/blocks/index.ts +179 -0
- package/src/chain/blocks/types.ts +101 -0
- package/src/chain/blocks/utils/blowfishBanner.ts +28 -0
- package/src/chain/blocks/utils/chainSegment.ts +29 -0
- package/src/chain/blocks/utils/checkpoint.ts +25 -0
- package/src/chain/blocks/utils/giraffeBanner.ts +30 -0
- package/src/chain/blocks/utils/ownBanner.ts +20 -0
- package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +43 -0
- package/src/chain/blocks/utils/zebraBanner.ts +45 -0
- package/src/chain/blocks/verifyBlock.ts +242 -0
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +34 -0
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +438 -0
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +129 -0
- package/src/chain/blocks/verifyBlocksSignatures.ts +105 -0
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +114 -0
- package/src/chain/blocks/writeBlockInputToDb.ts +128 -0
- package/src/chain/bls/index.ts +4 -0
- package/src/chain/bls/interface.ts +68 -0
- package/src/chain/bls/maybeBatch.ts +45 -0
- package/src/chain/bls/multithread/index.ts +582 -0
- package/src/chain/bls/multithread/jobItem.ts +119 -0
- package/src/chain/bls/multithread/poolSize.ts +16 -0
- package/src/chain/bls/multithread/types.ts +38 -0
- package/src/chain/bls/multithread/utils.ts +19 -0
- package/src/chain/bls/multithread/worker.ts +114 -0
- package/src/chain/bls/singleThread.ts +87 -0
- package/src/chain/bls/utils.ts +30 -0
- package/src/chain/chain.ts +1365 -0
- package/src/chain/emitter.ts +113 -0
- package/src/chain/errors/attestationError.ts +194 -0
- package/src/chain/errors/attesterSlashingError.ts +11 -0
- package/src/chain/errors/blobSidecarError.ts +60 -0
- package/src/chain/errors/blockError.ts +166 -0
- package/src/chain/errors/blsToExecutionChangeError.ts +13 -0
- package/src/chain/errors/dataColumnSidecarError.ts +80 -0
- package/src/chain/errors/gossipValidation.ts +20 -0
- package/src/chain/errors/index.ts +10 -0
- package/src/chain/errors/lightClientError.ts +30 -0
- package/src/chain/errors/proposerSlashingError.ts +11 -0
- package/src/chain/errors/syncCommitteeError.ts +36 -0
- package/src/chain/errors/voluntaryExitError.ts +13 -0
- package/src/chain/forkChoice/index.ts +112 -0
- package/src/chain/genesis/genesis.ts +190 -0
- package/src/chain/genesis/interface.ts +14 -0
- package/src/chain/index.ts +6 -0
- package/src/chain/initState.ts +221 -0
- package/src/chain/interface.ts +280 -0
- package/src/chain/lightClient/index.ts +764 -0
- package/src/chain/lightClient/proofs.ts +85 -0
- package/src/chain/lightClient/types.ts +33 -0
- package/src/chain/opPools/aggregatedAttestationPool.ts +1063 -0
- package/src/chain/opPools/attestationPool.ts +283 -0
- package/src/chain/opPools/index.ts +5 -0
- package/src/chain/opPools/opPool.ts +462 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +167 -0
- package/src/chain/opPools/syncContributionAndProofPool.ts +240 -0
- package/src/chain/opPools/types.ts +35 -0
- package/src/chain/opPools/utils.ts +65 -0
- package/src/chain/options.ts +138 -0
- package/src/chain/prepareNextSlot.ts +277 -0
- package/src/chain/produceBlock/computeNewStateRoot.ts +55 -0
- package/src/chain/produceBlock/index.ts +2 -0
- package/src/chain/produceBlock/produceBlockBody.ts +797 -0
- package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +54 -0
- package/src/chain/regen/errors.ts +30 -0
- package/src/chain/regen/index.ts +4 -0
- package/src/chain/regen/interface.ts +93 -0
- package/src/chain/regen/queued.ts +317 -0
- package/src/chain/regen/regen.ts +424 -0
- package/src/chain/reprocess.ts +161 -0
- package/src/chain/rewards/attestationsRewards.ts +196 -0
- package/src/chain/rewards/blockRewards.ts +150 -0
- package/src/chain/rewards/syncCommitteeRewards.ts +58 -0
- package/src/chain/seenCache/index.ts +5 -0
- package/src/chain/seenCache/seenAggregateAndProof.ts +120 -0
- package/src/chain/seenCache/seenAttestationData.ts +145 -0
- package/src/chain/seenCache/seenAttesters.ts +58 -0
- package/src/chain/seenCache/seenBlockAttesters.ts +18 -0
- package/src/chain/seenCache/seenBlockProposers.ts +48 -0
- package/src/chain/seenCache/seenCommittee.ts +43 -0
- package/src/chain/seenCache/seenCommitteeContribution.ts +104 -0
- package/src/chain/seenCache/seenGossipBlockInput.ts +373 -0
- package/src/chain/serializeState.ts +32 -0
- package/src/chain/shufflingCache.ts +238 -0
- package/src/chain/stateCache/blockStateCacheImpl.ts +150 -0
- package/src/chain/stateCache/datastore/db.ts +36 -0
- package/src/chain/stateCache/datastore/file.ts +53 -0
- package/src/chain/stateCache/datastore/index.ts +2 -0
- package/src/chain/stateCache/datastore/types.ts +13 -0
- package/src/chain/stateCache/fifoBlockStateCache.ts +208 -0
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +198 -0
- package/src/chain/stateCache/index.ts +3 -0
- package/src/chain/stateCache/mapMetrics.ts +52 -0
- package/src/chain/stateCache/persistentCheckpointsCache.ts +835 -0
- package/src/chain/stateCache/types.ts +86 -0
- package/src/chain/validation/aggregateAndProof.ts +258 -0
- package/src/chain/validation/attestation.ts +885 -0
- package/src/chain/validation/attesterSlashing.ts +61 -0
- package/src/chain/validation/blobSidecar.ts +301 -0
- package/src/chain/validation/block.ts +188 -0
- package/src/chain/validation/blsToExecutionChange.ts +61 -0
- package/src/chain/validation/dataColumnSidecar.ts +381 -0
- package/src/chain/validation/index.ts +9 -0
- package/src/chain/validation/lightClientFinalityUpdate.ts +45 -0
- package/src/chain/validation/lightClientOptimisticUpdate.ts +67 -0
- package/src/chain/validation/proposerSlashing.ts +54 -0
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +38 -0
- package/src/chain/validation/signatureSets/contributionAndProof.ts +27 -0
- package/src/chain/validation/signatureSets/index.ts +6 -0
- package/src/chain/validation/signatureSets/selectionProof.ts +27 -0
- package/src/chain/validation/signatureSets/syncCommittee.ts +22 -0
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +18 -0
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +27 -0
- package/src/chain/validation/syncCommittee.ts +165 -0
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +122 -0
- package/src/chain/validation/voluntaryExit.ts +58 -0
- package/src/chain/validatorMonitor.ts +1299 -0
- package/src/constants/constants.ts +15 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/network.ts +52 -0
- package/src/db/beacon.ts +113 -0
- package/src/db/buckets.ts +80 -0
- package/src/db/index.ts +2 -0
- package/src/db/interface.ts +76 -0
- package/src/db/options.ts +7 -0
- package/src/db/repositories/attesterSlashing.ts +38 -0
- package/src/db/repositories/backfilledRanges.ts +29 -0
- package/src/db/repositories/blobSidecars.ts +37 -0
- package/src/db/repositories/blobSidecarsArchive.ts +28 -0
- package/src/db/repositories/block.ts +33 -0
- package/src/db/repositories/blockArchive.ts +170 -0
- package/src/db/repositories/blockArchiveIndex.ts +45 -0
- package/src/db/repositories/blsToExecutionChange.ts +16 -0
- package/src/db/repositories/checkpointState.ts +31 -0
- package/src/db/repositories/dataColumnSidecar.ts +49 -0
- package/src/db/repositories/dataColumnSidecarArchive.ts +56 -0
- package/src/db/repositories/depositDataRoot.ts +80 -0
- package/src/db/repositories/depositEvent.ts +32 -0
- package/src/db/repositories/eth1Data.ts +33 -0
- package/src/db/repositories/index.ts +20 -0
- package/src/db/repositories/lightclientBestUpdate.ts +41 -0
- package/src/db/repositories/lightclientCheckpointHeader.ts +32 -0
- package/src/db/repositories/lightclientSyncCommittee.ts +16 -0
- package/src/db/repositories/lightclientSyncCommitteeWitness.ts +77 -0
- package/src/db/repositories/proposerSlashing.ts +15 -0
- package/src/db/repositories/stateArchive.ts +69 -0
- package/src/db/repositories/stateArchiveIndex.ts +18 -0
- package/src/db/repositories/voluntaryExit.ts +15 -0
- package/src/db/single/index.ts +2 -0
- package/src/db/single/preGenesisState.ts +37 -0
- package/src/db/single/preGenesisStateLastProcessedBlock.ts +34 -0
- package/src/eth1/errors.ts +40 -0
- package/src/eth1/eth1DataCache.ts +26 -0
- package/src/eth1/eth1DepositDataTracker.ts +410 -0
- package/src/eth1/eth1DepositsCache.ts +141 -0
- package/src/eth1/eth1MergeBlockTracker.ts +328 -0
- package/src/eth1/index.ts +157 -0
- package/src/eth1/interface.ts +131 -0
- package/src/eth1/options.ts +28 -0
- package/src/eth1/provider/eth1Provider.ts +229 -0
- package/src/eth1/provider/jsonRpcHttpClient.ts +390 -0
- package/src/eth1/provider/jwt.ts +36 -0
- package/src/eth1/provider/utils.ts +136 -0
- package/src/eth1/stream.ts +75 -0
- package/src/eth1/utils/depositContract.ts +37 -0
- package/src/eth1/utils/deposits.ts +70 -0
- package/src/eth1/utils/eth1Data.ts +100 -0
- package/src/eth1/utils/eth1DepositEvent.ts +12 -0
- package/src/eth1/utils/eth1Vote.ts +142 -0
- package/src/eth1/utils/groupDepositEventsByBlock.ts +19 -0
- package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +18 -0
- package/src/execution/builder/cache.ts +39 -0
- package/src/execution/builder/http.ts +229 -0
- package/src/execution/builder/index.ts +27 -0
- package/src/execution/builder/interface.ts +49 -0
- package/src/execution/builder/utils.ts +19 -0
- package/src/execution/engine/disabled.ts +35 -0
- package/src/execution/engine/http.ts +644 -0
- package/src/execution/engine/index.ts +63 -0
- package/src/execution/engine/interface.ts +199 -0
- package/src/execution/engine/mock.ts +493 -0
- package/src/execution/engine/payloadIdCache.ts +54 -0
- package/src/execution/engine/types.ts +640 -0
- package/src/execution/engine/utils.ts +136 -0
- package/src/execution/index.ts +4 -0
- package/src/index.ts +20 -0
- package/src/metrics/index.ts +4 -0
- package/src/metrics/metrics/beacon.ts +390 -0
- package/src/metrics/metrics/lodestar.ts +1870 -0
- package/src/metrics/metrics.ts +43 -0
- package/src/metrics/nodeJsMetrics.ts +19 -0
- package/src/metrics/options.ts +22 -0
- package/src/metrics/server/http.ts +114 -0
- package/src/metrics/server/index.ts +1 -0
- package/src/metrics/utils/avgMinMax.ts +87 -0
- package/src/metrics/utils/gauge.ts +22 -0
- package/src/metrics/utils/registryMetricCreator.ts +41 -0
- package/src/monitoring/clientStats.ts +297 -0
- package/src/monitoring/index.ts +2 -0
- package/src/monitoring/options.ts +19 -0
- package/src/monitoring/properties.ts +152 -0
- package/src/monitoring/service.ts +235 -0
- package/src/monitoring/system.ts +146 -0
- package/src/monitoring/types.ts +21 -0
- package/src/network/core/events.ts +59 -0
- package/src/network/core/index.ts +3 -0
- package/src/network/core/metrics.ts +304 -0
- package/src/network/core/networkCore.ts +599 -0
- package/src/network/core/networkCoreWorker.ts +176 -0
- package/src/network/core/networkCoreWorkerHandler.ts +284 -0
- package/src/network/core/types.ts +119 -0
- package/src/network/discv5/index.ts +132 -0
- package/src/network/discv5/types.ts +74 -0
- package/src/network/discv5/utils.ts +50 -0
- package/src/network/discv5/worker.ts +137 -0
- package/src/network/events.ts +51 -0
- package/src/network/forks.ts +94 -0
- package/src/network/gossip/constants.ts +15 -0
- package/src/network/gossip/encoding.ts +111 -0
- package/src/network/gossip/errors.ts +7 -0
- package/src/network/gossip/gossipsub.ts +384 -0
- package/src/network/gossip/index.ts +4 -0
- package/src/network/gossip/interface.ts +215 -0
- package/src/network/gossip/metrics.ts +71 -0
- package/src/network/gossip/scoringParameters.ts +333 -0
- package/src/network/gossip/topic.ts +332 -0
- package/src/network/index.ts +8 -0
- package/src/network/interface.ts +134 -0
- package/src/network/libp2p/error.ts +55 -0
- package/src/network/libp2p/index.ts +153 -0
- package/src/network/metadata.ts +162 -0
- package/src/network/network.ts +767 -0
- package/src/network/networkConfig.ts +12 -0
- package/src/network/options.ts +70 -0
- package/src/network/peers/client.ts +29 -0
- package/src/network/peers/datastore.ts +188 -0
- package/src/network/peers/discover.ts +647 -0
- package/src/network/peers/index.ts +2 -0
- package/src/network/peers/peerManager.ts +899 -0
- package/src/network/peers/peersData.ts +65 -0
- package/src/network/peers/score/constants.ts +34 -0
- package/src/network/peers/score/index.ts +4 -0
- package/src/network/peers/score/interface.ts +74 -0
- package/src/network/peers/score/score.ts +200 -0
- package/src/network/peers/score/store.ts +95 -0
- package/src/network/peers/score/utils.ts +37 -0
- package/src/network/peers/utils/assertPeerRelevance.ts +99 -0
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +27 -0
- package/src/network/peers/utils/getConnectedPeerIds.ts +33 -0
- package/src/network/peers/utils/index.ts +4 -0
- package/src/network/peers/utils/prioritizePeers.ts +627 -0
- package/src/network/peers/utils/subnetMap.ts +88 -0
- package/src/network/processor/aggregatorTracker.ts +38 -0
- package/src/network/processor/extractSlotRootFns.ts +64 -0
- package/src/network/processor/gossipHandlers.ts +951 -0
- package/src/network/processor/gossipQueues/index.ts +114 -0
- package/src/network/processor/gossipQueues/indexed.ts +219 -0
- package/src/network/processor/gossipQueues/linear.ts +162 -0
- package/src/network/processor/gossipQueues/types.ts +57 -0
- package/src/network/processor/gossipValidatorFn.ts +142 -0
- package/src/network/processor/index.ts +497 -0
- package/src/network/processor/types.ts +27 -0
- package/src/network/reqresp/ReqRespBeaconNode.ts +373 -0
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +101 -0
- package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +49 -0
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +114 -0
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +62 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +144 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +88 -0
- package/src/network/reqresp/handlers/index.ts +78 -0
- package/src/network/reqresp/handlers/lightClientBootstrap.ts +31 -0
- package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +21 -0
- package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +21 -0
- package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +39 -0
- package/src/network/reqresp/index.ts +2 -0
- package/src/network/reqresp/interface.ts +45 -0
- package/src/network/reqresp/protocols.ts +146 -0
- package/src/network/reqresp/rateLimit.ts +112 -0
- package/src/network/reqresp/score.ts +70 -0
- package/src/network/reqresp/types.ts +174 -0
- package/src/network/reqresp/utils/collect.ts +84 -0
- package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +57 -0
- package/src/network/reqresp/utils/dataColumnResponseValidation.ts +99 -0
- package/src/network/statusCache.ts +17 -0
- package/src/network/subnets/attnetsService.ts +385 -0
- package/src/network/subnets/index.ts +2 -0
- package/src/network/subnets/interface.ts +66 -0
- package/src/network/subnets/syncnetsService.ts +147 -0
- package/src/network/subnets/util.ts +63 -0
- package/src/network/util.ts +29 -0
- package/src/node/index.ts +2 -0
- package/src/node/nodejs.ts +349 -0
- package/src/node/notifier.ts +206 -0
- package/src/node/options.ts +51 -0
- package/src/node/utils/interop/deposits.ts +53 -0
- package/src/node/utils/interop/state.ts +59 -0
- package/src/node/utils/lightclient.ts +7 -0
- package/src/node/utils/state.ts +37 -0
- package/src/sync/backfill/backfill.ts +893 -0
- package/src/sync/backfill/errors.ts +23 -0
- package/src/sync/backfill/index.ts +1 -0
- package/src/sync/backfill/verify.ts +58 -0
- package/src/sync/constants.ts +71 -0
- package/src/sync/index.ts +2 -0
- package/src/sync/interface.ts +55 -0
- package/src/sync/options.ts +45 -0
- package/src/sync/range/batch.ts +455 -0
- package/src/sync/range/chain.ts +715 -0
- package/src/sync/range/range.ts +354 -0
- package/src/sync/range/utils/batches.ts +119 -0
- package/src/sync/range/utils/chainTarget.ts +62 -0
- package/src/sync/range/utils/hashBlocks.ts +27 -0
- package/src/sync/range/utils/index.ts +5 -0
- package/src/sync/range/utils/peerBalancer.ts +184 -0
- package/src/sync/range/utils/updateChains.ts +66 -0
- package/src/sync/sync.ts +290 -0
- package/src/sync/types.ts +59 -0
- package/src/sync/unknownBlock.ts +862 -0
- package/src/sync/utils/downloadByRange.ts +808 -0
- package/src/sync/utils/downloadByRoot.ts +560 -0
- package/src/sync/utils/pendingBlocksTree.ts +97 -0
- package/src/sync/utils/remoteSyncType.ts +144 -0
- package/src/util/address.ts +3 -0
- package/src/util/array.ts +311 -0
- package/src/util/asyncIterableToEvents.ts +164 -0
- package/src/util/binarySearch.ts +48 -0
- package/src/util/bitArray.ts +84 -0
- package/src/util/blobs.ts +210 -0
- package/src/util/bufferPool.ts +95 -0
- package/src/util/bytes.ts +11 -0
- package/src/util/chunkify.ts +27 -0
- package/src/util/clock.ts +204 -0
- package/src/util/dataColumns.ts +415 -0
- package/src/util/dependentRoot.ts +47 -0
- package/src/util/enum.ts +17 -0
- package/src/util/error.ts +56 -0
- package/src/util/eventLoop.ts +22 -0
- package/src/util/execution.ts +223 -0
- package/src/util/file.ts +52 -0
- package/src/util/forkChoice.ts +5 -0
- package/src/util/forkName.ts +20 -0
- package/src/util/graffiti.ts +39 -0
- package/src/util/hex.ts +9 -0
- package/src/util/index.ts +2 -0
- package/src/util/ip.ts +6 -0
- package/src/util/itTrigger.ts +49 -0
- package/src/util/kzg.ts +3 -0
- package/src/util/map.ts +77 -0
- package/src/util/metadata.ts +22 -0
- package/src/util/multifork.ts +69 -0
- package/src/util/numpy.ts +8 -0
- package/src/util/peerId.ts +16 -0
- package/src/util/profile.ts +54 -0
- package/src/util/promises.ts +14 -0
- package/src/util/queue/errors.ts +14 -0
- package/src/util/queue/fnQueue.ts +16 -0
- package/src/util/queue/index.ts +4 -0
- package/src/util/queue/itemQueue.ts +128 -0
- package/src/util/queue/options.ts +37 -0
- package/src/util/serializedCache.ts +20 -0
- package/src/util/set.ts +62 -0
- package/src/util/shuffle.ts +21 -0
- package/src/util/sortBy.ts +19 -0
- package/src/util/sszBytes.ts +481 -0
- package/src/util/strictEvents.ts +8 -0
- package/src/util/time.ts +13 -0
- package/src/util/timeSeries.ts +118 -0
- package/src/util/types.ts +31 -0
- package/src/util/workerEvents.ts +142 -0
- package/src/util/wrapError.ts +27 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {Epoch, ValidatorIndex} from "@lodestar/types";
|
|
2
|
+
import {MapDef} from "@lodestar/utils";
|
|
3
|
+
|
|
4
|
+
// How many *non future* epochs we intend to keep for SeenAttesters.
|
|
5
|
+
// Pre and post deneb specs require us to accept attestations from current and
|
|
6
|
+
// previous epoch.
|
|
7
|
+
//
|
|
8
|
+
// Pre-deneb:
|
|
9
|
+
// - `attestation.data.slot + ATTESTATION_PROPAGATION_SLOT_RANGE >= current_slot >= attestation.data.slot`
|
|
10
|
+
//
|
|
11
|
+
// Post-deneb:
|
|
12
|
+
// - `attestation.data.slot <= current_slot`
|
|
13
|
+
// - `compute_epoch_at_slot(attestation.data.slot) in (get_previous_epoch(state), get_current_epoch(state))`
|
|
14
|
+
//
|
|
15
|
+
// When factored in MAXIMUM_GOSSIP_CLOCK_DISPARITY, it is possible we keep 3 epochs of SeenAttesters:
|
|
16
|
+
// previous, current and future epoch. This constant is solely used to calculate `lowestPermissibleEpoch`
|
|
17
|
+
// which prunes anything older than it.
|
|
18
|
+
//
|
|
19
|
+
// Assuming we're at epoch 100 while all other nodes at epoch 99, they all accept attestations at epoch 98, 99.
|
|
20
|
+
// If MAX_RETAINED_EPOCH = 2 then our lowestPermissibleEpoch is 98 which is fine
|
|
21
|
+
//
|
|
22
|
+
// Assuming we're at epoch 99 while all other nodes at epoch 100, they all accept attestations at epoch 99, 100.
|
|
23
|
+
// If MAX_RETAINED_EPOCH = 2 then lowestPermissibleEpoch is 97 which is more than enough
|
|
24
|
+
const EPOCH_LOOKBACK_LIMIT = 2;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Keeps a cache to filter unaggregated attestations from the same validator in the same epoch.
|
|
28
|
+
*/
|
|
29
|
+
export class SeenAttesters {
|
|
30
|
+
protected readonly validatorIndexesByEpoch = new MapDef<Epoch, Set<ValidatorIndex>>(() => new Set<ValidatorIndex>());
|
|
31
|
+
protected lowestPermissibleEpoch: Epoch = 0;
|
|
32
|
+
|
|
33
|
+
isKnown(targetEpoch: Epoch, validatorIndex: ValidatorIndex): boolean {
|
|
34
|
+
return this.validatorIndexesByEpoch.get(targetEpoch)?.has(validatorIndex) === true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
add(targetEpoch: Epoch, validatorIndex: ValidatorIndex): void {
|
|
38
|
+
if (targetEpoch < this.lowestPermissibleEpoch) {
|
|
39
|
+
throw Error(`EpochTooLow ${targetEpoch} < ${this.lowestPermissibleEpoch}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
this.validatorIndexesByEpoch.getOrDefault(targetEpoch).add(validatorIndex);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
prune(currentEpoch: Epoch): void {
|
|
46
|
+
this.lowestPermissibleEpoch = Math.max(currentEpoch - EPOCH_LOOKBACK_LIMIT, 0);
|
|
47
|
+
for (const epoch of this.validatorIndexesByEpoch.keys()) {
|
|
48
|
+
if (epoch < this.lowestPermissibleEpoch) {
|
|
49
|
+
this.validatorIndexesByEpoch.delete(epoch);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Keeps a cache to filter aggregated attestations from the same aggregators in the same epoch
|
|
57
|
+
*/
|
|
58
|
+
export class SeenAggregators extends SeenAttesters {}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {Epoch, ValidatorIndex} from "@lodestar/types";
|
|
2
|
+
import {SeenAttesters} from "./seenAttesters.js";
|
|
3
|
+
// TODO abstract out the Seen* caches into an abstract abstract data structure
|
|
4
|
+
// that all the caches can extend since they share similar structure.
|
|
5
|
+
|
|
6
|
+
export class SeenBlockAttesters extends SeenAttesters {
|
|
7
|
+
addIndices(epoch: Epoch, validatorIndexes: ValidatorIndex[]): void {
|
|
8
|
+
if (epoch < this.lowestPermissibleEpoch) {
|
|
9
|
+
throw Error(`EpochTooLow ${epoch} < ${this.lowestPermissibleEpoch}`);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const indexesByEpoch = this.validatorIndexesByEpoch.getOrDefault(epoch);
|
|
13
|
+
|
|
14
|
+
for (const index of validatorIndexes) {
|
|
15
|
+
indexesByEpoch.add(index);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
2
|
+
import {Epoch, Slot, ValidatorIndex} from "@lodestar/types";
|
|
3
|
+
import {MapDef} from "@lodestar/utils";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Keeps a cache to filter block proposals from the same validator in the same slot.
|
|
7
|
+
*
|
|
8
|
+
* This cache is not bounded and for extremely long periods of non-finality it can grow a lot. However it's practically
|
|
9
|
+
* limited by the possible shufflings in those epochs, and the stored data is very cheap
|
|
10
|
+
*/
|
|
11
|
+
export class SeenBlockProposers {
|
|
12
|
+
private readonly proposerIndexesBySlot = new MapDef<Slot, Set<ValidatorIndex>>(() => new Set<ValidatorIndex>());
|
|
13
|
+
private finalizedSlot: Epoch = 0;
|
|
14
|
+
|
|
15
|
+
isKnown(blockSlot: Slot, proposerIndex: ValidatorIndex): boolean {
|
|
16
|
+
return this.proposerIndexesBySlot.get(blockSlot)?.has(proposerIndex) === true;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
add(blockSlot: Slot, proposerIndex: ValidatorIndex): void {
|
|
20
|
+
if (blockSlot < this.finalizedSlot) {
|
|
21
|
+
throw Error(`blockSlot ${blockSlot} < finalizedSlot ${this.finalizedSlot}`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
this.proposerIndexesBySlot.getOrDefault(blockSlot).add(proposerIndex);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
prune(finalizedSlot: Slot): void {
|
|
28
|
+
this.finalizedSlot = finalizedSlot;
|
|
29
|
+
for (const slot of this.proposerIndexesBySlot.keys()) {
|
|
30
|
+
if (slot < finalizedSlot) {
|
|
31
|
+
this.proposerIndexesBySlot.delete(slot);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
seenAtEpoch(epoch: Slot, index: ValidatorIndex): boolean {
|
|
37
|
+
const fromSlot = computeStartSlotAtEpoch(epoch);
|
|
38
|
+
const toSlot = computeStartSlotAtEpoch(epoch + 1);
|
|
39
|
+
|
|
40
|
+
for (let slot = fromSlot; slot < toSlot; slot++) {
|
|
41
|
+
if (this.proposerIndexesBySlot.get(slot)?.has(index) === true) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {RootHex, Slot, SubcommitteeIndex, ValidatorIndex} from "@lodestar/types";
|
|
2
|
+
import {MapDef} from "@lodestar/utils";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SyncCommittee signatures are only useful during a single slot according to our peer's clocks
|
|
6
|
+
*/
|
|
7
|
+
const MAX_SLOTS_IN_CACHE = 3;
|
|
8
|
+
|
|
9
|
+
/** ValidataorSubnetKey = `validatorIndex + subcommitteeIndex` */
|
|
10
|
+
type ValidatorSubnetKey = string;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Cache seen SyncCommitteeMessage by slot + validator index.
|
|
14
|
+
*/
|
|
15
|
+
export class SeenSyncCommitteeMessages {
|
|
16
|
+
private readonly seenCacheBySlot = new MapDef<Slot, Map<ValidatorSubnetKey, RootHex>>(() => new Map());
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* based on slot + validator index
|
|
20
|
+
*/
|
|
21
|
+
get(slot: Slot, subnet: SubcommitteeIndex, validatorIndex: ValidatorIndex): RootHex | null {
|
|
22
|
+
const root = this.seenCacheBySlot.getOrDefault(slot).get(seenCacheKey(subnet, validatorIndex));
|
|
23
|
+
return root ?? null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Register item as seen in the cache */
|
|
27
|
+
add(slot: Slot, subnet: SubcommitteeIndex, validatorIndex: ValidatorIndex, root: RootHex): void {
|
|
28
|
+
this.seenCacheBySlot.getOrDefault(slot).set(seenCacheKey(subnet, validatorIndex), root);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Prune per clock slot */
|
|
32
|
+
prune(clockSlot: Slot): void {
|
|
33
|
+
for (const slot of this.seenCacheBySlot.keys()) {
|
|
34
|
+
if (slot < clockSlot - MAX_SLOTS_IN_CACHE) {
|
|
35
|
+
this.seenCacheBySlot.delete(slot);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function seenCacheKey(subnet: SubcommitteeIndex, validatorIndex: ValidatorIndex): ValidatorSubnetKey {
|
|
42
|
+
return `${subnet}-${validatorIndex}`;
|
|
43
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {Slot, ValidatorIndex} from "@lodestar/types";
|
|
2
|
+
import {ContributionAndProof, SyncCommitteeContribution} from "@lodestar/types/altair";
|
|
3
|
+
import {MapDef, toRootHex} from "@lodestar/utils";
|
|
4
|
+
import {Metrics} from "../../metrics/index.js";
|
|
5
|
+
import {isSuperSetOrEqual} from "../../util/bitArray.js";
|
|
6
|
+
import {AggregationInfo, insertDesc} from "./seenAggregateAndProof.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* SyncCommittee aggregates are only useful for the next block they have signed.
|
|
10
|
+
*/
|
|
11
|
+
const MAX_SLOTS_IN_CACHE = 8;
|
|
12
|
+
|
|
13
|
+
/** AggregatorSubnetKey = `aggregatorIndex + subcommitteeIndex` */
|
|
14
|
+
type AggregatorSubnetKey = string;
|
|
15
|
+
|
|
16
|
+
/** ContributionDataKey = `slot + beacon_block_root + subcommittee_index */
|
|
17
|
+
type ContributionDataKey = string;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Cache SyncCommitteeContribution and seen ContributionAndProof.
|
|
21
|
+
* This is used for SignedContributionAndProof validation and block factory.
|
|
22
|
+
* This stays in-memory and should be pruned per slot.
|
|
23
|
+
*/
|
|
24
|
+
export class SeenContributionAndProof {
|
|
25
|
+
private readonly seenAggregatorBySlot = new MapDef<Slot, Set<AggregatorSubnetKey>>(
|
|
26
|
+
() => new Set<AggregatorSubnetKey>()
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
private readonly seenContributionBySlot = new MapDef<Slot, MapDef<ContributionDataKey, AggregationInfo[]>>(
|
|
30
|
+
() => new MapDef(() => [])
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
constructor(private readonly metrics: Metrics | null) {}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* _[IGNORE]_ A valid sync committee contribution with equal `slot`, `beacon_block_root` and `subcommittee_index` whose
|
|
37
|
+
* `aggregation_bits` is non-strict superset has _not_ already been seen.
|
|
38
|
+
*/
|
|
39
|
+
participantsKnown(contribution: SyncCommitteeContribution): boolean {
|
|
40
|
+
const {aggregationBits, slot} = contribution;
|
|
41
|
+
const contributionMap = this.seenContributionBySlot.getOrDefault(slot);
|
|
42
|
+
const seenAggregationInfoArr = contributionMap.getOrDefault(toContributionDataKey(contribution));
|
|
43
|
+
this.metrics?.seenCache.committeeContributions.isKnownCalls.inc();
|
|
44
|
+
// seenAttestingIndicesArr is sorted by trueBitCount desc
|
|
45
|
+
|
|
46
|
+
for (let i = 0; i < seenAggregationInfoArr.length; i++) {
|
|
47
|
+
if (isSuperSetOrEqual(seenAggregationInfoArr[i].aggregationBits, aggregationBits)) {
|
|
48
|
+
this.metrics?.seenCache.committeeContributions.isKnownHits.inc();
|
|
49
|
+
this.metrics?.seenCache.committeeContributions.superSetCheckTotal.observe(i + 1);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
this.metrics?.seenCache.committeeContributions.superSetCheckTotal.observe(seenAggregationInfoArr.length);
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Gossip validation requires to check:
|
|
60
|
+
* The sync committee contribution is the first valid contribution received for the aggregator with index
|
|
61
|
+
* contribution_and_proof.aggregator_index for the slot contribution.slot and subcommittee index contribution.subcommittee_index.
|
|
62
|
+
*/
|
|
63
|
+
isAggregatorKnown(slot: Slot, subcommitteeIndex: number, aggregatorIndex: ValidatorIndex): boolean {
|
|
64
|
+
return this.seenAggregatorBySlot.get(slot)?.has(seenAggregatorKey(subcommitteeIndex, aggregatorIndex)) === true;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Register item as seen in the cache */
|
|
68
|
+
add(contributionAndProof: ContributionAndProof, trueBitCount: number): void {
|
|
69
|
+
const {contribution, aggregatorIndex} = contributionAndProof;
|
|
70
|
+
const {subcommitteeIndex, slot, aggregationBits} = contribution;
|
|
71
|
+
|
|
72
|
+
// add to seenAggregatorBySlot
|
|
73
|
+
this.seenAggregatorBySlot.getOrDefault(slot).add(seenAggregatorKey(subcommitteeIndex, aggregatorIndex));
|
|
74
|
+
|
|
75
|
+
// add to seenContributionBySlot
|
|
76
|
+
const contributionMap = this.seenContributionBySlot.getOrDefault(slot);
|
|
77
|
+
const seenAggregationInfoArr = contributionMap.getOrDefault(toContributionDataKey(contribution));
|
|
78
|
+
insertDesc(seenAggregationInfoArr, {aggregationBits, trueBitCount});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Prune per head slot */
|
|
82
|
+
prune(headSlot: Slot): void {
|
|
83
|
+
for (const slot of this.seenAggregatorBySlot.keys()) {
|
|
84
|
+
if (slot < headSlot - MAX_SLOTS_IN_CACHE) {
|
|
85
|
+
this.seenAggregatorBySlot.delete(slot);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
for (const slot of this.seenContributionBySlot.keys()) {
|
|
90
|
+
if (slot < headSlot - MAX_SLOTS_IN_CACHE) {
|
|
91
|
+
this.seenContributionBySlot.delete(slot);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function seenAggregatorKey(subcommitteeIndex: number, aggregatorIndex: ValidatorIndex): AggregatorSubnetKey {
|
|
98
|
+
return `${subcommitteeIndex}-${aggregatorIndex}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function toContributionDataKey(contribution: SyncCommitteeContribution): ContributionDataKey {
|
|
102
|
+
const {slot, beaconBlockRoot, subcommitteeIndex} = contribution;
|
|
103
|
+
return `${slot} - ${toRootHex(beaconBlockRoot)} - ${subcommitteeIndex}`;
|
|
104
|
+
}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
+
import {CheckpointWithHex} from "@lodestar/fork-choice";
|
|
3
|
+
import {ForkName, ForkPostFulu, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
|
|
4
|
+
import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
5
|
+
import {RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
|
|
6
|
+
import {LodestarError, Logger} from "@lodestar/utils";
|
|
7
|
+
import {Metrics} from "../../metrics/metrics.js";
|
|
8
|
+
import {IClock} from "../../util/clock.js";
|
|
9
|
+
import {CustodyConfig} from "../../util/dataColumns.js";
|
|
10
|
+
import {
|
|
11
|
+
BlockInput,
|
|
12
|
+
BlockInputBlobs,
|
|
13
|
+
BlockInputColumns,
|
|
14
|
+
BlockInputPreData,
|
|
15
|
+
BlockWithSource,
|
|
16
|
+
DAType,
|
|
17
|
+
ForkBlobsDA,
|
|
18
|
+
IBlockInput,
|
|
19
|
+
LogMetaBasic,
|
|
20
|
+
LogMetaBlobs,
|
|
21
|
+
LogMetaColumns,
|
|
22
|
+
SourceMeta,
|
|
23
|
+
isBlockInputBlobs,
|
|
24
|
+
isBlockInputColumns,
|
|
25
|
+
isDaOutOfRange,
|
|
26
|
+
} from "../blocks/blockInput/index.js";
|
|
27
|
+
import {ChainEvent, ChainEventEmitter} from "../emitter.js";
|
|
28
|
+
|
|
29
|
+
const MAX_BLOCK_INPUT_CACHE_SIZE = 5;
|
|
30
|
+
|
|
31
|
+
export type SeenBlockInputCacheModules = {
|
|
32
|
+
config: ChainForkConfig;
|
|
33
|
+
clock: IClock;
|
|
34
|
+
chainEvents: ChainEventEmitter;
|
|
35
|
+
signal: AbortSignal;
|
|
36
|
+
custodyConfig: CustodyConfig;
|
|
37
|
+
metrics: Metrics | null;
|
|
38
|
+
logger?: Logger;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export type GetByBlobOptions = {
|
|
42
|
+
throwErrorIfAlreadyKnown?: boolean;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Consumers that create BlockInputs or change types of old BlockInputs
|
|
47
|
+
*
|
|
48
|
+
* - gossipHandlers (block and blob)
|
|
49
|
+
* - beaconBlocksMaybeBlobsByRange
|
|
50
|
+
* - unavailableBeaconBlobsByRoot (beaconBlocksMaybeBlobsByRoot)
|
|
51
|
+
* - publishBlock in the beacon/blocks/index.ts API
|
|
52
|
+
* https://github.com/ChainSafe/lodestar/blob/unstable/packages/beacon-node/src/api/impl/beacon/blocks/index.ts#L62
|
|
53
|
+
* - maybeValidateBlobs in verifyBlocksDataAvailability (is_data_available spec function)
|
|
54
|
+
* https://github.com/ChainSafe/lodestar/blob/unstable/packages/beacon-node/src/chain/blocks/verifyBlocksDataAvailability.ts#L111
|
|
55
|
+
*
|
|
56
|
+
*
|
|
57
|
+
* Pruning management for SeenBlockInputCache
|
|
58
|
+
* ------------------------------------------
|
|
59
|
+
* There are four cases for how pruning needs to be handled
|
|
60
|
+
* - Normal operation following head via gossip (and/or reqresp). For this situation the consumer (process pipeline or
|
|
61
|
+
* caller of processBlock) will call the `prune` method to remove any processed BlockInputs from the cache. This will
|
|
62
|
+
* also remove any ancestors of the processed BlockInput as that will also need to have been successfully processed
|
|
63
|
+
* for import to work correctly
|
|
64
|
+
* - onFinalized event handler will help to prune any non-canonical forks once the chain finalizes. Any block-slots that
|
|
65
|
+
* are before the finalized checkpoint will be pruned.
|
|
66
|
+
* - Range-sync periods. The range process uses this cache to store and sync blocks with DA data as the chain is pulled
|
|
67
|
+
* from peers. We pull batches, by epoch, so 32 slots are pulled at a time and several batches are pulled concurrently.
|
|
68
|
+
* It is important to set the MAX_BLOCK_INPUT_CACHE_SIZE high enough to support range sync activities. Currently the
|
|
69
|
+
* value is set for 5 batches of 32 slots. As process block is called (similar to following head) the BlockInput and
|
|
70
|
+
* its ancestors will be pruned.
|
|
71
|
+
* - Non-Finality times. This is a bit more tricky. There can be long periods of non-finality and storing everything
|
|
72
|
+
* will cause OOM. The pruneToMax will help ensure a hard limit on the number of stored blocks (with DA) that are held
|
|
73
|
+
* in memory at any one time. The value for MAX_BLOCK_INPUT_CACHE_SIZE is set to accommodate range-sync but in
|
|
74
|
+
* practice this value may need to be massaged in the future if we find issues when debugging non-finality
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
export class SeenBlockInput {
|
|
78
|
+
private readonly config: ChainForkConfig;
|
|
79
|
+
private readonly custodyConfig: CustodyConfig;
|
|
80
|
+
private readonly clock: IClock;
|
|
81
|
+
private readonly chainEvents: ChainEventEmitter;
|
|
82
|
+
private readonly signal: AbortSignal;
|
|
83
|
+
private readonly metrics: Metrics | null;
|
|
84
|
+
private readonly logger?: Logger;
|
|
85
|
+
private blockInputs = new Map<RootHex, IBlockInput>();
|
|
86
|
+
|
|
87
|
+
constructor({config, custodyConfig, clock, chainEvents, signal, metrics, logger}: SeenBlockInputCacheModules) {
|
|
88
|
+
this.config = config;
|
|
89
|
+
this.custodyConfig = custodyConfig;
|
|
90
|
+
this.clock = clock;
|
|
91
|
+
this.chainEvents = chainEvents;
|
|
92
|
+
this.signal = signal;
|
|
93
|
+
this.metrics = metrics;
|
|
94
|
+
this.logger = logger;
|
|
95
|
+
|
|
96
|
+
if (metrics) {
|
|
97
|
+
metrics.seenCache.blockInput.blockInputCount.addCollect(() =>
|
|
98
|
+
metrics.seenCache.blockInput.blockInputCount.set(this.blockInputs.size)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
this.chainEvents.on(ChainEvent.forkChoiceFinalized, this.onFinalized);
|
|
103
|
+
this.signal.addEventListener("abort", () => {
|
|
104
|
+
this.chainEvents.off(ChainEvent.forkChoiceFinalized, this.onFinalized);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
has(rootHex: RootHex): boolean {
|
|
109
|
+
return this.blockInputs.has(rootHex);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
get(rootHex: RootHex): IBlockInput | undefined {
|
|
113
|
+
return this.blockInputs.get(rootHex);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Removes the single BlockInput from the cache
|
|
118
|
+
*/
|
|
119
|
+
remove(rootHex: RootHex): void {
|
|
120
|
+
this.blockInputs.delete(rootHex);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Removes a processed BlockInput from the cache and also removes any ancestors of processed blocks
|
|
125
|
+
*/
|
|
126
|
+
prune(rootHex: RootHex): void {
|
|
127
|
+
let blockInput = this.blockInputs.get(rootHex);
|
|
128
|
+
let parentRootHex = blockInput?.parentRootHex;
|
|
129
|
+
let deletedCount = 0;
|
|
130
|
+
while (blockInput) {
|
|
131
|
+
deletedCount++;
|
|
132
|
+
this.blockInputs.delete(blockInput.blockRootHex);
|
|
133
|
+
blockInput = this.blockInputs.get(parentRootHex ?? "");
|
|
134
|
+
parentRootHex = blockInput?.parentRootHex;
|
|
135
|
+
}
|
|
136
|
+
this.logger?.debug(`BlockInputCache.prune deleted ${deletedCount} cached BlockInputs`);
|
|
137
|
+
this.pruneToMaxSize();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
onFinalized = (checkpoint: CheckpointWithHex) => {
|
|
141
|
+
let deletedCount = 0;
|
|
142
|
+
const cutoffSlot = computeStartSlotAtEpoch(checkpoint.epoch);
|
|
143
|
+
for (const [rootHex, blockInput] of this.blockInputs) {
|
|
144
|
+
if (blockInput.slot < cutoffSlot) {
|
|
145
|
+
deletedCount++;
|
|
146
|
+
this.blockInputs.delete(rootHex);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.logger?.debug(`BlockInputCache.onFinalized deleted ${deletedCount} cached BlockInputs`);
|
|
150
|
+
this.pruneToMaxSize();
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
getByBlock({blockRootHex, block, source, seenTimestampSec, peerIdStr}: BlockWithSource): BlockInput {
|
|
154
|
+
// TODO(peerDAS): Why is it necessary to static cast this here. All conditional paths result in a valid value so should be defined correctly below
|
|
155
|
+
let blockInput = this.blockInputs.get(blockRootHex) as IBlockInput;
|
|
156
|
+
if (!blockInput) {
|
|
157
|
+
const {forkName, daOutOfRange} = this.buildCommonProps(block.message.slot);
|
|
158
|
+
if (!isForkPostDeneb(forkName)) {
|
|
159
|
+
blockInput = BlockInputPreData.createFromBlock({
|
|
160
|
+
block,
|
|
161
|
+
blockRootHex,
|
|
162
|
+
daOutOfRange,
|
|
163
|
+
forkName,
|
|
164
|
+
source,
|
|
165
|
+
seenTimestampSec,
|
|
166
|
+
peerIdStr,
|
|
167
|
+
});
|
|
168
|
+
} else if (isForkPostFulu(forkName)) {
|
|
169
|
+
blockInput = BlockInputColumns.createFromBlock({
|
|
170
|
+
block: block as SignedBeaconBlock<ForkPostFulu>,
|
|
171
|
+
blockRootHex,
|
|
172
|
+
daOutOfRange,
|
|
173
|
+
forkName,
|
|
174
|
+
custodyColumns: this.custodyConfig.custodyColumns,
|
|
175
|
+
sampledColumns: this.custodyConfig.sampledColumns,
|
|
176
|
+
source,
|
|
177
|
+
seenTimestampSec,
|
|
178
|
+
peerIdStr,
|
|
179
|
+
});
|
|
180
|
+
} else {
|
|
181
|
+
blockInput = BlockInputBlobs.createFromBlock({
|
|
182
|
+
block: block as SignedBeaconBlock<ForkBlobsDA>,
|
|
183
|
+
blockRootHex,
|
|
184
|
+
daOutOfRange,
|
|
185
|
+
forkName,
|
|
186
|
+
source,
|
|
187
|
+
seenTimestampSec,
|
|
188
|
+
peerIdStr,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
this.blockInputs.set(blockInput.blockRootHex, blockInput);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (!blockInput.hasBlock()) {
|
|
195
|
+
blockInput.addBlock({block, blockRootHex, source, seenTimestampSec, peerIdStr});
|
|
196
|
+
} else {
|
|
197
|
+
this.logger?.debug("Attempt to cache block but is already cached on BlockInput", blockInput.getLogMeta());
|
|
198
|
+
this.metrics?.seenCache.blockInput.duplicateBlockCount.inc({source});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return blockInput as BlockInput;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
getByBlob(
|
|
205
|
+
{
|
|
206
|
+
blockRootHex,
|
|
207
|
+
blobSidecar,
|
|
208
|
+
source,
|
|
209
|
+
seenTimestampSec,
|
|
210
|
+
peerIdStr,
|
|
211
|
+
}: SourceMeta & {blockRootHex: RootHex; blobSidecar: deneb.BlobSidecar},
|
|
212
|
+
opts: GetByBlobOptions = {}
|
|
213
|
+
): BlockInputBlobs {
|
|
214
|
+
// TODO(peerDAS): Why is it necessary to static cast this here. All conditional paths result in a valid value so should be defined correctly below
|
|
215
|
+
let blockInput = this.blockInputs.get(blockRootHex) as IBlockInput;
|
|
216
|
+
let created = false;
|
|
217
|
+
if (!blockInput) {
|
|
218
|
+
created = true;
|
|
219
|
+
const {forkName, daOutOfRange} = this.buildCommonProps(blobSidecar.signedBlockHeader.message.slot);
|
|
220
|
+
blockInput = BlockInputBlobs.createFromBlob({
|
|
221
|
+
blobSidecar,
|
|
222
|
+
blockRootHex,
|
|
223
|
+
daOutOfRange,
|
|
224
|
+
forkName,
|
|
225
|
+
source,
|
|
226
|
+
seenTimestampSec,
|
|
227
|
+
peerIdStr,
|
|
228
|
+
});
|
|
229
|
+
this.metrics?.seenCache.blockInput.createdByBlob.inc();
|
|
230
|
+
this.blockInputs.set(blockRootHex, blockInput);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (!isBlockInputBlobs(blockInput)) {
|
|
234
|
+
throw new SeenBlockInputCacheError(
|
|
235
|
+
{
|
|
236
|
+
code: SeenBlockInputCacheErrorCode.WRONG_BLOCK_INPUT_TYPE,
|
|
237
|
+
cachedType: blockInput.type,
|
|
238
|
+
requestedType: DAType.Blobs,
|
|
239
|
+
...blockInput.getLogMeta(),
|
|
240
|
+
},
|
|
241
|
+
`BlockInputType mismatch adding blobIndex=${blobSidecar.index}`
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (!blockInput.hasBlob(blobSidecar.index)) {
|
|
246
|
+
blockInput.addBlob({blobSidecar, blockRootHex, source, seenTimestampSec, peerIdStr});
|
|
247
|
+
} else if (!created) {
|
|
248
|
+
this.logger?.debug(
|
|
249
|
+
`Attempt to cache blob index #${blobSidecar.index} but is already cached on BlockInput`,
|
|
250
|
+
blockInput.getLogMeta()
|
|
251
|
+
);
|
|
252
|
+
this.metrics?.seenCache.blockInput.duplicateBlobCount.inc({source});
|
|
253
|
+
if (opts.throwErrorIfAlreadyKnown) {
|
|
254
|
+
throw new SeenBlockInputCacheError({
|
|
255
|
+
code: SeenBlockInputCacheErrorCode.GOSSIP_BLOB_ALREADY_KNOWN,
|
|
256
|
+
...blockInput.getLogMeta(),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return blockInput;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
getByColumn(
|
|
265
|
+
{
|
|
266
|
+
blockRootHex,
|
|
267
|
+
columnSidecar,
|
|
268
|
+
seenTimestampSec,
|
|
269
|
+
source,
|
|
270
|
+
peerIdStr,
|
|
271
|
+
}: SourceMeta & {blockRootHex: RootHex; columnSidecar: fulu.DataColumnSidecar},
|
|
272
|
+
opts: GetByBlobOptions = {}
|
|
273
|
+
): BlockInputColumns {
|
|
274
|
+
let blockInput = this.blockInputs.get(blockRootHex);
|
|
275
|
+
let created = false;
|
|
276
|
+
if (!blockInput) {
|
|
277
|
+
created = true;
|
|
278
|
+
const {forkName, daOutOfRange} = this.buildCommonProps(columnSidecar.signedBlockHeader.message.slot);
|
|
279
|
+
blockInput = BlockInputColumns.createFromColumn({
|
|
280
|
+
columnSidecar,
|
|
281
|
+
blockRootHex,
|
|
282
|
+
daOutOfRange,
|
|
283
|
+
forkName,
|
|
284
|
+
source,
|
|
285
|
+
seenTimestampSec,
|
|
286
|
+
peerIdStr,
|
|
287
|
+
custodyColumns: this.custodyConfig.custodyColumns,
|
|
288
|
+
sampledColumns: this.custodyConfig.sampledColumns,
|
|
289
|
+
});
|
|
290
|
+
this.metrics?.seenCache.blockInput.createdByBlob.inc();
|
|
291
|
+
this.blockInputs.set(blockRootHex, blockInput);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (!isBlockInputColumns(blockInput)) {
|
|
295
|
+
throw new SeenBlockInputCacheError(
|
|
296
|
+
{
|
|
297
|
+
code: SeenBlockInputCacheErrorCode.WRONG_BLOCK_INPUT_TYPE,
|
|
298
|
+
cachedType: blockInput.type,
|
|
299
|
+
requestedType: DAType.Columns,
|
|
300
|
+
...blockInput.getLogMeta(),
|
|
301
|
+
},
|
|
302
|
+
`BlockInputType mismatch adding columnIndex=${columnSidecar.index}`
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!blockInput.hasColumn(columnSidecar.index)) {
|
|
307
|
+
blockInput.addColumn({columnSidecar, blockRootHex, source, seenTimestampSec, peerIdStr});
|
|
308
|
+
} else if (!created) {
|
|
309
|
+
this.logger?.debug(
|
|
310
|
+
`Attempt to cache column index #${columnSidecar.index} but is already cached on BlockInput`,
|
|
311
|
+
blockInput.getLogMeta()
|
|
312
|
+
);
|
|
313
|
+
this.metrics?.seenCache.blockInput.duplicateColumnCount.inc({source});
|
|
314
|
+
if (opts.throwErrorIfAlreadyKnown) {
|
|
315
|
+
throw new SeenBlockInputCacheError({
|
|
316
|
+
code: SeenBlockInputCacheErrorCode.GOSSIP_COLUMN_ALREADY_KNOWN,
|
|
317
|
+
...blockInput.getLogMeta(),
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return blockInput;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
private buildCommonProps(slot: Slot): {
|
|
326
|
+
daOutOfRange: boolean;
|
|
327
|
+
forkName: ForkName;
|
|
328
|
+
} {
|
|
329
|
+
const forkName = this.config.getForkName(slot);
|
|
330
|
+
return {
|
|
331
|
+
forkName,
|
|
332
|
+
daOutOfRange: isDaOutOfRange(this.config, forkName, slot, this.clock.currentEpoch),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Use custom implementation of pruneSetToMax to allow for sorting by slot
|
|
338
|
+
* and deleting via key/rootHex
|
|
339
|
+
*/
|
|
340
|
+
private pruneToMaxSize() {
|
|
341
|
+
let itemsToDelete = this.blockInputs.size - MAX_BLOCK_INPUT_CACHE_SIZE;
|
|
342
|
+
|
|
343
|
+
if (itemsToDelete > 0) {
|
|
344
|
+
const sorted = [...this.blockInputs.entries()].sort((a, b) => b[1].slot - a[1].slot);
|
|
345
|
+
for (const [rootHex] of sorted) {
|
|
346
|
+
this.blockInputs.delete(rootHex);
|
|
347
|
+
itemsToDelete--;
|
|
348
|
+
if (itemsToDelete <= 0) return;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
enum SeenBlockInputCacheErrorCode {
|
|
355
|
+
WRONG_BLOCK_INPUT_TYPE = "BLOCK_INPUT_CACHE_ERROR_WRONG_BLOCK_INPUT_TYPE",
|
|
356
|
+
GOSSIP_BLOB_ALREADY_KNOWN = "BLOCK_INPUT_CACHE_ERROR_GOSSIP_BLOB_ALREADY_KNOWN",
|
|
357
|
+
GOSSIP_COLUMN_ALREADY_KNOWN = "BLOCK_INPUT_CACHE_ERROR_GOSSIP_COLUMN_ALREADY_KNOWN",
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
type SeenBlockInputCacheErrorType =
|
|
361
|
+
| (LogMetaBasic & {
|
|
362
|
+
code: SeenBlockInputCacheErrorCode.WRONG_BLOCK_INPUT_TYPE;
|
|
363
|
+
cachedType: DAType;
|
|
364
|
+
requestedType: DAType;
|
|
365
|
+
})
|
|
366
|
+
| (LogMetaBlobs & {
|
|
367
|
+
code: SeenBlockInputCacheErrorCode.GOSSIP_BLOB_ALREADY_KNOWN;
|
|
368
|
+
})
|
|
369
|
+
| (LogMetaColumns & {
|
|
370
|
+
code: SeenBlockInputCacheErrorCode.GOSSIP_COLUMN_ALREADY_KNOWN;
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
class SeenBlockInputCacheError extends LodestarError<SeenBlockInputCacheErrorType> {}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {CachedBeaconStateAllForks} from "@lodestar/state-transition";
|
|
2
|
+
import {AllocSource, BufferPool} from "../util/bufferPool.js";
|
|
3
|
+
|
|
4
|
+
type ProcessStateBytesFn<T> = (stateBytes: Uint8Array) => Promise<T>;
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Serialize state using the BufferPool if provided.
|
|
8
|
+
*/
|
|
9
|
+
export async function serializeState<T>(
|
|
10
|
+
state: CachedBeaconStateAllForks,
|
|
11
|
+
source: AllocSource,
|
|
12
|
+
processFn: ProcessStateBytesFn<T>,
|
|
13
|
+
bufferPool?: BufferPool | null
|
|
14
|
+
): Promise<T> {
|
|
15
|
+
const size = state.type.tree_serializedSize(state.node);
|
|
16
|
+
let stateBytes: Uint8Array | null = null;
|
|
17
|
+
if (bufferPool) {
|
|
18
|
+
using bufferWithKey = bufferPool.alloc(size, source);
|
|
19
|
+
if (bufferWithKey) {
|
|
20
|
+
stateBytes = bufferWithKey.buffer;
|
|
21
|
+
const dataView = new DataView(stateBytes.buffer, stateBytes.byteOffset, stateBytes.byteLength);
|
|
22
|
+
state.serializeToBytes({uint8Array: stateBytes, dataView}, 0);
|
|
23
|
+
return processFn(stateBytes);
|
|
24
|
+
}
|
|
25
|
+
// release the buffer back to the pool automatically
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// we already have metrics in BufferPool so no need to do it here
|
|
29
|
+
stateBytes = state.serialize();
|
|
30
|
+
|
|
31
|
+
return processFn(stateBytes);
|
|
32
|
+
}
|