@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/sync/unknownBlock.ts
DELETED
|
@@ -1,859 +0,0 @@
|
|
|
1
|
-
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {ForkSeq} from "@lodestar/params";
|
|
3
|
-
import {RequestError, RequestErrorCode} from "@lodestar/reqresp";
|
|
4
|
-
import {RootHex} from "@lodestar/types";
|
|
5
|
-
import {Logger, prettyPrintIndices, pruneSetToMax, sleep} from "@lodestar/utils";
|
|
6
|
-
import {isBlockInputBlobs, isBlockInputColumns} from "../chain/blocks/blockInput/blockInput.js";
|
|
7
|
-
import {BlockInputSource, IBlockInput} from "../chain/blocks/blockInput/types.js";
|
|
8
|
-
import {BlockError, BlockErrorCode} from "../chain/errors/index.js";
|
|
9
|
-
import {ChainEvent, ChainEventData, IBeaconChain} from "../chain/index.js";
|
|
10
|
-
import {Metrics} from "../metrics/index.js";
|
|
11
|
-
import {INetwork, NetworkEvent, NetworkEventData, prettyPrintPeerIdStr} from "../network/index.js";
|
|
12
|
-
import {PeerSyncMeta} from "../network/peers/peersData.js";
|
|
13
|
-
import {PeerIdStr} from "../util/peerId.js";
|
|
14
|
-
import {shuffle} from "../util/shuffle.js";
|
|
15
|
-
import {sortBy} from "../util/sortBy.js";
|
|
16
|
-
import {wrapError} from "../util/wrapError.js";
|
|
17
|
-
import {MAX_CONCURRENT_REQUESTS} from "./constants.js";
|
|
18
|
-
import {SyncOptions} from "./options.js";
|
|
19
|
-
import {
|
|
20
|
-
BlockInputSyncCacheItem,
|
|
21
|
-
PendingBlockInput,
|
|
22
|
-
PendingBlockInputStatus,
|
|
23
|
-
PendingBlockType,
|
|
24
|
-
getBlockInputSyncCacheItemRootHex,
|
|
25
|
-
getBlockInputSyncCacheItemSlot,
|
|
26
|
-
isPendingBlockInput,
|
|
27
|
-
} from "./types.js";
|
|
28
|
-
import {DownloadByRootError, downloadByRoot} from "./utils/downloadByRoot.js";
|
|
29
|
-
import {getAllDescendantBlocks, getDescendantBlocks, getUnknownAndAncestorBlocks} from "./utils/pendingBlocksTree.js";
|
|
30
|
-
|
|
31
|
-
const MAX_ATTEMPTS_PER_BLOCK = 5;
|
|
32
|
-
const MAX_KNOWN_BAD_BLOCKS = 500;
|
|
33
|
-
const MAX_PENDING_BLOCKS = 100;
|
|
34
|
-
|
|
35
|
-
enum FetchResult {
|
|
36
|
-
SuccessResolved = "success_resolved",
|
|
37
|
-
SuccessMissingParent = "success_missing_parent",
|
|
38
|
-
SuccessLate = "success_late",
|
|
39
|
-
FailureTriedAllPeers = "failure_tried_all_peers",
|
|
40
|
-
FailureMaxAttempts = "failure_max_attempts",
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* BlockInputSync is a class that handles ReqResp to find blocks and data related to a specific blockRoot. The
|
|
45
|
-
* blockRoot may have been found via object gossip, or the API. Gossip objects that can trigger a search are block,
|
|
46
|
-
* blobs, columns, attestations, etc. In the case of blocks and data this is generally during the current slot but
|
|
47
|
-
* can also be for items that are received late but are not fully verified and thus not in fork-choice (old blocks on
|
|
48
|
-
* an unknown fork). It can also be triggered via an attestation (or sync committee message or any other item that
|
|
49
|
-
* gets gossiped) that references a blockRoot that is not in fork-choice. In rare (and realistically should not happen)
|
|
50
|
-
* situations it can get triggered via the API when the validator attempts to publish a block, attestation, aggregate
|
|
51
|
-
* and proof or a sync committee contribution that has unknown information included (parentRoot for instance).
|
|
52
|
-
*
|
|
53
|
-
* The goal of the class is to make sure that all information that is necessary for import into fork-choice is pulled
|
|
54
|
-
* from peers so that the block and data can be processed, and thus the object that triggered the search can be
|
|
55
|
-
* referenced and validated.
|
|
56
|
-
*
|
|
57
|
-
* The most common case for this search is a set of block/data that comes across gossip for the current slot, during
|
|
58
|
-
* normal chain operation, but not everything was received before the gossip cutoff window happens so it is necessary
|
|
59
|
-
* to pull remaining data via req/resp so that fork-choice can be updated prior to making an attestation for the
|
|
60
|
-
* current slot.
|
|
61
|
-
*
|
|
62
|
-
* Event sources for old UnknownBlock
|
|
63
|
-
*
|
|
64
|
-
* - publishBlock
|
|
65
|
-
* - gossipHandlers
|
|
66
|
-
* - searchUnknownSlotRoot
|
|
67
|
-
* = produceSyncCommitteeContribution
|
|
68
|
-
* = validateGossipFnRetryUnknownRoot
|
|
69
|
-
* * submitPoolAttestationsV2
|
|
70
|
-
* * publishAggregateAndProofsV2
|
|
71
|
-
* = onPendingGossipsubMessage
|
|
72
|
-
* * NetworkEvent.pendingGossipsubMessage
|
|
73
|
-
* - onGossipsubMessage
|
|
74
|
-
*/
|
|
75
|
-
export class BlockInputSync {
|
|
76
|
-
/**
|
|
77
|
-
* block RootHex -> PendingBlock. To avoid finding same root at the same time
|
|
78
|
-
*/
|
|
79
|
-
private readonly pendingBlocks = new Map<RootHex, BlockInputSyncCacheItem>();
|
|
80
|
-
private readonly knownBadBlocks = new Set<RootHex>();
|
|
81
|
-
private readonly maxPendingBlocks;
|
|
82
|
-
private subscribedToNetworkEvents = false;
|
|
83
|
-
private peerBalancer: UnknownBlockPeerBalancer;
|
|
84
|
-
|
|
85
|
-
constructor(
|
|
86
|
-
private readonly config: ChainForkConfig,
|
|
87
|
-
private readonly network: INetwork,
|
|
88
|
-
private readonly chain: IBeaconChain,
|
|
89
|
-
private readonly logger: Logger,
|
|
90
|
-
private readonly metrics: Metrics | null,
|
|
91
|
-
private readonly opts?: SyncOptions
|
|
92
|
-
) {
|
|
93
|
-
this.maxPendingBlocks = opts?.maxPendingBlocks ?? MAX_PENDING_BLOCKS;
|
|
94
|
-
this.peerBalancer = new UnknownBlockPeerBalancer();
|
|
95
|
-
|
|
96
|
-
if (metrics) {
|
|
97
|
-
metrics.blockInputSync.pendingBlocks.addCollect(() =>
|
|
98
|
-
metrics.blockInputSync.pendingBlocks.set(this.pendingBlocks.size)
|
|
99
|
-
);
|
|
100
|
-
metrics.blockInputSync.knownBadBlocks.addCollect(() =>
|
|
101
|
-
metrics.blockInputSync.knownBadBlocks.set(this.knownBadBlocks.size)
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
subscribeToNetwork(): void {
|
|
107
|
-
if (this.opts?.disableBlockInputSync) {
|
|
108
|
-
this.logger.verbose("BlockInputSync disabled by disableBlockInputSync option.");
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// cannot chain to the above if or the log will be incorrect
|
|
113
|
-
if (!this.subscribedToNetworkEvents) {
|
|
114
|
-
this.logger.verbose("BlockInputSync enabled.");
|
|
115
|
-
this.chain.emitter.on(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
|
|
116
|
-
this.chain.emitter.on(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
|
|
117
|
-
this.chain.emitter.on(ChainEvent.unknownParent, this.onUnknownParent);
|
|
118
|
-
this.network.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
119
|
-
this.network.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
120
|
-
this.subscribedToNetworkEvents = true;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
unsubscribeFromNetwork(): void {
|
|
125
|
-
this.logger.verbose("BlockInputSync disabled.");
|
|
126
|
-
this.chain.emitter.off(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
|
|
127
|
-
this.chain.emitter.off(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
|
|
128
|
-
this.chain.emitter.off(ChainEvent.unknownParent, this.onUnknownParent);
|
|
129
|
-
this.network.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
130
|
-
this.network.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
131
|
-
this.subscribedToNetworkEvents = false;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
close(): void {
|
|
135
|
-
this.unsubscribeFromNetwork();
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
isSubscribedToNetwork(): boolean {
|
|
139
|
-
return this.subscribedToNetworkEvents;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Process an unknownBlock event and register the block in `pendingBlocks` Map.
|
|
144
|
-
*/
|
|
145
|
-
private onUnknownBlockRoot = (data: ChainEventData[ChainEvent.unknownBlockRoot]): void => {
|
|
146
|
-
try {
|
|
147
|
-
this.addByRootHex(data.rootHex, data.peer);
|
|
148
|
-
this.triggerUnknownBlockSearch();
|
|
149
|
-
this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.UNKNOWN_BLOCK_ROOT});
|
|
150
|
-
this.metrics?.blockInputSync.source.inc({source: data.source});
|
|
151
|
-
} catch (e) {
|
|
152
|
-
this.logger.debug("Error handling unknownBlockRoot event", {}, e as Error);
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Process an unknownBlockInput event and register the block in `pendingBlocks` Map.
|
|
158
|
-
*/
|
|
159
|
-
private onIncompleteBlockInput = (data: ChainEventData[ChainEvent.incompleteBlockInput]): void => {
|
|
160
|
-
try {
|
|
161
|
-
this.addByBlockInput(data.blockInput, data.peer);
|
|
162
|
-
this.triggerUnknownBlockSearch();
|
|
163
|
-
this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.INCOMPLETE_BLOCK_INPUT});
|
|
164
|
-
this.metrics?.blockInputSync.source.inc({source: data.source});
|
|
165
|
-
} catch (e) {
|
|
166
|
-
this.logger.debug("Error handling incompleteBlockInput event", {}, e as Error);
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Process an unknownBlockParent event and register the block in `pendingBlocks` Map.
|
|
172
|
-
*/
|
|
173
|
-
private onUnknownParent = (data: ChainEventData[ChainEvent.unknownParent]): void => {
|
|
174
|
-
try {
|
|
175
|
-
this.addByRootHex(data.blockInput.parentRootHex, data.peer);
|
|
176
|
-
this.addByBlockInput(data.blockInput, data.peer);
|
|
177
|
-
this.triggerUnknownBlockSearch();
|
|
178
|
-
this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.UNKNOWN_PARENT});
|
|
179
|
-
this.metrics?.blockInputSync.source.inc({source: data.source});
|
|
180
|
-
} catch (e) {
|
|
181
|
-
this.logger.debug("Error handling unknownParent event", {}, e as Error);
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
private addByRootHex = (rootHex: RootHex, peerIdStr?: PeerIdStr): void => {
|
|
186
|
-
let pendingBlock = this.pendingBlocks.get(rootHex);
|
|
187
|
-
if (!pendingBlock) {
|
|
188
|
-
pendingBlock = {
|
|
189
|
-
status: PendingBlockInputStatus.pending,
|
|
190
|
-
rootHex: rootHex,
|
|
191
|
-
peerIdStrings: new Set(),
|
|
192
|
-
timeAddedSec: Date.now() / 1000,
|
|
193
|
-
};
|
|
194
|
-
this.pendingBlocks.set(rootHex, pendingBlock);
|
|
195
|
-
|
|
196
|
-
this.logger.verbose("Added new rootHex to BlockInputSync.pendingBlocks", {
|
|
197
|
-
root: pendingBlock.rootHex,
|
|
198
|
-
peerIdStr: peerIdStr ?? "unknown peer",
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
if (peerIdStr) {
|
|
203
|
-
pendingBlock.peerIdStrings.add(peerIdStr);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// TODO: check this prune methodology
|
|
207
|
-
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
208
|
-
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
209
|
-
if (prunedItemCount > 0) {
|
|
210
|
-
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
private addByBlockInput = (blockInput: IBlockInput, peerIdStr?: string): void => {
|
|
215
|
-
let pendingBlock = this.pendingBlocks.get(blockInput.blockRootHex);
|
|
216
|
-
// if entry is missing or was added via rootHex and now we have more complete information overwrite
|
|
217
|
-
// the existing information with the more complete cache entry
|
|
218
|
-
if (!pendingBlock || !isPendingBlockInput(pendingBlock)) {
|
|
219
|
-
pendingBlock = {
|
|
220
|
-
// can be added via unknown parent and we may already have full block input. need to check and set correctly
|
|
221
|
-
// so we pull the data if its missing or handle the block correctly in getIncompleteAndAncestorBlocks
|
|
222
|
-
status: blockInput.hasBlockAndAllData() ? PendingBlockInputStatus.downloaded : PendingBlockInputStatus.pending,
|
|
223
|
-
blockInput,
|
|
224
|
-
peerIdStrings: new Set(),
|
|
225
|
-
timeAddedSec: Date.now() / 1000,
|
|
226
|
-
};
|
|
227
|
-
this.pendingBlocks.set(blockInput.blockRootHex, pendingBlock);
|
|
228
|
-
|
|
229
|
-
this.logger.verbose("Added blockInput to BlockInputSync.pendingBlocks", pendingBlock.blockInput.getLogMeta());
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if (peerIdStr) {
|
|
233
|
-
pendingBlock.peerIdStrings.add(peerIdStr);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// TODO: check this prune methodology
|
|
237
|
-
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
238
|
-
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
239
|
-
if (prunedItemCount > 0) {
|
|
240
|
-
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
private onPeerConnected = (data: NetworkEventData[NetworkEvent.peerConnected]): void => {
|
|
245
|
-
try {
|
|
246
|
-
const peerId = data.peer;
|
|
247
|
-
const peerSyncMeta = this.network.getConnectedPeerSyncMeta(peerId);
|
|
248
|
-
this.peerBalancer.onPeerConnected(data.peer, peerSyncMeta);
|
|
249
|
-
this.triggerUnknownBlockSearch();
|
|
250
|
-
} catch (e) {
|
|
251
|
-
this.logger.debug("Error handling peerConnected event", {}, e as Error);
|
|
252
|
-
}
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
private onPeerDisconnected = (data: NetworkEventData[NetworkEvent.peerDisconnected]): void => {
|
|
256
|
-
const peerId = data.peer;
|
|
257
|
-
this.peerBalancer.onPeerDisconnected(peerId);
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Gather tip parent blocks with unknown parent and do a search for all of them
|
|
262
|
-
*/
|
|
263
|
-
private triggerUnknownBlockSearch = (): void => {
|
|
264
|
-
// Cheap early stop to prevent calling the network.getConnectedPeers()
|
|
265
|
-
if (this.pendingBlocks.size === 0) {
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// If the node loses all peers with pending unknown blocks, the sync will stall
|
|
270
|
-
const connectedPeers = this.network.getConnectedPeers();
|
|
271
|
-
if (connectedPeers.length === 0) {
|
|
272
|
-
this.logger.debug("No connected peers, skipping unknown block search.");
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
const {unknowns, ancestors} = getUnknownAndAncestorBlocks(this.pendingBlocks);
|
|
277
|
-
// it's rare when there is no unknown block
|
|
278
|
-
// see https://github.com/ChainSafe/lodestar/issues/5649#issuecomment-1594213550
|
|
279
|
-
if (unknowns.length === 0) {
|
|
280
|
-
let processedBlocks = 0;
|
|
281
|
-
|
|
282
|
-
for (const block of ancestors) {
|
|
283
|
-
// when this happens, it's likely the block and parent block are processed by head sync
|
|
284
|
-
if (this.chain.forkChoice.hasBlockHex(block.blockInput.parentRootHex)) {
|
|
285
|
-
processedBlocks++;
|
|
286
|
-
this.processBlock(block).catch((e) => {
|
|
287
|
-
this.logger.debug("Unexpected error - process old downloaded block", {}, e);
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
this.logger.verbose("No unknown block, process ancestor downloaded blocks", {
|
|
293
|
-
pendingBlocks: this.pendingBlocks.size,
|
|
294
|
-
ancestorBlocks: ancestors.length,
|
|
295
|
-
processedBlocks,
|
|
296
|
-
});
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// most of the time there is exactly 1 unknown block
|
|
301
|
-
for (const block of unknowns) {
|
|
302
|
-
this.downloadBlock(block).catch((e) => {
|
|
303
|
-
this.logger.debug("Unexpected error - downloadBlock", {root: getBlockInputSyncCacheItemRootHex(block)}, e);
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
private async downloadBlock(block: BlockInputSyncCacheItem): Promise<void> {
|
|
309
|
-
if (block.status !== PendingBlockInputStatus.pending) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
314
|
-
const logCtx = {
|
|
315
|
-
slot: getBlockInputSyncCacheItemSlot(block),
|
|
316
|
-
root: rootHex,
|
|
317
|
-
pendingBlocks: this.pendingBlocks.size,
|
|
318
|
-
};
|
|
319
|
-
|
|
320
|
-
this.logger.verbose("BlockInputSync.downloadBlock()", logCtx);
|
|
321
|
-
|
|
322
|
-
block.status = PendingBlockInputStatus.fetching;
|
|
323
|
-
|
|
324
|
-
const res = await wrapError(this.fetchBlockInput(block));
|
|
325
|
-
|
|
326
|
-
if (!res.err) {
|
|
327
|
-
this.metrics?.blockInputSync.downloadedBlocksSuccess.inc();
|
|
328
|
-
const pending = res.result;
|
|
329
|
-
this.pendingBlocks.set(pending.blockInput.blockRootHex, pending);
|
|
330
|
-
const blockSlot = pending.blockInput.slot;
|
|
331
|
-
const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
|
|
332
|
-
const delaySec = Date.now() / 1000 - (this.chain.genesisTime + blockSlot * this.config.SECONDS_PER_SLOT);
|
|
333
|
-
this.metrics?.blockInputSync.elapsedTimeTillReceived.observe(delaySec);
|
|
334
|
-
|
|
335
|
-
const parentInForkChoice = this.chain.forkChoice.hasBlockHex(pending.blockInput.parentRootHex);
|
|
336
|
-
const logCtx2 = {
|
|
337
|
-
...logCtx,
|
|
338
|
-
slot: blockSlot,
|
|
339
|
-
parentInForkChoice,
|
|
340
|
-
};
|
|
341
|
-
this.logger.verbose("Downloaded unknown block", logCtx2);
|
|
342
|
-
|
|
343
|
-
if (parentInForkChoice) {
|
|
344
|
-
// Bingo! Process block. Add to pending blocks anyway for recycle the cache that prevents duplicate processing
|
|
345
|
-
this.processBlock(pending).catch((e) => {
|
|
346
|
-
this.logger.debug("Unexpected error - process newly downloaded block", logCtx2, e);
|
|
347
|
-
});
|
|
348
|
-
} else if (blockSlot <= finalizedSlot) {
|
|
349
|
-
// the common ancestor of the downloading chain and canonical chain should be at least the finalized slot and
|
|
350
|
-
// we should found it through forkchoice. If not, we should penalize all peers sending us this block chain
|
|
351
|
-
// 0 - 1 - ... - n - finalizedSlot
|
|
352
|
-
// \
|
|
353
|
-
// parent 1 - parent 2 - ... - unknownParent block
|
|
354
|
-
this.logger.debug("Downloaded block is before finalized slot", {
|
|
355
|
-
...logCtx2,
|
|
356
|
-
finalizedSlot,
|
|
357
|
-
});
|
|
358
|
-
this.removeAndDownScoreAllDescendants(block);
|
|
359
|
-
} else {
|
|
360
|
-
this.onUnknownBlockRoot({rootHex: pending.blockInput.parentRootHex, source: BlockInputSource.byRoot});
|
|
361
|
-
}
|
|
362
|
-
} else {
|
|
363
|
-
this.metrics?.blockInputSync.downloadedBlocksError.inc();
|
|
364
|
-
this.logger.debug("Ignoring unknown block root after many failed downloads", logCtx, res.err);
|
|
365
|
-
this.removeAndDownScoreAllDescendants(block);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Send block to the processor awaiting completition. If processed successfully, send all children to the processor.
|
|
371
|
-
* On error, remove and downscore all descendants.
|
|
372
|
-
* This function could run recursively for all descendant blocks
|
|
373
|
-
*/
|
|
374
|
-
private async processBlock(pendingBlock: PendingBlockInput): Promise<void> {
|
|
375
|
-
// pending block status is `downloaded` right after `downloadBlock`
|
|
376
|
-
// but could be `pending` if added by `onUnknownBlockParent` event and this function is called recursively
|
|
377
|
-
if (pendingBlock.status !== PendingBlockInputStatus.downloaded) {
|
|
378
|
-
if (pendingBlock.status === PendingBlockInputStatus.pending) {
|
|
379
|
-
const connectedPeers = this.network.getConnectedPeers();
|
|
380
|
-
if (connectedPeers.length === 0) {
|
|
381
|
-
this.logger.debug("No connected peers, skipping download block", {
|
|
382
|
-
slot: pendingBlock.blockInput.slot,
|
|
383
|
-
blockRoot: pendingBlock.blockInput.blockRootHex,
|
|
384
|
-
});
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
// if the download is a success we'll call `processBlock()` for this block
|
|
388
|
-
await this.downloadBlock(pendingBlock);
|
|
389
|
-
}
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
pendingBlock.status = PendingBlockInputStatus.processing;
|
|
394
|
-
// this prevents unbundling attack
|
|
395
|
-
// see https://lighthouse-blog.sigmaprime.io/mev-unbundling-rpc.html
|
|
396
|
-
const {slot: blockSlot, proposerIndex} = pendingBlock.blockInput.getBlock().message;
|
|
397
|
-
const fork = this.config.getForkName(blockSlot);
|
|
398
|
-
const proposerBoostWindowMs = this.config.getAttestationDueMs(fork);
|
|
399
|
-
if (
|
|
400
|
-
this.chain.clock.msFromSlot(blockSlot) < proposerBoostWindowMs &&
|
|
401
|
-
this.chain.seenBlockProposers.isKnown(blockSlot, proposerIndex)
|
|
402
|
-
) {
|
|
403
|
-
// proposer is known by a gossip block already, wait a bit to make sure this block is not
|
|
404
|
-
// eligible for proposer boost to prevent unbundling attack
|
|
405
|
-
this.logger.verbose("Avoid proposer boost for this block of known proposer", {
|
|
406
|
-
slot: blockSlot,
|
|
407
|
-
root: pendingBlock.blockInput.blockRootHex,
|
|
408
|
-
proposerIndex,
|
|
409
|
-
});
|
|
410
|
-
await sleep(proposerBoostWindowMs);
|
|
411
|
-
}
|
|
412
|
-
// At gossip time, it's critical to keep a good number of mesh peers.
|
|
413
|
-
// To do that, the Gossip Job Wait Time should be consistently <3s to avoid the behavior penalties in gossip
|
|
414
|
-
// Gossip Job Wait Time depends on the BLS Job Wait Time
|
|
415
|
-
// so `blsVerifyOnMainThread = true`: we want to verify signatures immediately without affecting the bls thread pool.
|
|
416
|
-
// otherwise we can't utilize bls thread pool capacity and Gossip Job Wait Time can't be kept low consistently.
|
|
417
|
-
// See https://github.com/ChainSafe/lodestar/issues/3792
|
|
418
|
-
const res = await wrapError(
|
|
419
|
-
this.chain.processBlock(pendingBlock.blockInput, {
|
|
420
|
-
ignoreIfKnown: true,
|
|
421
|
-
// there could be finalized/head sync at the same time so we need to ignore if finalized
|
|
422
|
-
// see https://github.com/ChainSafe/lodestar/issues/5650
|
|
423
|
-
ignoreIfFinalized: true,
|
|
424
|
-
blsVerifyOnMainThread: true,
|
|
425
|
-
// block is validated with correct root, we want to process it as soon as possible
|
|
426
|
-
eagerPersistBlock: true,
|
|
427
|
-
})
|
|
428
|
-
);
|
|
429
|
-
|
|
430
|
-
if (res.err) this.metrics?.blockInputSync.processedBlocksError.inc();
|
|
431
|
-
else this.metrics?.blockInputSync.processedBlocksSuccess.inc();
|
|
432
|
-
|
|
433
|
-
if (!res.err) {
|
|
434
|
-
// no need to update status to "processed", delete anyway
|
|
435
|
-
this.pendingBlocks.delete(pendingBlock.blockInput.blockRootHex);
|
|
436
|
-
this.chain.seenBlockInputCache.prune(pendingBlock.blockInput.blockRootHex);
|
|
437
|
-
|
|
438
|
-
// Send child blocks to the processor
|
|
439
|
-
for (const descendantBlock of getDescendantBlocks(pendingBlock.blockInput.blockRootHex, this.pendingBlocks)) {
|
|
440
|
-
if (isPendingBlockInput(descendantBlock)) {
|
|
441
|
-
this.processBlock(descendantBlock).catch((e) => {
|
|
442
|
-
this.logger.debug("Unexpected error - process descendant block", {}, e);
|
|
443
|
-
});
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
} else {
|
|
447
|
-
const errorData = {slot: pendingBlock.blockInput.slot, root: pendingBlock.blockInput.blockRootHex};
|
|
448
|
-
if (res.err instanceof BlockError) {
|
|
449
|
-
switch (res.err.type.code) {
|
|
450
|
-
// This cases are already handled with `{ignoreIfKnown: true}`
|
|
451
|
-
// case BlockErrorCode.ALREADY_KNOWN:
|
|
452
|
-
// case BlockErrorCode.GENESIS_BLOCK:
|
|
453
|
-
|
|
454
|
-
case BlockErrorCode.PARENT_UNKNOWN:
|
|
455
|
-
case BlockErrorCode.PRESTATE_MISSING:
|
|
456
|
-
// Should not happen, mark as downloaded to try again latter
|
|
457
|
-
this.logger.debug("Attempted to process block but its parent was still unknown", errorData, res.err);
|
|
458
|
-
pendingBlock.status = PendingBlockInputStatus.downloaded;
|
|
459
|
-
break;
|
|
460
|
-
|
|
461
|
-
case BlockErrorCode.EXECUTION_ENGINE_ERROR:
|
|
462
|
-
// Removing the block(s) without penalizing the peers, hoping for EL to
|
|
463
|
-
// recover on a latter download + verify attempt
|
|
464
|
-
this.removeAllDescendants(pendingBlock);
|
|
465
|
-
break;
|
|
466
|
-
|
|
467
|
-
default:
|
|
468
|
-
// Block is not correct with respect to our chain. Log error loudly
|
|
469
|
-
this.logger.debug("Error processing block from unknown parent sync", errorData, res.err);
|
|
470
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// Probably a queue error or something unwanted happened, mark as pending to try again latter
|
|
475
|
-
else {
|
|
476
|
-
this.logger.debug("Unknown error processing block from unknown block sync", errorData, res.err);
|
|
477
|
-
pendingBlock.status = PendingBlockInputStatus.downloaded;
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/**
|
|
483
|
-
* From a set of shuffled peers:
|
|
484
|
-
* - fetch the block
|
|
485
|
-
* - from deneb, fetch all missing blobs
|
|
486
|
-
* - from peerDAS, fetch sampled colmns
|
|
487
|
-
* TODO: this means we only have block root, and nothing else. Consider to reflect this in the function name
|
|
488
|
-
* prefulu, will attempt a max of `MAX_ATTEMPTS_PER_BLOCK` on different peers, postfulu we may attempt more as defined in `getMaxDownloadAttempts()` function
|
|
489
|
-
* Also verifies the received block root + returns the peer that provided the block for future downscoring.
|
|
490
|
-
*/
|
|
491
|
-
private async fetchBlockInput(cacheItem: BlockInputSyncCacheItem): Promise<PendingBlockInput> {
|
|
492
|
-
const rootHex = getBlockInputSyncCacheItemRootHex(cacheItem);
|
|
493
|
-
const excludedPeers = new Set<PeerIdStr>();
|
|
494
|
-
const defaultPendingColumns =
|
|
495
|
-
this.config.getForkSeq(this.chain.clock.currentSlot) >= ForkSeq.fulu
|
|
496
|
-
? new Set(this.network.custodyConfig.sampledColumns)
|
|
497
|
-
: null;
|
|
498
|
-
|
|
499
|
-
const fetchStartSec = Date.now() / 1000;
|
|
500
|
-
let slot = isPendingBlockInput(cacheItem) ? cacheItem.blockInput.slot : undefined;
|
|
501
|
-
if (slot !== undefined) {
|
|
502
|
-
this.metrics?.blockInputSync.fetchBegin.observe(this.chain.clock.secFromSlot(slot, fetchStartSec));
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
let i = 0;
|
|
506
|
-
while (i++ < this.getMaxDownloadAttempts()) {
|
|
507
|
-
const pendingColumns =
|
|
508
|
-
isPendingBlockInput(cacheItem) && isBlockInputColumns(cacheItem.blockInput)
|
|
509
|
-
? new Set(cacheItem.blockInput.getMissingSampledColumnMeta().missing)
|
|
510
|
-
: defaultPendingColumns;
|
|
511
|
-
// pendingDataColumns is null pre-fulu
|
|
512
|
-
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers);
|
|
513
|
-
if (peerMeta === null) {
|
|
514
|
-
// no more peer with needed columns to try, throw error
|
|
515
|
-
let message = `Error fetching UnknownBlockRoot slot=${slot} root=${rootHex} after ${i}: cannot find peer`;
|
|
516
|
-
if (pendingColumns) {
|
|
517
|
-
message += ` with needed columns=${prettyPrintIndices(Array.from(pendingColumns))}`;
|
|
518
|
-
}
|
|
519
|
-
this.metrics?.blockInputSync.fetchTimeSec.observe(
|
|
520
|
-
{result: FetchResult.FailureTriedAllPeers},
|
|
521
|
-
Date.now() / 1000 - fetchStartSec
|
|
522
|
-
);
|
|
523
|
-
this.metrics?.blockInputSync.fetchPeers.set({result: FetchResult.FailureTriedAllPeers}, i);
|
|
524
|
-
throw Error(message);
|
|
525
|
-
}
|
|
526
|
-
const {peerId, client: peerClient} = peerMeta;
|
|
527
|
-
|
|
528
|
-
cacheItem.peerIdStrings.add(peerId);
|
|
529
|
-
|
|
530
|
-
try {
|
|
531
|
-
const downloadResult = await downloadByRoot({
|
|
532
|
-
config: this.config,
|
|
533
|
-
network: this.network,
|
|
534
|
-
seenCache: this.chain.seenBlockInputCache,
|
|
535
|
-
emitter: this.chain.emitter,
|
|
536
|
-
peerMeta,
|
|
537
|
-
cacheItem,
|
|
538
|
-
});
|
|
539
|
-
cacheItem = downloadResult.result;
|
|
540
|
-
if (slot === undefined) {
|
|
541
|
-
slot = cacheItem.blockInput.slot;
|
|
542
|
-
// we were not able to observe the time into slot when starting the fetch, do it now
|
|
543
|
-
this.metrics?.blockInputSync.fetchBegin.observe(this.chain.clock.secFromSlot(slot, fetchStartSec));
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
const logCtx = {slot, rootHex, peerId, peerClient};
|
|
547
|
-
this.logger.verbose("BlockInputSync.fetchBlockInput: successful download", logCtx);
|
|
548
|
-
this.metrics?.blockInputSync.downloadByRoot.success.inc();
|
|
549
|
-
const warnings = downloadResult.warnings;
|
|
550
|
-
if (warnings) {
|
|
551
|
-
for (const warning of warnings) {
|
|
552
|
-
this.logger.debug("BlockInputSync.fetchBlockInput: downloaded with warning", logCtx, warning);
|
|
553
|
-
this.metrics?.blockInputSync.downloadByRoot.warn.inc({code: warning.type.code, client: peerClient});
|
|
554
|
-
}
|
|
555
|
-
// TODO: penalize peer?
|
|
556
|
-
}
|
|
557
|
-
} catch (e) {
|
|
558
|
-
this.logger.debug(
|
|
559
|
-
"Error downloading in BlockInputSync.fetchBlockInput",
|
|
560
|
-
{slot, rootHex, attempt: i, peer: peerId, peerClient},
|
|
561
|
-
e as Error
|
|
562
|
-
);
|
|
563
|
-
const downloadByRootMetrics = this.metrics?.blockInputSync.downloadByRoot;
|
|
564
|
-
// TODO: penalize peer?
|
|
565
|
-
if (e instanceof DownloadByRootError) {
|
|
566
|
-
const errorCode = e.type.code;
|
|
567
|
-
downloadByRootMetrics?.error.inc({code: errorCode, client: peerClient});
|
|
568
|
-
excludedPeers.add(peerId);
|
|
569
|
-
} else if (e instanceof RequestError) {
|
|
570
|
-
// should look into req_resp metrics in this case
|
|
571
|
-
downloadByRootMetrics?.error.inc({code: "req_resp", client: peerClient});
|
|
572
|
-
switch (e.type.code) {
|
|
573
|
-
case RequestErrorCode.REQUEST_RATE_LIMITED:
|
|
574
|
-
case RequestErrorCode.REQUEST_TIMEOUT:
|
|
575
|
-
// do not exclude peer for these errors
|
|
576
|
-
break;
|
|
577
|
-
default:
|
|
578
|
-
excludedPeers.add(peerId);
|
|
579
|
-
break;
|
|
580
|
-
}
|
|
581
|
-
} else {
|
|
582
|
-
// investigate if this happens
|
|
583
|
-
downloadByRootMetrics?.error.inc({code: "unknown", client: peerClient});
|
|
584
|
-
excludedPeers.add(peerId);
|
|
585
|
-
}
|
|
586
|
-
} finally {
|
|
587
|
-
this.peerBalancer.onRequestCompleted(peerId);
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
this.pendingBlocks.set(getBlockInputSyncCacheItemRootHex(cacheItem), cacheItem);
|
|
591
|
-
|
|
592
|
-
if (cacheItem.status === PendingBlockInputStatus.downloaded) {
|
|
593
|
-
// download was successful, no need to go with another peer, return
|
|
594
|
-
const result = this.chain.forkChoice.hasBlockHex(cacheItem.blockInput.blockRootHex)
|
|
595
|
-
? FetchResult.SuccessLate
|
|
596
|
-
: this.chain.forkChoice.hasBlockHex(cacheItem.blockInput.parentRootHex)
|
|
597
|
-
? FetchResult.SuccessResolved
|
|
598
|
-
: FetchResult.SuccessMissingParent;
|
|
599
|
-
this.metrics?.blockInputSync.fetchTimeSec.observe({result}, Date.now() / 1000 - fetchStartSec);
|
|
600
|
-
this.metrics?.blockInputSync.fetchPeers.set({result}, i);
|
|
601
|
-
return cacheItem;
|
|
602
|
-
}
|
|
603
|
-
} // end while loop over peers
|
|
604
|
-
|
|
605
|
-
const message = `Error fetching BlockInput with slot=${slot} root=${rootHex} after ${i - 1} attempts.`;
|
|
606
|
-
|
|
607
|
-
if (!isPendingBlockInput(cacheItem)) {
|
|
608
|
-
throw Error(`${message} No block and no data was found.`);
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
if (!cacheItem.blockInput.hasBlock()) {
|
|
612
|
-
throw new Error(`${message} Block was not found.`);
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
if (isBlockInputBlobs(cacheItem.blockInput)) {
|
|
616
|
-
const missing = cacheItem.blockInput.getMissingBlobMeta().map((b) => b.index);
|
|
617
|
-
if (missing.length) {
|
|
618
|
-
throw new Error(`${message} Missing blob indices=${prettyPrintIndices(missing)}.`);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
if (isBlockInputColumns(cacheItem.blockInput)) {
|
|
623
|
-
const missing = cacheItem.blockInput.getMissingSampledColumnMeta().missing;
|
|
624
|
-
if (missing.length) {
|
|
625
|
-
throw new Error(`${message} Missing column indices=${prettyPrintIndices(missing)}.`);
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
this.metrics?.blockInputSync.fetchTimeSec.observe(
|
|
630
|
-
{result: FetchResult.FailureMaxAttempts},
|
|
631
|
-
Date.now() / 1000 - fetchStartSec
|
|
632
|
-
);
|
|
633
|
-
this.metrics?.blockInputSync.fetchPeers.set({result: FetchResult.FailureMaxAttempts}, i - 1);
|
|
634
|
-
|
|
635
|
-
throw Error(message);
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
/**
|
|
639
|
-
* Gets all descendant blocks of `block` recursively from `pendingBlocks`.
|
|
640
|
-
* Assumes that if a parent block does not exist or is not processable, all descendant blocks are bad too.
|
|
641
|
-
* Downscore all peers that have referenced any of this bad blocks. May report peers multiple times if they have
|
|
642
|
-
* referenced more than one bad block.
|
|
643
|
-
*/
|
|
644
|
-
private removeAndDownScoreAllDescendants(block: BlockInputSyncCacheItem): void {
|
|
645
|
-
// Get all blocks that are a descendant of this one
|
|
646
|
-
const badPendingBlocks = this.removeAllDescendants(block);
|
|
647
|
-
// just console log and do not penalize on pending/bad blocks for debugging
|
|
648
|
-
// console.log("removeAndDownscoreAllDescendants", {block});
|
|
649
|
-
|
|
650
|
-
for (const block of badPendingBlocks) {
|
|
651
|
-
//
|
|
652
|
-
// TODO(fulu): why is this commented out here?
|
|
653
|
-
//
|
|
654
|
-
// this.knownBadBlocks.add(block.blockRootHex);
|
|
655
|
-
// for (const peerIdStr of block.peerIdStrs) {
|
|
656
|
-
// // TODO: Refactor peerRpcScores to work with peerIdStr only
|
|
657
|
-
// this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, "BadBlockByRoot");
|
|
658
|
-
// }
|
|
659
|
-
this.logger.debug("ignored Banning unknown block", {
|
|
660
|
-
slot: getBlockInputSyncCacheItemSlot(block),
|
|
661
|
-
root: getBlockInputSyncCacheItemRootHex(block),
|
|
662
|
-
peerIdStrings: Array.from(block.peerIdStrings)
|
|
663
|
-
.map((id) => prettyPrintPeerIdStr(id))
|
|
664
|
-
.join(","),
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
// Prune knownBadBlocks
|
|
669
|
-
pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
private removeAllDescendants(block: BlockInputSyncCacheItem): BlockInputSyncCacheItem[] {
|
|
673
|
-
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
674
|
-
const slot = getBlockInputSyncCacheItemSlot(block);
|
|
675
|
-
// Get all blocks that are a descendant of this one
|
|
676
|
-
const badPendingBlocks = [block, ...getAllDescendantBlocks(rootHex, this.pendingBlocks)];
|
|
677
|
-
|
|
678
|
-
this.metrics?.blockInputSync.removedBlocks.inc(badPendingBlocks.length);
|
|
679
|
-
|
|
680
|
-
for (const block of badPendingBlocks) {
|
|
681
|
-
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
682
|
-
this.pendingBlocks.delete(rootHex);
|
|
683
|
-
this.chain.seenBlockInputCache.prune(rootHex);
|
|
684
|
-
this.logger.debug("Removing bad/unknown/incomplete BlockInputSyncCacheItem", {
|
|
685
|
-
slot,
|
|
686
|
-
blockRoot: rootHex,
|
|
687
|
-
});
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
return badPendingBlocks;
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
private getMaxDownloadAttempts(): number {
|
|
694
|
-
if (this.config.getForkSeq(this.chain.clock.currentSlot) < ForkSeq.fulu) {
|
|
695
|
-
return MAX_ATTEMPTS_PER_BLOCK;
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
// TODO: I consider max 20 downloads per block for a supernode is enough for devnets
|
|
699
|
-
// review this computation for public testnets or mainnet
|
|
700
|
-
return Math.min(
|
|
701
|
-
20,
|
|
702
|
-
(MAX_ATTEMPTS_PER_BLOCK * this.network.custodyConfig.sampleGroups.length) / this.config.SAMPLES_PER_SLOT
|
|
703
|
-
);
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
/**
|
|
708
|
-
* Class to track active byRoots requests and balance them across eligible peers.
|
|
709
|
-
*/
|
|
710
|
-
export class UnknownBlockPeerBalancer {
|
|
711
|
-
readonly peersMeta: Map<PeerIdStr, PeerSyncMeta>;
|
|
712
|
-
readonly activeRequests: Map<PeerIdStr, number>;
|
|
713
|
-
|
|
714
|
-
constructor() {
|
|
715
|
-
this.peersMeta = new Map();
|
|
716
|
-
this.activeRequests = new Map();
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
/** Trigger on each peer re-status */
|
|
720
|
-
onPeerConnected(peerId: PeerIdStr, syncMeta: PeerSyncMeta): void {
|
|
721
|
-
this.peersMeta.set(peerId, syncMeta);
|
|
722
|
-
|
|
723
|
-
if (!this.activeRequests.has(peerId)) {
|
|
724
|
-
this.activeRequests.set(peerId, 0);
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
onPeerDisconnected(peerId: PeerIdStr): void {
|
|
729
|
-
this.peersMeta.delete(peerId);
|
|
730
|
-
this.activeRequests.delete(peerId);
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
/**
|
|
734
|
-
* called from fetchUnknownBlockRoot() where we only have block root and nothing else
|
|
735
|
-
* excludedPeers are the peers that we requested already so we don't want to try again
|
|
736
|
-
* pendingColumns is empty for prefulu, or the 1st time we we download a block by root
|
|
737
|
-
*/
|
|
738
|
-
bestPeerForPendingColumns(pendingColumns: Set<number> | null, excludedPeers: Set<PeerIdStr>): PeerSyncMeta | null {
|
|
739
|
-
const eligiblePeers = this.filterPeers(pendingColumns, excludedPeers);
|
|
740
|
-
if (eligiblePeers.length === 0) {
|
|
741
|
-
return null;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
const sortedEligiblePeers = sortBy(
|
|
745
|
-
shuffle(eligiblePeers),
|
|
746
|
-
// prefer peers with least active req
|
|
747
|
-
(peerId) => this.activeRequests.get(peerId) ?? 0
|
|
748
|
-
);
|
|
749
|
-
|
|
750
|
-
const bestPeerId = sortedEligiblePeers[0];
|
|
751
|
-
this.onRequest(bestPeerId);
|
|
752
|
-
return this.peersMeta.get(bestPeerId) ?? null;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
/**
|
|
756
|
-
* called from fetchUnavailableBlockInput() where we have either BlockInput or NullBlockInput
|
|
757
|
-
* excludedPeers are the peers that we requested already so we don't want to try again
|
|
758
|
-
*/
|
|
759
|
-
bestPeerForBlockInput(blockInput: IBlockInput, excludedPeers: Set<PeerIdStr>): PeerSyncMeta | null {
|
|
760
|
-
const eligiblePeers: PeerIdStr[] = [];
|
|
761
|
-
|
|
762
|
-
if (isBlockInputColumns(blockInput)) {
|
|
763
|
-
const pendingDataColumns: Set<number> = new Set(blockInput.getMissingSampledColumnMeta().missing);
|
|
764
|
-
// there could be no pending column in case when block is still missing
|
|
765
|
-
eligiblePeers.push(...this.filterPeers(pendingDataColumns, excludedPeers));
|
|
766
|
-
} else {
|
|
767
|
-
// prefulu
|
|
768
|
-
eligiblePeers.push(...this.filterPeers(null, excludedPeers));
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
if (eligiblePeers.length === 0) {
|
|
772
|
-
return null;
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
const sortedEligiblePeers = sortBy(
|
|
776
|
-
shuffle(eligiblePeers),
|
|
777
|
-
// prefer peers with least active req
|
|
778
|
-
(peerId) => this.activeRequests.get(peerId) ?? 0
|
|
779
|
-
);
|
|
780
|
-
|
|
781
|
-
const bestPeerId = sortedEligiblePeers[0];
|
|
782
|
-
this.onRequest(bestPeerId);
|
|
783
|
-
return this.peersMeta.get(bestPeerId) ?? null;
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
/**
|
|
787
|
-
* Consumers don't need to call this method directly, it is called internally by bestPeer*() methods
|
|
788
|
-
* make this public for testing
|
|
789
|
-
*/
|
|
790
|
-
onRequest(peerId: PeerIdStr): void {
|
|
791
|
-
this.activeRequests.set(peerId, (this.activeRequests.get(peerId) ?? 0) + 1);
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
/**
|
|
795
|
-
* Consumers should call this method when a request is completed for a peer.
|
|
796
|
-
*/
|
|
797
|
-
onRequestCompleted(peerId: PeerIdStr): void {
|
|
798
|
-
this.activeRequests.set(peerId, Math.max(0, (this.activeRequests.get(peerId) ?? 1) - 1));
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
getTotalActiveRequests(): number {
|
|
802
|
-
let totalActiveRequests = 0;
|
|
803
|
-
for (const count of this.activeRequests.values()) {
|
|
804
|
-
totalActiveRequests += count;
|
|
805
|
-
}
|
|
806
|
-
return totalActiveRequests;
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
// pendingDataColumns could be null for prefulu
|
|
810
|
-
private filterPeers(pendingDataColumns: Set<number> | null, excludedPeers: Set<PeerIdStr>): PeerIdStr[] {
|
|
811
|
-
let maxColumnCount = 0;
|
|
812
|
-
const considerPeers: {peerId: PeerIdStr; columnCount: number}[] = [];
|
|
813
|
-
for (const [peerId, syncMeta] of this.peersMeta.entries()) {
|
|
814
|
-
if (excludedPeers.has(peerId)) {
|
|
815
|
-
// made request to this peer already
|
|
816
|
-
continue;
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
const activeRequests = this.activeRequests.get(peerId) ?? 0;
|
|
820
|
-
if (activeRequests >= MAX_CONCURRENT_REQUESTS) {
|
|
821
|
-
// should return peer with no more than MAX_CONCURRENT_REQUESTS active requests
|
|
822
|
-
continue;
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
if (pendingDataColumns === null || pendingDataColumns.size === 0) {
|
|
826
|
-
// prefulu, no pending columns
|
|
827
|
-
considerPeers.push({peerId, columnCount: 0});
|
|
828
|
-
continue;
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
// postfulu, find peers that have custody columns that we need
|
|
832
|
-
const {custodyColumns: peerColumns} = syncMeta;
|
|
833
|
-
// check if the peer has all needed columns
|
|
834
|
-
// get match
|
|
835
|
-
const columns = peerColumns.reduce((acc, elem) => {
|
|
836
|
-
if (pendingDataColumns.has(elem)) {
|
|
837
|
-
acc.push(elem);
|
|
838
|
-
}
|
|
839
|
-
return acc;
|
|
840
|
-
}, [] as number[]);
|
|
841
|
-
|
|
842
|
-
if (columns.length > 0) {
|
|
843
|
-
if (columns.length > maxColumnCount) {
|
|
844
|
-
maxColumnCount = columns.length;
|
|
845
|
-
}
|
|
846
|
-
considerPeers.push({peerId, columnCount: columns.length});
|
|
847
|
-
}
|
|
848
|
-
} // end for
|
|
849
|
-
|
|
850
|
-
const eligiblePeers: PeerIdStr[] = [];
|
|
851
|
-
for (const {peerId, columnCount} of considerPeers) {
|
|
852
|
-
if (columnCount === maxColumnCount) {
|
|
853
|
-
eligiblePeers.push(peerId);
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
return eligiblePeers;
|
|
858
|
-
}
|
|
859
|
-
}
|