@lodestar/beacon-node 1.35.0-dev.fcf8d024ea → 1.35.0-dev.feed916580
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/config/constants.d.ts +0 -5
- package/lib/api/impl/config/constants.js +1 -6
- package/lib/api/impl/config/constants.js.map +1 -1
- package/lib/api/impl/validator/index.js +3 -5
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +0 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +3 -4
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +1 -8
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +7 -1
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +0 -1
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/chain.js +3 -2
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +2 -2
- package/lib/chain/opPools/attestationPool.d.ts +3 -2
- package/lib/chain/opPools/attestationPool.js +5 -3
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts +2 -3
- package/lib/chain/opPools/syncCommitteeMessagePool.js +5 -6
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/types.d.ts +1 -1
- package/lib/chain/opPools/types.js +1 -1
- package/lib/chain/opPools/types.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +3 -3
- package/lib/chain/prepareNextSlot.js +8 -8
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +8 -9
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js +3 -4
- package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts +4 -6
- package/lib/chain/validation/lightClientOptimisticUpdate.js +11 -11
- package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
- package/lib/chain/validatorMonitor.js +14 -20
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/buckets.d.ts +4 -4
- package/lib/db/buckets.js +4 -4
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/repositories/blobSidecars.js +1 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/db/repositories/blobSidecarsArchive.js +1 -1
- package/lib/db/repositories/blobSidecarsArchive.js.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/dataColumnSidecar.js +1 -1
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +1 -1
- package/lib/metrics/metrics/lodestar.js +3 -3
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +3 -9
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/discv5/index.js +1 -4
- package/lib/network/discv5/index.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +0 -1
- package/lib/network/gossip/gossipsub.js +16 -35
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/metrics.d.ts +7 -15
- package/lib/network/gossip/metrics.js +6 -16
- package/lib/network/gossip/metrics.js.map +1 -1
- package/lib/network/libp2p/index.js +1 -9
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/metadata.js +1 -2
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +1 -1
- package/lib/network/network.js +13 -11
- package/lib/network/network.js.map +1 -1
- package/lib/network/peers/datastore.d.ts +2 -2
- package/lib/network/peers/datastore.js +2 -2
- package/lib/network/peers/datastore.js.map +1 -1
- package/lib/network/processor/index.d.ts +1 -1
- package/lib/network/processor/index.js +3 -2
- package/lib/network/processor/index.js.map +1 -1
- package/lib/sync/types.d.ts +1 -0
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +1 -0
- package/lib/sync/unknownBlock.js +19 -17
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +1 -3
- package/lib/sync/utils/downloadByRoot.js +9 -36
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.js +3 -5
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/clock.d.ts +0 -5
- package/lib/util/clock.js +0 -3
- package/lib/util/clock.js.map +1 -1
- package/lib/util/dataColumns.js +1 -1
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/execution.js +2 -19
- package/lib/util/execution.js.map +1 -1
- package/package.json +22 -32
- package/lib/api/impl/api.d.ts.map +0 -1
- package/lib/api/impl/beacon/blocks/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/blocks/utils.d.ts.map +0 -1
- package/lib/api/impl/beacon/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/rewards/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +0 -1
- package/lib/api/impl/config/constants.d.ts.map +0 -1
- package/lib/api/impl/config/index.d.ts.map +0 -1
- package/lib/api/impl/debug/index.d.ts.map +0 -1
- package/lib/api/impl/errors.d.ts.map +0 -1
- package/lib/api/impl/events/index.d.ts.map +0 -1
- package/lib/api/impl/index.d.ts.map +0 -1
- package/lib/api/impl/lightclient/index.d.ts.map +0 -1
- package/lib/api/impl/lodestar/index.d.ts.map +0 -1
- package/lib/api/impl/node/index.d.ts.map +0 -1
- package/lib/api/impl/node/utils.d.ts.map +0 -1
- package/lib/api/impl/proof/index.d.ts.map +0 -1
- package/lib/api/impl/types.d.ts.map +0 -1
- package/lib/api/impl/utils.d.ts.map +0 -1
- package/lib/api/impl/validator/index.d.ts.map +0 -1
- package/lib/api/impl/validator/utils.d.ts.map +0 -1
- package/lib/api/index.d.ts.map +0 -1
- package/lib/api/options.d.ts.map +0 -1
- package/lib/api/rest/activeSockets.d.ts.map +0 -1
- package/lib/api/rest/base.d.ts.map +0 -1
- package/lib/api/rest/index.d.ts.map +0 -1
- package/lib/api/rest/swaggerUI.d.ts.map +0 -1
- package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +0 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +0 -1
- package/lib/chain/GetBlobsTracker.d.ts.map +0 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +0 -1
- package/lib/chain/archiveStore/constants.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/worker.d.ts.map +0 -1
- package/lib/chain/archiveStore/index.d.ts.map +0 -1
- package/lib/chain/archiveStore/interface.d.ts.map +0 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +0 -1
- package/lib/chain/balancesCache.d.ts.map +0 -1
- package/lib/chain/beaconProposerCache.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/errors.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/index.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/types.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/utils.d.ts.map +0 -1
- package/lib/chain/blocks/importBlock.d.ts.map +0 -1
- package/lib/chain/blocks/index.d.ts.map +0 -1
- package/lib/chain/blocks/types.d.ts.map +0 -1
- package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/chainSegment.d.ts.map +0 -1
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +0 -1
- package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/ownBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/zebraBanner.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +0 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +0 -1
- package/lib/chain/bls/index.d.ts.map +0 -1
- package/lib/chain/bls/interface.d.ts.map +0 -1
- package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
- package/lib/chain/bls/multithread/index.d.ts.map +0 -1
- package/lib/chain/bls/multithread/jobItem.d.ts.map +0 -1
- package/lib/chain/bls/multithread/poolSize.d.ts.map +0 -1
- package/lib/chain/bls/multithread/types.d.ts.map +0 -1
- package/lib/chain/bls/multithread/utils.d.ts.map +0 -1
- package/lib/chain/bls/multithread/worker.d.ts.map +0 -1
- package/lib/chain/bls/singleThread.d.ts.map +0 -1
- package/lib/chain/bls/utils.d.ts.map +0 -1
- package/lib/chain/chain.d.ts.map +0 -1
- package/lib/chain/emitter.d.ts.map +0 -1
- package/lib/chain/errors/attestationError.d.ts.map +0 -1
- package/lib/chain/errors/attesterSlashingError.d.ts.map +0 -1
- package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/blockError.d.ts.map +0 -1
- package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +0 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/gossipValidation.d.ts.map +0 -1
- package/lib/chain/errors/index.d.ts.map +0 -1
- package/lib/chain/errors/lightClientError.d.ts.map +0 -1
- package/lib/chain/errors/proposerSlashingError.d.ts.map +0 -1
- package/lib/chain/errors/syncCommitteeError.d.ts.map +0 -1
- package/lib/chain/errors/voluntaryExitError.d.ts.map +0 -1
- package/lib/chain/forkChoice/index.d.ts.map +0 -1
- package/lib/chain/genesis/genesis.d.ts.map +0 -1
- package/lib/chain/genesis/interface.d.ts.map +0 -1
- package/lib/chain/index.d.ts.map +0 -1
- package/lib/chain/initState.d.ts.map +0 -1
- package/lib/chain/interface.d.ts.map +0 -1
- package/lib/chain/lightClient/index.d.ts.map +0 -1
- package/lib/chain/lightClient/proofs.d.ts.map +0 -1
- package/lib/chain/lightClient/types.d.ts.map +0 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +0 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +0 -1
- package/lib/chain/opPools/index.d.ts.map +0 -1
- package/lib/chain/opPools/opPool.d.ts.map +0 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +0 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +0 -1
- package/lib/chain/opPools/types.d.ts.map +0 -1
- package/lib/chain/opPools/utils.d.ts.map +0 -1
- package/lib/chain/options.d.ts.map +0 -1
- package/lib/chain/prepareNextSlot.d.ts.map +0 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +0 -1
- package/lib/chain/produceBlock/index.d.ts.map +0 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +0 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +0 -1
- package/lib/chain/regen/errors.d.ts.map +0 -1
- package/lib/chain/regen/index.d.ts.map +0 -1
- package/lib/chain/regen/interface.d.ts.map +0 -1
- package/lib/chain/regen/queued.d.ts.map +0 -1
- package/lib/chain/regen/regen.d.ts.map +0 -1
- package/lib/chain/reprocess.d.ts.map +0 -1
- package/lib/chain/rewards/attestationsRewards.d.ts.map +0 -1
- package/lib/chain/rewards/blockRewards.d.ts.map +0 -1
- package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +0 -1
- package/lib/chain/seenCache/index.d.ts.map +0 -1
- package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +0 -1
- package/lib/chain/seenCache/seenAttestationData.d.ts.map +0 -1
- package/lib/chain/seenCache/seenAttesters.d.ts.map +0 -1
- package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +0 -1
- package/lib/chain/seenCache/seenBlockProposers.d.ts.map +0 -1
- package/lib/chain/seenCache/seenCommittee.d.ts.map +0 -1
- package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +0 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +0 -1
- package/lib/chain/serializeState.d.ts.map +0 -1
- package/lib/chain/shufflingCache.d.ts.map +0 -1
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/db.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/file.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/index.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/types.d.ts.map +0 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +0 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
- package/lib/chain/stateCache/index.d.ts.map +0 -1
- package/lib/chain/stateCache/mapMetrics.d.ts.map +0 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +0 -1
- package/lib/chain/stateCache/types.d.ts.map +0 -1
- package/lib/chain/validation/aggregateAndProof.d.ts.map +0 -1
- package/lib/chain/validation/attestation.d.ts.map +0 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +0 -1
- package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
- package/lib/chain/validation/block.d.ts.map +0 -1
- package/lib/chain/validation/blsToExecutionChange.d.ts.map +0 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +0 -1
- package/lib/chain/validation/index.d.ts.map +0 -1
- package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +0 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +0 -1
- package/lib/chain/validation/proposerSlashing.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/index.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +0 -1
- package/lib/chain/validation/syncCommittee.d.ts.map +0 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +0 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +0 -1
- package/lib/chain/validatorMonitor.d.ts.map +0 -1
- package/lib/constants/constants.d.ts.map +0 -1
- package/lib/constants/index.d.ts.map +0 -1
- package/lib/constants/network.d.ts.map +0 -1
- package/lib/db/beacon.d.ts.map +0 -1
- package/lib/db/buckets.d.ts.map +0 -1
- package/lib/db/index.d.ts.map +0 -1
- package/lib/db/interface.d.ts.map +0 -1
- package/lib/db/options.d.ts.map +0 -1
- package/lib/db/repositories/attesterSlashing.d.ts.map +0 -1
- package/lib/db/repositories/backfilledRanges.d.ts.map +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +0 -1
- package/lib/db/repositories/blobSidecarsArchive.d.ts.map +0 -1
- package/lib/db/repositories/block.d.ts.map +0 -1
- package/lib/db/repositories/blockArchive.d.ts.map +0 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +0 -1
- package/lib/db/repositories/blsToExecutionChange.d.ts.map +0 -1
- package/lib/db/repositories/checkpointState.d.ts.map +0 -1
- package/lib/db/repositories/dataColumnSidecar.d.ts.map +0 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +0 -1
- package/lib/db/repositories/depositDataRoot.d.ts.map +0 -1
- package/lib/db/repositories/depositEvent.d.ts.map +0 -1
- package/lib/db/repositories/eth1Data.d.ts.map +0 -1
- package/lib/db/repositories/index.d.ts.map +0 -1
- package/lib/db/repositories/lightclientBestUpdate.d.ts.map +0 -1
- package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +0 -1
- package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +0 -1
- package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +0 -1
- package/lib/db/repositories/proposerSlashing.d.ts.map +0 -1
- package/lib/db/repositories/stateArchive.d.ts.map +0 -1
- package/lib/db/repositories/stateArchiveIndex.d.ts.map +0 -1
- package/lib/db/repositories/voluntaryExit.d.ts.map +0 -1
- package/lib/db/single/index.d.ts.map +0 -1
- package/lib/db/single/preGenesisState.d.ts.map +0 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +0 -1
- package/lib/eth1/errors.d.ts.map +0 -1
- package/lib/eth1/eth1DataCache.d.ts.map +0 -1
- package/lib/eth1/eth1DepositDataTracker.d.ts.map +0 -1
- package/lib/eth1/eth1DepositsCache.d.ts.map +0 -1
- package/lib/eth1/eth1MergeBlockTracker.d.ts.map +0 -1
- package/lib/eth1/index.d.ts.map +0 -1
- package/lib/eth1/interface.d.ts.map +0 -1
- package/lib/eth1/options.d.ts.map +0 -1
- package/lib/eth1/provider/eth1Provider.d.ts.map +0 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +0 -1
- package/lib/eth1/provider/jwt.d.ts.map +0 -1
- package/lib/eth1/provider/utils.d.ts.map +0 -1
- package/lib/eth1/stream.d.ts.map +0 -1
- package/lib/eth1/utils/depositContract.d.ts.map +0 -1
- package/lib/eth1/utils/deposits.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Data.d.ts.map +0 -1
- package/lib/eth1/utils/eth1DepositEvent.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Vote.d.ts.map +0 -1
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +0 -1
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +0 -1
- package/lib/execution/builder/cache.d.ts.map +0 -1
- package/lib/execution/builder/http.d.ts.map +0 -1
- package/lib/execution/builder/index.d.ts.map +0 -1
- package/lib/execution/builder/interface.d.ts.map +0 -1
- package/lib/execution/builder/utils.d.ts.map +0 -1
- package/lib/execution/engine/disabled.d.ts.map +0 -1
- package/lib/execution/engine/http.d.ts.map +0 -1
- package/lib/execution/engine/index.d.ts.map +0 -1
- package/lib/execution/engine/interface.d.ts.map +0 -1
- package/lib/execution/engine/mock.d.ts.map +0 -1
- package/lib/execution/engine/payloadIdCache.d.ts.map +0 -1
- package/lib/execution/engine/types.d.ts.map +0 -1
- package/lib/execution/engine/utils.d.ts.map +0 -1
- package/lib/execution/index.d.ts.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/metrics/index.d.ts.map +0 -1
- package/lib/metrics/metrics/beacon.d.ts.map +0 -1
- package/lib/metrics/metrics/lodestar.d.ts.map +0 -1
- package/lib/metrics/metrics.d.ts.map +0 -1
- package/lib/metrics/nodeJsMetrics.d.ts.map +0 -1
- package/lib/metrics/options.d.ts.map +0 -1
- package/lib/metrics/server/http.d.ts.map +0 -1
- package/lib/metrics/server/index.d.ts.map +0 -1
- package/lib/metrics/utils/avgMinMax.d.ts.map +0 -1
- package/lib/metrics/utils/gauge.d.ts.map +0 -1
- package/lib/metrics/utils/registryMetricCreator.d.ts.map +0 -1
- package/lib/monitoring/clientStats.d.ts.map +0 -1
- package/lib/monitoring/index.d.ts.map +0 -1
- package/lib/monitoring/options.d.ts.map +0 -1
- package/lib/monitoring/properties.d.ts.map +0 -1
- package/lib/monitoring/service.d.ts.map +0 -1
- package/lib/monitoring/system.d.ts.map +0 -1
- package/lib/monitoring/types.d.ts.map +0 -1
- package/lib/network/core/events.d.ts.map +0 -1
- package/lib/network/core/index.d.ts.map +0 -1
- package/lib/network/core/metrics.d.ts.map +0 -1
- package/lib/network/core/networkCore.d.ts.map +0 -1
- package/lib/network/core/networkCoreWorker.d.ts.map +0 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +0 -1
- package/lib/network/core/types.d.ts.map +0 -1
- package/lib/network/discv5/index.d.ts.map +0 -1
- package/lib/network/discv5/types.d.ts.map +0 -1
- package/lib/network/discv5/utils.d.ts.map +0 -1
- package/lib/network/discv5/worker.d.ts.map +0 -1
- package/lib/network/events.d.ts.map +0 -1
- package/lib/network/forks.d.ts.map +0 -1
- package/lib/network/gossip/constants.d.ts.map +0 -1
- package/lib/network/gossip/encoding.d.ts.map +0 -1
- package/lib/network/gossip/errors.d.ts.map +0 -1
- package/lib/network/gossip/gossipsub.d.ts.map +0 -1
- package/lib/network/gossip/index.d.ts.map +0 -1
- package/lib/network/gossip/interface.d.ts.map +0 -1
- package/lib/network/gossip/metrics.d.ts.map +0 -1
- package/lib/network/gossip/scoringParameters.d.ts.map +0 -1
- package/lib/network/gossip/topic.d.ts.map +0 -1
- package/lib/network/index.d.ts.map +0 -1
- package/lib/network/interface.d.ts.map +0 -1
- package/lib/network/libp2p/error.d.ts.map +0 -1
- package/lib/network/libp2p/index.d.ts.map +0 -1
- package/lib/network/metadata.d.ts.map +0 -1
- package/lib/network/network.d.ts.map +0 -1
- package/lib/network/networkConfig.d.ts.map +0 -1
- package/lib/network/options.d.ts.map +0 -1
- package/lib/network/peers/client.d.ts.map +0 -1
- package/lib/network/peers/datastore.d.ts.map +0 -1
- package/lib/network/peers/discover.d.ts.map +0 -1
- package/lib/network/peers/index.d.ts.map +0 -1
- package/lib/network/peers/peerManager.d.ts.map +0 -1
- package/lib/network/peers/peersData.d.ts.map +0 -1
- package/lib/network/peers/score/constants.d.ts.map +0 -1
- package/lib/network/peers/score/index.d.ts.map +0 -1
- package/lib/network/peers/score/interface.d.ts.map +0 -1
- package/lib/network/peers/score/score.d.ts.map +0 -1
- package/lib/network/peers/score/store.d.ts.map +0 -1
- package/lib/network/peers/score/utils.d.ts.map +0 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +0 -1
- package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +0 -1
- package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +0 -1
- package/lib/network/peers/utils/index.d.ts.map +0 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +0 -1
- package/lib/network/peers/utils/subnetMap.d.ts.map +0 -1
- package/lib/network/processor/aggregatorTracker.d.ts.map +0 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +0 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/indexed.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/linear.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/types.d.ts.map +0 -1
- package/lib/network/processor/gossipValidatorFn.d.ts.map +0 -1
- package/lib/network/processor/index.d.ts.map +0 -1
- package/lib/network/processor/types.d.ts.map +0 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/index.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +0 -1
- package/lib/network/reqresp/index.d.ts.map +0 -1
- package/lib/network/reqresp/interface.d.ts.map +0 -1
- package/lib/network/reqresp/protocols.d.ts.map +0 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +0 -1
- package/lib/network/reqresp/score.d.ts.map +0 -1
- package/lib/network/reqresp/types.d.ts.map +0 -1
- package/lib/network/reqresp/utils/collect.d.ts.map +0 -1
- package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +0 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +0 -1
- package/lib/network/statusCache.d.ts.map +0 -1
- package/lib/network/subnets/attnetsService.d.ts.map +0 -1
- package/lib/network/subnets/index.d.ts.map +0 -1
- package/lib/network/subnets/interface.d.ts.map +0 -1
- package/lib/network/subnets/syncnetsService.d.ts.map +0 -1
- package/lib/network/subnets/util.d.ts.map +0 -1
- package/lib/network/util.d.ts.map +0 -1
- package/lib/node/index.d.ts.map +0 -1
- package/lib/node/nodejs.d.ts.map +0 -1
- package/lib/node/notifier.d.ts.map +0 -1
- package/lib/node/options.d.ts.map +0 -1
- package/lib/node/utils/interop/deposits.d.ts.map +0 -1
- package/lib/node/utils/interop/state.d.ts.map +0 -1
- package/lib/node/utils/lightclient.d.ts.map +0 -1
- package/lib/node/utils/state.d.ts.map +0 -1
- package/lib/sync/backfill/backfill.d.ts.map +0 -1
- package/lib/sync/backfill/errors.d.ts.map +0 -1
- package/lib/sync/backfill/index.d.ts.map +0 -1
- package/lib/sync/backfill/verify.d.ts.map +0 -1
- package/lib/sync/constants.d.ts.map +0 -1
- package/lib/sync/index.d.ts.map +0 -1
- package/lib/sync/interface.d.ts.map +0 -1
- package/lib/sync/options.d.ts.map +0 -1
- package/lib/sync/range/batch.d.ts.map +0 -1
- package/lib/sync/range/chain.d.ts.map +0 -1
- package/lib/sync/range/range.d.ts.map +0 -1
- package/lib/sync/range/utils/batches.d.ts.map +0 -1
- package/lib/sync/range/utils/chainTarget.d.ts.map +0 -1
- package/lib/sync/range/utils/hashBlocks.d.ts.map +0 -1
- package/lib/sync/range/utils/index.d.ts.map +0 -1
- package/lib/sync/range/utils/peerBalancer.d.ts.map +0 -1
- package/lib/sync/range/utils/updateChains.d.ts.map +0 -1
- package/lib/sync/sync.d.ts.map +0 -1
- package/lib/sync/types.d.ts.map +0 -1
- package/lib/sync/unknownBlock.d.ts.map +0 -1
- package/lib/sync/utils/downloadByRange.d.ts.map +0 -1
- package/lib/sync/utils/downloadByRoot.d.ts.map +0 -1
- package/lib/sync/utils/pendingBlocksTree.d.ts.map +0 -1
- package/lib/sync/utils/remoteSyncType.d.ts.map +0 -1
- package/lib/util/address.d.ts.map +0 -1
- package/lib/util/array.d.ts.map +0 -1
- package/lib/util/asyncIterableToEvents.d.ts.map +0 -1
- package/lib/util/binarySearch.d.ts.map +0 -1
- package/lib/util/bitArray.d.ts.map +0 -1
- package/lib/util/blobs.d.ts.map +0 -1
- package/lib/util/bufferPool.d.ts.map +0 -1
- package/lib/util/bytes.d.ts.map +0 -1
- package/lib/util/chunkify.d.ts.map +0 -1
- package/lib/util/clock.d.ts.map +0 -1
- package/lib/util/dataColumns.d.ts.map +0 -1
- package/lib/util/dependentRoot.d.ts.map +0 -1
- package/lib/util/enum.d.ts.map +0 -1
- package/lib/util/error.d.ts.map +0 -1
- package/lib/util/eventLoop.d.ts.map +0 -1
- package/lib/util/execution.d.ts.map +0 -1
- package/lib/util/file.d.ts.map +0 -1
- package/lib/util/forkChoice.d.ts.map +0 -1
- package/lib/util/forkName.d.ts.map +0 -1
- package/lib/util/graffiti.d.ts.map +0 -1
- package/lib/util/hex.d.ts.map +0 -1
- package/lib/util/index.d.ts.map +0 -1
- package/lib/util/ip.d.ts.map +0 -1
- package/lib/util/itTrigger.d.ts.map +0 -1
- package/lib/util/kzg.d.ts.map +0 -1
- package/lib/util/map.d.ts.map +0 -1
- package/lib/util/metadata.d.ts.map +0 -1
- package/lib/util/multifork.d.ts.map +0 -1
- package/lib/util/numpy.d.ts.map +0 -1
- package/lib/util/peerId.d.ts.map +0 -1
- package/lib/util/profile.d.ts.map +0 -1
- package/lib/util/promises.d.ts.map +0 -1
- package/lib/util/queue/errors.d.ts.map +0 -1
- package/lib/util/queue/fnQueue.d.ts.map +0 -1
- package/lib/util/queue/index.d.ts.map +0 -1
- package/lib/util/queue/itemQueue.d.ts.map +0 -1
- package/lib/util/queue/options.d.ts.map +0 -1
- package/lib/util/serializedCache.d.ts.map +0 -1
- package/lib/util/set.d.ts.map +0 -1
- package/lib/util/shuffle.d.ts.map +0 -1
- package/lib/util/sortBy.d.ts.map +0 -1
- package/lib/util/sszBytes.d.ts.map +0 -1
- package/lib/util/strictEvents.d.ts.map +0 -1
- package/lib/util/time.d.ts.map +0 -1
- package/lib/util/timeSeries.d.ts.map +0 -1
- package/lib/util/types.d.ts.map +0 -1
- package/lib/util/workerEvents.d.ts.map +0 -1
- package/lib/util/wrapError.d.ts.map +0 -1
- package/src/api/impl/api.ts +0 -26
- package/src/api/impl/beacon/blocks/index.ts +0 -744
- package/src/api/impl/beacon/blocks/utils.ts +0 -75
- package/src/api/impl/beacon/index.ts +0 -35
- package/src/api/impl/beacon/pool/index.ts +0 -314
- package/src/api/impl/beacon/rewards/index.ts +0 -30
- package/src/api/impl/beacon/state/index.ts +0 -406
- package/src/api/impl/beacon/state/utils.ts +0 -189
- package/src/api/impl/config/constants.ts +0 -127
- package/src/api/impl/config/index.ts +0 -59
- package/src/api/impl/debug/index.ts +0 -131
- package/src/api/impl/errors.ts +0 -50
- package/src/api/impl/events/index.ts +0 -33
- package/src/api/impl/index.ts +0 -6
- package/src/api/impl/lightclient/index.ts +0 -64
- package/src/api/impl/lodestar/index.ts +0 -257
- package/src/api/impl/node/index.ts +0 -88
- package/src/api/impl/node/utils.ts +0 -51
- package/src/api/impl/proof/index.ts +0 -60
- package/src/api/impl/types.ts +0 -17
- package/src/api/impl/utils.ts +0 -25
- package/src/api/impl/validator/index.ts +0 -1540
- package/src/api/impl/validator/utils.ts +0 -85
- package/src/api/index.ts +0 -2
- package/src/api/options.ts +0 -16
- package/src/api/rest/activeSockets.ts +0 -109
- package/src/api/rest/base.ts +0 -216
- package/src/api/rest/index.ts +0 -63
- package/src/api/rest/swaggerUI.ts +0 -80
- package/src/bun-wrappers/prometheus-gc-stats.ts +0 -7
- package/src/chain/ColumnReconstructionTracker.ts +0 -90
- package/src/chain/GetBlobsTracker.ts +0 -115
- package/src/chain/archiveStore/archiveStore.ts +0 -222
- package/src/chain/archiveStore/constants.ts +0 -5
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +0 -116
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +0 -68
- package/src/chain/archiveStore/historicalState/metrics.ts +0 -214
- package/src/chain/archiveStore/historicalState/types.ts +0 -41
- package/src/chain/archiveStore/historicalState/worker.ts +0 -77
- package/src/chain/archiveStore/index.ts +0 -3
- package/src/chain/archiveStore/interface.ts +0 -75
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +0 -138
- package/src/chain/archiveStore/utils/archiveBlocks.ts +0 -437
- package/src/chain/archiveStore/utils/pruneHistory.ts +0 -56
- package/src/chain/archiveStore/utils/updateBackfillRange.ts +0 -50
- package/src/chain/balancesCache.ts +0 -52
- package/src/chain/beaconProposerCache.ts +0 -43
- package/src/chain/blocks/blockInput/blockInput.ts +0 -852
- package/src/chain/blocks/blockInput/errors.ts +0 -48
- package/src/chain/blocks/blockInput/index.ts +0 -4
- package/src/chain/blocks/blockInput/types.ts +0 -145
- package/src/chain/blocks/blockInput/utils.ts +0 -21
- package/src/chain/blocks/importBlock.ts +0 -597
- package/src/chain/blocks/index.ts +0 -179
- package/src/chain/blocks/types.ts +0 -101
- package/src/chain/blocks/utils/blowfishBanner.ts +0 -28
- package/src/chain/blocks/utils/chainSegment.ts +0 -29
- package/src/chain/blocks/utils/checkpoint.ts +0 -25
- package/src/chain/blocks/utils/giraffeBanner.ts +0 -30
- package/src/chain/blocks/utils/ownBanner.ts +0 -20
- package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +0 -43
- package/src/chain/blocks/utils/zebraBanner.ts +0 -45
- package/src/chain/blocks/verifyBlock.ts +0 -242
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +0 -42
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +0 -438
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +0 -129
- package/src/chain/blocks/verifyBlocksSignatures.ts +0 -105
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +0 -114
- package/src/chain/blocks/writeBlockInputToDb.ts +0 -120
- package/src/chain/bls/index.ts +0 -4
- package/src/chain/bls/interface.ts +0 -68
- package/src/chain/bls/maybeBatch.ts +0 -45
- package/src/chain/bls/multithread/index.ts +0 -582
- package/src/chain/bls/multithread/jobItem.ts +0 -119
- package/src/chain/bls/multithread/poolSize.ts +0 -16
- package/src/chain/bls/multithread/types.ts +0 -38
- package/src/chain/bls/multithread/utils.ts +0 -19
- package/src/chain/bls/multithread/worker.ts +0 -114
- package/src/chain/bls/singleThread.ts +0 -87
- package/src/chain/bls/utils.ts +0 -30
- package/src/chain/chain.ts +0 -1354
- package/src/chain/emitter.ts +0 -113
- package/src/chain/errors/attestationError.ts +0 -194
- package/src/chain/errors/attesterSlashingError.ts +0 -11
- package/src/chain/errors/blobSidecarError.ts +0 -60
- package/src/chain/errors/blockError.ts +0 -166
- package/src/chain/errors/blsToExecutionChangeError.ts +0 -13
- package/src/chain/errors/dataColumnSidecarError.ts +0 -80
- package/src/chain/errors/gossipValidation.ts +0 -20
- package/src/chain/errors/index.ts +0 -10
- package/src/chain/errors/lightClientError.ts +0 -30
- package/src/chain/errors/proposerSlashingError.ts +0 -11
- package/src/chain/errors/syncCommitteeError.ts +0 -36
- package/src/chain/errors/voluntaryExitError.ts +0 -13
- package/src/chain/forkChoice/index.ts +0 -112
- package/src/chain/genesis/genesis.ts +0 -190
- package/src/chain/genesis/interface.ts +0 -14
- package/src/chain/index.ts +0 -6
- package/src/chain/initState.ts +0 -221
- package/src/chain/interface.ts +0 -280
- package/src/chain/lightClient/index.ts +0 -764
- package/src/chain/lightClient/proofs.ts +0 -85
- package/src/chain/lightClient/types.ts +0 -33
- package/src/chain/opPools/aggregatedAttestationPool.ts +0 -1063
- package/src/chain/opPools/attestationPool.ts +0 -282
- package/src/chain/opPools/index.ts +0 -5
- package/src/chain/opPools/opPool.ts +0 -462
- package/src/chain/opPools/syncCommitteeMessagePool.ts +0 -169
- package/src/chain/opPools/syncContributionAndProofPool.ts +0 -240
- package/src/chain/opPools/types.ts +0 -35
- package/src/chain/opPools/utils.ts +0 -65
- package/src/chain/options.ts +0 -138
- package/src/chain/prepareNextSlot.ts +0 -277
- package/src/chain/produceBlock/computeNewStateRoot.ts +0 -55
- package/src/chain/produceBlock/index.ts +0 -2
- package/src/chain/produceBlock/produceBlockBody.ts +0 -797
- package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +0 -54
- package/src/chain/regen/errors.ts +0 -30
- package/src/chain/regen/index.ts +0 -4
- package/src/chain/regen/interface.ts +0 -93
- package/src/chain/regen/queued.ts +0 -317
- package/src/chain/regen/regen.ts +0 -424
- package/src/chain/reprocess.ts +0 -161
- package/src/chain/rewards/attestationsRewards.ts +0 -196
- package/src/chain/rewards/blockRewards.ts +0 -150
- package/src/chain/rewards/syncCommitteeRewards.ts +0 -58
- package/src/chain/seenCache/index.ts +0 -5
- package/src/chain/seenCache/seenAggregateAndProof.ts +0 -120
- package/src/chain/seenCache/seenAttestationData.ts +0 -145
- package/src/chain/seenCache/seenAttesters.ts +0 -58
- package/src/chain/seenCache/seenBlockAttesters.ts +0 -18
- package/src/chain/seenCache/seenBlockProposers.ts +0 -48
- package/src/chain/seenCache/seenCommittee.ts +0 -43
- package/src/chain/seenCache/seenCommitteeContribution.ts +0 -104
- package/src/chain/seenCache/seenGossipBlockInput.ts +0 -373
- package/src/chain/serializeState.ts +0 -32
- package/src/chain/shufflingCache.ts +0 -238
- package/src/chain/stateCache/blockStateCacheImpl.ts +0 -150
- package/src/chain/stateCache/datastore/db.ts +0 -36
- package/src/chain/stateCache/datastore/file.ts +0 -53
- package/src/chain/stateCache/datastore/index.ts +0 -2
- package/src/chain/stateCache/datastore/types.ts +0 -13
- package/src/chain/stateCache/fifoBlockStateCache.ts +0 -208
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -198
- package/src/chain/stateCache/index.ts +0 -3
- package/src/chain/stateCache/mapMetrics.ts +0 -52
- package/src/chain/stateCache/persistentCheckpointsCache.ts +0 -837
- package/src/chain/stateCache/types.ts +0 -86
- package/src/chain/validation/aggregateAndProof.ts +0 -258
- package/src/chain/validation/attestation.ts +0 -885
- package/src/chain/validation/attesterSlashing.ts +0 -61
- package/src/chain/validation/blobSidecar.ts +0 -301
- package/src/chain/validation/block.ts +0 -188
- package/src/chain/validation/blsToExecutionChange.ts +0 -61
- package/src/chain/validation/dataColumnSidecar.ts +0 -381
- package/src/chain/validation/index.ts +0 -9
- package/src/chain/validation/lightClientFinalityUpdate.ts +0 -46
- package/src/chain/validation/lightClientOptimisticUpdate.ts +0 -68
- package/src/chain/validation/proposerSlashing.ts +0 -54
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +0 -38
- package/src/chain/validation/signatureSets/contributionAndProof.ts +0 -27
- package/src/chain/validation/signatureSets/index.ts +0 -6
- package/src/chain/validation/signatureSets/selectionProof.ts +0 -27
- package/src/chain/validation/signatureSets/syncCommittee.ts +0 -22
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +0 -18
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +0 -27
- package/src/chain/validation/syncCommittee.ts +0 -165
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +0 -122
- package/src/chain/validation/voluntaryExit.ts +0 -58
- package/src/chain/validatorMonitor.ts +0 -1309
- package/src/constants/constants.ts +0 -15
- package/src/constants/index.ts +0 -2
- package/src/constants/network.ts +0 -52
- package/src/db/beacon.ts +0 -113
- package/src/db/buckets.ts +0 -80
- package/src/db/index.ts +0 -2
- package/src/db/interface.ts +0 -76
- package/src/db/options.ts +0 -7
- package/src/db/repositories/attesterSlashing.ts +0 -38
- package/src/db/repositories/backfilledRanges.ts +0 -29
- package/src/db/repositories/blobSidecars.ts +0 -37
- package/src/db/repositories/blobSidecarsArchive.ts +0 -28
- package/src/db/repositories/block.ts +0 -33
- package/src/db/repositories/blockArchive.ts +0 -170
- package/src/db/repositories/blockArchiveIndex.ts +0 -45
- package/src/db/repositories/blsToExecutionChange.ts +0 -16
- package/src/db/repositories/checkpointState.ts +0 -31
- package/src/db/repositories/dataColumnSidecar.ts +0 -49
- package/src/db/repositories/dataColumnSidecarArchive.ts +0 -56
- package/src/db/repositories/depositDataRoot.ts +0 -80
- package/src/db/repositories/depositEvent.ts +0 -32
- package/src/db/repositories/eth1Data.ts +0 -33
- package/src/db/repositories/index.ts +0 -20
- package/src/db/repositories/lightclientBestUpdate.ts +0 -41
- package/src/db/repositories/lightclientCheckpointHeader.ts +0 -32
- package/src/db/repositories/lightclientSyncCommittee.ts +0 -16
- package/src/db/repositories/lightclientSyncCommitteeWitness.ts +0 -77
- package/src/db/repositories/proposerSlashing.ts +0 -15
- package/src/db/repositories/stateArchive.ts +0 -69
- package/src/db/repositories/stateArchiveIndex.ts +0 -18
- package/src/db/repositories/voluntaryExit.ts +0 -15
- package/src/db/single/index.ts +0 -2
- package/src/db/single/preGenesisState.ts +0 -37
- package/src/db/single/preGenesisStateLastProcessedBlock.ts +0 -34
- package/src/eth1/errors.ts +0 -40
- package/src/eth1/eth1DataCache.ts +0 -26
- package/src/eth1/eth1DepositDataTracker.ts +0 -410
- package/src/eth1/eth1DepositsCache.ts +0 -141
- package/src/eth1/eth1MergeBlockTracker.ts +0 -328
- package/src/eth1/index.ts +0 -157
- package/src/eth1/interface.ts +0 -131
- package/src/eth1/options.ts +0 -28
- package/src/eth1/provider/eth1Provider.ts +0 -229
- package/src/eth1/provider/jsonRpcHttpClient.ts +0 -390
- package/src/eth1/provider/jwt.ts +0 -36
- package/src/eth1/provider/utils.ts +0 -136
- package/src/eth1/stream.ts +0 -75
- package/src/eth1/utils/depositContract.ts +0 -37
- package/src/eth1/utils/deposits.ts +0 -70
- package/src/eth1/utils/eth1Data.ts +0 -100
- package/src/eth1/utils/eth1DepositEvent.ts +0 -12
- package/src/eth1/utils/eth1Vote.ts +0 -142
- package/src/eth1/utils/groupDepositEventsByBlock.ts +0 -19
- package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +0 -18
- package/src/execution/builder/cache.ts +0 -39
- package/src/execution/builder/http.ts +0 -229
- package/src/execution/builder/index.ts +0 -27
- package/src/execution/builder/interface.ts +0 -49
- package/src/execution/builder/utils.ts +0 -19
- package/src/execution/engine/disabled.ts +0 -35
- package/src/execution/engine/http.ts +0 -644
- package/src/execution/engine/index.ts +0 -63
- package/src/execution/engine/interface.ts +0 -199
- package/src/execution/engine/mock.ts +0 -493
- package/src/execution/engine/payloadIdCache.ts +0 -54
- package/src/execution/engine/types.ts +0 -640
- package/src/execution/engine/utils.ts +0 -136
- package/src/execution/index.ts +0 -4
- package/src/index.ts +0 -20
- package/src/metrics/index.ts +0 -4
- package/src/metrics/metrics/beacon.ts +0 -390
- package/src/metrics/metrics/lodestar.ts +0 -1870
- package/src/metrics/metrics.ts +0 -43
- package/src/metrics/nodeJsMetrics.ts +0 -19
- package/src/metrics/options.ts +0 -22
- package/src/metrics/server/http.ts +0 -114
- package/src/metrics/server/index.ts +0 -1
- package/src/metrics/utils/avgMinMax.ts +0 -87
- package/src/metrics/utils/gauge.ts +0 -22
- package/src/metrics/utils/registryMetricCreator.ts +0 -41
- package/src/monitoring/clientStats.ts +0 -297
- package/src/monitoring/index.ts +0 -2
- package/src/monitoring/options.ts +0 -19
- package/src/monitoring/properties.ts +0 -152
- package/src/monitoring/service.ts +0 -235
- package/src/monitoring/system.ts +0 -146
- package/src/monitoring/types.ts +0 -21
- package/src/network/core/events.ts +0 -59
- package/src/network/core/index.ts +0 -3
- package/src/network/core/metrics.ts +0 -304
- package/src/network/core/networkCore.ts +0 -599
- package/src/network/core/networkCoreWorker.ts +0 -176
- package/src/network/core/networkCoreWorkerHandler.ts +0 -284
- package/src/network/core/types.ts +0 -119
- package/src/network/discv5/index.ts +0 -132
- package/src/network/discv5/types.ts +0 -74
- package/src/network/discv5/utils.ts +0 -50
- package/src/network/discv5/worker.ts +0 -137
- package/src/network/events.ts +0 -51
- package/src/network/forks.ts +0 -94
- package/src/network/gossip/constants.ts +0 -15
- package/src/network/gossip/encoding.ts +0 -111
- package/src/network/gossip/errors.ts +0 -7
- package/src/network/gossip/gossipsub.ts +0 -384
- package/src/network/gossip/index.ts +0 -4
- package/src/network/gossip/interface.ts +0 -215
- package/src/network/gossip/metrics.ts +0 -71
- package/src/network/gossip/scoringParameters.ts +0 -333
- package/src/network/gossip/topic.ts +0 -332
- package/src/network/index.ts +0 -8
- package/src/network/interface.ts +0 -134
- package/src/network/libp2p/error.ts +0 -55
- package/src/network/libp2p/index.ts +0 -153
- package/src/network/metadata.ts +0 -162
- package/src/network/network.ts +0 -767
- package/src/network/networkConfig.ts +0 -12
- package/src/network/options.ts +0 -70
- package/src/network/peers/client.ts +0 -29
- package/src/network/peers/datastore.ts +0 -188
- package/src/network/peers/discover.ts +0 -647
- package/src/network/peers/index.ts +0 -2
- package/src/network/peers/peerManager.ts +0 -899
- package/src/network/peers/peersData.ts +0 -65
- package/src/network/peers/score/constants.ts +0 -34
- package/src/network/peers/score/index.ts +0 -4
- package/src/network/peers/score/interface.ts +0 -74
- package/src/network/peers/score/score.ts +0 -200
- package/src/network/peers/score/store.ts +0 -95
- package/src/network/peers/score/utils.ts +0 -37
- package/src/network/peers/utils/assertPeerRelevance.ts +0 -99
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +0 -27
- package/src/network/peers/utils/getConnectedPeerIds.ts +0 -33
- package/src/network/peers/utils/index.ts +0 -4
- package/src/network/peers/utils/prioritizePeers.ts +0 -627
- package/src/network/peers/utils/subnetMap.ts +0 -88
- package/src/network/processor/aggregatorTracker.ts +0 -38
- package/src/network/processor/extractSlotRootFns.ts +0 -64
- package/src/network/processor/gossipHandlers.ts +0 -951
- package/src/network/processor/gossipQueues/index.ts +0 -114
- package/src/network/processor/gossipQueues/indexed.ts +0 -219
- package/src/network/processor/gossipQueues/linear.ts +0 -162
- package/src/network/processor/gossipQueues/types.ts +0 -57
- package/src/network/processor/gossipValidatorFn.ts +0 -142
- package/src/network/processor/index.ts +0 -496
- package/src/network/processor/types.ts +0 -27
- package/src/network/reqresp/ReqRespBeaconNode.ts +0 -373
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +0 -101
- package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +0 -49
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -114
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -62
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +0 -144
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +0 -88
- package/src/network/reqresp/handlers/index.ts +0 -78
- package/src/network/reqresp/handlers/lightClientBootstrap.ts +0 -31
- package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +0 -21
- package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +0 -21
- package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +0 -39
- package/src/network/reqresp/index.ts +0 -2
- package/src/network/reqresp/interface.ts +0 -45
- package/src/network/reqresp/protocols.ts +0 -146
- package/src/network/reqresp/rateLimit.ts +0 -112
- package/src/network/reqresp/score.ts +0 -70
- package/src/network/reqresp/types.ts +0 -174
- package/src/network/reqresp/utils/collect.ts +0 -84
- package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +0 -57
- package/src/network/reqresp/utils/dataColumnResponseValidation.ts +0 -99
- package/src/network/statusCache.ts +0 -17
- package/src/network/subnets/attnetsService.ts +0 -385
- package/src/network/subnets/index.ts +0 -2
- package/src/network/subnets/interface.ts +0 -66
- package/src/network/subnets/syncnetsService.ts +0 -147
- package/src/network/subnets/util.ts +0 -63
- package/src/network/util.ts +0 -29
- package/src/node/index.ts +0 -2
- package/src/node/nodejs.ts +0 -349
- package/src/node/notifier.ts +0 -206
- package/src/node/options.ts +0 -51
- package/src/node/utils/interop/deposits.ts +0 -53
- package/src/node/utils/interop/state.ts +0 -59
- package/src/node/utils/lightclient.ts +0 -7
- package/src/node/utils/state.ts +0 -37
- package/src/sync/backfill/backfill.ts +0 -893
- package/src/sync/backfill/errors.ts +0 -23
- package/src/sync/backfill/index.ts +0 -1
- package/src/sync/backfill/verify.ts +0 -58
- package/src/sync/constants.ts +0 -71
- package/src/sync/index.ts +0 -2
- package/src/sync/interface.ts +0 -55
- package/src/sync/options.ts +0 -45
- package/src/sync/range/batch.ts +0 -455
- package/src/sync/range/chain.ts +0 -715
- package/src/sync/range/range.ts +0 -354
- package/src/sync/range/utils/batches.ts +0 -119
- package/src/sync/range/utils/chainTarget.ts +0 -62
- package/src/sync/range/utils/hashBlocks.ts +0 -27
- package/src/sync/range/utils/index.ts +0 -5
- package/src/sync/range/utils/peerBalancer.ts +0 -184
- package/src/sync/range/utils/updateChains.ts +0 -66
- package/src/sync/sync.ts +0 -290
- package/src/sync/types.ts +0 -57
- package/src/sync/unknownBlock.ts +0 -859
- package/src/sync/utils/downloadByRange.ts +0 -808
- package/src/sync/utils/downloadByRoot.ts +0 -560
- package/src/sync/utils/pendingBlocksTree.ts +0 -97
- package/src/sync/utils/remoteSyncType.ts +0 -144
- package/src/util/address.ts +0 -3
- package/src/util/array.ts +0 -311
- package/src/util/asyncIterableToEvents.ts +0 -164
- package/src/util/binarySearch.ts +0 -48
- package/src/util/bitArray.ts +0 -84
- package/src/util/blobs.ts +0 -210
- package/src/util/bufferPool.ts +0 -95
- package/src/util/bytes.ts +0 -11
- package/src/util/chunkify.ts +0 -27
- package/src/util/clock.ts +0 -212
- package/src/util/dataColumns.ts +0 -415
- package/src/util/dependentRoot.ts +0 -47
- package/src/util/enum.ts +0 -17
- package/src/util/error.ts +0 -56
- package/src/util/eventLoop.ts +0 -22
- package/src/util/execution.ts +0 -223
- package/src/util/file.ts +0 -52
- package/src/util/forkChoice.ts +0 -5
- package/src/util/forkName.ts +0 -20
- package/src/util/graffiti.ts +0 -39
- package/src/util/hex.ts +0 -9
- package/src/util/index.ts +0 -2
- package/src/util/ip.ts +0 -6
- package/src/util/itTrigger.ts +0 -49
- package/src/util/kzg.ts +0 -3
- package/src/util/map.ts +0 -77
- package/src/util/metadata.ts +0 -22
- package/src/util/multifork.ts +0 -69
- package/src/util/numpy.ts +0 -8
- package/src/util/peerId.ts +0 -16
- package/src/util/profile.ts +0 -54
- package/src/util/promises.ts +0 -14
- package/src/util/queue/errors.ts +0 -14
- package/src/util/queue/fnQueue.ts +0 -16
- package/src/util/queue/index.ts +0 -4
- package/src/util/queue/itemQueue.ts +0 -128
- package/src/util/queue/options.ts +0 -37
- package/src/util/serializedCache.ts +0 -20
- package/src/util/set.ts +0 -62
- package/src/util/shuffle.ts +0 -21
- package/src/util/sortBy.ts +0 -19
- package/src/util/sszBytes.ts +0 -481
- package/src/util/strictEvents.ts +0 -8
- package/src/util/time.ts +0 -13
- package/src/util/timeSeries.ts +0 -118
- package/src/util/types.ts +0 -31
- package/src/util/workerEvents.ts +0 -142
- package/src/util/wrapError.ts +0 -27
package/src/chain/chain.ts
DELETED
|
@@ -1,1354 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import {PrivateKey} from "@libp2p/interface";
|
|
3
|
-
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
4
|
-
import {CompositeTypeAny, TreeView, Type} from "@chainsafe/ssz";
|
|
5
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
6
|
-
import {CheckpointWithHex, ExecutionStatus, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
|
|
7
|
-
import {LoggerNode} from "@lodestar/logger/node";
|
|
8
|
-
import {EFFECTIVE_BALANCE_INCREMENT, GENESIS_SLOT, SLOTS_PER_EPOCH, isForkPostElectra} from "@lodestar/params";
|
|
9
|
-
import {
|
|
10
|
-
BeaconStateAllForks,
|
|
11
|
-
BeaconStateElectra,
|
|
12
|
-
CachedBeaconStateAllForks,
|
|
13
|
-
EffectiveBalanceIncrements,
|
|
14
|
-
EpochShuffling,
|
|
15
|
-
Index2PubkeyCache,
|
|
16
|
-
computeAnchorCheckpoint,
|
|
17
|
-
computeEndSlotAtEpoch,
|
|
18
|
-
computeEpochAtSlot,
|
|
19
|
-
computeStartSlotAtEpoch,
|
|
20
|
-
createCachedBeaconState,
|
|
21
|
-
getEffectiveBalanceIncrementsZeroInactive,
|
|
22
|
-
getEffectiveBalancesFromStateBytes,
|
|
23
|
-
isCachedBeaconState,
|
|
24
|
-
processSlots,
|
|
25
|
-
} from "@lodestar/state-transition";
|
|
26
|
-
import {
|
|
27
|
-
BeaconBlock,
|
|
28
|
-
BlindedBeaconBlock,
|
|
29
|
-
BlindedBeaconBlockBody,
|
|
30
|
-
Epoch,
|
|
31
|
-
Root,
|
|
32
|
-
RootHex,
|
|
33
|
-
SignedBeaconBlock,
|
|
34
|
-
Slot,
|
|
35
|
-
Status,
|
|
36
|
-
UintNum64,
|
|
37
|
-
ValidatorIndex,
|
|
38
|
-
Wei,
|
|
39
|
-
isBlindedBeaconBlock,
|
|
40
|
-
} from "@lodestar/types";
|
|
41
|
-
import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRootHex} from "@lodestar/utils";
|
|
42
|
-
import {ProcessShutdownCallback} from "@lodestar/validator";
|
|
43
|
-
import {GENESIS_EPOCH, ZERO_HASH} from "../constants/index.js";
|
|
44
|
-
import {IBeaconDb} from "../db/index.js";
|
|
45
|
-
import {IEth1ForBlockProduction} from "../eth1/index.js";
|
|
46
|
-
import {BuilderStatus} from "../execution/builder/http.js";
|
|
47
|
-
import {IExecutionBuilder, IExecutionEngine} from "../execution/index.js";
|
|
48
|
-
import {Metrics} from "../metrics/index.js";
|
|
49
|
-
import {computeNodeIdFromPrivateKey} from "../network/subnets/interface.js";
|
|
50
|
-
import {BufferPool} from "../util/bufferPool.js";
|
|
51
|
-
import {Clock, ClockEvent, IClock} from "../util/clock.js";
|
|
52
|
-
import {CustodyConfig, getValidatorsCustodyRequirement} from "../util/dataColumns.js";
|
|
53
|
-
import {ensureDir, writeIfNotExist} from "../util/file.js";
|
|
54
|
-
import {isOptimisticBlock} from "../util/forkChoice.js";
|
|
55
|
-
import {SerializedCache} from "../util/serializedCache.js";
|
|
56
|
-
import {ArchiveStore} from "./archiveStore/archiveStore.js";
|
|
57
|
-
import {CheckpointBalancesCache} from "./balancesCache.js";
|
|
58
|
-
import {BeaconProposerCache} from "./beaconProposerCache.js";
|
|
59
|
-
import {IBlockInput} from "./blocks/blockInput/index.js";
|
|
60
|
-
import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
|
|
61
|
-
import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
|
|
62
|
-
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
63
|
-
import {ChainEvent, ChainEventEmitter} from "./emitter.js";
|
|
64
|
-
import {ForkchoiceCaller, initializeForkChoice} from "./forkChoice/index.js";
|
|
65
|
-
import {GetBlobsTracker} from "./GetBlobsTracker.js";
|
|
66
|
-
import {CommonBlockBody, FindHeadFnName, IBeaconChain, ProposerPreparationData, StateGetOpts} from "./interface.js";
|
|
67
|
-
import {LightClientServer} from "./lightClient/index.js";
|
|
68
|
-
import {
|
|
69
|
-
AggregatedAttestationPool,
|
|
70
|
-
AttestationPool,
|
|
71
|
-
OpPool,
|
|
72
|
-
SyncCommitteeMessagePool,
|
|
73
|
-
SyncContributionAndProofPool,
|
|
74
|
-
} from "./opPools/index.js";
|
|
75
|
-
import {IChainOptions} from "./options.js";
|
|
76
|
-
import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
|
|
77
|
-
import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
|
|
78
|
-
import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
|
|
79
|
-
import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
|
|
80
|
-
import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
|
|
81
|
-
import {ReprocessController} from "./reprocess.js";
|
|
82
|
-
import {AttestationsRewards, computeAttestationsRewards} from "./rewards/attestationsRewards.js";
|
|
83
|
-
import {BlockRewards, computeBlockRewards} from "./rewards/blockRewards.js";
|
|
84
|
-
import {SyncCommitteeRewards, computeSyncCommitteeRewards} from "./rewards/syncCommitteeRewards.js";
|
|
85
|
-
import {
|
|
86
|
-
SeenAggregators,
|
|
87
|
-
SeenAttesters,
|
|
88
|
-
SeenBlockProposers,
|
|
89
|
-
SeenContributionAndProof,
|
|
90
|
-
SeenSyncCommitteeMessages,
|
|
91
|
-
} from "./seenCache/index.js";
|
|
92
|
-
import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
|
|
93
|
-
import {SeenAttestationDatas} from "./seenCache/seenAttestationData.js";
|
|
94
|
-
import {SeenBlockAttesters} from "./seenCache/seenBlockAttesters.js";
|
|
95
|
-
import {SeenBlockInput} from "./seenCache/seenGossipBlockInput.js";
|
|
96
|
-
import {ShufflingCache} from "./shufflingCache.js";
|
|
97
|
-
import {BlockStateCacheImpl} from "./stateCache/blockStateCacheImpl.js";
|
|
98
|
-
import {DbCPStateDatastore} from "./stateCache/datastore/db.js";
|
|
99
|
-
import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
|
|
100
|
-
import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
|
|
101
|
-
import {InMemoryCheckpointStateCache} from "./stateCache/inMemoryCheckpointsCache.js";
|
|
102
|
-
import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
|
|
103
|
-
import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* The maximum number of cached produced results to keep in memory.
|
|
107
|
-
*
|
|
108
|
-
* Arbitrary constant. Blobs and payloads should be consumed immediately in the same slot
|
|
109
|
-
* they are produced. A value of 1 would probably be sufficient. However it's sensible to
|
|
110
|
-
* allow some margin if the node overloads.
|
|
111
|
-
*/
|
|
112
|
-
const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
|
|
113
|
-
|
|
114
|
-
export class BeaconChain implements IBeaconChain {
|
|
115
|
-
readonly genesisTime: UintNum64;
|
|
116
|
-
readonly genesisValidatorsRoot: Root;
|
|
117
|
-
readonly eth1: IEth1ForBlockProduction;
|
|
118
|
-
readonly executionEngine: IExecutionEngine;
|
|
119
|
-
readonly executionBuilder?: IExecutionBuilder;
|
|
120
|
-
// Expose config for convenience in modularized functions
|
|
121
|
-
readonly config: BeaconConfig;
|
|
122
|
-
readonly custodyConfig: CustodyConfig;
|
|
123
|
-
readonly logger: Logger;
|
|
124
|
-
readonly metrics: Metrics | null;
|
|
125
|
-
readonly validatorMonitor: ValidatorMonitor | null;
|
|
126
|
-
readonly bufferPool: BufferPool | null;
|
|
127
|
-
|
|
128
|
-
readonly anchorStateLatestBlockSlot: Slot;
|
|
129
|
-
|
|
130
|
-
readonly bls: IBlsVerifier;
|
|
131
|
-
readonly forkChoice: IForkChoice;
|
|
132
|
-
readonly clock: IClock;
|
|
133
|
-
readonly emitter: ChainEventEmitter;
|
|
134
|
-
readonly regen: QueuedStateRegenerator;
|
|
135
|
-
readonly lightClientServer?: LightClientServer;
|
|
136
|
-
readonly reprocessController: ReprocessController;
|
|
137
|
-
readonly archiveStore: ArchiveStore;
|
|
138
|
-
|
|
139
|
-
// Ops pool
|
|
140
|
-
readonly attestationPool: AttestationPool;
|
|
141
|
-
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
142
|
-
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
143
|
-
readonly syncContributionAndProofPool;
|
|
144
|
-
readonly opPool = new OpPool();
|
|
145
|
-
|
|
146
|
-
// Gossip seen cache
|
|
147
|
-
readonly seenAttesters = new SeenAttesters();
|
|
148
|
-
readonly seenAggregators = new SeenAggregators();
|
|
149
|
-
readonly seenAggregatedAttestations: SeenAggregatedAttestations;
|
|
150
|
-
readonly seenBlockProposers = new SeenBlockProposers();
|
|
151
|
-
readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
|
|
152
|
-
readonly seenContributionAndProof: SeenContributionAndProof;
|
|
153
|
-
readonly seenAttestationDatas: SeenAttestationDatas;
|
|
154
|
-
readonly seenBlockInputCache: SeenBlockInput;
|
|
155
|
-
// Seen cache for liveness checks
|
|
156
|
-
readonly seenBlockAttesters = new SeenBlockAttesters();
|
|
157
|
-
|
|
158
|
-
// Global state caches
|
|
159
|
-
readonly pubkey2index: PubkeyIndexMap;
|
|
160
|
-
readonly index2pubkey: Index2PubkeyCache;
|
|
161
|
-
|
|
162
|
-
readonly beaconProposerCache: BeaconProposerCache;
|
|
163
|
-
readonly checkpointBalancesCache: CheckpointBalancesCache;
|
|
164
|
-
readonly shufflingCache: ShufflingCache;
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Cache produced results (ExecutionPayload, DA Data) from the local execution so that we can send
|
|
168
|
-
* and get signed/published blinded versions which beacon node can
|
|
169
|
-
* assemble into full blocks before publishing to the network.
|
|
170
|
-
*/
|
|
171
|
-
readonly blockProductionCache = new Map<RootHex, ProduceResult>();
|
|
172
|
-
|
|
173
|
-
readonly blacklistedBlocks: Map<RootHex, Slot | null>;
|
|
174
|
-
|
|
175
|
-
readonly serializedCache: SerializedCache;
|
|
176
|
-
|
|
177
|
-
readonly getBlobsTracker: GetBlobsTracker;
|
|
178
|
-
readonly columnReconstructionTracker: ColumnReconstructionTracker;
|
|
179
|
-
|
|
180
|
-
readonly opts: IChainOptions;
|
|
181
|
-
|
|
182
|
-
protected readonly blockProcessor: BlockProcessor;
|
|
183
|
-
protected readonly db: IBeaconDb;
|
|
184
|
-
private abortController = new AbortController();
|
|
185
|
-
private processShutdownCallback: ProcessShutdownCallback;
|
|
186
|
-
private _earliestAvailableSlot: Slot;
|
|
187
|
-
|
|
188
|
-
get earliestAvailableSlot(): Slot {
|
|
189
|
-
return this._earliestAvailableSlot;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
set earliestAvailableSlot(slot: Slot) {
|
|
193
|
-
if (this._earliestAvailableSlot !== slot) {
|
|
194
|
-
this._earliestAvailableSlot = slot;
|
|
195
|
-
this.emitter.emit(ChainEvent.updateStatus);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
constructor(
|
|
200
|
-
opts: IChainOptions,
|
|
201
|
-
{
|
|
202
|
-
privateKey,
|
|
203
|
-
config,
|
|
204
|
-
db,
|
|
205
|
-
dbName,
|
|
206
|
-
dataDir,
|
|
207
|
-
logger,
|
|
208
|
-
processShutdownCallback,
|
|
209
|
-
clock,
|
|
210
|
-
metrics,
|
|
211
|
-
validatorMonitor,
|
|
212
|
-
anchorState,
|
|
213
|
-
eth1,
|
|
214
|
-
executionEngine,
|
|
215
|
-
executionBuilder,
|
|
216
|
-
}: {
|
|
217
|
-
privateKey: PrivateKey;
|
|
218
|
-
config: BeaconConfig;
|
|
219
|
-
db: IBeaconDb;
|
|
220
|
-
dbName: string;
|
|
221
|
-
dataDir: string;
|
|
222
|
-
logger: Logger;
|
|
223
|
-
processShutdownCallback: ProcessShutdownCallback;
|
|
224
|
-
/** Used for testing to supply fake clock */
|
|
225
|
-
clock?: IClock;
|
|
226
|
-
metrics: Metrics | null;
|
|
227
|
-
validatorMonitor: ValidatorMonitor | null;
|
|
228
|
-
anchorState: BeaconStateAllForks;
|
|
229
|
-
eth1: IEth1ForBlockProduction;
|
|
230
|
-
executionEngine: IExecutionEngine;
|
|
231
|
-
executionBuilder?: IExecutionBuilder;
|
|
232
|
-
}
|
|
233
|
-
) {
|
|
234
|
-
this.opts = opts;
|
|
235
|
-
this.config = config;
|
|
236
|
-
this.db = db;
|
|
237
|
-
this.logger = logger;
|
|
238
|
-
this.processShutdownCallback = processShutdownCallback;
|
|
239
|
-
this.metrics = metrics;
|
|
240
|
-
this.validatorMonitor = validatorMonitor;
|
|
241
|
-
this.genesisTime = anchorState.genesisTime;
|
|
242
|
-
this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
|
|
243
|
-
this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
|
|
244
|
-
this.eth1 = eth1;
|
|
245
|
-
this.executionEngine = executionEngine;
|
|
246
|
-
this.executionBuilder = executionBuilder;
|
|
247
|
-
const signal = this.abortController.signal;
|
|
248
|
-
const emitter = new ChainEventEmitter();
|
|
249
|
-
// by default, verify signatures on both main threads and worker threads
|
|
250
|
-
const bls = opts.blsVerifyAllMainThread
|
|
251
|
-
? new BlsSingleThreadVerifier({metrics})
|
|
252
|
-
: new BlsMultiThreadWorkerPool(opts, {logger, metrics});
|
|
253
|
-
|
|
254
|
-
if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
|
|
255
|
-
|
|
256
|
-
this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
|
|
257
|
-
this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
|
|
258
|
-
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
|
|
259
|
-
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
260
|
-
this.syncContributionAndProofPool = new SyncContributionAndProofPool(clock, metrics, logger);
|
|
261
|
-
|
|
262
|
-
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
263
|
-
this.seenContributionAndProof = new SeenContributionAndProof(metrics);
|
|
264
|
-
this.seenAttestationDatas = new SeenAttestationDatas(metrics, this.opts?.attDataCacheSlotDistance);
|
|
265
|
-
|
|
266
|
-
const nodeId = computeNodeIdFromPrivateKey(privateKey);
|
|
267
|
-
const initialCustodyGroupCount =
|
|
268
|
-
opts.initialCustodyGroupCount ?? (opts.supernode ? config.NUMBER_OF_CUSTODY_GROUPS : config.CUSTODY_REQUIREMENT);
|
|
269
|
-
this.metrics?.peerDas.targetCustodyGroupCount.set(initialCustodyGroupCount);
|
|
270
|
-
this.custodyConfig = new CustodyConfig({
|
|
271
|
-
nodeId,
|
|
272
|
-
config,
|
|
273
|
-
initialCustodyGroupCount,
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
this.beaconProposerCache = new BeaconProposerCache(opts);
|
|
277
|
-
this.checkpointBalancesCache = new CheckpointBalancesCache();
|
|
278
|
-
this.seenBlockInputCache = new SeenBlockInput({
|
|
279
|
-
config,
|
|
280
|
-
custodyConfig: this.custodyConfig,
|
|
281
|
-
clock,
|
|
282
|
-
chainEvents: emitter,
|
|
283
|
-
signal,
|
|
284
|
-
metrics,
|
|
285
|
-
logger,
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
// Restore state caches
|
|
289
|
-
// anchorState may already by a CachedBeaconState. If so, don't create the cache again, since deserializing all
|
|
290
|
-
// pubkeys takes ~30 seconds for 350k keys (mainnet 2022Q2).
|
|
291
|
-
// When the BeaconStateCache is created in eth1 genesis builder it may be incorrect. Until we can ensure that
|
|
292
|
-
// it's safe to re-use _ANY_ BeaconStateCache, this option is disabled by default and only used in tests.
|
|
293
|
-
const cachedState =
|
|
294
|
-
isCachedBeaconState(anchorState) && opts.skipCreateStateCacheIfAvailable
|
|
295
|
-
? anchorState
|
|
296
|
-
: createCachedBeaconState(anchorState, {
|
|
297
|
-
config,
|
|
298
|
-
pubkey2index: new PubkeyIndexMap(),
|
|
299
|
-
index2pubkey: [],
|
|
300
|
-
});
|
|
301
|
-
this._earliestAvailableSlot = cachedState.slot;
|
|
302
|
-
|
|
303
|
-
this.shufflingCache = cachedState.epochCtx.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
|
|
304
|
-
{
|
|
305
|
-
shuffling: cachedState.epochCtx.previousShuffling,
|
|
306
|
-
decisionRoot: cachedState.epochCtx.previousDecisionRoot,
|
|
307
|
-
},
|
|
308
|
-
{
|
|
309
|
-
shuffling: cachedState.epochCtx.currentShuffling,
|
|
310
|
-
decisionRoot: cachedState.epochCtx.currentDecisionRoot,
|
|
311
|
-
},
|
|
312
|
-
{
|
|
313
|
-
shuffling: cachedState.epochCtx.nextShuffling,
|
|
314
|
-
decisionRoot: cachedState.epochCtx.nextDecisionRoot,
|
|
315
|
-
},
|
|
316
|
-
]);
|
|
317
|
-
|
|
318
|
-
// Persist single global instance of state caches
|
|
319
|
-
this.pubkey2index = cachedState.epochCtx.pubkey2index;
|
|
320
|
-
this.index2pubkey = cachedState.epochCtx.index2pubkey;
|
|
321
|
-
|
|
322
|
-
const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
|
|
323
|
-
const blockStateCache = this.opts.nHistoricalStates
|
|
324
|
-
? new FIFOBlockStateCache(this.opts, {metrics})
|
|
325
|
-
: new BlockStateCacheImpl({metrics});
|
|
326
|
-
this.bufferPool = this.opts.nHistoricalStates
|
|
327
|
-
? new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics)
|
|
328
|
-
: null;
|
|
329
|
-
const checkpointStateCache = this.opts.nHistoricalStates
|
|
330
|
-
? new PersistentCheckpointStateCache(
|
|
331
|
-
{
|
|
332
|
-
metrics,
|
|
333
|
-
logger,
|
|
334
|
-
clock,
|
|
335
|
-
blockStateCache,
|
|
336
|
-
bufferPool: this.bufferPool,
|
|
337
|
-
datastore: fileDataStore
|
|
338
|
-
? // debug option if we want to investigate any issues with the DB
|
|
339
|
-
new FileCPStateDatastore(dataDir)
|
|
340
|
-
: // production option
|
|
341
|
-
new DbCPStateDatastore(this.db),
|
|
342
|
-
},
|
|
343
|
-
this.opts
|
|
344
|
-
)
|
|
345
|
-
: new InMemoryCheckpointStateCache({metrics});
|
|
346
|
-
const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
|
|
347
|
-
blockStateCache.add(cachedState);
|
|
348
|
-
blockStateCache.setHeadState(cachedState);
|
|
349
|
-
checkpointStateCache.add(checkpoint, cachedState);
|
|
350
|
-
|
|
351
|
-
const forkChoice = initializeForkChoice(
|
|
352
|
-
config,
|
|
353
|
-
emitter,
|
|
354
|
-
clock.currentSlot,
|
|
355
|
-
cachedState,
|
|
356
|
-
opts,
|
|
357
|
-
this.justifiedBalancesGetter.bind(this),
|
|
358
|
-
metrics,
|
|
359
|
-
logger
|
|
360
|
-
);
|
|
361
|
-
const regen = new QueuedStateRegenerator({
|
|
362
|
-
config,
|
|
363
|
-
forkChoice,
|
|
364
|
-
blockStateCache,
|
|
365
|
-
checkpointStateCache,
|
|
366
|
-
db,
|
|
367
|
-
metrics,
|
|
368
|
-
validatorMonitor,
|
|
369
|
-
logger,
|
|
370
|
-
emitter,
|
|
371
|
-
signal,
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
if (!opts.disableLightClientServer) {
|
|
375
|
-
this.lightClientServer = new LightClientServer(opts, {config, db, metrics, emitter, logger});
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
this.reprocessController = new ReprocessController(this.metrics);
|
|
379
|
-
|
|
380
|
-
this.blockProcessor = new BlockProcessor(this, metrics, opts, signal);
|
|
381
|
-
|
|
382
|
-
this.forkChoice = forkChoice;
|
|
383
|
-
this.clock = clock;
|
|
384
|
-
this.regen = regen;
|
|
385
|
-
this.bls = bls;
|
|
386
|
-
this.emitter = emitter;
|
|
387
|
-
|
|
388
|
-
this.serializedCache = new SerializedCache();
|
|
389
|
-
|
|
390
|
-
this.getBlobsTracker = new GetBlobsTracker({
|
|
391
|
-
logger,
|
|
392
|
-
executionEngine: this.executionEngine,
|
|
393
|
-
emitter,
|
|
394
|
-
metrics,
|
|
395
|
-
config,
|
|
396
|
-
});
|
|
397
|
-
this.columnReconstructionTracker = new ColumnReconstructionTracker({
|
|
398
|
-
logger,
|
|
399
|
-
emitter,
|
|
400
|
-
metrics,
|
|
401
|
-
config,
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
this.archiveStore = new ArchiveStore(
|
|
405
|
-
{db, chain: this, logger: logger as LoggerNode, metrics},
|
|
406
|
-
{...opts, dbName, anchorState: {finalizedCheckpoint: anchorState.finalizedCheckpoint}},
|
|
407
|
-
signal
|
|
408
|
-
);
|
|
409
|
-
|
|
410
|
-
// Stop polling eth1 data if anchor state is in Electra AND deposit_requests_start_index is reached
|
|
411
|
-
const anchorStateFork = this.config.getForkName(anchorState.slot);
|
|
412
|
-
if (isForkPostElectra(anchorStateFork)) {
|
|
413
|
-
const {eth1DepositIndex, depositRequestsStartIndex} = anchorState as BeaconStateElectra;
|
|
414
|
-
if (eth1DepositIndex === Number(depositRequestsStartIndex)) {
|
|
415
|
-
this.eth1.stopPollingEth1Data();
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// always run PrepareNextSlotScheduler except for fork_choice spec tests
|
|
420
|
-
if (!opts?.disablePrepareNextSlot) {
|
|
421
|
-
new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if (metrics) {
|
|
425
|
-
metrics.clockSlot.addCollect(() => this.onScrapeMetrics(metrics));
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// Event handlers. emitter is created internally and dropped on close(). Not need to .removeListener()
|
|
429
|
-
clock.addListener(ClockEvent.slot, this.onClockSlot.bind(this));
|
|
430
|
-
clock.addListener(ClockEvent.epoch, this.onClockEpoch.bind(this));
|
|
431
|
-
emitter.addListener(ChainEvent.forkChoiceFinalized, this.onForkChoiceFinalized.bind(this));
|
|
432
|
-
emitter.addListener(ChainEvent.forkChoiceJustified, this.onForkChoiceJustified.bind(this));
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
async init(): Promise<void> {
|
|
436
|
-
await this.archiveStore.init();
|
|
437
|
-
await this.loadFromDisk();
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
async close(): Promise<void> {
|
|
441
|
-
await this.archiveStore.close();
|
|
442
|
-
await this.bls.close();
|
|
443
|
-
this.abortController.abort();
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
seenBlock(blockRoot: RootHex): boolean {
|
|
447
|
-
return this.seenBlockInputCache.has(blockRoot) || this.forkChoice.hasBlockHex(blockRoot);
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
regenCanAcceptWork(): boolean {
|
|
451
|
-
return this.regen.canAcceptWork();
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
blsThreadPoolCanAcceptWork(): boolean {
|
|
455
|
-
return this.bls.canAcceptWork();
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
validatorSeenAtEpoch(index: ValidatorIndex, epoch: Epoch): boolean {
|
|
459
|
-
// Caller must check that epoch is not older that current epoch - 1
|
|
460
|
-
// else the caches for that epoch may already be pruned.
|
|
461
|
-
|
|
462
|
-
return (
|
|
463
|
-
// Dedicated cache for liveness checks, registers attesters seen through blocks.
|
|
464
|
-
// Note: this check should be cheaper + overlap with counting participants of aggregates from gossip.
|
|
465
|
-
this.seenBlockAttesters.isKnown(epoch, index) ||
|
|
466
|
-
//
|
|
467
|
-
// Re-use gossip caches. Populated on validation of gossip + API messages
|
|
468
|
-
// seenAttesters = single signer of unaggregated attestations
|
|
469
|
-
this.seenAttesters.isKnown(epoch, index) ||
|
|
470
|
-
// seenAggregators = single aggregator index, not participants of the aggregate
|
|
471
|
-
this.seenAggregators.isKnown(epoch, index) ||
|
|
472
|
-
// seenBlockProposers = single block proposer
|
|
473
|
-
this.seenBlockProposers.seenAtEpoch(epoch, index)
|
|
474
|
-
);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
/** Populate in-memory caches with persisted data. Call at least once on startup */
|
|
478
|
-
async loadFromDisk(): Promise<void> {
|
|
479
|
-
await this.regen.init();
|
|
480
|
-
await this.opPool.fromPersisted(this.db);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
/** Persist in-memory data to the DB. Call at least once before stopping the process */
|
|
484
|
-
async persistToDisk(): Promise<void> {
|
|
485
|
-
await this.archiveStore.persistToDisk();
|
|
486
|
-
await this.opPool.toPersisted(this.db);
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
getHeadState(): CachedBeaconStateAllForks {
|
|
490
|
-
// head state should always exist
|
|
491
|
-
const head = this.forkChoice.getHead();
|
|
492
|
-
const headState = this.regen.getClosestHeadState(head);
|
|
493
|
-
if (!headState) {
|
|
494
|
-
throw Error(`headState does not exist for head root=${head.blockRoot} slot=${head.slot}`);
|
|
495
|
-
}
|
|
496
|
-
return headState;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
async getHeadStateAtCurrentEpoch(regenCaller: RegenCaller): Promise<CachedBeaconStateAllForks> {
|
|
500
|
-
return this.getHeadStateAtEpoch(this.clock.currentEpoch, regenCaller);
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
async getHeadStateAtEpoch(epoch: Epoch, regenCaller: RegenCaller): Promise<CachedBeaconStateAllForks> {
|
|
504
|
-
// using getHeadState() means we'll use checkpointStateCache if it's available
|
|
505
|
-
const headState = this.getHeadState();
|
|
506
|
-
// head state is in the same epoch, or we pulled up head state already from past epoch
|
|
507
|
-
if (epoch <= computeEpochAtSlot(headState.slot)) {
|
|
508
|
-
// should go to this most of the time
|
|
509
|
-
return headState;
|
|
510
|
-
}
|
|
511
|
-
// only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
|
|
512
|
-
const head = this.forkChoice.getHead();
|
|
513
|
-
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
514
|
-
return this.regen.getBlockSlotState(head.blockRoot, startSlot, {dontTransferCache: true}, regenCaller);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
async getStateBySlot(
|
|
518
|
-
slot: Slot,
|
|
519
|
-
opts?: StateGetOpts
|
|
520
|
-
): Promise<{state: BeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
521
|
-
const finalizedBlock = this.forkChoice.getFinalizedBlock();
|
|
522
|
-
|
|
523
|
-
if (slot < finalizedBlock.slot) {
|
|
524
|
-
// request for finalized state not supported in this API
|
|
525
|
-
// fall back to caller to look in db or getHistoricalStateBySlot
|
|
526
|
-
return null;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
if (opts?.allowRegen) {
|
|
530
|
-
// Find closest canonical block to slot, then trigger regen
|
|
531
|
-
const block = this.forkChoice.getCanonicalBlockClosestLteSlot(slot) ?? finalizedBlock;
|
|
532
|
-
const state = await this.regen.getBlockSlotState(
|
|
533
|
-
block.blockRoot,
|
|
534
|
-
slot,
|
|
535
|
-
{dontTransferCache: true},
|
|
536
|
-
RegenCaller.restApi
|
|
537
|
-
);
|
|
538
|
-
return {
|
|
539
|
-
state,
|
|
540
|
-
executionOptimistic: isOptimisticBlock(block),
|
|
541
|
-
finalized: slot === finalizedBlock.slot && finalizedBlock.slot !== GENESIS_SLOT,
|
|
542
|
-
};
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
// Just check if state is already in the cache. If it's not dialed to the correct slot,
|
|
546
|
-
// do not bother in advancing the state. restApiCanTriggerRegen == false means do no work
|
|
547
|
-
const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
|
|
548
|
-
if (!block) {
|
|
549
|
-
return null;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
const state = this.regen.getStateSync(block.stateRoot);
|
|
553
|
-
return (
|
|
554
|
-
state && {
|
|
555
|
-
state,
|
|
556
|
-
executionOptimistic: isOptimisticBlock(block),
|
|
557
|
-
finalized: slot === finalizedBlock.slot && finalizedBlock.slot !== GENESIS_SLOT,
|
|
558
|
-
}
|
|
559
|
-
);
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
async getHistoricalStateBySlot(
|
|
563
|
-
slot: number
|
|
564
|
-
): Promise<{state: Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
565
|
-
if (!this.opts.serveHistoricalState) {
|
|
566
|
-
throw Error("Historical state regen is not enabled, set --serveHistoricalState to fetch this data");
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
return this.archiveStore.getHistoricalStateBySlot(slot);
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
async getStateByStateRoot(
|
|
573
|
-
stateRoot: RootHex,
|
|
574
|
-
opts?: StateGetOpts
|
|
575
|
-
): Promise<{state: BeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
576
|
-
if (opts?.allowRegen) {
|
|
577
|
-
const state = await this.regen.getState(stateRoot, RegenCaller.restApi);
|
|
578
|
-
const block = this.forkChoice.getBlock(state.latestBlockHeader.hashTreeRoot());
|
|
579
|
-
const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
580
|
-
return {
|
|
581
|
-
state,
|
|
582
|
-
executionOptimistic: block != null && isOptimisticBlock(block),
|
|
583
|
-
finalized: state.epochCtx.epoch <= finalizedEpoch && finalizedEpoch !== GENESIS_EPOCH,
|
|
584
|
-
};
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
// TODO: This can only fulfill requests for a very narrow set of roots.
|
|
588
|
-
// - very recent states that happen to be in the cache
|
|
589
|
-
// - 1 every 100s of states that are persisted in the archive state
|
|
590
|
-
|
|
591
|
-
// TODO: This is very inneficient for debug requests of serialized content, since it deserializes to serialize again
|
|
592
|
-
const cachedStateCtx = this.regen.getStateSync(stateRoot);
|
|
593
|
-
if (cachedStateCtx) {
|
|
594
|
-
const block = this.forkChoice.getBlock(cachedStateCtx.latestBlockHeader.hashTreeRoot());
|
|
595
|
-
const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
596
|
-
return {
|
|
597
|
-
state: cachedStateCtx,
|
|
598
|
-
executionOptimistic: block != null && isOptimisticBlock(block),
|
|
599
|
-
finalized: cachedStateCtx.epochCtx.epoch <= finalizedEpoch && finalizedEpoch !== GENESIS_EPOCH,
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
const data = await this.db.stateArchive.getByRoot(fromHex(stateRoot));
|
|
604
|
-
return data && {state: data, executionOptimistic: false, finalized: true};
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
getStateByCheckpoint(
|
|
608
|
-
checkpoint: CheckpointWithHex
|
|
609
|
-
): {state: BeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null {
|
|
610
|
-
// finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
|
|
611
|
-
const cachedStateCtx = this.regen.getCheckpointStateSync(checkpoint);
|
|
612
|
-
if (cachedStateCtx) {
|
|
613
|
-
const block = this.forkChoice.getBlock(cachedStateCtx.latestBlockHeader.hashTreeRoot());
|
|
614
|
-
const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
615
|
-
return {
|
|
616
|
-
state: cachedStateCtx,
|
|
617
|
-
executionOptimistic: block != null && isOptimisticBlock(block),
|
|
618
|
-
finalized: cachedStateCtx.epochCtx.epoch <= finalizedEpoch && finalizedEpoch !== GENESIS_EPOCH,
|
|
619
|
-
};
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
return null;
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
async getStateOrBytesByCheckpoint(
|
|
626
|
-
checkpoint: CheckpointWithHex
|
|
627
|
-
): Promise<{state: CachedBeaconStateAllForks | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
628
|
-
const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpoint);
|
|
629
|
-
if (cachedStateCtx) {
|
|
630
|
-
const block = this.forkChoice.getBlock(checkpoint.root);
|
|
631
|
-
const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
632
|
-
return {
|
|
633
|
-
state: cachedStateCtx,
|
|
634
|
-
executionOptimistic: block != null && isOptimisticBlock(block),
|
|
635
|
-
finalized: checkpoint.epoch <= finalizedEpoch && finalizedEpoch !== GENESIS_EPOCH,
|
|
636
|
-
};
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
return null;
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
async getCanonicalBlockAtSlot(
|
|
643
|
-
slot: Slot
|
|
644
|
-
): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
645
|
-
const finalizedBlock = this.forkChoice.getFinalizedBlock();
|
|
646
|
-
if (slot > finalizedBlock.slot) {
|
|
647
|
-
// Unfinalized slot, attempt to find in fork-choice
|
|
648
|
-
const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
|
|
649
|
-
if (block) {
|
|
650
|
-
const data = await this.db.block.get(fromHex(block.blockRoot));
|
|
651
|
-
if (data) {
|
|
652
|
-
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
// A non-finalized slot expected to be found in the hot db, could be archived during
|
|
656
|
-
// this function runtime, so if not found in the hot db, fallback to the cold db
|
|
657
|
-
// TODO: Add a lock to the archiver to have determinstic behaviour on where are blocks
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
const data = await this.db.blockArchive.get(slot);
|
|
661
|
-
return data && {block: data, executionOptimistic: false, finalized: true};
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
async getBlockByRoot(
|
|
665
|
-
root: string
|
|
666
|
-
): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
667
|
-
const block = this.forkChoice.getBlockHex(root);
|
|
668
|
-
if (block) {
|
|
669
|
-
const data = await this.db.block.get(fromHex(root));
|
|
670
|
-
if (data) {
|
|
671
|
-
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
672
|
-
}
|
|
673
|
-
// If block is not found in hot db, try cold db since there could be an archive cycle happening
|
|
674
|
-
// TODO: Add a lock to the archiver to have deterministic behavior on where are blocks
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
const data = await this.db.blockArchive.getByRoot(fromHex(root));
|
|
678
|
-
return data && {block: data, executionOptimistic: false, finalized: true};
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
|
|
682
|
-
const {slot, parentBlockRoot} = blockAttributes;
|
|
683
|
-
const state = await this.regen.getBlockSlotState(
|
|
684
|
-
toRootHex(parentBlockRoot),
|
|
685
|
-
slot,
|
|
686
|
-
{dontTransferCache: true},
|
|
687
|
-
RegenCaller.produceBlock
|
|
688
|
-
);
|
|
689
|
-
|
|
690
|
-
// TODO: To avoid breaking changes for metric define this attribute
|
|
691
|
-
const blockType = BlockType.Full;
|
|
692
|
-
|
|
693
|
-
return produceCommonBlockBody.call(this, blockType, state, blockAttributes);
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
produceBlock(blockAttributes: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}): Promise<{
|
|
697
|
-
block: BeaconBlock;
|
|
698
|
-
executionPayloadValue: Wei;
|
|
699
|
-
consensusBlockValue: Wei;
|
|
700
|
-
shouldOverrideBuilder?: boolean;
|
|
701
|
-
}> {
|
|
702
|
-
return this.produceBlockWrapper<BlockType.Full>(BlockType.Full, blockAttributes);
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
produceBlindedBlock(blockAttributes: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}): Promise<{
|
|
706
|
-
block: BlindedBeaconBlock;
|
|
707
|
-
executionPayloadValue: Wei;
|
|
708
|
-
consensusBlockValue: Wei;
|
|
709
|
-
}> {
|
|
710
|
-
return this.produceBlockWrapper<BlockType.Blinded>(BlockType.Blinded, blockAttributes);
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
async produceBlockWrapper<T extends BlockType>(
|
|
714
|
-
blockType: T,
|
|
715
|
-
{
|
|
716
|
-
randaoReveal,
|
|
717
|
-
graffiti,
|
|
718
|
-
slot,
|
|
719
|
-
feeRecipient,
|
|
720
|
-
commonBlockBodyPromise,
|
|
721
|
-
parentBlockRoot,
|
|
722
|
-
parentSlot,
|
|
723
|
-
}: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
|
|
724
|
-
): Promise<{
|
|
725
|
-
block: AssembledBlockType<T>;
|
|
726
|
-
executionPayloadValue: Wei;
|
|
727
|
-
consensusBlockValue: Wei;
|
|
728
|
-
shouldOverrideBuilder?: boolean;
|
|
729
|
-
}> {
|
|
730
|
-
const state = await this.regen.getBlockSlotState(
|
|
731
|
-
toRootHex(parentBlockRoot),
|
|
732
|
-
slot,
|
|
733
|
-
{dontTransferCache: true},
|
|
734
|
-
RegenCaller.produceBlock
|
|
735
|
-
);
|
|
736
|
-
const proposerIndex = state.epochCtx.getBeaconProposer(slot);
|
|
737
|
-
const proposerPubKey = state.epochCtx.index2pubkey[proposerIndex].toBytes();
|
|
738
|
-
|
|
739
|
-
const {body, produceResult, executionPayloadValue, shouldOverrideBuilder} = await produceBlockBody.call(
|
|
740
|
-
this,
|
|
741
|
-
blockType,
|
|
742
|
-
state,
|
|
743
|
-
{
|
|
744
|
-
randaoReveal,
|
|
745
|
-
graffiti,
|
|
746
|
-
slot,
|
|
747
|
-
feeRecipient,
|
|
748
|
-
parentSlot,
|
|
749
|
-
parentBlockRoot,
|
|
750
|
-
proposerIndex,
|
|
751
|
-
proposerPubKey,
|
|
752
|
-
commonBlockBodyPromise,
|
|
753
|
-
}
|
|
754
|
-
);
|
|
755
|
-
|
|
756
|
-
// The hashtree root computed here for debug log will get cached and hence won't introduce additional delays
|
|
757
|
-
const bodyRoot =
|
|
758
|
-
produceResult.type === BlockType.Full
|
|
759
|
-
? this.config.getForkTypes(slot).BeaconBlockBody.hashTreeRoot(body)
|
|
760
|
-
: this.config
|
|
761
|
-
.getPostBellatrixForkTypes(slot)
|
|
762
|
-
.BlindedBeaconBlockBody.hashTreeRoot(body as BlindedBeaconBlockBody);
|
|
763
|
-
this.logger.debug("Computing block post state from the produced body", {
|
|
764
|
-
slot,
|
|
765
|
-
bodyRoot: toRootHex(bodyRoot),
|
|
766
|
-
blockType,
|
|
767
|
-
});
|
|
768
|
-
|
|
769
|
-
const block = {
|
|
770
|
-
slot,
|
|
771
|
-
proposerIndex,
|
|
772
|
-
parentRoot: parentBlockRoot,
|
|
773
|
-
stateRoot: ZERO_HASH,
|
|
774
|
-
body,
|
|
775
|
-
} as AssembledBlockType<T>;
|
|
776
|
-
|
|
777
|
-
const {newStateRoot, proposerReward} = computeNewStateRoot(this.metrics, state, block);
|
|
778
|
-
block.stateRoot = newStateRoot;
|
|
779
|
-
const blockRoot =
|
|
780
|
-
produceResult.type === BlockType.Full
|
|
781
|
-
? this.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block)
|
|
782
|
-
: this.config.getPostBellatrixForkTypes(slot).BlindedBeaconBlock.hashTreeRoot(block as BlindedBeaconBlock);
|
|
783
|
-
const blockRootHex = toRootHex(blockRoot);
|
|
784
|
-
|
|
785
|
-
// Track the produced block for consensus broadcast validations, later validation, etc.
|
|
786
|
-
this.blockProductionCache.set(blockRootHex, produceResult);
|
|
787
|
-
this.metrics?.blockProductionCacheSize.set(this.blockProductionCache.size);
|
|
788
|
-
|
|
789
|
-
return {block, executionPayloadValue, consensusBlockValue: gweiToWei(proposerReward), shouldOverrideBuilder};
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
async processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void> {
|
|
793
|
-
return this.blockProcessor.processBlocksJob([block], opts);
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
async processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void> {
|
|
797
|
-
return this.blockProcessor.processBlocksJob(blocks, opts);
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
getStatus(): Status {
|
|
801
|
-
const head = this.forkChoice.getHead();
|
|
802
|
-
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
803
|
-
const boundary = this.config.getForkBoundaryAtEpoch(this.clock.currentEpoch);
|
|
804
|
-
return {
|
|
805
|
-
// fork_digest: The node's ForkDigest (compute_fork_digest(current_fork_version, genesis_validators_root)) where
|
|
806
|
-
// - current_fork_version is the fork version at the node's current epoch defined by the wall-clock time (not necessarily the epoch to which the node is sync)
|
|
807
|
-
// - genesis_validators_root is the static Root found in state.genesis_validators_root
|
|
808
|
-
// - epoch of fork boundary is used to get blob parameters of current Blob Parameter Only (BPO) fork
|
|
809
|
-
forkDigest: this.config.forkBoundary2ForkDigest(boundary),
|
|
810
|
-
// finalized_root: state.finalized_checkpoint.root for the state corresponding to the head block (Note this defaults to Root(b'\x00' * 32) for the genesis finalized checkpoint).
|
|
811
|
-
finalizedRoot: finalizedCheckpoint.epoch === GENESIS_EPOCH ? ZERO_HASH : finalizedCheckpoint.root,
|
|
812
|
-
finalizedEpoch: finalizedCheckpoint.epoch,
|
|
813
|
-
// TODO: PERFORMANCE: Memoize to prevent re-computing every time
|
|
814
|
-
headRoot: fromHex(head.blockRoot),
|
|
815
|
-
headSlot: head.slot,
|
|
816
|
-
earliestAvailableSlot: this._earliestAvailableSlot,
|
|
817
|
-
};
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
recomputeForkChoiceHead(caller: ForkchoiceCaller): ProtoBlock {
|
|
821
|
-
this.metrics?.forkChoice.requests.inc();
|
|
822
|
-
const timer = this.metrics?.forkChoice.findHead.startTimer({caller});
|
|
823
|
-
|
|
824
|
-
try {
|
|
825
|
-
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetCanonicalHead}).head;
|
|
826
|
-
} catch (e) {
|
|
827
|
-
this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetCanonicalHead});
|
|
828
|
-
throw e;
|
|
829
|
-
} finally {
|
|
830
|
-
timer?.();
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
predictProposerHead(slot: Slot): ProtoBlock {
|
|
835
|
-
this.metrics?.forkChoice.requests.inc();
|
|
836
|
-
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.predictProposerHead});
|
|
837
|
-
const secFromSlot = this.clock.secFromSlot(slot);
|
|
838
|
-
|
|
839
|
-
try {
|
|
840
|
-
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, secFromSlot, slot}).head;
|
|
841
|
-
} catch (e) {
|
|
842
|
-
this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetPredictedProposerHead});
|
|
843
|
-
throw e;
|
|
844
|
-
} finally {
|
|
845
|
-
timer?.();
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
getProposerHead(slot: Slot): ProtoBlock {
|
|
850
|
-
this.metrics?.forkChoice.requests.inc();
|
|
851
|
-
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.getProposerHead});
|
|
852
|
-
const secFromSlot = this.clock.secFromSlot(slot);
|
|
853
|
-
|
|
854
|
-
try {
|
|
855
|
-
const {head, isHeadTimely, notReorgedReason} = this.forkChoice.updateAndGetHead({
|
|
856
|
-
mode: UpdateHeadOpt.GetProposerHead,
|
|
857
|
-
secFromSlot,
|
|
858
|
-
slot,
|
|
859
|
-
});
|
|
860
|
-
|
|
861
|
-
if (isHeadTimely && notReorgedReason !== undefined) {
|
|
862
|
-
this.metrics?.forkChoice.notReorgedReason.inc({reason: notReorgedReason});
|
|
863
|
-
}
|
|
864
|
-
return head;
|
|
865
|
-
} catch (e) {
|
|
866
|
-
this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetProposerHead});
|
|
867
|
-
throw e;
|
|
868
|
-
} finally {
|
|
869
|
-
timer?.();
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
/**
|
|
874
|
-
* Returns Promise that resolves either on block found or once 1 slot passes.
|
|
875
|
-
* Used to handle unknown block root for both unaggregated and aggregated attestations.
|
|
876
|
-
* @returns true if blockFound
|
|
877
|
-
*/
|
|
878
|
-
waitForBlock(slot: Slot, root: RootHex): Promise<boolean> {
|
|
879
|
-
return this.reprocessController.waitForBlockOfAttestation(slot, root);
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
persistBlock(data: BeaconBlock | BlindedBeaconBlock, suffix?: string): void {
|
|
883
|
-
const slot = data.slot;
|
|
884
|
-
if (isBlindedBeaconBlock(data)) {
|
|
885
|
-
const sszType = this.config.getPostBellatrixForkTypes(slot).BlindedBeaconBlock;
|
|
886
|
-
void this.persistSszObject("BlindedBeaconBlock", sszType.serialize(data), sszType.hashTreeRoot(data), suffix);
|
|
887
|
-
} else {
|
|
888
|
-
const sszType = this.config.getForkTypes(slot).BeaconBlock;
|
|
889
|
-
void this.persistSszObject("BeaconBlock", sszType.serialize(data), sszType.hashTreeRoot(data), suffix);
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
/**
|
|
894
|
-
* Invalid state root error is critical and it causes the node to stale most of the time so we want to always
|
|
895
|
-
* persist preState, postState and block for further investigation.
|
|
896
|
-
*/
|
|
897
|
-
async persistInvalidStateRoot(
|
|
898
|
-
preState: CachedBeaconStateAllForks,
|
|
899
|
-
postState: CachedBeaconStateAllForks,
|
|
900
|
-
block: SignedBeaconBlock
|
|
901
|
-
): Promise<void> {
|
|
902
|
-
const blockSlot = block.message.slot;
|
|
903
|
-
const blockType = this.config.getForkTypes(blockSlot).SignedBeaconBlock;
|
|
904
|
-
const postStateRoot = postState.hashTreeRoot();
|
|
905
|
-
const logStr = `slot_${blockSlot}_invalid_state_root_${toRootHex(postStateRoot)}`;
|
|
906
|
-
await Promise.all([
|
|
907
|
-
this.persistSszObject(
|
|
908
|
-
`SignedBeaconBlock_slot_${blockSlot}`,
|
|
909
|
-
blockType.serialize(block),
|
|
910
|
-
blockType.hashTreeRoot(block),
|
|
911
|
-
`${logStr}_block`
|
|
912
|
-
),
|
|
913
|
-
this.persistSszObject(
|
|
914
|
-
`preState_slot_${preState.slot}_${preState.type.typeName}`,
|
|
915
|
-
preState.serialize(),
|
|
916
|
-
preState.hashTreeRoot(),
|
|
917
|
-
`${logStr}_pre_state`
|
|
918
|
-
),
|
|
919
|
-
this.persistSszObject(
|
|
920
|
-
`postState_slot_${postState.slot}_${postState.type.typeName}`,
|
|
921
|
-
postState.serialize(),
|
|
922
|
-
postState.hashTreeRoot(),
|
|
923
|
-
`${logStr}_post_state`
|
|
924
|
-
),
|
|
925
|
-
]);
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
persistInvalidSszValue<T>(type: Type<T>, sszObject: T, suffix?: string): void {
|
|
929
|
-
if (this.opts.persistInvalidSszObjects) {
|
|
930
|
-
void this.persistSszObject(type.typeName, type.serialize(sszObject), type.hashTreeRoot(sszObject), suffix);
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
persistInvalidSszBytes(typeName: string, sszBytes: Uint8Array, suffix?: string): void {
|
|
935
|
-
if (this.opts.persistInvalidSszObjects) {
|
|
936
|
-
void this.persistSszObject(typeName, sszBytes, sszBytes, suffix);
|
|
937
|
-
}
|
|
938
|
-
}
|
|
939
|
-
|
|
940
|
-
persistInvalidSszView(view: TreeView<CompositeTypeAny>, suffix?: string): void {
|
|
941
|
-
if (this.opts.persistInvalidSszObjects) {
|
|
942
|
-
void this.persistSszObject(view.type.typeName, view.serialize(), view.hashTreeRoot(), suffix);
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
/**
|
|
947
|
-
* Regenerate state for attestation verification, this does not happen with default chain option of maxSkipSlots = 32 .
|
|
948
|
-
* However, need to handle just in case. Lodestar doesn't support multiple regen state requests for attestation verification
|
|
949
|
-
* at the same time, bounded inside "ShufflingCache.insertPromise()" function.
|
|
950
|
-
* Leave this function in chain instead of attestatation verification code to make sure we're aware of its performance impact.
|
|
951
|
-
*/
|
|
952
|
-
async regenStateForAttestationVerification(
|
|
953
|
-
attEpoch: Epoch,
|
|
954
|
-
shufflingDependentRoot: RootHex,
|
|
955
|
-
attHeadBlock: ProtoBlock,
|
|
956
|
-
regenCaller: RegenCaller
|
|
957
|
-
): Promise<EpochShuffling> {
|
|
958
|
-
// this is to prevent multiple calls to get shuffling for the same epoch and dependent root
|
|
959
|
-
// any subsequent calls of the same epoch and dependent root will wait for this promise to resolve
|
|
960
|
-
this.shufflingCache.insertPromise(attEpoch, shufflingDependentRoot);
|
|
961
|
-
const blockEpoch = computeEpochAtSlot(attHeadBlock.slot);
|
|
962
|
-
|
|
963
|
-
let state: CachedBeaconStateAllForks;
|
|
964
|
-
if (blockEpoch < attEpoch - 1) {
|
|
965
|
-
// thanks to one epoch look ahead, we don't need to dial up to attEpoch
|
|
966
|
-
const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
|
|
967
|
-
this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
|
|
968
|
-
state = await this.regen.getBlockSlotState(
|
|
969
|
-
attHeadBlock.blockRoot,
|
|
970
|
-
targetSlot,
|
|
971
|
-
{dontTransferCache: true},
|
|
972
|
-
regenCaller
|
|
973
|
-
);
|
|
974
|
-
} else if (blockEpoch > attEpoch) {
|
|
975
|
-
// should not happen, handled inside attestation verification code
|
|
976
|
-
throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
|
|
977
|
-
} else {
|
|
978
|
-
// should use either current or next shuffling of head state
|
|
979
|
-
// it's not likely to hit this since these shufflings are cached already
|
|
980
|
-
// so handle just in case
|
|
981
|
-
this.metrics?.gossipAttestation.useHeadBlockState.inc({caller: regenCaller});
|
|
982
|
-
state = await this.regen.getState(attHeadBlock.stateRoot, regenCaller);
|
|
983
|
-
}
|
|
984
|
-
|
|
985
|
-
// should always be the current epoch of the active context so no need to await a result from the ShufflingCache
|
|
986
|
-
return state.epochCtx.getShufflingAtEpoch(attEpoch);
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
/**
|
|
990
|
-
* `ForkChoice.onBlock` must never throw for a block that is valid with respect to the network
|
|
991
|
-
* `justifiedBalancesGetter()` must never throw and it should always return a state.
|
|
992
|
-
* @param blockState state that declares justified checkpoint `checkpoint`
|
|
993
|
-
*/
|
|
994
|
-
private justifiedBalancesGetter(
|
|
995
|
-
checkpoint: CheckpointWithHex,
|
|
996
|
-
blockState: CachedBeaconStateAllForks
|
|
997
|
-
): EffectiveBalanceIncrements {
|
|
998
|
-
this.metrics?.balancesCache.requests.inc();
|
|
999
|
-
|
|
1000
|
-
const effectiveBalances = this.checkpointBalancesCache.get(checkpoint);
|
|
1001
|
-
if (effectiveBalances) {
|
|
1002
|
-
return effectiveBalances;
|
|
1003
|
-
}
|
|
1004
|
-
// not expected, need metrics
|
|
1005
|
-
this.metrics?.balancesCache.misses.inc();
|
|
1006
|
-
this.logger.debug("checkpointBalances cache miss", {
|
|
1007
|
-
epoch: checkpoint.epoch,
|
|
1008
|
-
root: checkpoint.rootHex,
|
|
1009
|
-
});
|
|
1010
|
-
|
|
1011
|
-
const {state, stateId, shouldWarn} = this.closestJustifiedBalancesStateToCheckpoint(checkpoint, blockState);
|
|
1012
|
-
this.metrics?.balancesCache.closestStateResult.inc({stateId});
|
|
1013
|
-
if (shouldWarn) {
|
|
1014
|
-
this.logger.warn("currentJustifiedCheckpoint state not avail, using closest state", {
|
|
1015
|
-
checkpointEpoch: checkpoint.epoch,
|
|
1016
|
-
checkpointRoot: checkpoint.rootHex,
|
|
1017
|
-
stateId,
|
|
1018
|
-
stateSlot: state.slot,
|
|
1019
|
-
stateRoot: toRootHex(state.hashTreeRoot()),
|
|
1020
|
-
});
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
return getEffectiveBalanceIncrementsZeroInactive(state);
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1026
|
-
/**
|
|
1027
|
-
* - Assumptions + invariant this function is based on:
|
|
1028
|
-
* - Our cache can only persist X states at once to prevent OOM
|
|
1029
|
-
* - Some old states (including to-be justified checkpoint) may / must be dropped from the cache
|
|
1030
|
-
* - Thus, there is no guarantee that the state for a justified checkpoint will be available in the cache
|
|
1031
|
-
* @param blockState state that declares justified checkpoint `checkpoint`
|
|
1032
|
-
*/
|
|
1033
|
-
private closestJustifiedBalancesStateToCheckpoint(
|
|
1034
|
-
checkpoint: CheckpointWithHex,
|
|
1035
|
-
blockState: CachedBeaconStateAllForks
|
|
1036
|
-
): {state: CachedBeaconStateAllForks; stateId: string; shouldWarn: boolean} {
|
|
1037
|
-
const state = this.regen.getCheckpointStateSync(checkpoint);
|
|
1038
|
-
if (state) {
|
|
1039
|
-
return {state, stateId: "checkpoint_state", shouldWarn: false};
|
|
1040
|
-
}
|
|
1041
|
-
|
|
1042
|
-
// Check if blockState is in the same epoch, not need to iterate the fork-choice then
|
|
1043
|
-
if (computeEpochAtSlot(blockState.slot) === checkpoint.epoch) {
|
|
1044
|
-
return {state: blockState, stateId: "block_state_same_epoch", shouldWarn: true};
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
// Find a state in the same branch of checkpoint at same epoch. Balances should exactly the same
|
|
1048
|
-
for (const descendantBlock of this.forkChoice.forwardIterateDescendants(checkpoint.rootHex)) {
|
|
1049
|
-
if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
|
|
1050
|
-
const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
|
|
1051
|
-
if (descendantBlockState) {
|
|
1052
|
-
return {state: descendantBlockState, stateId: "descendant_state_same_epoch", shouldWarn: true};
|
|
1053
|
-
}
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
|
|
1057
|
-
// Check if blockState is in the next epoch, not need to iterate the fork-choice then
|
|
1058
|
-
if (computeEpochAtSlot(blockState.slot) === checkpoint.epoch + 1) {
|
|
1059
|
-
return {state: blockState, stateId: "block_state_next_epoch", shouldWarn: true};
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
|
-
// Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
|
|
1063
|
-
// Note: must call .forwardIterateDescendants() again since nodes are not sorted
|
|
1064
|
-
for (const descendantBlock of this.forkChoice.forwardIterateDescendants(checkpoint.rootHex)) {
|
|
1065
|
-
if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
|
|
1066
|
-
const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
|
|
1067
|
-
if (descendantBlockState) {
|
|
1068
|
-
return {state: blockState, stateId: "descendant_state_latter_epoch", shouldWarn: true};
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
|
|
1073
|
-
// If there's no state available in the same branch of checkpoint use blockState regardless of its epoch
|
|
1074
|
-
return {state: blockState, stateId: "block_state_any_epoch", shouldWarn: true};
|
|
1075
|
-
}
|
|
1076
|
-
|
|
1077
|
-
private async persistSszObject(prefix: string, bytes: Uint8Array, root: Uint8Array, logStr?: string): Promise<void> {
|
|
1078
|
-
const now = new Date();
|
|
1079
|
-
// yyyy-MM-dd
|
|
1080
|
-
const dateStr = now.toISOString().split("T")[0];
|
|
1081
|
-
|
|
1082
|
-
// by default store to lodestar_archive of current dir
|
|
1083
|
-
const dirpath = path.join(this.opts.persistInvalidSszObjectsDir ?? "invalid_ssz_objects", dateStr);
|
|
1084
|
-
const filepath = path.join(dirpath, `${prefix}_${toRootHex(root)}.ssz`);
|
|
1085
|
-
|
|
1086
|
-
await ensureDir(dirpath);
|
|
1087
|
-
|
|
1088
|
-
// as of Feb 17 2022 there are a lot of duplicate files stored with different date suffixes
|
|
1089
|
-
// remove date suffixes in file name, and check duplicate to avoid redundant persistence
|
|
1090
|
-
await writeIfNotExist(filepath, bytes);
|
|
1091
|
-
|
|
1092
|
-
this.logger.debug("Persisted invalid ssz object", {id: logStr, filepath});
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
private onScrapeMetrics(metrics: Metrics): void {
|
|
1096
|
-
// aggregatedAttestationPool tracks metrics on its own
|
|
1097
|
-
metrics.opPool.attestationPool.size.set(this.attestationPool.getAttestationCount());
|
|
1098
|
-
metrics.opPool.attesterSlashingPoolSize.set(this.opPool.attesterSlashingsSize);
|
|
1099
|
-
metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
|
|
1100
|
-
metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
|
|
1101
|
-
metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
|
|
1102
|
-
// syncContributionAndProofPool tracks metrics on its own
|
|
1103
|
-
metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
|
|
1104
|
-
metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
|
|
1105
|
-
|
|
1106
|
-
const headState = this.getHeadState();
|
|
1107
|
-
const fork = this.config.getForkName(headState.slot);
|
|
1108
|
-
|
|
1109
|
-
if (isForkPostElectra(fork)) {
|
|
1110
|
-
const headStateElectra = headState as BeaconStateElectra;
|
|
1111
|
-
metrics.pendingDeposits.set(headStateElectra.pendingDeposits.length);
|
|
1112
|
-
metrics.pendingPartialWithdrawals.set(headStateElectra.pendingPartialWithdrawals.length);
|
|
1113
|
-
metrics.pendingConsolidations.set(headStateElectra.pendingConsolidations.length);
|
|
1114
|
-
}
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1117
|
-
private onClockSlot(slot: Slot): void {
|
|
1118
|
-
this.logger.verbose("Clock slot", {slot});
|
|
1119
|
-
|
|
1120
|
-
// CRITICAL UPDATE
|
|
1121
|
-
if (this.forkChoice.irrecoverableError) {
|
|
1122
|
-
this.processShutdownCallback(this.forkChoice.irrecoverableError);
|
|
1123
|
-
}
|
|
1124
|
-
|
|
1125
|
-
this.forkChoice.updateTime(slot);
|
|
1126
|
-
this.metrics?.clockSlot.set(slot);
|
|
1127
|
-
|
|
1128
|
-
this.attestationPool.prune(slot);
|
|
1129
|
-
this.aggregatedAttestationPool.prune(slot);
|
|
1130
|
-
this.syncCommitteeMessagePool.prune(slot);
|
|
1131
|
-
this.seenSyncCommitteeMessages.prune(slot);
|
|
1132
|
-
this.seenAttestationDatas.onSlot(slot);
|
|
1133
|
-
this.reprocessController.onSlot(slot);
|
|
1134
|
-
|
|
1135
|
-
// Prune old cached block production artifacts, those are only useful on their slot
|
|
1136
|
-
pruneSetToMax(this.blockProductionCache, this.opts.maxCachedProducedRoots ?? DEFAULT_MAX_CACHED_PRODUCED_RESULTS);
|
|
1137
|
-
this.metrics?.blockProductionCacheSize.set(this.blockProductionCache.size);
|
|
1138
|
-
|
|
1139
|
-
const metrics = this.metrics;
|
|
1140
|
-
if (metrics && (slot + 1) % SLOTS_PER_EPOCH === 0) {
|
|
1141
|
-
// On the last slot of the epoch
|
|
1142
|
-
sleep((1000 * this.config.SECONDS_PER_SLOT) / 2)
|
|
1143
|
-
.then(() => this.validatorMonitor?.onceEveryEndOfEpoch(this.getHeadState()))
|
|
1144
|
-
.catch((e) => {
|
|
1145
|
-
if (!isErrorAborted(e)) this.logger.error("Error on validator monitor onceEveryEndOfEpoch", {slot}, e);
|
|
1146
|
-
});
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
private onClockEpoch(epoch: Epoch): void {
|
|
1151
|
-
this.metrics?.clockEpoch.set(epoch);
|
|
1152
|
-
|
|
1153
|
-
this.seenAttesters.prune(epoch);
|
|
1154
|
-
this.seenAggregators.prune(epoch);
|
|
1155
|
-
this.seenAggregatedAttestations.prune(epoch);
|
|
1156
|
-
this.seenBlockAttesters.prune(epoch);
|
|
1157
|
-
this.beaconProposerCache.prune(epoch);
|
|
1158
|
-
|
|
1159
|
-
// Poll for merge block in the background to speed-up block production. Only if:
|
|
1160
|
-
// - after BELLATRIX_FORK_EPOCH
|
|
1161
|
-
// - Beacon node synced
|
|
1162
|
-
// - head state not isMergeTransitionComplete
|
|
1163
|
-
if (this.config.BELLATRIX_FORK_EPOCH - epoch < 1) {
|
|
1164
|
-
const head = this.forkChoice.getHead();
|
|
1165
|
-
if (epoch - computeEpochAtSlot(head.slot) < 5 && head.executionStatus === ExecutionStatus.PreMerge) {
|
|
1166
|
-
this.eth1.startPollingMergeBlock();
|
|
1167
|
-
}
|
|
1168
|
-
}
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
protected onNewHead(head: ProtoBlock): void {
|
|
1172
|
-
this.syncContributionAndProofPool.prune(head.slot);
|
|
1173
|
-
this.seenContributionAndProof.prune(head.slot);
|
|
1174
|
-
}
|
|
1175
|
-
|
|
1176
|
-
private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
|
|
1177
|
-
this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
|
|
1178
|
-
}
|
|
1179
|
-
|
|
1180
|
-
private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
|
|
1181
|
-
this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
|
|
1182
|
-
this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
|
|
1183
|
-
|
|
1184
|
-
// Update validator custody to account for effective balance changes
|
|
1185
|
-
await this.updateValidatorsCustodyRequirement(cp);
|
|
1186
|
-
|
|
1187
|
-
// TODO: Improve using regen here
|
|
1188
|
-
const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
|
|
1189
|
-
const headState = this.regen.getStateSync(stateRoot);
|
|
1190
|
-
const headBlock = await this.db.block.get(fromHex(blockRoot));
|
|
1191
|
-
if (headBlock == null) {
|
|
1192
|
-
throw Error(`Head block ${slot} ${headBlock} is not available in database`);
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
if (headState) {
|
|
1196
|
-
this.opPool.pruneAll(headBlock, headState);
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
if (headState === null) {
|
|
1200
|
-
this.logger.verbose("Head state is null");
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
|
|
1204
|
-
async updateBeaconProposerData(epoch: Epoch, proposers: ProposerPreparationData[]): Promise<void> {
|
|
1205
|
-
const previousValidatorCount = this.beaconProposerCache.getValidatorIndices().length;
|
|
1206
|
-
|
|
1207
|
-
for (const proposer of proposers) {
|
|
1208
|
-
this.beaconProposerCache.add(epoch, proposer);
|
|
1209
|
-
}
|
|
1210
|
-
|
|
1211
|
-
const newValidatorCount = this.beaconProposerCache.getValidatorIndices().length;
|
|
1212
|
-
|
|
1213
|
-
// Only update validator custody if we discovered new validators
|
|
1214
|
-
if (newValidatorCount > previousValidatorCount) {
|
|
1215
|
-
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1216
|
-
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
|
|
1220
|
-
private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
|
|
1221
|
-
if (this.opts.supernode) {
|
|
1222
|
-
// Disable dynamic custody updates for supernodes since they must maintain custody
|
|
1223
|
-
// of all custody groups regardless of validator effective balances
|
|
1224
|
-
return;
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
|
-
// Validators attached to the node
|
|
1228
|
-
const validatorIndices = this.beaconProposerCache.getValidatorIndices();
|
|
1229
|
-
|
|
1230
|
-
// Update custody requirement based on finalized state
|
|
1231
|
-
let effectiveBalances: number[];
|
|
1232
|
-
const effectiveBalanceIncrements = this.checkpointBalancesCache.get(finalizedCheckpoint);
|
|
1233
|
-
if (effectiveBalanceIncrements) {
|
|
1234
|
-
effectiveBalances = validatorIndices.map(
|
|
1235
|
-
(index) => (effectiveBalanceIncrements[index] ?? 0) * EFFECTIVE_BALANCE_INCREMENT
|
|
1236
|
-
);
|
|
1237
|
-
} else {
|
|
1238
|
-
// If there's no cached effective balances, get the state from disk and parse them out
|
|
1239
|
-
this.logger.debug("No cached finalized effective balances to update target custody group count", {
|
|
1240
|
-
finalizedEpoch: finalizedCheckpoint.epoch,
|
|
1241
|
-
finalizedRoot: finalizedCheckpoint.rootHex,
|
|
1242
|
-
});
|
|
1243
|
-
|
|
1244
|
-
const stateOrBytes = (await this.getStateOrBytesByCheckpoint(finalizedCheckpoint))?.state;
|
|
1245
|
-
if (!stateOrBytes) {
|
|
1246
|
-
// If even the state is not available, we cannot update the custody group count
|
|
1247
|
-
this.logger.debug("No finalized state or bytes available to update target custody group count", {
|
|
1248
|
-
finalizedEpoch: finalizedCheckpoint.epoch,
|
|
1249
|
-
finalizedRoot: finalizedCheckpoint.rootHex,
|
|
1250
|
-
});
|
|
1251
|
-
return;
|
|
1252
|
-
}
|
|
1253
|
-
|
|
1254
|
-
if (stateOrBytes instanceof Uint8Array) {
|
|
1255
|
-
effectiveBalances = getEffectiveBalancesFromStateBytes(this.config, stateOrBytes, validatorIndices);
|
|
1256
|
-
} else {
|
|
1257
|
-
effectiveBalances = validatorIndices.map((index) => stateOrBytes.validators.get(index).effectiveBalance ?? 0);
|
|
1258
|
-
}
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
const targetCustodyGroupCount = getValidatorsCustodyRequirement(this.config, effectiveBalances);
|
|
1262
|
-
// Only update if target is increased
|
|
1263
|
-
if (targetCustodyGroupCount > this.custodyConfig.targetCustodyGroupCount) {
|
|
1264
|
-
this.custodyConfig.updateTargetCustodyGroupCount(targetCustodyGroupCount);
|
|
1265
|
-
this.metrics?.peerDas.targetCustodyGroupCount.set(targetCustodyGroupCount);
|
|
1266
|
-
this.logger.verbose("Updated target custody group count", {
|
|
1267
|
-
finalizedEpoch: finalizedCheckpoint.epoch,
|
|
1268
|
-
validatorCount: validatorIndices.length,
|
|
1269
|
-
targetCustodyGroupCount,
|
|
1270
|
-
});
|
|
1271
|
-
this.emitter.emit(ChainEvent.updateTargetCustodyGroupCount, targetCustodyGroupCount);
|
|
1272
|
-
}
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
|
-
updateBuilderStatus(clockSlot: Slot): void {
|
|
1276
|
-
const executionBuilder = this.executionBuilder;
|
|
1277
|
-
if (executionBuilder) {
|
|
1278
|
-
const {faultInspectionWindow, allowedFaults} = executionBuilder;
|
|
1279
|
-
const slotsPresent = this.forkChoice.getSlotsPresent(clockSlot - faultInspectionWindow);
|
|
1280
|
-
const previousStatus = executionBuilder.status;
|
|
1281
|
-
const shouldEnable = slotsPresent >= Math.min(faultInspectionWindow - allowedFaults, clockSlot);
|
|
1282
|
-
|
|
1283
|
-
executionBuilder.updateStatus(shouldEnable ? BuilderStatus.enabled : BuilderStatus.circuitBreaker);
|
|
1284
|
-
// The status changed we should log
|
|
1285
|
-
const status = executionBuilder.status;
|
|
1286
|
-
const builderLog = {
|
|
1287
|
-
status,
|
|
1288
|
-
slotsPresent,
|
|
1289
|
-
faultInspectionWindow,
|
|
1290
|
-
allowedFaults,
|
|
1291
|
-
};
|
|
1292
|
-
if (status !== previousStatus) {
|
|
1293
|
-
this.logger.info("External builder status updated", builderLog);
|
|
1294
|
-
} else {
|
|
1295
|
-
this.logger.verbose("External builder status", builderLog);
|
|
1296
|
-
}
|
|
1297
|
-
}
|
|
1298
|
-
}
|
|
1299
|
-
|
|
1300
|
-
async getBlockRewards(block: BeaconBlock | BlindedBeaconBlock): Promise<BlockRewards> {
|
|
1301
|
-
let preState = this.regen.getPreStateSync(block);
|
|
1302
|
-
|
|
1303
|
-
if (preState === null) {
|
|
1304
|
-
throw Error(`Pre-state is unavailable given block's parent root ${toRootHex(block.parentRoot)}`);
|
|
1305
|
-
}
|
|
1306
|
-
|
|
1307
|
-
preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
|
|
1308
|
-
|
|
1309
|
-
const postState = this.regen.getStateSync(toRootHex(block.stateRoot)) ?? undefined;
|
|
1310
|
-
|
|
1311
|
-
return computeBlockRewards(block, preState.clone(), postState?.clone());
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1314
|
-
async getAttestationsRewards(
|
|
1315
|
-
epoch: Epoch,
|
|
1316
|
-
validatorIds?: (ValidatorIndex | string)[]
|
|
1317
|
-
): Promise<{rewards: AttestationsRewards; executionOptimistic: boolean; finalized: boolean}> {
|
|
1318
|
-
// We use end slot of (epoch + 1) to ensure we have seen all attestations. On-time or late. Any late attestation beyond this slot is not considered
|
|
1319
|
-
const slot = computeEndSlotAtEpoch(epoch + 1);
|
|
1320
|
-
const stateResult = await this.getStateBySlot(slot, {allowRegen: false}); // No regen if state not in cache
|
|
1321
|
-
|
|
1322
|
-
if (stateResult === null) {
|
|
1323
|
-
throw Error(`State is unavailable for slot ${slot}`);
|
|
1324
|
-
}
|
|
1325
|
-
|
|
1326
|
-
const {executionOptimistic, finalized} = stateResult;
|
|
1327
|
-
const stateRoot = toRootHex(stateResult.state.hashTreeRoot());
|
|
1328
|
-
|
|
1329
|
-
const cachedState = this.regen.getStateSync(stateRoot);
|
|
1330
|
-
|
|
1331
|
-
if (cachedState === null) {
|
|
1332
|
-
throw Error(`State is not in cache for slot ${slot}`);
|
|
1333
|
-
}
|
|
1334
|
-
|
|
1335
|
-
const rewards = await computeAttestationsRewards(epoch, cachedState, this.config, validatorIds);
|
|
1336
|
-
|
|
1337
|
-
return {rewards, executionOptimistic, finalized};
|
|
1338
|
-
}
|
|
1339
|
-
|
|
1340
|
-
async getSyncCommitteeRewards(
|
|
1341
|
-
block: BeaconBlock | BlindedBeaconBlock,
|
|
1342
|
-
validatorIds?: (ValidatorIndex | string)[]
|
|
1343
|
-
): Promise<SyncCommitteeRewards> {
|
|
1344
|
-
let preState = this.regen.getPreStateSync(block);
|
|
1345
|
-
|
|
1346
|
-
if (preState === null) {
|
|
1347
|
-
throw Error(`Pre-state is unavailable given block's parent root ${toRootHex(block.parentRoot)}`);
|
|
1348
|
-
}
|
|
1349
|
-
|
|
1350
|
-
preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
|
|
1351
|
-
|
|
1352
|
-
return computeSyncCommitteeRewards(block, preState.clone(), validatorIds);
|
|
1353
|
-
}
|
|
1354
|
-
}
|