@lodestar/beacon-node 1.35.0-dev.f80d2d52da → 1.35.0-dev.fd1dac853d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/api.d.ts.map +1 -0
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/blocks/index.js +58 -46
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/blocks/utils.d.ts.map +1 -0
- package/lib/api/impl/beacon/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/pool/index.js +3 -3
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/rewards/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -0
- package/lib/api/impl/config/constants.d.ts +5 -0
- package/lib/api/impl/config/constants.d.ts.map +1 -0
- package/lib/api/impl/config/constants.js +6 -1
- package/lib/api/impl/config/constants.js.map +1 -1
- package/lib/api/impl/config/index.d.ts.map +1 -0
- package/lib/api/impl/debug/index.d.ts.map +1 -0
- package/lib/api/impl/debug/index.js +1 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/errors.d.ts.map +1 -0
- package/lib/api/impl/errors.js +2 -0
- package/lib/api/impl/errors.js.map +1 -1
- package/lib/api/impl/events/index.d.ts.map +1 -0
- package/lib/api/impl/index.d.ts +3 -3
- package/lib/api/impl/index.d.ts.map +1 -0
- package/lib/api/impl/index.js +3 -3
- package/lib/api/impl/index.js.map +1 -1
- package/lib/api/impl/lightclient/index.d.ts.map +1 -0
- package/lib/api/impl/lodestar/index.d.ts.map +1 -0
- package/lib/api/impl/lodestar/index.js +2 -2
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/node/index.d.ts.map +1 -0
- package/lib/api/impl/node/utils.d.ts.map +1 -0
- package/lib/api/impl/proof/index.d.ts.map +1 -0
- package/lib/api/impl/types.d.ts.map +1 -0
- package/lib/api/impl/utils.d.ts.map +1 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -0
- package/lib/api/impl/validator/index.js +22 -26
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts.map +1 -0
- package/lib/api/index.d.ts.map +1 -0
- package/lib/api/options.d.ts.map +1 -0
- package/lib/api/rest/activeSockets.d.ts.map +1 -0
- package/lib/api/rest/activeSockets.js +3 -2
- package/lib/api/rest/activeSockets.js.map +1 -1
- package/lib/api/rest/base.d.ts +1 -1
- package/lib/api/rest/base.d.ts.map +1 -0
- package/lib/api/rest/base.js +6 -2
- package/lib/api/rest/base.js.map +1 -1
- package/lib/api/rest/index.d.ts.map +1 -0
- package/lib/api/rest/index.js +2 -0
- package/lib/api/rest/index.js.map +1 -1
- package/lib/api/rest/swaggerUI.d.ts.map +1 -0
- package/lib/api/rest/swaggerUI.js +4 -2
- package/lib/api/rest/swaggerUI.js.map +1 -1
- package/lib/bun-wrappers/prometheus-gc-stats.d.ts +2 -0
- package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +1 -0
- package/lib/bun-wrappers/prometheus-gc-stats.js +8 -0
- package/lib/bun-wrappers/prometheus-gc-stats.js.map +1 -0
- package/lib/chain/ColumnReconstructionTracker.d.ts +32 -0
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -0
- package/lib/chain/ColumnReconstructionTracker.js +71 -0
- package/lib/chain/ColumnReconstructionTracker.js.map +1 -0
- package/lib/chain/GetBlobsTracker.d.ts +31 -0
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -0
- package/lib/chain/GetBlobsTracker.js +82 -0
- package/lib/chain/GetBlobsTracker.js.map +1 -0
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -0
- package/lib/chain/archiveStore/archiveStore.js +49 -38
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/constants.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +3 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/worker.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/worker.js +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/index.d.ts +1 -1
- package/lib/chain/archiveStore/index.d.ts.map +1 -0
- package/lib/chain/archiveStore/index.js +1 -1
- package/lib/chain/archiveStore/interface.d.ts.map +1 -0
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -0
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +5 -0
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.js +5 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +1 -0
- package/lib/chain/balancesCache.d.ts.map +1 -0
- package/lib/chain/balancesCache.js +1 -3
- package/lib/chain/balancesCache.js.map +1 -1
- package/lib/chain/beaconProposerCache.d.ts.map +1 -0
- package/lib/chain/beaconProposerCache.js +1 -0
- package/lib/chain/beaconProposerCache.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +19 -7
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/blockInput.js +133 -89
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/index.d.ts +1 -1
- package/lib/chain/blocks/blockInput/index.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/index.js +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +19 -10
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/types.js +1 -0
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/blockInput/utils.d.ts +0 -4
- package/lib/chain/blocks/blockInput/utils.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/utils.js +6 -29
- package/lib/chain/blocks/blockInput/utils.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -0
- package/lib/chain/blocks/importBlock.js +42 -37
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/index.d.ts +6 -5
- package/lib/chain/blocks/index.d.ts.map +1 -0
- package/lib/chain/blocks/index.js +5 -4
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +3 -108
- package/lib/chain/blocks/types.d.ts.map +1 -0
- package/lib/chain/blocks/types.js +0 -119
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/chainSegment.d.ts +2 -2
- package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -0
- package/lib/chain/blocks/utils/chainSegment.js +2 -2
- package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -0
- package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/ownBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/zebraBanner.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlock.d.ts +3 -3
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlock.js +15 -14
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts +7 -22
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +23 -108
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +4 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +24 -22
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +4 -3
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +2 -2
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -2
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +2 -2
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +3 -3
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -0
- package/lib/chain/blocks/writeBlockInputToDb.js +56 -67
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/index.d.ts.map +1 -0
- package/lib/chain/bls/interface.d.ts.map +1 -0
- package/lib/chain/bls/maybeBatch.d.ts.map +1 -0
- package/lib/chain/bls/multithread/index.d.ts.map +1 -0
- package/lib/chain/bls/multithread/index.js +168 -163
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -0
- package/lib/chain/bls/multithread/poolSize.d.ts.map +1 -0
- package/lib/chain/bls/multithread/types.d.ts.map +1 -0
- package/lib/chain/bls/multithread/utils.d.ts.map +1 -0
- package/lib/chain/bls/multithread/worker.d.ts.map +1 -0
- package/lib/chain/bls/singleThread.d.ts.map +1 -0
- package/lib/chain/bls/singleThread.js +1 -0
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.d.ts.map +1 -0
- package/lib/chain/chain.d.ts +13 -11
- package/lib/chain/chain.d.ts.map +1 -0
- package/lib/chain/chain.js +82 -24
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +43 -2
- package/lib/chain/emitter.d.ts.map +1 -0
- package/lib/chain/emitter.js +18 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/attestationError.d.ts.map +1 -0
- package/lib/chain/errors/attesterSlashingError.d.ts.map +1 -0
- package/lib/chain/errors/blobSidecarError.d.ts +24 -0
- package/lib/chain/errors/blobSidecarError.d.ts.map +1 -0
- package/lib/chain/errors/blobSidecarError.js +10 -0
- package/lib/chain/errors/blobSidecarError.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts.map +1 -0
- package/lib/chain/errors/blockError.js +1 -0
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +1 -0
- package/lib/chain/errors/dataColumnSidecarError.d.ts +42 -0
- package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -0
- package/lib/chain/errors/dataColumnSidecarError.js +14 -0
- package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
- package/lib/chain/errors/gossipValidation.d.ts.map +1 -0
- package/lib/chain/errors/gossipValidation.js +1 -0
- package/lib/chain/errors/gossipValidation.js.map +1 -1
- package/lib/chain/errors/index.d.ts +2 -2
- package/lib/chain/errors/index.d.ts.map +1 -0
- package/lib/chain/errors/index.js +2 -2
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/errors/lightClientError.d.ts.map +1 -0
- package/lib/chain/errors/proposerSlashingError.d.ts.map +1 -0
- package/lib/chain/errors/syncCommitteeError.d.ts.map +1 -0
- package/lib/chain/errors/voluntaryExitError.d.ts.map +1 -0
- package/lib/chain/forkChoice/index.d.ts.map +1 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/genesis/genesis.d.ts.map +1 -0
- package/lib/chain/genesis/genesis.js +16 -5
- package/lib/chain/genesis/genesis.js.map +1 -1
- package/lib/chain/genesis/interface.d.ts.map +1 -0
- package/lib/chain/index.d.ts +2 -2
- package/lib/chain/index.d.ts.map +1 -0
- package/lib/chain/index.js +2 -2
- package/lib/chain/index.js.map +1 -1
- package/lib/chain/initState.d.ts.map +1 -0
- package/lib/chain/interface.d.ts +12 -9
- package/lib/chain/interface.d.ts.map +1 -0
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/lightClient/index.d.ts.map +1 -0
- package/lib/chain/lightClient/index.js +16 -9
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/lightClient/proofs.d.ts.map +1 -0
- package/lib/chain/lightClient/proofs.js.map +1 -1
- package/lib/chain/lightClient/types.d.ts.map +1 -0
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/aggregatedAttestationPool.js +14 -9
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +2 -3
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/attestationPool.js +10 -7
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +1 -1
- package/lib/chain/opPools/index.d.ts.map +1 -0
- package/lib/chain/opPools/index.js +1 -1
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/opPool.d.ts.map +1 -0
- package/lib/chain/opPools/opPool.js +10 -12
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts +3 -2
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.js +14 -10
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -0
- package/lib/chain/opPools/syncContributionAndProofPool.js +5 -2
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/types.d.ts +1 -1
- package/lib/chain/opPools/types.d.ts.map +1 -0
- package/lib/chain/opPools/types.js +1 -1
- package/lib/chain/opPools/types.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -0
- package/lib/chain/options.d.ts.map +1 -0
- package/lib/chain/options.js +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +3 -3
- package/lib/chain/prepareNextSlot.d.ts.map +1 -0
- package/lib/chain/prepareNextSlot.js +145 -140
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -0
- package/lib/chain/produceBlock/index.d.ts.map +1 -0
- package/lib/chain/produceBlock/produceBlockBody.d.ts +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -0
- package/lib/chain/produceBlock/produceBlockBody.js +3 -10
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +1 -0
- package/lib/chain/regen/errors.d.ts.map +1 -0
- package/lib/chain/regen/errors.js +1 -0
- package/lib/chain/regen/errors.js.map +1 -1
- package/lib/chain/regen/index.d.ts +1 -1
- package/lib/chain/regen/index.d.ts.map +1 -0
- package/lib/chain/regen/index.js +1 -1
- package/lib/chain/regen/index.js.map +1 -1
- package/lib/chain/regen/interface.d.ts.map +1 -0
- package/lib/chain/regen/queued.d.ts.map +1 -0
- package/lib/chain/regen/queued.js +35 -28
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts.map +1 -0
- package/lib/chain/regen/regen.js +1 -0
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/reprocess.d.ts.map +1 -0
- package/lib/chain/reprocess.js +3 -1
- package/lib/chain/reprocess.js.map +1 -1
- package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -0
- package/lib/chain/rewards/blockRewards.d.ts.map +1 -0
- package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -0
- package/lib/chain/seenCache/index.d.ts +1 -1
- package/lib/chain/seenCache/index.d.ts.map +1 -0
- package/lib/chain/seenCache/index.js +1 -1
- package/lib/chain/seenCache/index.js.map +1 -1
- package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAggregateAndProof.js +7 -6
- package/lib/chain/seenCache/seenAggregateAndProof.js.map +1 -1
- package/lib/chain/seenCache/seenAttestationData.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAttestationData.js +5 -2
- package/lib/chain/seenCache/seenAttestationData.js.map +1 -1
- package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAttesters.js +2 -4
- package/lib/chain/seenCache/seenAttesters.js.map +1 -1
- package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +1 -0
- package/lib/chain/seenCache/seenBlockProposers.d.ts.map +1 -0
- package/lib/chain/seenCache/seenBlockProposers.js +2 -4
- package/lib/chain/seenCache/seenBlockProposers.js.map +1 -1
- package/lib/chain/seenCache/seenCommittee.d.ts.map +1 -0
- package/lib/chain/seenCache/seenCommittee.js +1 -3
- package/lib/chain/seenCache/seenCommittee.js.map +1 -1
- package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +1 -0
- package/lib/chain/seenCache/seenCommitteeContribution.js +3 -2
- package/lib/chain/seenCache/seenCommitteeContribution.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +74 -78
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -0
- package/lib/chain/seenCache/seenGossipBlockInput.js +235 -369
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/serializeState.d.ts.map +1 -0
- package/lib/chain/shufflingCache.d.ts.map +1 -0
- package/lib/chain/shufflingCache.js +5 -2
- package/lib/chain/shufflingCache.js.map +1 -1
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -0
- package/lib/chain/stateCache/blockStateCacheImpl.js +13 -7
- package/lib/chain/stateCache/blockStateCacheImpl.js.map +1 -1
- package/lib/chain/stateCache/datastore/db.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/db.js +1 -0
- package/lib/chain/stateCache/datastore/db.js.map +1 -1
- package/lib/chain/stateCache/datastore/file.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/file.js +1 -0
- package/lib/chain/stateCache/datastore/file.js.map +1 -1
- package/lib/chain/stateCache/datastore/index.d.ts +1 -1
- package/lib/chain/stateCache/datastore/index.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/index.js +1 -1
- package/lib/chain/stateCache/datastore/index.js.map +1 -1
- package/lib/chain/stateCache/datastore/types.d.ts.map +1 -0
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -0
- package/lib/chain/stateCache/fifoBlockStateCache.js +10 -0
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -0
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js +10 -4
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/index.d.ts +1 -1
- package/lib/chain/stateCache/index.d.ts.map +1 -0
- package/lib/chain/stateCache/index.js +1 -1
- package/lib/chain/stateCache/index.js.map +1 -1
- package/lib/chain/stateCache/mapMetrics.d.ts.map +1 -0
- package/lib/chain/stateCache/mapMetrics.js +4 -4
- package/lib/chain/stateCache/mapMetrics.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -0
- package/lib/chain/stateCache/persistentCheckpointsCache.js +23 -14
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts.map +1 -0
- package/lib/chain/validation/aggregateAndProof.d.ts.map +1 -0
- package/lib/chain/validation/attestation.d.ts.map +1 -0
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -0
- package/lib/chain/validation/blobSidecar.d.ts +8 -3
- package/lib/chain/validation/blobSidecar.d.ts.map +1 -0
- package/lib/chain/validation/blobSidecar.js +73 -31
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -0
- package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -0
- package/lib/chain/validation/dataColumnSidecar.d.ts +7 -9
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -0
- package/lib/chain/validation/dataColumnSidecar.js +95 -57
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/index.d.ts +1 -1
- package/lib/chain/validation/index.d.ts.map +1 -0
- package/lib/chain/validation/index.js +1 -1
- package/lib/chain/validation/index.js.map +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +1 -0
- package/lib/chain/validation/lightClientFinalityUpdate.js +4 -3
- package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts +6 -4
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +1 -0
- package/lib/chain/validation/lightClientOptimisticUpdate.js +11 -11
- package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +1 -2
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/index.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -0
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -0
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -0
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -0
- package/lib/chain/validatorMonitor.d.ts +1 -3
- package/lib/chain/validatorMonitor.d.ts.map +1 -0
- package/lib/chain/validatorMonitor.js +23 -16
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/constants/constants.d.ts.map +1 -0
- package/lib/constants/index.d.ts.map +1 -0
- package/lib/constants/network.d.ts.map +1 -0
- package/lib/db/beacon.d.ts.map +1 -0
- package/lib/db/beacon.js +24 -0
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +4 -4
- package/lib/db/buckets.d.ts.map +1 -0
- package/lib/db/buckets.js +4 -4
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/index.d.ts +1 -1
- package/lib/db/index.d.ts.map +1 -0
- package/lib/db/index.js.map +1 -1
- package/lib/db/interface.d.ts.map +1 -0
- package/lib/db/options.d.ts.map +1 -0
- package/lib/db/repositories/attesterSlashing.d.ts.map +1 -0
- package/lib/db/repositories/backfilledRanges.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecars.js +1 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/db/repositories/blobSidecarsArchive.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecarsArchive.js +1 -1
- package/lib/db/repositories/blobSidecarsArchive.js.map +1 -1
- package/lib/db/repositories/block.d.ts.map +1 -0
- package/lib/db/repositories/blockArchive.d.ts.map +1 -0
- package/lib/db/repositories/blockArchive.js +2 -3
- package/lib/db/repositories/blockArchive.js.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -0
- package/lib/db/repositories/blsToExecutionChange.d.ts.map +1 -0
- package/lib/db/repositories/checkpointState.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecar.js +2 -2
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js +2 -2
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/db/repositories/depositDataRoot.d.ts.map +1 -0
- package/lib/db/repositories/depositDataRoot.js +1 -0
- package/lib/db/repositories/depositDataRoot.js.map +1 -1
- package/lib/db/repositories/depositEvent.d.ts.map +1 -0
- package/lib/db/repositories/eth1Data.d.ts.map +1 -0
- package/lib/db/repositories/index.d.ts +10 -10
- package/lib/db/repositories/index.d.ts.map +1 -0
- package/lib/db/repositories/index.js +9 -9
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/db/repositories/lightclientBestUpdate.d.ts.map +1 -0
- package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +1 -0
- package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +1 -0
- package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +1 -0
- package/lib/db/repositories/proposerSlashing.d.ts.map +1 -0
- package/lib/db/repositories/stateArchive.d.ts.map +1 -0
- package/lib/db/repositories/stateArchiveIndex.d.ts.map +1 -0
- package/lib/db/repositories/voluntaryExit.d.ts.map +1 -0
- package/lib/db/single/index.d.ts.map +1 -0
- package/lib/db/single/preGenesisState.d.ts.map +1 -0
- package/lib/db/single/preGenesisState.js +6 -0
- package/lib/db/single/preGenesisState.js.map +1 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +1 -0
- package/lib/db/single/preGenesisStateLastProcessedBlock.js +5 -0
- package/lib/db/single/preGenesisStateLastProcessedBlock.js.map +1 -1
- package/lib/eth1/errors.d.ts.map +1 -0
- package/lib/eth1/eth1DataCache.d.ts.map +1 -0
- package/lib/eth1/eth1DataCache.js +2 -0
- package/lib/eth1/eth1DataCache.js.map +1 -1
- package/lib/eth1/eth1DepositDataTracker.d.ts.map +1 -0
- package/lib/eth1/eth1DepositDataTracker.js +18 -5
- package/lib/eth1/eth1DepositDataTracker.js.map +1 -1
- package/lib/eth1/eth1DepositsCache.d.ts.map +1 -0
- package/lib/eth1/eth1DepositsCache.js +3 -0
- package/lib/eth1/eth1DepositsCache.js.map +1 -1
- package/lib/eth1/eth1MergeBlockTracker.d.ts.map +1 -0
- package/lib/eth1/eth1MergeBlockTracker.js +10 -4
- package/lib/eth1/eth1MergeBlockTracker.js.map +1 -1
- package/lib/eth1/index.d.ts.map +1 -0
- package/lib/eth1/index.js +2 -0
- package/lib/eth1/index.js.map +1 -1
- package/lib/eth1/interface.d.ts.map +1 -0
- package/lib/eth1/options.d.ts.map +1 -0
- package/lib/eth1/provider/eth1Provider.d.ts +1 -2
- package/lib/eth1/provider/eth1Provider.d.ts.map +1 -0
- package/lib/eth1/provider/eth1Provider.js +6 -2
- package/lib/eth1/provider/eth1Provider.js.map +1 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts +1 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +1 -0
- package/lib/eth1/provider/jsonRpcHttpClient.js +16 -2
- package/lib/eth1/provider/jsonRpcHttpClient.js.map +1 -1
- package/lib/eth1/provider/jwt.d.ts.map +1 -0
- package/lib/eth1/provider/jwt.js.map +1 -1
- package/lib/eth1/provider/utils.d.ts +5 -0
- package/lib/eth1/provider/utils.d.ts.map +1 -0
- package/lib/eth1/provider/utils.js +9 -1
- package/lib/eth1/provider/utils.js.map +1 -1
- package/lib/eth1/stream.d.ts.map +1 -0
- package/lib/eth1/utils/depositContract.d.ts.map +1 -0
- package/lib/eth1/utils/deposits.d.ts.map +1 -0
- package/lib/eth1/utils/deposits.js.map +1 -1
- package/lib/eth1/utils/eth1Data.d.ts.map +1 -0
- package/lib/eth1/utils/eth1DepositEvent.d.ts.map +1 -0
- package/lib/eth1/utils/eth1Vote.d.ts.map +1 -0
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +1 -0
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +1 -0
- package/lib/execution/builder/cache.d.ts.map +1 -0
- package/lib/execution/builder/cache.js +6 -0
- package/lib/execution/builder/cache.js.map +1 -1
- package/lib/execution/builder/http.d.ts.map +1 -0
- package/lib/execution/builder/http.js +14 -8
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/index.d.ts.map +1 -0
- package/lib/execution/builder/index.js.map +1 -1
- package/lib/execution/builder/interface.d.ts.map +1 -0
- package/lib/execution/builder/utils.d.ts.map +1 -0
- package/lib/execution/engine/disabled.d.ts.map +1 -0
- package/lib/execution/engine/disabled.js +2 -4
- package/lib/execution/engine/disabled.js.map +1 -1
- package/lib/execution/engine/http.d.ts +2 -2
- package/lib/execution/engine/http.d.ts.map +1 -0
- package/lib/execution/engine/http.js +43 -11
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -0
- package/lib/execution/engine/interface.d.ts +2 -2
- package/lib/execution/engine/interface.d.ts.map +1 -0
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.d.ts.map +1 -0
- package/lib/execution/engine/mock.js +16 -12
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -0
- package/lib/execution/engine/payloadIdCache.js +1 -3
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/types.d.ts +5 -1
- package/lib/execution/engine/types.d.ts.map +1 -0
- package/lib/execution/engine/types.js +37 -8
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.d.ts.map +1 -0
- package/lib/execution/engine/utils.js +3 -3
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/execution/index.d.ts +2 -2
- package/lib/execution/index.d.ts.map +1 -0
- package/lib/execution/index.js +2 -2
- package/lib/execution/index.js.map +1 -1
- package/lib/index.d.ts +6 -6
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +5 -5
- package/lib/index.js.map +1 -1
- package/lib/metrics/index.d.ts +1 -1
- package/lib/metrics/index.d.ts.map +1 -0
- package/lib/metrics/index.js +1 -1
- package/lib/metrics/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +11 -5
- package/lib/metrics/metrics/beacon.d.ts.map +1 -0
- package/lib/metrics/metrics/beacon.js +40 -20
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +56 -14
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -0
- package/lib/metrics/metrics/lodestar.js +87 -10
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/metrics.d.ts +1 -1
- package/lib/metrics/metrics.d.ts.map +1 -0
- package/lib/metrics/metrics.js.map +1 -1
- package/lib/metrics/nodeJsMetrics.d.ts.map +1 -0
- package/lib/metrics/nodeJsMetrics.js +1 -1
- package/lib/metrics/nodeJsMetrics.js.map +1 -1
- package/lib/metrics/options.d.ts.map +1 -0
- package/lib/metrics/server/http.d.ts +1 -1
- package/lib/metrics/server/http.d.ts.map +1 -0
- package/lib/metrics/server/index.d.ts.map +1 -0
- package/lib/metrics/utils/avgMinMax.d.ts +1 -1
- package/lib/metrics/utils/avgMinMax.d.ts.map +1 -0
- package/lib/metrics/utils/avgMinMax.js +10 -6
- package/lib/metrics/utils/avgMinMax.js.map +1 -1
- package/lib/metrics/utils/gauge.d.ts +1 -1
- package/lib/metrics/utils/gauge.d.ts.map +1 -0
- package/lib/metrics/utils/gauge.js +1 -4
- package/lib/metrics/utils/gauge.js.map +1 -1
- package/lib/metrics/utils/registryMetricCreator.d.ts +1 -1
- package/lib/metrics/utils/registryMetricCreator.d.ts.map +1 -0
- package/lib/metrics/utils/registryMetricCreator.js.map +1 -1
- package/lib/monitoring/clientStats.d.ts.map +1 -0
- package/lib/monitoring/index.d.ts.map +1 -0
- package/lib/monitoring/options.d.ts.map +1 -0
- package/lib/monitoring/properties.d.ts.map +1 -0
- package/lib/monitoring/properties.js +4 -0
- package/lib/monitoring/properties.js.map +1 -1
- package/lib/monitoring/service.d.ts.map +1 -0
- package/lib/monitoring/service.js +13 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/monitoring/system.d.ts.map +1 -0
- package/lib/monitoring/system.js +25 -27
- package/lib/monitoring/system.js.map +1 -1
- package/lib/monitoring/types.d.ts.map +1 -0
- package/lib/network/core/events.d.ts.map +1 -0
- package/lib/network/core/index.d.ts.map +1 -0
- package/lib/network/core/metrics.d.ts.map +1 -0
- package/lib/network/core/networkCore.d.ts +2 -2
- package/lib/network/core/networkCore.d.ts.map +1 -0
- package/lib/network/core/networkCore.js +67 -50
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.d.ts.map +1 -0
- package/lib/network/core/networkCoreWorker.js +1 -1
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -2
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -0
- package/lib/network/core/networkCoreWorkerHandler.js +14 -5
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts.map +1 -0
- package/lib/network/discv5/index.d.ts +2 -2
- package/lib/network/discv5/index.d.ts.map +1 -0
- package/lib/network/discv5/index.js +9 -3
- package/lib/network/discv5/index.js.map +1 -1
- package/lib/network/discv5/types.d.ts.map +1 -0
- package/lib/network/discv5/utils.d.ts.map +1 -0
- package/lib/network/discv5/worker.d.ts.map +1 -0
- package/lib/network/discv5/worker.js +3 -3
- package/lib/network/discv5/worker.js.map +1 -1
- package/lib/network/events.d.ts +2 -18
- package/lib/network/events.d.ts.map +1 -0
- package/lib/network/events.js +0 -7
- package/lib/network/events.js.map +1 -1
- package/lib/network/forks.d.ts.map +1 -0
- package/lib/network/gossip/constants.d.ts.map +1 -0
- package/lib/network/gossip/encoding.d.ts +1 -1
- package/lib/network/gossip/encoding.d.ts.map +1 -0
- package/lib/network/gossip/encoding.js +4 -2
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/gossip/errors.d.ts.map +1 -0
- package/lib/network/gossip/errors.js +1 -0
- package/lib/network/gossip/errors.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +2 -1
- package/lib/network/gossip/gossipsub.d.ts.map +1 -0
- package/lib/network/gossip/gossipsub.js +44 -18
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/index.d.ts +2 -2
- package/lib/network/gossip/index.d.ts.map +1 -0
- package/lib/network/gossip/index.js +2 -2
- package/lib/network/gossip/index.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +2 -2
- package/lib/network/gossip/interface.d.ts.map +1 -0
- package/lib/network/gossip/metrics.d.ts +15 -7
- package/lib/network/gossip/metrics.d.ts.map +1 -0
- package/lib/network/gossip/metrics.js +16 -6
- package/lib/network/gossip/metrics.js.map +1 -1
- package/lib/network/gossip/scoringParameters.d.ts.map +1 -0
- package/lib/network/gossip/scoringParameters.js +4 -4
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +125 -105
- package/lib/network/gossip/topic.d.ts.map +1 -0
- package/lib/network/gossip/topic.js +2 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/index.d.ts +3 -3
- package/lib/network/index.d.ts.map +1 -0
- package/lib/network/index.js +3 -3
- package/lib/network/index.js.map +1 -1
- package/lib/network/interface.d.ts +3 -2
- package/lib/network/interface.d.ts.map +1 -0
- package/lib/network/libp2p/error.d.ts.map +1 -0
- package/lib/network/libp2p/index.d.ts.map +1 -0
- package/lib/network/libp2p/index.js +11 -3
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/metadata.d.ts.map +1 -0
- package/lib/network/metadata.js +6 -1
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +5 -3
- package/lib/network/network.d.ts.map +1 -0
- package/lib/network/network.js +92 -76
- package/lib/network/network.js.map +1 -1
- package/lib/network/networkConfig.d.ts.map +1 -0
- package/lib/network/options.d.ts.map +1 -0
- package/lib/network/options.js +1 -1
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/client.d.ts.map +1 -0
- package/lib/network/peers/datastore.d.ts +2 -2
- package/lib/network/peers/datastore.d.ts.map +1 -0
- package/lib/network/peers/datastore.js +10 -4
- package/lib/network/peers/datastore.js.map +1 -1
- package/lib/network/peers/discover.d.ts.map +1 -0
- package/lib/network/peers/discover.js +75 -66
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/index.d.ts.map +1 -0
- package/lib/network/peers/peerManager.d.ts.map +1 -0
- package/lib/network/peers/peerManager.js +156 -131
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +1 -1
- package/lib/network/peers/peersData.d.ts.map +1 -0
- package/lib/network/peers/peersData.js +1 -3
- package/lib/network/peers/peersData.js.map +1 -1
- package/lib/network/peers/score/constants.d.ts.map +1 -0
- package/lib/network/peers/score/index.d.ts +1 -1
- package/lib/network/peers/score/index.d.ts.map +1 -0
- package/lib/network/peers/score/index.js +1 -1
- package/lib/network/peers/score/index.js.map +1 -1
- package/lib/network/peers/score/interface.d.ts.map +1 -0
- package/lib/network/peers/score/score.d.ts.map +1 -0
- package/lib/network/peers/score/score.js +6 -0
- package/lib/network/peers/score/score.js.map +1 -1
- package/lib/network/peers/score/store.d.ts.map +1 -0
- package/lib/network/peers/score/store.js +3 -0
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/score/utils.d.ts.map +1 -0
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -0
- package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -0
- package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +1 -0
- package/lib/network/peers/utils/index.d.ts.map +1 -0
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -0
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -0
- package/lib/network/peers/utils/subnetMap.js +2 -4
- package/lib/network/peers/utils/subnetMap.js.map +1 -1
- package/lib/network/processor/aggregatorTracker.d.ts.map +1 -0
- package/lib/network/processor/aggregatorTracker.js +1 -3
- package/lib/network/processor/aggregatorTracker.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -0
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -0
- package/lib/network/processor/gossipHandlers.js +145 -165
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/indexed.js +11 -9
- package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
- package/lib/network/processor/gossipQueues/linear.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/linear.js +9 -8
- package/lib/network/processor/gossipQueues/linear.js.map +1 -1
- package/lib/network/processor/gossipQueues/types.d.ts.map +1 -0
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -0
- package/lib/network/processor/index.d.ts +2 -1
- package/lib/network/processor/index.d.ts.map +1 -0
- package/lib/network/processor/index.js +21 -8
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/processor/types.d.ts.map +1 -0
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -0
- package/lib/network/reqresp/ReqRespBeaconNode.js +11 -2
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +1 -0
- package/lib/network/reqresp/index.d.ts +1 -3
- package/lib/network/reqresp/index.d.ts.map +1 -0
- package/lib/network/reqresp/index.js +1 -3
- package/lib/network/reqresp/index.js.map +1 -1
- package/lib/network/reqresp/interface.d.ts.map +1 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -0
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -0
- package/lib/network/reqresp/rateLimit.js +11 -5
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -0
- package/lib/network/reqresp/types.d.ts.map +1 -0
- package/lib/network/reqresp/utils/collect.d.ts.map +1 -0
- package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +1 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
- package/lib/network/statusCache.d.ts.map +1 -0
- package/lib/network/statusCache.js +1 -0
- package/lib/network/statusCache.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts.map +1 -0
- package/lib/network/subnets/attnetsService.js +73 -65
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/index.d.ts.map +1 -0
- package/lib/network/subnets/interface.d.ts.map +1 -0
- package/lib/network/subnets/interface.js +1 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/network/subnets/syncnetsService.d.ts.map +1 -0
- package/lib/network/subnets/syncnetsService.js +29 -22
- package/lib/network/subnets/syncnetsService.js.map +1 -1
- package/lib/network/subnets/util.d.ts.map +1 -0
- package/lib/network/subnets/util.js +1 -2
- package/lib/network/subnets/util.js.map +1 -1
- package/lib/network/util.d.ts.map +1 -0
- package/lib/node/index.d.ts.map +1 -0
- package/lib/node/nodejs.d.ts +1 -1
- package/lib/node/nodejs.d.ts.map +1 -0
- package/lib/node/nodejs.js +15 -0
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.d.ts.map +1 -0
- package/lib/node/notifier.js +2 -3
- package/lib/node/notifier.js.map +1 -1
- package/lib/node/options.d.ts.map +1 -0
- package/lib/node/options.js.map +1 -1
- package/lib/node/utils/interop/deposits.d.ts.map +1 -0
- package/lib/node/utils/interop/state.d.ts.map +1 -0
- package/lib/node/utils/interop/state.js +1 -2
- package/lib/node/utils/interop/state.js.map +1 -1
- package/lib/node/utils/lightclient.d.ts.map +1 -0
- package/lib/node/utils/state.d.ts.map +1 -0
- package/lib/sync/backfill/backfill.d.ts +1 -1
- package/lib/sync/backfill/backfill.d.ts.map +1 -0
- package/lib/sync/backfill/backfill.js +58 -16
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/backfill/errors.d.ts.map +1 -0
- package/lib/sync/backfill/index.d.ts.map +1 -0
- package/lib/sync/backfill/verify.d.ts.map +1 -0
- package/lib/sync/constants.d.ts +2 -1
- package/lib/sync/constants.d.ts.map +1 -0
- package/lib/sync/constants.js +2 -1
- package/lib/sync/constants.js.map +1 -1
- package/lib/sync/index.d.ts.map +1 -0
- package/lib/sync/interface.d.ts +1 -59
- package/lib/sync/interface.d.ts.map +1 -0
- package/lib/sync/interface.js +0 -20
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/options.d.ts +1 -1
- package/lib/sync/options.d.ts.map +1 -0
- package/lib/sync/range/batch.d.ts +48 -32
- package/lib/sync/range/batch.d.ts.map +1 -0
- package/lib/sync/range/batch.js +201 -55
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +15 -10
- package/lib/sync/range/chain.d.ts.map +1 -0
- package/lib/sync/range/chain.js +141 -70
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts +3 -3
- package/lib/sync/range/range.d.ts.map +1 -0
- package/lib/sync/range/range.js +86 -54
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/batches.d.ts.map +1 -0
- package/lib/sync/range/utils/chainTarget.d.ts.map +1 -0
- package/lib/sync/range/utils/hashBlocks.d.ts +2 -2
- package/lib/sync/range/utils/hashBlocks.d.ts.map +1 -0
- package/lib/sync/range/utils/hashBlocks.js +6 -4
- package/lib/sync/range/utils/hashBlocks.js.map +1 -1
- package/lib/sync/range/utils/index.d.ts.map +1 -0
- package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -0
- package/lib/sync/range/utils/peerBalancer.js +18 -13
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/range/utils/updateChains.d.ts.map +1 -0
- package/lib/sync/sync.d.ts +1 -2
- package/lib/sync/sync.d.ts.map +1 -0
- package/lib/sync/sync.js +95 -87
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/types.d.ts +43 -0
- package/lib/sync/types.d.ts.map +1 -0
- package/lib/sync/types.js +34 -0
- package/lib/sync/types.js.map +1 -0
- package/lib/sync/unknownBlock.d.ts +42 -29
- package/lib/sync/unknownBlock.d.ts.map +1 -0
- package/lib/sync/unknownBlock.js +407 -462
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +186 -0
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -0
- package/lib/sync/utils/downloadByRange.js +457 -0
- package/lib/sync/utils/downloadByRange.js.map +1 -0
- package/lib/sync/utils/downloadByRoot.d.ts +121 -0
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -0
- package/lib/sync/utils/downloadByRoot.js +346 -0
- package/lib/sync/utils/downloadByRoot.js.map +1 -0
- package/lib/sync/utils/pendingBlocksTree.d.ts +14 -6
- package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -0
- package/lib/sync/utils/pendingBlocksTree.js +24 -18
- package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
- package/lib/sync/utils/remoteSyncType.d.ts.map +1 -0
- package/lib/util/address.d.ts.map +1 -0
- package/lib/util/array.d.ts.map +1 -0
- package/lib/util/array.js +7 -3
- package/lib/util/array.js.map +1 -1
- package/lib/util/asyncIterableToEvents.d.ts.map +1 -0
- package/lib/util/asyncIterableToEvents.js +6 -3
- package/lib/util/asyncIterableToEvents.js.map +1 -1
- package/lib/util/binarySearch.d.ts.map +1 -0
- package/lib/util/binarySearch.js +2 -0
- package/lib/util/binarySearch.js.map +1 -1
- package/lib/util/bitArray.d.ts.map +1 -0
- package/lib/util/blobs.d.ts +2 -2
- package/lib/util/blobs.d.ts.map +1 -0
- package/lib/util/blobs.js +9 -7
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/bufferPool.d.ts.map +1 -0
- package/lib/util/bufferPool.js +7 -2
- package/lib/util/bufferPool.js.map +1 -1
- package/lib/util/bytes.d.ts.map +1 -0
- package/lib/util/chunkify.d.ts.map +1 -0
- package/lib/util/clock.d.ts +9 -4
- package/lib/util/clock.d.ts.map +1 -0
- package/lib/util/clock.js +30 -22
- package/lib/util/clock.js.map +1 -1
- package/lib/util/dataColumns.d.ts +13 -10
- package/lib/util/dataColumns.d.ts.map +1 -0
- package/lib/util/dataColumns.js +92 -134
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/dependentRoot.d.ts.map +1 -0
- package/lib/util/enum.d.ts.map +1 -0
- package/lib/util/error.d.ts.map +1 -0
- package/lib/util/eventLoop.d.ts.map +1 -0
- package/lib/util/execution.d.ts +20 -0
- package/lib/util/execution.d.ts.map +1 -0
- package/lib/util/execution.js +165 -0
- package/lib/util/execution.js.map +1 -0
- package/lib/util/file.d.ts.map +1 -0
- package/lib/util/forkChoice.d.ts.map +1 -0
- package/lib/util/forkName.d.ts.map +1 -0
- package/lib/util/graffiti.d.ts.map +1 -0
- package/lib/util/hex.d.ts.map +1 -0
- package/lib/util/index.d.ts.map +1 -0
- package/lib/util/ip.d.ts.map +1 -0
- package/lib/util/itTrigger.d.ts.map +1 -0
- package/lib/util/itTrigger.js +4 -4
- package/lib/util/itTrigger.js.map +1 -1
- package/lib/util/kzg.d.ts.map +1 -0
- package/lib/util/map.d.ts.map +1 -0
- package/lib/util/map.js +2 -0
- package/lib/util/map.js.map +1 -1
- package/lib/util/metadata.d.ts.map +1 -0
- package/lib/util/multifork.d.ts.map +1 -0
- package/lib/util/numpy.d.ts.map +1 -0
- package/lib/util/peerId.d.ts.map +1 -0
- package/lib/util/profile.d.ts.map +1 -0
- package/lib/util/promises.d.ts.map +1 -0
- package/lib/util/queue/errors.d.ts.map +1 -0
- package/lib/util/queue/fnQueue.d.ts.map +1 -0
- package/lib/util/queue/index.d.ts +1 -1
- package/lib/util/queue/index.d.ts.map +1 -0
- package/lib/util/queue/index.js +1 -1
- package/lib/util/queue/index.js.map +1 -1
- package/lib/util/queue/itemQueue.d.ts.map +1 -0
- package/lib/util/queue/itemQueue.js +52 -49
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/queue/options.d.ts.map +1 -0
- package/lib/util/serializedCache.d.ts.map +1 -0
- package/lib/util/serializedCache.js +1 -3
- package/lib/util/serializedCache.js.map +1 -1
- package/lib/util/set.d.ts.map +1 -0
- package/lib/util/set.js +2 -0
- package/lib/util/set.js.map +1 -1
- package/lib/util/shuffle.d.ts.map +1 -0
- package/lib/util/sortBy.d.ts.map +1 -0
- package/lib/util/sszBytes.d.ts +1 -0
- package/lib/util/sszBytes.d.ts.map +1 -0
- package/lib/util/sszBytes.js +1 -1
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/strictEvents.d.ts.map +1 -0
- package/lib/util/time.d.ts.map +1 -0
- package/lib/util/timeSeries.d.ts.map +1 -0
- package/lib/util/timeSeries.js +3 -1
- package/lib/util/timeSeries.js.map +1 -1
- package/lib/util/types.d.ts +1 -1
- package/lib/util/types.d.ts.map +1 -0
- package/lib/util/types.js +2 -2
- package/lib/util/types.js.map +1 -1
- package/lib/util/workerEvents.d.ts.map +1 -0
- package/lib/util/wrapError.d.ts +7 -0
- package/lib/util/wrapError.d.ts.map +1 -0
- package/package.json +40 -24
- package/src/api/impl/api.ts +26 -0
- package/src/api/impl/beacon/blocks/index.ts +744 -0
- package/src/api/impl/beacon/blocks/utils.ts +75 -0
- package/src/api/impl/beacon/index.ts +35 -0
- package/src/api/impl/beacon/pool/index.ts +314 -0
- package/src/api/impl/beacon/rewards/index.ts +30 -0
- package/src/api/impl/beacon/state/index.ts +406 -0
- package/src/api/impl/beacon/state/utils.ts +189 -0
- package/src/api/impl/config/constants.ts +127 -0
- package/src/api/impl/config/index.ts +59 -0
- package/src/api/impl/debug/index.ts +131 -0
- package/src/api/impl/errors.ts +50 -0
- package/src/api/impl/events/index.ts +33 -0
- package/src/api/impl/index.ts +6 -0
- package/src/api/impl/lightclient/index.ts +64 -0
- package/src/api/impl/lodestar/index.ts +257 -0
- package/src/api/impl/node/index.ts +88 -0
- package/src/api/impl/node/utils.ts +51 -0
- package/src/api/impl/proof/index.ts +60 -0
- package/src/api/impl/types.ts +17 -0
- package/src/api/impl/utils.ts +25 -0
- package/src/api/impl/validator/index.ts +1533 -0
- package/src/api/impl/validator/utils.ts +85 -0
- package/src/api/index.ts +2 -0
- package/src/api/options.ts +16 -0
- package/src/api/rest/activeSockets.ts +109 -0
- package/src/api/rest/base.ts +216 -0
- package/src/api/rest/index.ts +63 -0
- package/src/api/rest/swaggerUI.ts +80 -0
- package/src/bun-wrappers/prometheus-gc-stats.ts +7 -0
- package/src/chain/ColumnReconstructionTracker.ts +90 -0
- package/src/chain/GetBlobsTracker.ts +115 -0
- package/src/chain/archiveStore/archiveStore.ts +222 -0
- package/src/chain/archiveStore/constants.ts +5 -0
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +116 -0
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +68 -0
- package/src/chain/archiveStore/historicalState/metrics.ts +214 -0
- package/src/chain/archiveStore/historicalState/types.ts +41 -0
- package/src/chain/archiveStore/historicalState/worker.ts +77 -0
- package/src/chain/archiveStore/index.ts +3 -0
- package/src/chain/archiveStore/interface.ts +75 -0
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +138 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +437 -0
- package/src/chain/archiveStore/utils/pruneHistory.ts +56 -0
- package/src/chain/archiveStore/utils/updateBackfillRange.ts +50 -0
- package/src/chain/balancesCache.ts +52 -0
- package/src/chain/beaconProposerCache.ts +43 -0
- package/src/chain/blocks/blockInput/blockInput.ts +852 -0
- package/src/chain/blocks/blockInput/errors.ts +48 -0
- package/src/chain/blocks/blockInput/index.ts +4 -0
- package/src/chain/blocks/blockInput/types.ts +145 -0
- package/src/chain/blocks/blockInput/utils.ts +21 -0
- package/src/chain/blocks/importBlock.ts +599 -0
- package/src/chain/blocks/index.ts +179 -0
- package/src/chain/blocks/types.ts +101 -0
- package/src/chain/blocks/utils/blowfishBanner.ts +28 -0
- package/src/chain/blocks/utils/chainSegment.ts +29 -0
- package/src/chain/blocks/utils/checkpoint.ts +25 -0
- package/src/chain/blocks/utils/giraffeBanner.ts +30 -0
- package/src/chain/blocks/utils/ownBanner.ts +20 -0
- package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +43 -0
- package/src/chain/blocks/utils/zebraBanner.ts +45 -0
- package/src/chain/blocks/verifyBlock.ts +242 -0
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +42 -0
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +438 -0
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +129 -0
- package/src/chain/blocks/verifyBlocksSignatures.ts +105 -0
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +114 -0
- package/src/chain/blocks/writeBlockInputToDb.ts +120 -0
- package/src/chain/bls/index.ts +4 -0
- package/src/chain/bls/interface.ts +68 -0
- package/src/chain/bls/maybeBatch.ts +45 -0
- package/src/chain/bls/multithread/index.ts +582 -0
- package/src/chain/bls/multithread/jobItem.ts +119 -0
- package/src/chain/bls/multithread/poolSize.ts +16 -0
- package/src/chain/bls/multithread/types.ts +38 -0
- package/src/chain/bls/multithread/utils.ts +19 -0
- package/src/chain/bls/multithread/worker.ts +114 -0
- package/src/chain/bls/singleThread.ts +87 -0
- package/src/chain/bls/utils.ts +30 -0
- package/src/chain/chain.ts +1354 -0
- package/src/chain/emitter.ts +113 -0
- package/src/chain/errors/attestationError.ts +194 -0
- package/src/chain/errors/attesterSlashingError.ts +11 -0
- package/src/chain/errors/blobSidecarError.ts +60 -0
- package/src/chain/errors/blockError.ts +166 -0
- package/src/chain/errors/blsToExecutionChangeError.ts +13 -0
- package/src/chain/errors/dataColumnSidecarError.ts +80 -0
- package/src/chain/errors/gossipValidation.ts +20 -0
- package/src/chain/errors/index.ts +10 -0
- package/src/chain/errors/lightClientError.ts +30 -0
- package/src/chain/errors/proposerSlashingError.ts +11 -0
- package/src/chain/errors/syncCommitteeError.ts +36 -0
- package/src/chain/errors/voluntaryExitError.ts +13 -0
- package/src/chain/forkChoice/index.ts +112 -0
- package/src/chain/genesis/genesis.ts +190 -0
- package/src/chain/genesis/interface.ts +14 -0
- package/src/chain/index.ts +6 -0
- package/src/chain/initState.ts +221 -0
- package/src/chain/interface.ts +280 -0
- package/src/chain/lightClient/index.ts +764 -0
- package/src/chain/lightClient/proofs.ts +85 -0
- package/src/chain/lightClient/types.ts +33 -0
- package/src/chain/opPools/aggregatedAttestationPool.ts +1063 -0
- package/src/chain/opPools/attestationPool.ts +282 -0
- package/src/chain/opPools/index.ts +5 -0
- package/src/chain/opPools/opPool.ts +462 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +169 -0
- package/src/chain/opPools/syncContributionAndProofPool.ts +240 -0
- package/src/chain/opPools/types.ts +35 -0
- package/src/chain/opPools/utils.ts +65 -0
- package/src/chain/options.ts +138 -0
- package/src/chain/prepareNextSlot.ts +277 -0
- package/src/chain/produceBlock/computeNewStateRoot.ts +55 -0
- package/src/chain/produceBlock/index.ts +2 -0
- package/src/chain/produceBlock/produceBlockBody.ts +797 -0
- package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +54 -0
- package/src/chain/regen/errors.ts +30 -0
- package/src/chain/regen/index.ts +4 -0
- package/src/chain/regen/interface.ts +93 -0
- package/src/chain/regen/queued.ts +317 -0
- package/src/chain/regen/regen.ts +424 -0
- package/src/chain/reprocess.ts +161 -0
- package/src/chain/rewards/attestationsRewards.ts +196 -0
- package/src/chain/rewards/blockRewards.ts +150 -0
- package/src/chain/rewards/syncCommitteeRewards.ts +58 -0
- package/src/chain/seenCache/index.ts +5 -0
- package/src/chain/seenCache/seenAggregateAndProof.ts +120 -0
- package/src/chain/seenCache/seenAttestationData.ts +145 -0
- package/src/chain/seenCache/seenAttesters.ts +58 -0
- package/src/chain/seenCache/seenBlockAttesters.ts +18 -0
- package/src/chain/seenCache/seenBlockProposers.ts +48 -0
- package/src/chain/seenCache/seenCommittee.ts +43 -0
- package/src/chain/seenCache/seenCommitteeContribution.ts +104 -0
- package/src/chain/seenCache/seenGossipBlockInput.ts +373 -0
- package/src/chain/serializeState.ts +32 -0
- package/src/chain/shufflingCache.ts +238 -0
- package/src/chain/stateCache/blockStateCacheImpl.ts +150 -0
- package/src/chain/stateCache/datastore/db.ts +36 -0
- package/src/chain/stateCache/datastore/file.ts +53 -0
- package/src/chain/stateCache/datastore/index.ts +2 -0
- package/src/chain/stateCache/datastore/types.ts +13 -0
- package/src/chain/stateCache/fifoBlockStateCache.ts +208 -0
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +198 -0
- package/src/chain/stateCache/index.ts +3 -0
- package/src/chain/stateCache/mapMetrics.ts +52 -0
- package/src/chain/stateCache/persistentCheckpointsCache.ts +837 -0
- package/src/chain/stateCache/types.ts +86 -0
- package/src/chain/validation/aggregateAndProof.ts +258 -0
- package/src/chain/validation/attestation.ts +885 -0
- package/src/chain/validation/attesterSlashing.ts +61 -0
- package/src/chain/validation/blobSidecar.ts +301 -0
- package/src/chain/validation/block.ts +188 -0
- package/src/chain/validation/blsToExecutionChange.ts +61 -0
- package/src/chain/validation/dataColumnSidecar.ts +381 -0
- package/src/chain/validation/index.ts +9 -0
- package/src/chain/validation/lightClientFinalityUpdate.ts +46 -0
- package/src/chain/validation/lightClientOptimisticUpdate.ts +68 -0
- package/src/chain/validation/proposerSlashing.ts +54 -0
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +38 -0
- package/src/chain/validation/signatureSets/contributionAndProof.ts +27 -0
- package/src/chain/validation/signatureSets/index.ts +6 -0
- package/src/chain/validation/signatureSets/selectionProof.ts +27 -0
- package/src/chain/validation/signatureSets/syncCommittee.ts +22 -0
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +18 -0
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +27 -0
- package/src/chain/validation/syncCommittee.ts +165 -0
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +122 -0
- package/src/chain/validation/voluntaryExit.ts +58 -0
- package/src/chain/validatorMonitor.ts +1310 -0
- package/src/constants/constants.ts +15 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/network.ts +52 -0
- package/src/db/beacon.ts +113 -0
- package/src/db/buckets.ts +80 -0
- package/src/db/index.ts +2 -0
- package/src/db/interface.ts +76 -0
- package/src/db/options.ts +7 -0
- package/src/db/repositories/attesterSlashing.ts +38 -0
- package/src/db/repositories/backfilledRanges.ts +29 -0
- package/src/db/repositories/blobSidecars.ts +37 -0
- package/src/db/repositories/blobSidecarsArchive.ts +28 -0
- package/src/db/repositories/block.ts +33 -0
- package/src/db/repositories/blockArchive.ts +170 -0
- package/src/db/repositories/blockArchiveIndex.ts +45 -0
- package/src/db/repositories/blsToExecutionChange.ts +16 -0
- package/src/db/repositories/checkpointState.ts +31 -0
- package/src/db/repositories/dataColumnSidecar.ts +49 -0
- package/src/db/repositories/dataColumnSidecarArchive.ts +56 -0
- package/src/db/repositories/depositDataRoot.ts +80 -0
- package/src/db/repositories/depositEvent.ts +32 -0
- package/src/db/repositories/eth1Data.ts +33 -0
- package/src/db/repositories/index.ts +20 -0
- package/src/db/repositories/lightclientBestUpdate.ts +41 -0
- package/src/db/repositories/lightclientCheckpointHeader.ts +32 -0
- package/src/db/repositories/lightclientSyncCommittee.ts +16 -0
- package/src/db/repositories/lightclientSyncCommitteeWitness.ts +77 -0
- package/src/db/repositories/proposerSlashing.ts +15 -0
- package/src/db/repositories/stateArchive.ts +69 -0
- package/src/db/repositories/stateArchiveIndex.ts +18 -0
- package/src/db/repositories/voluntaryExit.ts +15 -0
- package/src/db/single/index.ts +2 -0
- package/src/db/single/preGenesisState.ts +37 -0
- package/src/db/single/preGenesisStateLastProcessedBlock.ts +34 -0
- package/src/eth1/errors.ts +40 -0
- package/src/eth1/eth1DataCache.ts +26 -0
- package/src/eth1/eth1DepositDataTracker.ts +410 -0
- package/src/eth1/eth1DepositsCache.ts +141 -0
- package/src/eth1/eth1MergeBlockTracker.ts +328 -0
- package/src/eth1/index.ts +157 -0
- package/src/eth1/interface.ts +131 -0
- package/src/eth1/options.ts +28 -0
- package/src/eth1/provider/eth1Provider.ts +229 -0
- package/src/eth1/provider/jsonRpcHttpClient.ts +390 -0
- package/src/eth1/provider/jwt.ts +36 -0
- package/src/eth1/provider/utils.ts +136 -0
- package/src/eth1/stream.ts +75 -0
- package/src/eth1/utils/depositContract.ts +37 -0
- package/src/eth1/utils/deposits.ts +70 -0
- package/src/eth1/utils/eth1Data.ts +100 -0
- package/src/eth1/utils/eth1DepositEvent.ts +12 -0
- package/src/eth1/utils/eth1Vote.ts +142 -0
- package/src/eth1/utils/groupDepositEventsByBlock.ts +19 -0
- package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +18 -0
- package/src/execution/builder/cache.ts +39 -0
- package/src/execution/builder/http.ts +229 -0
- package/src/execution/builder/index.ts +27 -0
- package/src/execution/builder/interface.ts +49 -0
- package/src/execution/builder/utils.ts +19 -0
- package/src/execution/engine/disabled.ts +35 -0
- package/src/execution/engine/http.ts +644 -0
- package/src/execution/engine/index.ts +63 -0
- package/src/execution/engine/interface.ts +199 -0
- package/src/execution/engine/mock.ts +493 -0
- package/src/execution/engine/payloadIdCache.ts +54 -0
- package/src/execution/engine/types.ts +640 -0
- package/src/execution/engine/utils.ts +136 -0
- package/src/execution/index.ts +4 -0
- package/src/index.ts +20 -0
- package/src/metrics/index.ts +4 -0
- package/src/metrics/metrics/beacon.ts +390 -0
- package/src/metrics/metrics/lodestar.ts +1870 -0
- package/src/metrics/metrics.ts +43 -0
- package/src/metrics/nodeJsMetrics.ts +19 -0
- package/src/metrics/options.ts +22 -0
- package/src/metrics/server/http.ts +114 -0
- package/src/metrics/server/index.ts +1 -0
- package/src/metrics/utils/avgMinMax.ts +87 -0
- package/src/metrics/utils/gauge.ts +22 -0
- package/src/metrics/utils/registryMetricCreator.ts +41 -0
- package/src/monitoring/clientStats.ts +297 -0
- package/src/monitoring/index.ts +2 -0
- package/src/monitoring/options.ts +19 -0
- package/src/monitoring/properties.ts +152 -0
- package/src/monitoring/service.ts +235 -0
- package/src/monitoring/system.ts +146 -0
- package/src/monitoring/types.ts +21 -0
- package/src/network/core/events.ts +59 -0
- package/src/network/core/index.ts +3 -0
- package/src/network/core/metrics.ts +304 -0
- package/src/network/core/networkCore.ts +599 -0
- package/src/network/core/networkCoreWorker.ts +176 -0
- package/src/network/core/networkCoreWorkerHandler.ts +284 -0
- package/src/network/core/types.ts +119 -0
- package/src/network/discv5/index.ts +132 -0
- package/src/network/discv5/types.ts +74 -0
- package/src/network/discv5/utils.ts +50 -0
- package/src/network/discv5/worker.ts +137 -0
- package/src/network/events.ts +51 -0
- package/src/network/forks.ts +94 -0
- package/src/network/gossip/constants.ts +15 -0
- package/src/network/gossip/encoding.ts +111 -0
- package/src/network/gossip/errors.ts +7 -0
- package/src/network/gossip/gossipsub.ts +384 -0
- package/src/network/gossip/index.ts +4 -0
- package/src/network/gossip/interface.ts +215 -0
- package/src/network/gossip/metrics.ts +71 -0
- package/src/network/gossip/scoringParameters.ts +333 -0
- package/src/network/gossip/topic.ts +332 -0
- package/src/network/index.ts +8 -0
- package/src/network/interface.ts +134 -0
- package/src/network/libp2p/error.ts +55 -0
- package/src/network/libp2p/index.ts +153 -0
- package/src/network/metadata.ts +162 -0
- package/src/network/network.ts +767 -0
- package/src/network/networkConfig.ts +12 -0
- package/src/network/options.ts +70 -0
- package/src/network/peers/client.ts +29 -0
- package/src/network/peers/datastore.ts +188 -0
- package/src/network/peers/discover.ts +647 -0
- package/src/network/peers/index.ts +2 -0
- package/src/network/peers/peerManager.ts +900 -0
- package/src/network/peers/peersData.ts +65 -0
- package/src/network/peers/score/constants.ts +34 -0
- package/src/network/peers/score/index.ts +4 -0
- package/src/network/peers/score/interface.ts +74 -0
- package/src/network/peers/score/score.ts +200 -0
- package/src/network/peers/score/store.ts +95 -0
- package/src/network/peers/score/utils.ts +37 -0
- package/src/network/peers/utils/assertPeerRelevance.ts +99 -0
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +27 -0
- package/src/network/peers/utils/getConnectedPeerIds.ts +33 -0
- package/src/network/peers/utils/index.ts +4 -0
- package/src/network/peers/utils/prioritizePeers.ts +627 -0
- package/src/network/peers/utils/subnetMap.ts +88 -0
- package/src/network/processor/aggregatorTracker.ts +38 -0
- package/src/network/processor/extractSlotRootFns.ts +64 -0
- package/src/network/processor/gossipHandlers.ts +951 -0
- package/src/network/processor/gossipQueues/index.ts +114 -0
- package/src/network/processor/gossipQueues/indexed.ts +219 -0
- package/src/network/processor/gossipQueues/linear.ts +162 -0
- package/src/network/processor/gossipQueues/types.ts +57 -0
- package/src/network/processor/gossipValidatorFn.ts +142 -0
- package/src/network/processor/index.ts +496 -0
- package/src/network/processor/types.ts +27 -0
- package/src/network/reqresp/ReqRespBeaconNode.ts +373 -0
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +101 -0
- package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +49 -0
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +114 -0
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +62 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +144 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +88 -0
- package/src/network/reqresp/handlers/index.ts +78 -0
- package/src/network/reqresp/handlers/lightClientBootstrap.ts +31 -0
- package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +21 -0
- package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +21 -0
- package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +39 -0
- package/src/network/reqresp/index.ts +2 -0
- package/src/network/reqresp/interface.ts +45 -0
- package/src/network/reqresp/protocols.ts +146 -0
- package/src/network/reqresp/rateLimit.ts +112 -0
- package/src/network/reqresp/score.ts +70 -0
- package/src/network/reqresp/types.ts +174 -0
- package/src/network/reqresp/utils/collect.ts +84 -0
- package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +57 -0
- package/src/network/reqresp/utils/dataColumnResponseValidation.ts +99 -0
- package/src/network/statusCache.ts +17 -0
- package/src/network/subnets/attnetsService.ts +382 -0
- package/src/network/subnets/index.ts +2 -0
- package/src/network/subnets/interface.ts +66 -0
- package/src/network/subnets/syncnetsService.ts +147 -0
- package/src/network/subnets/util.ts +63 -0
- package/src/network/util.ts +29 -0
- package/src/node/index.ts +2 -0
- package/src/node/nodejs.ts +349 -0
- package/src/node/notifier.ts +206 -0
- package/src/node/options.ts +51 -0
- package/src/node/utils/interop/deposits.ts +53 -0
- package/src/node/utils/interop/state.ts +59 -0
- package/src/node/utils/lightclient.ts +7 -0
- package/src/node/utils/state.ts +37 -0
- package/src/sync/backfill/backfill.ts +893 -0
- package/src/sync/backfill/errors.ts +23 -0
- package/src/sync/backfill/index.ts +1 -0
- package/src/sync/backfill/verify.ts +58 -0
- package/src/sync/constants.ts +71 -0
- package/src/sync/index.ts +2 -0
- package/src/sync/interface.ts +55 -0
- package/src/sync/options.ts +45 -0
- package/src/sync/range/batch.ts +455 -0
- package/src/sync/range/chain.ts +715 -0
- package/src/sync/range/range.ts +354 -0
- package/src/sync/range/utils/batches.ts +119 -0
- package/src/sync/range/utils/chainTarget.ts +62 -0
- package/src/sync/range/utils/hashBlocks.ts +27 -0
- package/src/sync/range/utils/index.ts +5 -0
- package/src/sync/range/utils/peerBalancer.ts +184 -0
- package/src/sync/range/utils/updateChains.ts +66 -0
- package/src/sync/sync.ts +290 -0
- package/src/sync/types.ts +57 -0
- package/src/sync/unknownBlock.ts +860 -0
- package/src/sync/utils/downloadByRange.ts +808 -0
- package/src/sync/utils/downloadByRoot.ts +560 -0
- package/src/sync/utils/pendingBlocksTree.ts +97 -0
- package/src/sync/utils/remoteSyncType.ts +144 -0
- package/src/util/address.ts +3 -0
- package/src/util/array.ts +311 -0
- package/src/util/asyncIterableToEvents.ts +164 -0
- package/src/util/binarySearch.ts +48 -0
- package/src/util/bitArray.ts +84 -0
- package/src/util/blobs.ts +210 -0
- package/src/util/bufferPool.ts +95 -0
- package/src/util/bytes.ts +11 -0
- package/src/util/chunkify.ts +27 -0
- package/src/util/clock.ts +212 -0
- package/src/util/dataColumns.ts +415 -0
- package/src/util/dependentRoot.ts +47 -0
- package/src/util/enum.ts +17 -0
- package/src/util/error.ts +56 -0
- package/src/util/eventLoop.ts +22 -0
- package/src/util/execution.ts +223 -0
- package/src/util/file.ts +52 -0
- package/src/util/forkChoice.ts +5 -0
- package/src/util/forkName.ts +20 -0
- package/src/util/graffiti.ts +39 -0
- package/src/util/hex.ts +9 -0
- package/src/util/index.ts +2 -0
- package/src/util/ip.ts +6 -0
- package/src/util/itTrigger.ts +49 -0
- package/src/util/kzg.ts +3 -0
- package/src/util/map.ts +77 -0
- package/src/util/metadata.ts +22 -0
- package/src/util/multifork.ts +69 -0
- package/src/util/numpy.ts +8 -0
- package/src/util/peerId.ts +16 -0
- package/src/util/profile.ts +54 -0
- package/src/util/promises.ts +14 -0
- package/src/util/queue/errors.ts +14 -0
- package/src/util/queue/fnQueue.ts +16 -0
- package/src/util/queue/index.ts +4 -0
- package/src/util/queue/itemQueue.ts +128 -0
- package/src/util/queue/options.ts +37 -0
- package/src/util/serializedCache.ts +20 -0
- package/src/util/set.ts +62 -0
- package/src/util/shuffle.ts +21 -0
- package/src/util/sortBy.ts +19 -0
- package/src/util/sszBytes.ts +481 -0
- package/src/util/strictEvents.ts +8 -0
- package/src/util/time.ts +13 -0
- package/src/util/timeSeries.ts +118 -0
- package/src/util/types.ts +31 -0
- package/src/util/workerEvents.ts +142 -0
- package/src/util/wrapError.ts +27 -0
- package/lib/chain/seenCache/seenBlockInput.d.ts +0 -84
- package/lib/chain/seenCache/seenBlockInput.js +0 -225
- package/lib/chain/seenCache/seenBlockInput.js.map +0 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +0 -28
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +0 -328
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +0 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +0 -49
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +0 -499
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +0 -1
package/lib/sync/unknownBlock.js
CHANGED
|
@@ -1,21 +1,77 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { ForkSeq } from "@lodestar/params";
|
|
2
|
+
import { RequestError, RequestErrorCode } from "@lodestar/reqresp";
|
|
3
|
+
import { computeTimeAtSlot } from "@lodestar/state-transition";
|
|
4
|
+
import { prettyPrintIndices, pruneSetToMax, sleep } from "@lodestar/utils";
|
|
5
|
+
import { isBlockInputBlobs, isBlockInputColumns } from "../chain/blocks/blockInput/blockInput.js";
|
|
6
|
+
import { BlockInputSource } from "../chain/blocks/blockInput/types.js";
|
|
5
7
|
import { BlockError, BlockErrorCode } from "../chain/errors/index.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { byteArrayEquals } from "../util/bytes.js";
|
|
8
|
+
import { ChainEvent } from "../chain/index.js";
|
|
9
|
+
import { NetworkEvent, prettyPrintPeerIdStr } from "../network/index.js";
|
|
9
10
|
import { shuffle } from "../util/shuffle.js";
|
|
10
11
|
import { sortBy } from "../util/sortBy.js";
|
|
11
12
|
import { wrapError } from "../util/wrapError.js";
|
|
12
13
|
import { MAX_CONCURRENT_REQUESTS } from "./constants.js";
|
|
13
|
-
import {
|
|
14
|
+
import { PendingBlockInputStatus, PendingBlockType, getBlockInputSyncCacheItemRootHex, getBlockInputSyncCacheItemSlot, isPendingBlockInput, } from "./types.js";
|
|
15
|
+
import { DownloadByRootError, downloadByRoot } from "./utils/downloadByRoot.js";
|
|
14
16
|
import { getAllDescendantBlocks, getDescendantBlocks, getUnknownAndAncestorBlocks } from "./utils/pendingBlocksTree.js";
|
|
15
17
|
const MAX_ATTEMPTS_PER_BLOCK = 5;
|
|
16
18
|
const MAX_KNOWN_BAD_BLOCKS = 500;
|
|
17
19
|
const MAX_PENDING_BLOCKS = 100;
|
|
18
|
-
|
|
20
|
+
var FetchResult;
|
|
21
|
+
(function (FetchResult) {
|
|
22
|
+
FetchResult["SuccessResolved"] = "success_resolved";
|
|
23
|
+
FetchResult["SuccessMissingParent"] = "success_missing_parent";
|
|
24
|
+
FetchResult["SuccessLate"] = "success_late";
|
|
25
|
+
FetchResult["FailureTriedAllPeers"] = "failure_tried_all_peers";
|
|
26
|
+
FetchResult["FailureMaxAttempts"] = "failure_max_attempts";
|
|
27
|
+
})(FetchResult || (FetchResult = {}));
|
|
28
|
+
/**
|
|
29
|
+
* BlockInputSync is a class that handles ReqResp to find blocks and data related to a specific blockRoot. The
|
|
30
|
+
* blockRoot may have been found via object gossip, or the API. Gossip objects that can trigger a search are block,
|
|
31
|
+
* blobs, columns, attestations, etc. In the case of blocks and data this is generally during the current slot but
|
|
32
|
+
* can also be for items that are received late but are not fully verified and thus not in fork-choice (old blocks on
|
|
33
|
+
* an unknown fork). It can also be triggered via an attestation (or sync committee message or any other item that
|
|
34
|
+
* gets gossiped) that references a blockRoot that is not in fork-choice. In rare (and realistically should not happen)
|
|
35
|
+
* situations it can get triggered via the API when the validator attempts to publish a block, attestation, aggregate
|
|
36
|
+
* and proof or a sync committee contribution that has unknown information included (parentRoot for instance).
|
|
37
|
+
*
|
|
38
|
+
* The goal of the class is to make sure that all information that is necessary for import into fork-choice is pulled
|
|
39
|
+
* from peers so that the block and data can be processed, and thus the object that triggered the search can be
|
|
40
|
+
* referenced and validated.
|
|
41
|
+
*
|
|
42
|
+
* The most common case for this search is a set of block/data that comes across gossip for the current slot, during
|
|
43
|
+
* normal chain operation, but not everything was received before the gossip cutoff window happens so it is necessary
|
|
44
|
+
* to pull remaining data via req/resp so that fork-choice can be updated prior to making an attestation for the
|
|
45
|
+
* current slot.
|
|
46
|
+
*
|
|
47
|
+
* Event sources for old UnknownBlock
|
|
48
|
+
*
|
|
49
|
+
* - publishBlock
|
|
50
|
+
* - gossipHandlers
|
|
51
|
+
* - searchUnknownSlotRoot
|
|
52
|
+
* = produceSyncCommitteeContribution
|
|
53
|
+
* = validateGossipFnRetryUnknownRoot
|
|
54
|
+
* * submitPoolAttestationsV2
|
|
55
|
+
* * publishAggregateAndProofsV2
|
|
56
|
+
* = onPendingGossipsubMessage
|
|
57
|
+
* * NetworkEvent.pendingGossipsubMessage
|
|
58
|
+
* - onGossipsubMessage
|
|
59
|
+
*/
|
|
60
|
+
export class BlockInputSync {
|
|
61
|
+
config;
|
|
62
|
+
network;
|
|
63
|
+
chain;
|
|
64
|
+
logger;
|
|
65
|
+
metrics;
|
|
66
|
+
opts;
|
|
67
|
+
/**
|
|
68
|
+
* block RootHex -> PendingBlock. To avoid finding same root at the same time
|
|
69
|
+
*/
|
|
70
|
+
pendingBlocks = new Map();
|
|
71
|
+
knownBadBlocks = new Set();
|
|
72
|
+
maxPendingBlocks;
|
|
73
|
+
subscribedToNetworkEvents = false;
|
|
74
|
+
peerBalancer;
|
|
19
75
|
constructor(config, network, chain, logger, metrics, opts) {
|
|
20
76
|
this.config = config;
|
|
21
77
|
this.network = network;
|
|
@@ -23,306 +79,227 @@ export class UnknownBlockSync {
|
|
|
23
79
|
this.logger = logger;
|
|
24
80
|
this.metrics = metrics;
|
|
25
81
|
this.opts = opts;
|
|
26
|
-
/**
|
|
27
|
-
* block RootHex -> PendingBlock. To avoid finding same root at the same time
|
|
28
|
-
*/
|
|
29
|
-
this.pendingBlocks = new Map();
|
|
30
|
-
this.knownBadBlocks = new Set();
|
|
31
|
-
this.subscribedToNetworkEvents = false;
|
|
32
|
-
this.engineGetBlobsCache = new Map();
|
|
33
|
-
this.blockInputsRetryTrackerCache = new Set();
|
|
34
|
-
/**
|
|
35
|
-
* Process an unknownBlock event and register the block in `pendingBlocks` Map.
|
|
36
|
-
*/
|
|
37
|
-
this.onUnknownBlock = (data) => {
|
|
38
|
-
try {
|
|
39
|
-
const unknownBlockType = this.addUnknownBlock(data.rootHex, data.peer);
|
|
40
|
-
this.triggerUnknownBlockSearch();
|
|
41
|
-
this.metrics?.syncUnknownBlock.requests.inc({ type: unknownBlockType });
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
44
|
-
this.logger.debug("Error handling unknownBlock event", {}, e);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* Process an unknownBlockInput event and register the block in `pendingBlocks` Map.
|
|
49
|
-
*/
|
|
50
|
-
this.onUnknownBlockInput = (data) => {
|
|
51
|
-
try {
|
|
52
|
-
const unknownBlockType = this.addUnknownBlock(data.blockInput, data.peer);
|
|
53
|
-
this.triggerUnknownBlockSearch();
|
|
54
|
-
this.metrics?.syncUnknownBlock.requests.inc({ type: unknownBlockType });
|
|
55
|
-
}
|
|
56
|
-
catch (e) {
|
|
57
|
-
this.logger.debug("Error handling unknownBlockInput event", {}, e);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* Process an unknownBlockParent event and register the block in `pendingBlocks` Map.
|
|
62
|
-
*/
|
|
63
|
-
this.onUnknownParent = (data) => {
|
|
64
|
-
try {
|
|
65
|
-
this.addUnknownParent(data.blockInput, data.peer);
|
|
66
|
-
this.triggerUnknownBlockSearch();
|
|
67
|
-
this.metrics?.syncUnknownBlock.requests.inc({ type: PendingBlockType.UNKNOWN_PARENT });
|
|
68
|
-
}
|
|
69
|
-
catch (e) {
|
|
70
|
-
this.logger.debug("Error handling unknownBlockParent event", {}, e);
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
this.onPeerConnected = (data) => {
|
|
74
|
-
try {
|
|
75
|
-
const peerId = data.peer;
|
|
76
|
-
const peerSyncMeta = this.network.getConnectedPeerSyncMeta(peerId);
|
|
77
|
-
this.peerBalancer.onPeerConnected(data.peer, peerSyncMeta);
|
|
78
|
-
this.triggerUnknownBlockSearch();
|
|
79
|
-
}
|
|
80
|
-
catch (e) {
|
|
81
|
-
this.logger.debug("Error handling peerConnected event", {}, e);
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
this.onPeerDisconnected = (data) => {
|
|
85
|
-
const peerId = data.peer;
|
|
86
|
-
this.peerBalancer.onPeerDisconnected(peerId);
|
|
87
|
-
};
|
|
88
|
-
/**
|
|
89
|
-
* Gather tip parent blocks with unknown parent and do a search for all of them
|
|
90
|
-
*/
|
|
91
|
-
this.triggerUnknownBlockSearch = () => {
|
|
92
|
-
// Cheap early stop to prevent calling the network.getConnectedPeers()
|
|
93
|
-
if (this.pendingBlocks.size === 0) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
// If the node loses all peers with pending unknown blocks, the sync will stall
|
|
97
|
-
const connectedPeers = this.network.getConnectedPeers();
|
|
98
|
-
if (connectedPeers.length === 0) {
|
|
99
|
-
this.logger.debug("No connected peers, skipping unknown block search.");
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const { unknowns, ancestors } = getUnknownAndAncestorBlocks(this.pendingBlocks);
|
|
103
|
-
// it's rare when there is no unknown block
|
|
104
|
-
// see https://github.com/ChainSafe/lodestar/issues/5649#issuecomment-1594213550
|
|
105
|
-
if (unknowns.length === 0) {
|
|
106
|
-
let processedBlocks = 0;
|
|
107
|
-
for (const block of ancestors) {
|
|
108
|
-
// when this happens, it's likely the block and parent block are processed by head sync
|
|
109
|
-
if (this.chain.forkChoice.hasBlockHex(block.parentBlockRootHex)) {
|
|
110
|
-
processedBlocks++;
|
|
111
|
-
this.processBlock(block).catch((e) => {
|
|
112
|
-
this.logger.debug("Unexpected error - process old downloaded block", {}, e);
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
this.logger.verbose("No unknown block, process ancestor downloaded blocks", {
|
|
117
|
-
pendingBlocks: this.pendingBlocks.size,
|
|
118
|
-
ancestorBlocks: ancestors.length,
|
|
119
|
-
processedBlocks,
|
|
120
|
-
});
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
// most of the time there is exactly 1 unknown block
|
|
124
|
-
for (const block of unknowns) {
|
|
125
|
-
this.downloadBlock(block).catch((e) => {
|
|
126
|
-
this.logger.debug("Unexpected error - downloadBlock", { root: block.blockRootHex }, e);
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
82
|
this.maxPendingBlocks = opts?.maxPendingBlocks ?? MAX_PENDING_BLOCKS;
|
|
131
|
-
this.
|
|
132
|
-
this.peerBalancer = new UnknownBlockPeerBalancer(this.network.custodyConfig);
|
|
83
|
+
this.peerBalancer = new UnknownBlockPeerBalancer();
|
|
133
84
|
if (metrics) {
|
|
134
|
-
metrics.
|
|
135
|
-
|
|
136
|
-
metrics.syncUnknownBlock.knownBadBlocks.set(this.knownBadBlocks.size);
|
|
137
|
-
metrics.syncUnknownBlock.peerBalancer.peersMetaCount.set(this.peerBalancer.peersMeta.size);
|
|
138
|
-
metrics.syncUnknownBlock.peerBalancer.peersActiveRequestCount.set(this.peerBalancer.activeRequests.size);
|
|
139
|
-
metrics.syncUnknownBlock.peerBalancer.totalActiveRequests.set(this.peerBalancer.getTotalActiveRequests());
|
|
140
|
-
});
|
|
85
|
+
metrics.blockInputSync.pendingBlocks.addCollect(() => metrics.blockInputSync.pendingBlocks.set(this.pendingBlocks.size));
|
|
86
|
+
metrics.blockInputSync.knownBadBlocks.addCollect(() => metrics.blockInputSync.knownBadBlocks.set(this.knownBadBlocks.size));
|
|
141
87
|
}
|
|
142
88
|
}
|
|
143
89
|
subscribeToNetwork() {
|
|
144
|
-
if (
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
this.logger.verbose("UnknownBlockSync enabled.");
|
|
148
|
-
this.network.events.on(NetworkEvent.unknownBlock, this.onUnknownBlock);
|
|
149
|
-
this.network.events.on(NetworkEvent.unknownBlockInput, this.onUnknownBlockInput);
|
|
150
|
-
this.network.events.on(NetworkEvent.unknownBlockParent, this.onUnknownParent);
|
|
151
|
-
this.network.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
152
|
-
this.network.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
153
|
-
this.subscribedToNetworkEvents = true;
|
|
154
|
-
}
|
|
90
|
+
if (this.opts?.disableBlockInputSync) {
|
|
91
|
+
this.logger.verbose("BlockInputSync disabled by disableBlockInputSync option.");
|
|
92
|
+
return;
|
|
155
93
|
}
|
|
156
|
-
|
|
157
|
-
|
|
94
|
+
// cannot chain to the above if or the log will be incorrect
|
|
95
|
+
if (!this.subscribedToNetworkEvents) {
|
|
96
|
+
this.logger.verbose("BlockInputSync enabled.");
|
|
97
|
+
this.chain.emitter.on(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
|
|
98
|
+
this.chain.emitter.on(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
|
|
99
|
+
this.chain.emitter.on(ChainEvent.unknownParent, this.onUnknownParent);
|
|
100
|
+
this.network.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
101
|
+
this.network.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
102
|
+
this.subscribedToNetworkEvents = true;
|
|
158
103
|
}
|
|
159
104
|
}
|
|
160
105
|
unsubscribeFromNetwork() {
|
|
161
|
-
this.logger.verbose("
|
|
162
|
-
this.
|
|
163
|
-
this.
|
|
164
|
-
this.
|
|
106
|
+
this.logger.verbose("BlockInputSync disabled.");
|
|
107
|
+
this.chain.emitter.off(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
|
|
108
|
+
this.chain.emitter.off(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
|
|
109
|
+
this.chain.emitter.off(ChainEvent.unknownParent, this.onUnknownParent);
|
|
165
110
|
this.network.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
166
111
|
this.network.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
167
112
|
this.subscribedToNetworkEvents = false;
|
|
168
113
|
}
|
|
169
114
|
close() {
|
|
170
115
|
this.unsubscribeFromNetwork();
|
|
171
|
-
// add more in the future if needed
|
|
172
116
|
}
|
|
173
117
|
isSubscribedToNetwork() {
|
|
174
118
|
return this.subscribedToNetworkEvents;
|
|
175
119
|
}
|
|
176
120
|
/**
|
|
177
|
-
*
|
|
178
|
-
* - add the block to pendingBlocks with status downloaded or pending blockRootHex as key. This is similar to
|
|
179
|
-
* an `onUnknownBlock` event, but the blocks is downloaded.
|
|
180
|
-
* - add the parent root to pendingBlocks with status pending, parentBlockRootHex as key. This is
|
|
181
|
-
* the same to an `onUnknownBlock` event with parentBlockRootHex as root.
|
|
121
|
+
* Process an unknownBlock event and register the block in `pendingBlocks` Map.
|
|
182
122
|
*/
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
let pendingBlock = this.pendingBlocks.get(blockRootHex);
|
|
190
|
-
if (!pendingBlock) {
|
|
191
|
-
pendingBlock =
|
|
192
|
-
blockInput.type === BlockInputType.dataPromise
|
|
193
|
-
? {
|
|
194
|
-
unknownBlockType: PendingBlockType.UNKNOWN_DATA,
|
|
195
|
-
blockRootHex,
|
|
196
|
-
// this will be set after we download block
|
|
197
|
-
parentBlockRootHex: null,
|
|
198
|
-
blockInput,
|
|
199
|
-
peerIdStrs: new Set(),
|
|
200
|
-
status: PendingBlockStatus.pending,
|
|
201
|
-
downloadAttempts: 0,
|
|
202
|
-
}
|
|
203
|
-
: {
|
|
204
|
-
blockRootHex,
|
|
205
|
-
parentBlockRootHex,
|
|
206
|
-
blockInput,
|
|
207
|
-
peerIdStrs: new Set(),
|
|
208
|
-
status: PendingBlockStatus.downloaded,
|
|
209
|
-
downloadAttempts: 0,
|
|
210
|
-
};
|
|
211
|
-
this.pendingBlocks.set(blockRootHex, pendingBlock);
|
|
212
|
-
this.logger.verbose("Added unknown block parent to pendingBlocks", {
|
|
213
|
-
root: blockRootHex,
|
|
214
|
-
parent: parentBlockRootHex,
|
|
215
|
-
});
|
|
123
|
+
onUnknownBlockRoot = (data) => {
|
|
124
|
+
try {
|
|
125
|
+
this.addByRootHex(data.rootHex, data.peer);
|
|
126
|
+
this.triggerUnknownBlockSearch();
|
|
127
|
+
this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.UNKNOWN_BLOCK_ROOT });
|
|
128
|
+
this.metrics?.blockInputSync.source.inc({ source: data.source });
|
|
216
129
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
this.addUnknownBlock(parentBlockRootHex, peerIdStr);
|
|
220
|
-
}
|
|
221
|
-
addUnknownBlock(blockInputOrRootHex, peerIdStr) {
|
|
222
|
-
let blockRootHex;
|
|
223
|
-
let blockInput;
|
|
224
|
-
let unknownBlockType;
|
|
225
|
-
if (typeof blockInputOrRootHex === "string") {
|
|
226
|
-
blockRootHex = blockInputOrRootHex;
|
|
227
|
-
blockInput = null;
|
|
228
|
-
unknownBlockType = PendingBlockType.UNKNOWN_BLOCK;
|
|
130
|
+
catch (e) {
|
|
131
|
+
this.logger.debug("Error handling unknownBlockRoot event", {}, e);
|
|
229
132
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Process an unknownBlockInput event and register the block in `pendingBlocks` Map.
|
|
136
|
+
*/
|
|
137
|
+
onIncompleteBlockInput = (data) => {
|
|
138
|
+
try {
|
|
139
|
+
this.addByBlockInput(data.blockInput, data.peer);
|
|
140
|
+
this.triggerUnknownBlockSearch();
|
|
141
|
+
this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.INCOMPLETE_BLOCK_INPUT });
|
|
142
|
+
this.metrics?.blockInputSync.source.inc({ source: data.source });
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
this.logger.debug("Error handling incompleteBlockInput event", {}, e);
|
|
241
146
|
}
|
|
242
|
-
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Process an unknownBlockParent event and register the block in `pendingBlocks` Map.
|
|
150
|
+
*/
|
|
151
|
+
onUnknownParent = (data) => {
|
|
152
|
+
try {
|
|
153
|
+
this.addByRootHex(data.blockInput.parentRootHex, data.peer);
|
|
154
|
+
this.addByBlockInput(data.blockInput, data.peer);
|
|
155
|
+
this.triggerUnknownBlockSearch();
|
|
156
|
+
this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.UNKNOWN_PARENT });
|
|
157
|
+
this.metrics?.blockInputSync.source.inc({ source: data.source });
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
this.logger.debug("Error handling unknownParent event", {}, e);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
addByRootHex = (rootHex, peerIdStr) => {
|
|
164
|
+
let pendingBlock = this.pendingBlocks.get(rootHex);
|
|
243
165
|
if (!pendingBlock) {
|
|
244
166
|
pendingBlock = {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
blockInput,
|
|
250
|
-
peerIdStrs: new Set(),
|
|
251
|
-
status: PendingBlockStatus.pending,
|
|
252
|
-
downloadAttempts: 0,
|
|
167
|
+
status: PendingBlockInputStatus.pending,
|
|
168
|
+
rootHex: rootHex,
|
|
169
|
+
peerIdStrings: new Set(),
|
|
170
|
+
timeAddedSec: Date.now() / 1000,
|
|
253
171
|
};
|
|
254
|
-
this.pendingBlocks.set(
|
|
255
|
-
this.logger.verbose("Added
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
slot: blockInput?.block?.message.slot ?? "unknown",
|
|
172
|
+
this.pendingBlocks.set(rootHex, pendingBlock);
|
|
173
|
+
this.logger.verbose("Added new rootHex to BlockInputSync.pendingBlocks", {
|
|
174
|
+
root: pendingBlock.rootHex,
|
|
175
|
+
peerIdStr: peerIdStr ?? "unknown peer",
|
|
259
176
|
});
|
|
260
177
|
}
|
|
261
178
|
if (peerIdStr) {
|
|
262
|
-
pendingBlock.
|
|
179
|
+
pendingBlock.peerIdStrings.add(peerIdStr);
|
|
263
180
|
}
|
|
181
|
+
// TODO: check this prune methodology
|
|
264
182
|
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
265
183
|
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
266
184
|
if (prunedItemCount > 0) {
|
|
267
|
-
this.logger.
|
|
185
|
+
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
addByBlockInput = (blockInput, peerIdStr) => {
|
|
189
|
+
let pendingBlock = this.pendingBlocks.get(blockInput.blockRootHex);
|
|
190
|
+
// if entry is missing or was added via rootHex and now we have more complete information overwrite
|
|
191
|
+
// the existing information with the more complete cache entry
|
|
192
|
+
if (!pendingBlock || !isPendingBlockInput(pendingBlock)) {
|
|
193
|
+
pendingBlock = {
|
|
194
|
+
// can be added via unknown parent and we may already have full block input. need to check and set correctly
|
|
195
|
+
// so we pull the data if its missing or handle the block correctly in getIncompleteAndAncestorBlocks
|
|
196
|
+
status: blockInput.hasBlockAndAllData() ? PendingBlockInputStatus.downloaded : PendingBlockInputStatus.pending,
|
|
197
|
+
blockInput,
|
|
198
|
+
peerIdStrings: new Set(),
|
|
199
|
+
timeAddedSec: Date.now() / 1000,
|
|
200
|
+
};
|
|
201
|
+
this.pendingBlocks.set(blockInput.blockRootHex, pendingBlock);
|
|
202
|
+
this.logger.verbose("Added blockInput to BlockInputSync.pendingBlocks", pendingBlock.blockInput.getLogMeta());
|
|
268
203
|
}
|
|
269
|
-
|
|
270
|
-
|
|
204
|
+
if (peerIdStr) {
|
|
205
|
+
pendingBlock.peerIdStrings.add(peerIdStr);
|
|
206
|
+
}
|
|
207
|
+
// TODO: check this prune methodology
|
|
208
|
+
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
209
|
+
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
210
|
+
if (prunedItemCount > 0) {
|
|
211
|
+
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
onPeerConnected = (data) => {
|
|
215
|
+
try {
|
|
216
|
+
const peerId = data.peer;
|
|
217
|
+
const peerSyncMeta = this.network.getConnectedPeerSyncMeta(peerId);
|
|
218
|
+
this.peerBalancer.onPeerConnected(data.peer, peerSyncMeta);
|
|
219
|
+
this.triggerUnknownBlockSearch();
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
this.logger.debug("Error handling peerConnected event", {}, e);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
onPeerDisconnected = (data) => {
|
|
226
|
+
const peerId = data.peer;
|
|
227
|
+
this.peerBalancer.onPeerDisconnected(peerId);
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Gather tip parent blocks with unknown parent and do a search for all of them
|
|
231
|
+
*/
|
|
232
|
+
triggerUnknownBlockSearch = () => {
|
|
233
|
+
// Cheap early stop to prevent calling the network.getConnectedPeers()
|
|
234
|
+
if (this.pendingBlocks.size === 0) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
// If the node loses all peers with pending unknown blocks, the sync will stall
|
|
238
|
+
const connectedPeers = this.network.getConnectedPeers();
|
|
239
|
+
if (connectedPeers.length === 0) {
|
|
240
|
+
this.logger.debug("No connected peers, skipping unknown block search.");
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const { unknowns, ancestors } = getUnknownAndAncestorBlocks(this.pendingBlocks);
|
|
244
|
+
// it's rare when there is no unknown block
|
|
245
|
+
// see https://github.com/ChainSafe/lodestar/issues/5649#issuecomment-1594213550
|
|
246
|
+
if (unknowns.length === 0) {
|
|
247
|
+
let processedBlocks = 0;
|
|
248
|
+
for (const block of ancestors) {
|
|
249
|
+
// when this happens, it's likely the block and parent block are processed by head sync
|
|
250
|
+
if (this.chain.forkChoice.hasBlockHex(block.blockInput.parentRootHex)) {
|
|
251
|
+
processedBlocks++;
|
|
252
|
+
this.processBlock(block).catch((e) => {
|
|
253
|
+
this.logger.debug("Unexpected error - process old downloaded block", {}, e);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
this.logger.verbose("No unknown block, process ancestor downloaded blocks", {
|
|
258
|
+
pendingBlocks: this.pendingBlocks.size,
|
|
259
|
+
ancestorBlocks: ancestors.length,
|
|
260
|
+
processedBlocks,
|
|
261
|
+
});
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// most of the time there is exactly 1 unknown block
|
|
265
|
+
for (const block of unknowns) {
|
|
266
|
+
this.downloadBlock(block).catch((e) => {
|
|
267
|
+
this.logger.debug("Unexpected error - downloadBlock", { root: getBlockInputSyncCacheItemRootHex(block) }, e);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
271
|
async downloadBlock(block) {
|
|
272
|
-
if (block.status !==
|
|
272
|
+
if (block.status !== PendingBlockInputStatus.pending) {
|
|
273
273
|
return;
|
|
274
274
|
}
|
|
275
|
-
const
|
|
275
|
+
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
276
276
|
const logCtx = {
|
|
277
|
-
|
|
277
|
+
slot: getBlockInputSyncCacheItemSlot(block),
|
|
278
|
+
root: rootHex,
|
|
278
279
|
pendingBlocks: this.pendingBlocks.size,
|
|
279
|
-
slot: block.blockInput?.block?.message.slot ?? "unknown",
|
|
280
|
-
unknownBlockType,
|
|
281
280
|
};
|
|
282
|
-
this.logger.verbose("
|
|
283
|
-
block.status =
|
|
284
|
-
|
|
285
|
-
if (block.blockInput === null) {
|
|
286
|
-
// we only have block root, and nothing else
|
|
287
|
-
res = await wrapError(this.fetchUnknownBlockRoot(fromHex(block.blockRootHex)));
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
res = await wrapError(this.fetchUnavailableBlockInput(block.blockInput));
|
|
291
|
-
}
|
|
292
|
-
if (res.err)
|
|
293
|
-
this.metrics?.syncUnknownBlock.downloadedBlocksError.inc();
|
|
294
|
-
else
|
|
295
|
-
this.metrics?.syncUnknownBlock.downloadedBlocksSuccess.inc();
|
|
281
|
+
this.logger.verbose("BlockInputSync.downloadBlock()", logCtx);
|
|
282
|
+
block.status = PendingBlockInputStatus.fetching;
|
|
283
|
+
const res = await wrapError(this.fetchBlockInput(block));
|
|
296
284
|
if (!res.err) {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
throw Error(`Expected BlockInput to be available, got dataPromise for ${block.blockRootHex}`);
|
|
302
|
-
}
|
|
303
|
-
block = {
|
|
304
|
-
...block,
|
|
305
|
-
status: PendingBlockStatus.downloaded,
|
|
306
|
-
blockInput,
|
|
307
|
-
parentBlockRootHex: toRootHex(blockInput.block.message.parentRoot),
|
|
308
|
-
};
|
|
309
|
-
this.pendingBlocks.set(block.blockRootHex, block);
|
|
310
|
-
const blockSlot = blockInput.block.message.slot;
|
|
285
|
+
this.metrics?.blockInputSync.downloadedBlocksSuccess.inc();
|
|
286
|
+
const pending = res.result;
|
|
287
|
+
this.pendingBlocks.set(pending.blockInput.blockRootHex, pending);
|
|
288
|
+
const blockSlot = pending.blockInput.slot;
|
|
311
289
|
const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
|
|
312
|
-
const delaySec = Date.now() / 1000 - (this.
|
|
313
|
-
this.metrics?.
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
if (parentInForkchoice) {
|
|
290
|
+
const delaySec = Date.now() / 1000 - computeTimeAtSlot(this.config, blockSlot, this.chain.genesisTime);
|
|
291
|
+
this.metrics?.blockInputSync.elapsedTimeTillReceived.observe(delaySec);
|
|
292
|
+
const parentInForkChoice = this.chain.forkChoice.hasBlockHex(pending.blockInput.parentRootHex);
|
|
293
|
+
const logCtx2 = {
|
|
294
|
+
...logCtx,
|
|
295
|
+
slot: blockSlot,
|
|
296
|
+
parentInForkChoice,
|
|
297
|
+
};
|
|
298
|
+
this.logger.verbose("Downloaded unknown block", logCtx2);
|
|
299
|
+
if (parentInForkChoice) {
|
|
323
300
|
// Bingo! Process block. Add to pending blocks anyway for recycle the cache that prevents duplicate processing
|
|
324
|
-
this.processBlock(
|
|
325
|
-
this.logger.debug("Unexpected error - process newly downloaded block",
|
|
301
|
+
this.processBlock(pending).catch((e) => {
|
|
302
|
+
this.logger.debug("Unexpected error - process newly downloaded block", logCtx2, e);
|
|
326
303
|
});
|
|
327
304
|
}
|
|
328
305
|
else if (blockSlot <= finalizedSlot) {
|
|
@@ -331,34 +308,20 @@ export class UnknownBlockSync {
|
|
|
331
308
|
// 0 - 1 - ... - n - finalizedSlot
|
|
332
309
|
// \
|
|
333
310
|
// parent 1 - parent 2 - ... - unknownParent block
|
|
334
|
-
const blockRoot = this.config.getForkTypes(blockSlot).BeaconBlock.hashTreeRoot(blockInput.block.message);
|
|
335
311
|
this.logger.debug("Downloaded block is before finalized slot", {
|
|
312
|
+
...logCtx2,
|
|
336
313
|
finalizedSlot,
|
|
337
|
-
blockSlot,
|
|
338
|
-
parentRoot: toRootHex(blockRoot),
|
|
339
|
-
unknownBlockType,
|
|
340
314
|
});
|
|
341
|
-
this.
|
|
315
|
+
this.removeAndDownScoreAllDescendants(block);
|
|
342
316
|
}
|
|
343
317
|
else {
|
|
344
|
-
this.
|
|
318
|
+
this.onUnknownBlockRoot({ rootHex: pending.blockInput.parentRootHex, source: BlockInputSource.byRoot });
|
|
345
319
|
}
|
|
346
320
|
}
|
|
347
321
|
else {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
block.downloadAttempts++;
|
|
352
|
-
const errorData = { root: block.blockRootHex, attempts: block.downloadAttempts, unknownBlockType };
|
|
353
|
-
if (block.downloadAttempts > MAX_ATTEMPTS_PER_BLOCK) {
|
|
354
|
-
// Give up on this block and assume it does not exist, penalizing all peers as if it was a bad block
|
|
355
|
-
this.logger.debug("Ignoring unknown block root after many failed downloads", errorData, res.err);
|
|
356
|
-
this.removeAndDownscoreAllDescendants(block);
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
// Try again when a new peer connects, its status changes, or a new unknownBlockParent event happens
|
|
360
|
-
this.logger.debug("Error downloading unknown block root", errorData, res.err);
|
|
361
|
-
}
|
|
322
|
+
this.metrics?.blockInputSync.downloadedBlocksError.inc();
|
|
323
|
+
this.logger.debug("Ignoring unknown block root after many failed downloads", logCtx, res.err);
|
|
324
|
+
this.removeAndDownScoreAllDescendants(block);
|
|
362
325
|
}
|
|
363
326
|
}
|
|
364
327
|
/**
|
|
@@ -369,11 +332,14 @@ export class UnknownBlockSync {
|
|
|
369
332
|
async processBlock(pendingBlock) {
|
|
370
333
|
// pending block status is `downloaded` right after `downloadBlock`
|
|
371
334
|
// but could be `pending` if added by `onUnknownBlockParent` event and this function is called recursively
|
|
372
|
-
if (pendingBlock.status !==
|
|
373
|
-
if (pendingBlock.status ===
|
|
335
|
+
if (pendingBlock.status !== PendingBlockInputStatus.downloaded) {
|
|
336
|
+
if (pendingBlock.status === PendingBlockInputStatus.pending) {
|
|
374
337
|
const connectedPeers = this.network.getConnectedPeers();
|
|
375
338
|
if (connectedPeers.length === 0) {
|
|
376
|
-
this.logger.debug("No connected peers, skipping download block", {
|
|
339
|
+
this.logger.debug("No connected peers, skipping download block", {
|
|
340
|
+
slot: pendingBlock.blockInput.slot,
|
|
341
|
+
blockRoot: pendingBlock.blockInput.blockRootHex,
|
|
342
|
+
});
|
|
377
343
|
return;
|
|
378
344
|
}
|
|
379
345
|
// if the download is a success we'll call `processBlock()` for this block
|
|
@@ -381,23 +347,22 @@ export class UnknownBlockSync {
|
|
|
381
347
|
}
|
|
382
348
|
return;
|
|
383
349
|
}
|
|
384
|
-
pendingBlock.status =
|
|
350
|
+
pendingBlock.status = PendingBlockInputStatus.processing;
|
|
385
351
|
// this prevents unbundling attack
|
|
386
352
|
// see https://lighthouse-blog.sigmaprime.io/mev-unbundling-rpc.html
|
|
387
|
-
const { slot: blockSlot, proposerIndex } = pendingBlock.blockInput.
|
|
388
|
-
|
|
353
|
+
const { slot: blockSlot, proposerIndex } = pendingBlock.blockInput.getBlock().message;
|
|
354
|
+
const fork = this.config.getForkName(blockSlot);
|
|
355
|
+
const proposerBoostWindowMs = this.config.getAttestationDueMs(fork);
|
|
356
|
+
if (this.chain.clock.msFromSlot(blockSlot) < proposerBoostWindowMs &&
|
|
389
357
|
this.chain.seenBlockProposers.isKnown(blockSlot, proposerIndex)) {
|
|
390
358
|
// proposer is known by a gossip block already, wait a bit to make sure this block is not
|
|
391
359
|
// eligible for proposer boost to prevent unbundling attack
|
|
392
|
-
const blockRoot = this.config
|
|
393
|
-
.getForkTypes(blockSlot)
|
|
394
|
-
.BeaconBlock.hashTreeRoot(pendingBlock.blockInput.block.message);
|
|
395
360
|
this.logger.verbose("Avoid proposer boost for this block of known proposer", {
|
|
396
|
-
blockSlot,
|
|
397
|
-
|
|
361
|
+
slot: blockSlot,
|
|
362
|
+
root: pendingBlock.blockInput.blockRootHex,
|
|
398
363
|
proposerIndex,
|
|
399
364
|
});
|
|
400
|
-
await sleep(
|
|
365
|
+
await sleep(proposerBoostWindowMs);
|
|
401
366
|
}
|
|
402
367
|
// At gossip time, it's critical to keep a good number of mesh peers.
|
|
403
368
|
// To do that, the Gossip Job Wait Time should be consistently <3s to avoid the behavior penalties in gossip
|
|
@@ -415,21 +380,24 @@ export class UnknownBlockSync {
|
|
|
415
380
|
eagerPersistBlock: true,
|
|
416
381
|
}));
|
|
417
382
|
if (res.err)
|
|
418
|
-
this.metrics?.
|
|
383
|
+
this.metrics?.blockInputSync.processedBlocksError.inc();
|
|
419
384
|
else
|
|
420
|
-
this.metrics?.
|
|
385
|
+
this.metrics?.blockInputSync.processedBlocksSuccess.inc();
|
|
421
386
|
if (!res.err) {
|
|
422
387
|
// no need to update status to "processed", delete anyway
|
|
423
|
-
this.pendingBlocks.delete(pendingBlock.blockRootHex);
|
|
388
|
+
this.pendingBlocks.delete(pendingBlock.blockInput.blockRootHex);
|
|
389
|
+
this.chain.seenBlockInputCache.prune(pendingBlock.blockInput.blockRootHex);
|
|
424
390
|
// Send child blocks to the processor
|
|
425
|
-
for (const descendantBlock of getDescendantBlocks(pendingBlock.blockRootHex, this.pendingBlocks)) {
|
|
426
|
-
|
|
427
|
-
this.
|
|
428
|
-
|
|
391
|
+
for (const descendantBlock of getDescendantBlocks(pendingBlock.blockInput.blockRootHex, this.pendingBlocks)) {
|
|
392
|
+
if (isPendingBlockInput(descendantBlock)) {
|
|
393
|
+
this.processBlock(descendantBlock).catch((e) => {
|
|
394
|
+
this.logger.debug("Unexpected error - process descendant block", {}, e);
|
|
395
|
+
});
|
|
396
|
+
}
|
|
429
397
|
}
|
|
430
398
|
}
|
|
431
399
|
else {
|
|
432
|
-
const errorData = {
|
|
400
|
+
const errorData = { slot: pendingBlock.blockInput.slot, root: pendingBlock.blockInput.blockRootHex };
|
|
433
401
|
if (res.err instanceof BlockError) {
|
|
434
402
|
switch (res.err.type.code) {
|
|
435
403
|
// This cases are already handled with `{ignoreIfKnown: true}`
|
|
@@ -439,7 +407,7 @@ export class UnknownBlockSync {
|
|
|
439
407
|
case BlockErrorCode.PRESTATE_MISSING:
|
|
440
408
|
// Should not happen, mark as downloaded to try again latter
|
|
441
409
|
this.logger.debug("Attempted to process block but its parent was still unknown", errorData, res.err);
|
|
442
|
-
pendingBlock.status =
|
|
410
|
+
pendingBlock.status = PendingBlockInputStatus.downloaded;
|
|
443
411
|
break;
|
|
444
412
|
case BlockErrorCode.EXECUTION_ENGINE_ERROR:
|
|
445
413
|
// Removing the block(s) without penalizing the peers, hoping for EL to
|
|
@@ -449,13 +417,13 @@ export class UnknownBlockSync {
|
|
|
449
417
|
default:
|
|
450
418
|
// Block is not correct with respect to our chain. Log error loudly
|
|
451
419
|
this.logger.debug("Error processing block from unknown parent sync", errorData, res.err);
|
|
452
|
-
this.
|
|
420
|
+
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
453
421
|
}
|
|
454
422
|
}
|
|
455
423
|
// Probably a queue error or something unwanted happened, mark as pending to try again latter
|
|
456
424
|
else {
|
|
457
425
|
this.logger.debug("Unknown error processing block from unknown block sync", errorData, res.err);
|
|
458
|
-
pendingBlock.status =
|
|
426
|
+
pendingBlock.status = PendingBlockInputStatus.downloaded;
|
|
459
427
|
}
|
|
460
428
|
}
|
|
461
429
|
}
|
|
@@ -468,144 +436,129 @@ export class UnknownBlockSync {
|
|
|
468
436
|
* prefulu, will attempt a max of `MAX_ATTEMPTS_PER_BLOCK` on different peers, postfulu we may attempt more as defined in `getMaxDownloadAttempts()` function
|
|
469
437
|
* Also verifies the received block root + returns the peer that provided the block for future downscoring.
|
|
470
438
|
*/
|
|
471
|
-
async
|
|
472
|
-
const
|
|
439
|
+
async fetchBlockInput(cacheItem) {
|
|
440
|
+
const rootHex = getBlockInputSyncCacheItemRootHex(cacheItem);
|
|
473
441
|
const excludedPeers = new Set();
|
|
474
|
-
let partialDownload = null;
|
|
475
442
|
const defaultPendingColumns = this.config.getForkSeq(this.chain.clock.currentSlot) >= ForkSeq.fulu
|
|
476
|
-
? new Set(this.network.custodyConfig.
|
|
443
|
+
? new Set(this.network.custodyConfig.sampledColumns)
|
|
477
444
|
: null;
|
|
478
|
-
|
|
445
|
+
const fetchStartSec = Date.now() / 1000;
|
|
446
|
+
let slot = isPendingBlockInput(cacheItem) ? cacheItem.blockInput.slot : undefined;
|
|
447
|
+
if (slot !== undefined) {
|
|
448
|
+
this.metrics?.blockInputSync.fetchBegin.observe(this.chain.clock.secFromSlot(slot, fetchStartSec));
|
|
449
|
+
}
|
|
479
450
|
let i = 0;
|
|
480
451
|
while (i++ < this.getMaxDownloadAttempts()) {
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
452
|
+
const pendingColumns = isPendingBlockInput(cacheItem) && isBlockInputColumns(cacheItem.blockInput)
|
|
453
|
+
? new Set(cacheItem.blockInput.getMissingSampledColumnMeta().missing)
|
|
454
|
+
: defaultPendingColumns;
|
|
455
|
+
// pendingDataColumns is null pre-fulu
|
|
456
|
+
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers);
|
|
457
|
+
if (peerMeta === null) {
|
|
484
458
|
// no more peer with needed columns to try, throw error
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
excludedPeers.add(peerId);
|
|
489
|
-
try {
|
|
490
|
-
const { blocks: [blockInput], pendingDataColumns, } = await beaconBlocksMaybeBlobsByRoot(this.config, this.network, peerId, [blockRoot], partialDownload, peerClient, this.metrics, this.logger);
|
|
491
|
-
// Peer does not have the block, try with next peer
|
|
492
|
-
if (blockInput === undefined) {
|
|
493
|
-
continue;
|
|
459
|
+
let message = `Error fetching UnknownBlockRoot slot=${slot} root=${rootHex} after ${i}: cannot find peer`;
|
|
460
|
+
if (pendingColumns) {
|
|
461
|
+
message += ` with needed columns=${prettyPrintIndices(Array.from(pendingColumns))}`;
|
|
494
462
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
}
|
|
499
|
-
// data is available, verify block root is correct
|
|
500
|
-
const block = blockInput.block.message;
|
|
501
|
-
const receivedBlockRoot = this.config.getForkTypes(block.slot).BeaconBlock.hashTreeRoot(block);
|
|
502
|
-
if (!byteArrayEquals(receivedBlockRoot, blockRoot)) {
|
|
503
|
-
throw Error(`Wrong block received by peer, got ${toRootHex(receivedBlockRoot)} expected ${blockRootHex}`);
|
|
504
|
-
}
|
|
505
|
-
return { blockInput, peerIdStr: peerId };
|
|
506
|
-
}
|
|
507
|
-
catch (e) {
|
|
508
|
-
this.logger.debug("Error fetching UnknownBlockRoot", { attempt: i, blockRootHex, peer: peerId }, e);
|
|
509
|
-
lastError = e;
|
|
463
|
+
this.metrics?.blockInputSync.fetchTimeSec.observe({ result: FetchResult.FailureTriedAllPeers }, Date.now() / 1000 - fetchStartSec);
|
|
464
|
+
this.metrics?.blockInputSync.fetchPeers.set({ result: FetchResult.FailureTriedAllPeers }, i);
|
|
465
|
+
throw Error(message);
|
|
510
466
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
if (lastError) {
|
|
516
|
-
lastError.message = `Error fetching UnknownBlockRoot after ${i} attempts: ${lastError.message}`;
|
|
517
|
-
throw lastError;
|
|
518
|
-
}
|
|
519
|
-
throw Error(`Error fetching UnknownBlockRoot after ${i}: cannot download all blobs or data columns for block ${blockRootHex}`);
|
|
520
|
-
}
|
|
521
|
-
/**
|
|
522
|
-
* We have partial block input:
|
|
523
|
-
* - we have block but not have all blobs (deneb) or needed columns (fulu)
|
|
524
|
-
* - we don't have block and have some blobs (deneb) or some columns (fulu)
|
|
525
|
-
* Fetches missing block/data columns/block for the blockinput. This function returns either preData or availableData BlockInput.
|
|
526
|
-
*/
|
|
527
|
-
async fetchUnavailableBlockInput(unavailableBlockInput) {
|
|
528
|
-
if (unavailableBlockInput.block !== null && unavailableBlockInput.type !== BlockInputType.dataPromise) {
|
|
529
|
-
return { blockInput: unavailableBlockInput, peerIdStr: "" };
|
|
530
|
-
}
|
|
531
|
-
let blockRootHex;
|
|
532
|
-
let blobKzgCommitmentsLen;
|
|
533
|
-
let blockRoot;
|
|
534
|
-
const dataMeta = {};
|
|
535
|
-
let sampledColumns = [];
|
|
536
|
-
if (unavailableBlockInput.block === null) {
|
|
537
|
-
blockRootHex = unavailableBlockInput.blockRootHex;
|
|
538
|
-
blockRoot = fromHex(blockRootHex);
|
|
539
|
-
}
|
|
540
|
-
else {
|
|
541
|
-
const { cachedData, block: unavailableBlock } = unavailableBlockInput;
|
|
542
|
-
blockRoot = this.config
|
|
543
|
-
.getForkTypes(unavailableBlock.message.slot)
|
|
544
|
-
.BeaconBlock.hashTreeRoot(unavailableBlock.message);
|
|
545
|
-
blockRootHex = toRootHex(blockRoot);
|
|
546
|
-
blobKzgCommitmentsLen = unavailableBlock.message.body.blobKzgCommitments.length;
|
|
547
|
-
if (cachedData.fork === ForkName.deneb || cachedData.fork === ForkName.electra) {
|
|
548
|
-
const pendingBlobs = blobKzgCommitmentsLen - cachedData.blobsCache.size;
|
|
549
|
-
Object.assign(dataMeta, { pendingBlobs });
|
|
550
|
-
}
|
|
551
|
-
else if (cachedData.fork === ForkName.fulu) {
|
|
552
|
-
sampledColumns = this.network.custodyConfig.sampledColumns;
|
|
553
|
-
const pendingColumns = sampledColumns.length - cachedData.dataColumnsCache.size;
|
|
554
|
-
Object.assign(dataMeta, { pendingColumns });
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
let lastError = null;
|
|
558
|
-
let i = 0;
|
|
559
|
-
const excludedPeers = new Set();
|
|
560
|
-
while (i++ < this.getMaxDownloadAttempts()) {
|
|
561
|
-
const bestPeer = this.peerBalancer.bestPeerForBlockInput(unavailableBlockInput, excludedPeers);
|
|
562
|
-
if (bestPeer === null) {
|
|
563
|
-
// no more peer to try, throw error
|
|
564
|
-
throw Error(`Error fetching UnavailableBlockInput after ${i}: cannot find peer with needed columns ${sampledColumns.join(", ")}`);
|
|
565
|
-
}
|
|
566
|
-
const { peerId, client: peerClient } = bestPeer;
|
|
567
|
-
excludedPeers.add(peerId);
|
|
467
|
+
const { peerId, client: peerClient } = peerMeta;
|
|
468
|
+
cacheItem.peerIdStrings.add(peerId);
|
|
568
469
|
try {
|
|
569
|
-
const
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
470
|
+
const downloadResult = await downloadByRoot({
|
|
471
|
+
config: this.config,
|
|
472
|
+
network: this.network,
|
|
473
|
+
seenCache: this.chain.seenBlockInputCache,
|
|
573
474
|
emitter: this.chain.emitter,
|
|
574
|
-
|
|
575
|
-
|
|
475
|
+
peerMeta,
|
|
476
|
+
cacheItem,
|
|
576
477
|
});
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
478
|
+
cacheItem = downloadResult.result;
|
|
479
|
+
if (slot === undefined) {
|
|
480
|
+
slot = cacheItem.blockInput.slot;
|
|
481
|
+
// we were not able to observe the time into slot when starting the fetch, do it now
|
|
482
|
+
this.metrics?.blockInputSync.fetchBegin.observe(this.chain.clock.secFromSlot(slot, fetchStartSec));
|
|
581
483
|
}
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
484
|
+
const logCtx = { slot, rootHex, peerId, peerClient };
|
|
485
|
+
this.logger.verbose("BlockInputSync.fetchBlockInput: successful download", logCtx);
|
|
486
|
+
this.metrics?.blockInputSync.downloadByRoot.success.inc();
|
|
487
|
+
const warnings = downloadResult.warnings;
|
|
488
|
+
if (warnings) {
|
|
489
|
+
for (const warning of warnings) {
|
|
490
|
+
this.logger.debug("BlockInputSync.fetchBlockInput: downloaded with warning", logCtx, warning);
|
|
491
|
+
this.metrics?.blockInputSync.downloadByRoot.warn.inc({ code: warning.type.code, client: peerClient });
|
|
492
|
+
}
|
|
493
|
+
// TODO: penalize peer?
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
catch (e) {
|
|
497
|
+
this.logger.debug("Error downloading in BlockInputSync.fetchBlockInput", { slot, rootHex, attempt: i, peer: peerId, peerClient }, e);
|
|
498
|
+
const downloadByRootMetrics = this.metrics?.blockInputSync.downloadByRoot;
|
|
499
|
+
// TODO: penalize peer?
|
|
500
|
+
if (e instanceof DownloadByRootError) {
|
|
501
|
+
const errorCode = e.type.code;
|
|
502
|
+
downloadByRootMetrics?.error.inc({ code: errorCode, client: peerClient });
|
|
503
|
+
excludedPeers.add(peerId);
|
|
587
504
|
}
|
|
588
|
-
if (
|
|
589
|
-
|
|
505
|
+
else if (e instanceof RequestError) {
|
|
506
|
+
// should look into req_resp metrics in this case
|
|
507
|
+
downloadByRootMetrics?.error.inc({ code: "req_resp", client: peerClient });
|
|
508
|
+
switch (e.type.code) {
|
|
509
|
+
case RequestErrorCode.REQUEST_RATE_LIMITED:
|
|
510
|
+
case RequestErrorCode.REQUEST_TIMEOUT:
|
|
511
|
+
// do not exclude peer for these errors
|
|
512
|
+
break;
|
|
513
|
+
default:
|
|
514
|
+
excludedPeers.add(peerId);
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
590
517
|
}
|
|
591
518
|
else {
|
|
592
|
-
|
|
519
|
+
// investigate if this happens
|
|
520
|
+
downloadByRootMetrics?.error.inc({ code: "unknown", client: peerClient });
|
|
521
|
+
excludedPeers.add(peerId);
|
|
593
522
|
}
|
|
594
|
-
return { blockInput, peerIdStr: peerId };
|
|
595
|
-
}
|
|
596
|
-
catch (e) {
|
|
597
|
-
this.logger.debug("Error fetching UnavailableBlockInput", { attempt: i, blockRootHex, peer: peerId }, e);
|
|
598
|
-
lastError = e;
|
|
599
523
|
}
|
|
600
524
|
finally {
|
|
601
525
|
this.peerBalancer.onRequestCompleted(peerId);
|
|
602
526
|
}
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
527
|
+
this.pendingBlocks.set(getBlockInputSyncCacheItemRootHex(cacheItem), cacheItem);
|
|
528
|
+
if (cacheItem.status === PendingBlockInputStatus.downloaded) {
|
|
529
|
+
// download was successful, no need to go with another peer, return
|
|
530
|
+
const result = this.chain.forkChoice.hasBlockHex(cacheItem.blockInput.blockRootHex)
|
|
531
|
+
? FetchResult.SuccessLate
|
|
532
|
+
: this.chain.forkChoice.hasBlockHex(cacheItem.blockInput.parentRootHex)
|
|
533
|
+
? FetchResult.SuccessResolved
|
|
534
|
+
: FetchResult.SuccessMissingParent;
|
|
535
|
+
this.metrics?.blockInputSync.fetchTimeSec.observe({ result }, Date.now() / 1000 - fetchStartSec);
|
|
536
|
+
this.metrics?.blockInputSync.fetchPeers.set({ result }, i);
|
|
537
|
+
return cacheItem;
|
|
538
|
+
}
|
|
539
|
+
} // end while loop over peers
|
|
540
|
+
const message = `Error fetching BlockInput with slot=${slot} root=${rootHex} after ${i - 1} attempts.`;
|
|
541
|
+
if (!isPendingBlockInput(cacheItem)) {
|
|
542
|
+
throw Error(`${message} No block and no data was found.`);
|
|
543
|
+
}
|
|
544
|
+
if (!cacheItem.blockInput.hasBlock()) {
|
|
545
|
+
throw new Error(`${message} Block was not found.`);
|
|
546
|
+
}
|
|
547
|
+
if (isBlockInputBlobs(cacheItem.blockInput)) {
|
|
548
|
+
const missing = cacheItem.blockInput.getMissingBlobMeta().map((b) => b.index);
|
|
549
|
+
if (missing.length) {
|
|
550
|
+
throw new Error(`${message} Missing blob indices=${prettyPrintIndices(missing)}.`);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
if (isBlockInputColumns(cacheItem.blockInput)) {
|
|
554
|
+
const missing = cacheItem.blockInput.getMissingSampledColumnMeta().missing;
|
|
555
|
+
if (missing.length) {
|
|
556
|
+
throw new Error(`${message} Missing column indices=${prettyPrintIndices(missing)}.`);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
this.metrics?.blockInputSync.fetchTimeSec.observe({ result: FetchResult.FailureMaxAttempts }, Date.now() / 1000 - fetchStartSec);
|
|
560
|
+
this.metrics?.blockInputSync.fetchPeers.set({ result: FetchResult.FailureMaxAttempts }, i - 1);
|
|
561
|
+
throw Error(message);
|
|
609
562
|
}
|
|
610
563
|
/**
|
|
611
564
|
* Gets all descendant blocks of `block` recursively from `pendingBlocks`.
|
|
@@ -613,33 +566,44 @@ export class UnknownBlockSync {
|
|
|
613
566
|
* Downscore all peers that have referenced any of this bad blocks. May report peers multiple times if they have
|
|
614
567
|
* referenced more than one bad block.
|
|
615
568
|
*/
|
|
616
|
-
|
|
569
|
+
removeAndDownScoreAllDescendants(block) {
|
|
617
570
|
// Get all blocks that are a descendant of this one
|
|
618
571
|
const badPendingBlocks = this.removeAllDescendants(block);
|
|
619
572
|
// just console log and do not penalize on pending/bad blocks for debugging
|
|
620
573
|
// console.log("removeAndDownscoreAllDescendants", {block});
|
|
621
574
|
for (const block of badPendingBlocks) {
|
|
575
|
+
//
|
|
576
|
+
// TODO(fulu): why is this commented out here?
|
|
577
|
+
//
|
|
622
578
|
// this.knownBadBlocks.add(block.blockRootHex);
|
|
623
579
|
// for (const peerIdStr of block.peerIdStrs) {
|
|
624
580
|
// // TODO: Refactor peerRpcScores to work with peerIdStr only
|
|
625
581
|
// this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, "BadBlockByRoot");
|
|
626
582
|
// }
|
|
627
583
|
this.logger.debug("ignored Banning unknown block", {
|
|
628
|
-
|
|
629
|
-
|
|
584
|
+
slot: getBlockInputSyncCacheItemSlot(block),
|
|
585
|
+
root: getBlockInputSyncCacheItemRootHex(block),
|
|
586
|
+
peerIdStrings: Array.from(block.peerIdStrings)
|
|
587
|
+
.map((id) => prettyPrintPeerIdStr(id))
|
|
588
|
+
.join(","),
|
|
630
589
|
});
|
|
631
590
|
}
|
|
632
591
|
// Prune knownBadBlocks
|
|
633
592
|
pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
|
|
634
593
|
}
|
|
635
594
|
removeAllDescendants(block) {
|
|
595
|
+
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
596
|
+
const slot = getBlockInputSyncCacheItemSlot(block);
|
|
636
597
|
// Get all blocks that are a descendant of this one
|
|
637
|
-
const badPendingBlocks = [block, ...getAllDescendantBlocks(
|
|
638
|
-
this.metrics?.
|
|
598
|
+
const badPendingBlocks = [block, ...getAllDescendantBlocks(rootHex, this.pendingBlocks)];
|
|
599
|
+
this.metrics?.blockInputSync.removedBlocks.inc(badPendingBlocks.length);
|
|
639
600
|
for (const block of badPendingBlocks) {
|
|
640
|
-
|
|
641
|
-
this.
|
|
642
|
-
|
|
601
|
+
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
602
|
+
this.pendingBlocks.delete(rootHex);
|
|
603
|
+
this.chain.seenBlockInputCache.prune(rootHex);
|
|
604
|
+
this.logger.debug("Removing bad/unknown/incomplete BlockInputSyncCacheItem", {
|
|
605
|
+
slot,
|
|
606
|
+
blockRoot: rootHex,
|
|
643
607
|
});
|
|
644
608
|
}
|
|
645
609
|
return badPendingBlocks;
|
|
@@ -657,10 +621,11 @@ export class UnknownBlockSync {
|
|
|
657
621
|
* Class to track active byRoots requests and balance them across eligible peers.
|
|
658
622
|
*/
|
|
659
623
|
export class UnknownBlockPeerBalancer {
|
|
660
|
-
|
|
624
|
+
peersMeta;
|
|
625
|
+
activeRequests;
|
|
626
|
+
constructor() {
|
|
661
627
|
this.peersMeta = new Map();
|
|
662
628
|
this.activeRequests = new Map();
|
|
663
|
-
this.custodyConfig = custodyConfig;
|
|
664
629
|
}
|
|
665
630
|
/** Trigger on each peer re-status */
|
|
666
631
|
onPeerConnected(peerId, syncMeta) {
|
|
@@ -694,36 +659,16 @@ export class UnknownBlockPeerBalancer {
|
|
|
694
659
|
* called from fetchUnavailableBlockInput() where we have either BlockInput or NullBlockInput
|
|
695
660
|
* excludedPeers are the peers that we requested already so we don't want to try again
|
|
696
661
|
*/
|
|
697
|
-
bestPeerForBlockInput(
|
|
698
|
-
let cachedData = undefined;
|
|
699
|
-
if (unavailableBlockInput.block === null) {
|
|
700
|
-
// NullBlockInput
|
|
701
|
-
cachedData = unavailableBlockInput.cachedData;
|
|
702
|
-
}
|
|
703
|
-
else {
|
|
704
|
-
// BlockInput
|
|
705
|
-
if (unavailableBlockInput.type !== BlockInputType.dataPromise) {
|
|
706
|
-
throw Error(`bestPeerForBlockInput called with BlockInput type ${unavailableBlockInput.type}, expected dataPromise`);
|
|
707
|
-
}
|
|
708
|
-
cachedData = unavailableBlockInput.cachedData;
|
|
709
|
-
}
|
|
662
|
+
bestPeerForBlockInput(blockInput, excludedPeers) {
|
|
710
663
|
const eligiblePeers = [];
|
|
711
|
-
if (
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
const pendingDataColumns = new Set();
|
|
715
|
-
for (const column of this.custodyConfig.sampledColumns) {
|
|
716
|
-
if (!dataColumnsCache.has(column)) {
|
|
717
|
-
pendingDataColumns.add(column);
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
// there could be no pending column in case of NullBlockInput
|
|
664
|
+
if (isBlockInputColumns(blockInput)) {
|
|
665
|
+
const pendingDataColumns = new Set(blockInput.getMissingSampledColumnMeta().missing);
|
|
666
|
+
// there could be no pending column in case when block is still missing
|
|
721
667
|
eligiblePeers.push(...this.filterPeers(pendingDataColumns, excludedPeers));
|
|
722
668
|
}
|
|
723
669
|
else {
|
|
724
670
|
// prefulu
|
|
725
|
-
|
|
726
|
-
eligiblePeers.push(...this.filterPeers(pendingDataColumns, excludedPeers));
|
|
671
|
+
eligiblePeers.push(...this.filterPeers(null, excludedPeers));
|
|
727
672
|
}
|
|
728
673
|
if (eligiblePeers.length === 0) {
|
|
729
674
|
return null;
|
|
@@ -775,7 +720,7 @@ export class UnknownBlockPeerBalancer {
|
|
|
775
720
|
continue;
|
|
776
721
|
}
|
|
777
722
|
// postfulu, find peers that have custody columns that we need
|
|
778
|
-
const {
|
|
723
|
+
const { custodyColumns: peerColumns } = syncMeta;
|
|
779
724
|
// check if the peer has all needed columns
|
|
780
725
|
// get match
|
|
781
726
|
const columns = peerColumns.reduce((acc, elem) => {
|