@lodestar/beacon-node 1.35.0-dev.fcf8d024ea → 1.35.0-dev.feed916580
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/config/constants.d.ts +0 -5
- package/lib/api/impl/config/constants.js +1 -6
- package/lib/api/impl/config/constants.js.map +1 -1
- package/lib/api/impl/validator/index.js +3 -5
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +0 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +3 -4
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +1 -8
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +7 -1
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +0 -1
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/chain.js +3 -2
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +2 -2
- package/lib/chain/opPools/attestationPool.d.ts +3 -2
- package/lib/chain/opPools/attestationPool.js +5 -3
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts +2 -3
- package/lib/chain/opPools/syncCommitteeMessagePool.js +5 -6
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/types.d.ts +1 -1
- package/lib/chain/opPools/types.js +1 -1
- package/lib/chain/opPools/types.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +3 -3
- package/lib/chain/prepareNextSlot.js +8 -8
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +8 -9
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js +3 -4
- package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts +4 -6
- package/lib/chain/validation/lightClientOptimisticUpdate.js +11 -11
- package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
- package/lib/chain/validatorMonitor.js +14 -20
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/buckets.d.ts +4 -4
- package/lib/db/buckets.js +4 -4
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/repositories/blobSidecars.js +1 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/db/repositories/blobSidecarsArchive.js +1 -1
- package/lib/db/repositories/blobSidecarsArchive.js.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/dataColumnSidecar.js +1 -1
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +1 -1
- package/lib/metrics/metrics/lodestar.js +3 -3
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +3 -9
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/discv5/index.js +1 -4
- package/lib/network/discv5/index.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +0 -1
- package/lib/network/gossip/gossipsub.js +16 -35
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/metrics.d.ts +7 -15
- package/lib/network/gossip/metrics.js +6 -16
- package/lib/network/gossip/metrics.js.map +1 -1
- package/lib/network/libp2p/index.js +1 -9
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/metadata.js +1 -2
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +1 -1
- package/lib/network/network.js +13 -11
- package/lib/network/network.js.map +1 -1
- package/lib/network/peers/datastore.d.ts +2 -2
- package/lib/network/peers/datastore.js +2 -2
- package/lib/network/peers/datastore.js.map +1 -1
- package/lib/network/processor/index.d.ts +1 -1
- package/lib/network/processor/index.js +3 -2
- package/lib/network/processor/index.js.map +1 -1
- package/lib/sync/types.d.ts +1 -0
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +1 -0
- package/lib/sync/unknownBlock.js +19 -17
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +1 -3
- package/lib/sync/utils/downloadByRoot.js +9 -36
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.js +3 -5
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/clock.d.ts +0 -5
- package/lib/util/clock.js +0 -3
- package/lib/util/clock.js.map +1 -1
- package/lib/util/dataColumns.js +1 -1
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/execution.js +2 -19
- package/lib/util/execution.js.map +1 -1
- package/package.json +22 -32
- package/lib/api/impl/api.d.ts.map +0 -1
- package/lib/api/impl/beacon/blocks/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/blocks/utils.d.ts.map +0 -1
- package/lib/api/impl/beacon/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/rewards/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +0 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +0 -1
- package/lib/api/impl/config/constants.d.ts.map +0 -1
- package/lib/api/impl/config/index.d.ts.map +0 -1
- package/lib/api/impl/debug/index.d.ts.map +0 -1
- package/lib/api/impl/errors.d.ts.map +0 -1
- package/lib/api/impl/events/index.d.ts.map +0 -1
- package/lib/api/impl/index.d.ts.map +0 -1
- package/lib/api/impl/lightclient/index.d.ts.map +0 -1
- package/lib/api/impl/lodestar/index.d.ts.map +0 -1
- package/lib/api/impl/node/index.d.ts.map +0 -1
- package/lib/api/impl/node/utils.d.ts.map +0 -1
- package/lib/api/impl/proof/index.d.ts.map +0 -1
- package/lib/api/impl/types.d.ts.map +0 -1
- package/lib/api/impl/utils.d.ts.map +0 -1
- package/lib/api/impl/validator/index.d.ts.map +0 -1
- package/lib/api/impl/validator/utils.d.ts.map +0 -1
- package/lib/api/index.d.ts.map +0 -1
- package/lib/api/options.d.ts.map +0 -1
- package/lib/api/rest/activeSockets.d.ts.map +0 -1
- package/lib/api/rest/base.d.ts.map +0 -1
- package/lib/api/rest/index.d.ts.map +0 -1
- package/lib/api/rest/swaggerUI.d.ts.map +0 -1
- package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +0 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +0 -1
- package/lib/chain/GetBlobsTracker.d.ts.map +0 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +0 -1
- package/lib/chain/archiveStore/constants.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +0 -1
- package/lib/chain/archiveStore/historicalState/worker.d.ts.map +0 -1
- package/lib/chain/archiveStore/index.d.ts.map +0 -1
- package/lib/chain/archiveStore/interface.d.ts.map +0 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +0 -1
- package/lib/chain/balancesCache.d.ts.map +0 -1
- package/lib/chain/beaconProposerCache.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/errors.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/index.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/types.d.ts.map +0 -1
- package/lib/chain/blocks/blockInput/utils.d.ts.map +0 -1
- package/lib/chain/blocks/importBlock.d.ts.map +0 -1
- package/lib/chain/blocks/index.d.ts.map +0 -1
- package/lib/chain/blocks/types.d.ts.map +0 -1
- package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/chainSegment.d.ts.map +0 -1
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +0 -1
- package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/ownBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +0 -1
- package/lib/chain/blocks/utils/zebraBanner.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +0 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +0 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +0 -1
- package/lib/chain/bls/index.d.ts.map +0 -1
- package/lib/chain/bls/interface.d.ts.map +0 -1
- package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
- package/lib/chain/bls/multithread/index.d.ts.map +0 -1
- package/lib/chain/bls/multithread/jobItem.d.ts.map +0 -1
- package/lib/chain/bls/multithread/poolSize.d.ts.map +0 -1
- package/lib/chain/bls/multithread/types.d.ts.map +0 -1
- package/lib/chain/bls/multithread/utils.d.ts.map +0 -1
- package/lib/chain/bls/multithread/worker.d.ts.map +0 -1
- package/lib/chain/bls/singleThread.d.ts.map +0 -1
- package/lib/chain/bls/utils.d.ts.map +0 -1
- package/lib/chain/chain.d.ts.map +0 -1
- package/lib/chain/emitter.d.ts.map +0 -1
- package/lib/chain/errors/attestationError.d.ts.map +0 -1
- package/lib/chain/errors/attesterSlashingError.d.ts.map +0 -1
- package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/blockError.d.ts.map +0 -1
- package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +0 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/gossipValidation.d.ts.map +0 -1
- package/lib/chain/errors/index.d.ts.map +0 -1
- package/lib/chain/errors/lightClientError.d.ts.map +0 -1
- package/lib/chain/errors/proposerSlashingError.d.ts.map +0 -1
- package/lib/chain/errors/syncCommitteeError.d.ts.map +0 -1
- package/lib/chain/errors/voluntaryExitError.d.ts.map +0 -1
- package/lib/chain/forkChoice/index.d.ts.map +0 -1
- package/lib/chain/genesis/genesis.d.ts.map +0 -1
- package/lib/chain/genesis/interface.d.ts.map +0 -1
- package/lib/chain/index.d.ts.map +0 -1
- package/lib/chain/initState.d.ts.map +0 -1
- package/lib/chain/interface.d.ts.map +0 -1
- package/lib/chain/lightClient/index.d.ts.map +0 -1
- package/lib/chain/lightClient/proofs.d.ts.map +0 -1
- package/lib/chain/lightClient/types.d.ts.map +0 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +0 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +0 -1
- package/lib/chain/opPools/index.d.ts.map +0 -1
- package/lib/chain/opPools/opPool.d.ts.map +0 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +0 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +0 -1
- package/lib/chain/opPools/types.d.ts.map +0 -1
- package/lib/chain/opPools/utils.d.ts.map +0 -1
- package/lib/chain/options.d.ts.map +0 -1
- package/lib/chain/prepareNextSlot.d.ts.map +0 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +0 -1
- package/lib/chain/produceBlock/index.d.ts.map +0 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +0 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +0 -1
- package/lib/chain/regen/errors.d.ts.map +0 -1
- package/lib/chain/regen/index.d.ts.map +0 -1
- package/lib/chain/regen/interface.d.ts.map +0 -1
- package/lib/chain/regen/queued.d.ts.map +0 -1
- package/lib/chain/regen/regen.d.ts.map +0 -1
- package/lib/chain/reprocess.d.ts.map +0 -1
- package/lib/chain/rewards/attestationsRewards.d.ts.map +0 -1
- package/lib/chain/rewards/blockRewards.d.ts.map +0 -1
- package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +0 -1
- package/lib/chain/seenCache/index.d.ts.map +0 -1
- package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +0 -1
- package/lib/chain/seenCache/seenAttestationData.d.ts.map +0 -1
- package/lib/chain/seenCache/seenAttesters.d.ts.map +0 -1
- package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +0 -1
- package/lib/chain/seenCache/seenBlockProposers.d.ts.map +0 -1
- package/lib/chain/seenCache/seenCommittee.d.ts.map +0 -1
- package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +0 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +0 -1
- package/lib/chain/serializeState.d.ts.map +0 -1
- package/lib/chain/shufflingCache.d.ts.map +0 -1
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/db.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/file.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/index.d.ts.map +0 -1
- package/lib/chain/stateCache/datastore/types.d.ts.map +0 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +0 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
- package/lib/chain/stateCache/index.d.ts.map +0 -1
- package/lib/chain/stateCache/mapMetrics.d.ts.map +0 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +0 -1
- package/lib/chain/stateCache/types.d.ts.map +0 -1
- package/lib/chain/validation/aggregateAndProof.d.ts.map +0 -1
- package/lib/chain/validation/attestation.d.ts.map +0 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +0 -1
- package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
- package/lib/chain/validation/block.d.ts.map +0 -1
- package/lib/chain/validation/blsToExecutionChange.d.ts.map +0 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +0 -1
- package/lib/chain/validation/index.d.ts.map +0 -1
- package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +0 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +0 -1
- package/lib/chain/validation/proposerSlashing.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/index.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +0 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +0 -1
- package/lib/chain/validation/syncCommittee.d.ts.map +0 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +0 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +0 -1
- package/lib/chain/validatorMonitor.d.ts.map +0 -1
- package/lib/constants/constants.d.ts.map +0 -1
- package/lib/constants/index.d.ts.map +0 -1
- package/lib/constants/network.d.ts.map +0 -1
- package/lib/db/beacon.d.ts.map +0 -1
- package/lib/db/buckets.d.ts.map +0 -1
- package/lib/db/index.d.ts.map +0 -1
- package/lib/db/interface.d.ts.map +0 -1
- package/lib/db/options.d.ts.map +0 -1
- package/lib/db/repositories/attesterSlashing.d.ts.map +0 -1
- package/lib/db/repositories/backfilledRanges.d.ts.map +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +0 -1
- package/lib/db/repositories/blobSidecarsArchive.d.ts.map +0 -1
- package/lib/db/repositories/block.d.ts.map +0 -1
- package/lib/db/repositories/blockArchive.d.ts.map +0 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +0 -1
- package/lib/db/repositories/blsToExecutionChange.d.ts.map +0 -1
- package/lib/db/repositories/checkpointState.d.ts.map +0 -1
- package/lib/db/repositories/dataColumnSidecar.d.ts.map +0 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +0 -1
- package/lib/db/repositories/depositDataRoot.d.ts.map +0 -1
- package/lib/db/repositories/depositEvent.d.ts.map +0 -1
- package/lib/db/repositories/eth1Data.d.ts.map +0 -1
- package/lib/db/repositories/index.d.ts.map +0 -1
- package/lib/db/repositories/lightclientBestUpdate.d.ts.map +0 -1
- package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +0 -1
- package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +0 -1
- package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +0 -1
- package/lib/db/repositories/proposerSlashing.d.ts.map +0 -1
- package/lib/db/repositories/stateArchive.d.ts.map +0 -1
- package/lib/db/repositories/stateArchiveIndex.d.ts.map +0 -1
- package/lib/db/repositories/voluntaryExit.d.ts.map +0 -1
- package/lib/db/single/index.d.ts.map +0 -1
- package/lib/db/single/preGenesisState.d.ts.map +0 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +0 -1
- package/lib/eth1/errors.d.ts.map +0 -1
- package/lib/eth1/eth1DataCache.d.ts.map +0 -1
- package/lib/eth1/eth1DepositDataTracker.d.ts.map +0 -1
- package/lib/eth1/eth1DepositsCache.d.ts.map +0 -1
- package/lib/eth1/eth1MergeBlockTracker.d.ts.map +0 -1
- package/lib/eth1/index.d.ts.map +0 -1
- package/lib/eth1/interface.d.ts.map +0 -1
- package/lib/eth1/options.d.ts.map +0 -1
- package/lib/eth1/provider/eth1Provider.d.ts.map +0 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +0 -1
- package/lib/eth1/provider/jwt.d.ts.map +0 -1
- package/lib/eth1/provider/utils.d.ts.map +0 -1
- package/lib/eth1/stream.d.ts.map +0 -1
- package/lib/eth1/utils/depositContract.d.ts.map +0 -1
- package/lib/eth1/utils/deposits.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Data.d.ts.map +0 -1
- package/lib/eth1/utils/eth1DepositEvent.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Vote.d.ts.map +0 -1
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +0 -1
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +0 -1
- package/lib/execution/builder/cache.d.ts.map +0 -1
- package/lib/execution/builder/http.d.ts.map +0 -1
- package/lib/execution/builder/index.d.ts.map +0 -1
- package/lib/execution/builder/interface.d.ts.map +0 -1
- package/lib/execution/builder/utils.d.ts.map +0 -1
- package/lib/execution/engine/disabled.d.ts.map +0 -1
- package/lib/execution/engine/http.d.ts.map +0 -1
- package/lib/execution/engine/index.d.ts.map +0 -1
- package/lib/execution/engine/interface.d.ts.map +0 -1
- package/lib/execution/engine/mock.d.ts.map +0 -1
- package/lib/execution/engine/payloadIdCache.d.ts.map +0 -1
- package/lib/execution/engine/types.d.ts.map +0 -1
- package/lib/execution/engine/utils.d.ts.map +0 -1
- package/lib/execution/index.d.ts.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/metrics/index.d.ts.map +0 -1
- package/lib/metrics/metrics/beacon.d.ts.map +0 -1
- package/lib/metrics/metrics/lodestar.d.ts.map +0 -1
- package/lib/metrics/metrics.d.ts.map +0 -1
- package/lib/metrics/nodeJsMetrics.d.ts.map +0 -1
- package/lib/metrics/options.d.ts.map +0 -1
- package/lib/metrics/server/http.d.ts.map +0 -1
- package/lib/metrics/server/index.d.ts.map +0 -1
- package/lib/metrics/utils/avgMinMax.d.ts.map +0 -1
- package/lib/metrics/utils/gauge.d.ts.map +0 -1
- package/lib/metrics/utils/registryMetricCreator.d.ts.map +0 -1
- package/lib/monitoring/clientStats.d.ts.map +0 -1
- package/lib/monitoring/index.d.ts.map +0 -1
- package/lib/monitoring/options.d.ts.map +0 -1
- package/lib/monitoring/properties.d.ts.map +0 -1
- package/lib/monitoring/service.d.ts.map +0 -1
- package/lib/monitoring/system.d.ts.map +0 -1
- package/lib/monitoring/types.d.ts.map +0 -1
- package/lib/network/core/events.d.ts.map +0 -1
- package/lib/network/core/index.d.ts.map +0 -1
- package/lib/network/core/metrics.d.ts.map +0 -1
- package/lib/network/core/networkCore.d.ts.map +0 -1
- package/lib/network/core/networkCoreWorker.d.ts.map +0 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +0 -1
- package/lib/network/core/types.d.ts.map +0 -1
- package/lib/network/discv5/index.d.ts.map +0 -1
- package/lib/network/discv5/types.d.ts.map +0 -1
- package/lib/network/discv5/utils.d.ts.map +0 -1
- package/lib/network/discv5/worker.d.ts.map +0 -1
- package/lib/network/events.d.ts.map +0 -1
- package/lib/network/forks.d.ts.map +0 -1
- package/lib/network/gossip/constants.d.ts.map +0 -1
- package/lib/network/gossip/encoding.d.ts.map +0 -1
- package/lib/network/gossip/errors.d.ts.map +0 -1
- package/lib/network/gossip/gossipsub.d.ts.map +0 -1
- package/lib/network/gossip/index.d.ts.map +0 -1
- package/lib/network/gossip/interface.d.ts.map +0 -1
- package/lib/network/gossip/metrics.d.ts.map +0 -1
- package/lib/network/gossip/scoringParameters.d.ts.map +0 -1
- package/lib/network/gossip/topic.d.ts.map +0 -1
- package/lib/network/index.d.ts.map +0 -1
- package/lib/network/interface.d.ts.map +0 -1
- package/lib/network/libp2p/error.d.ts.map +0 -1
- package/lib/network/libp2p/index.d.ts.map +0 -1
- package/lib/network/metadata.d.ts.map +0 -1
- package/lib/network/network.d.ts.map +0 -1
- package/lib/network/networkConfig.d.ts.map +0 -1
- package/lib/network/options.d.ts.map +0 -1
- package/lib/network/peers/client.d.ts.map +0 -1
- package/lib/network/peers/datastore.d.ts.map +0 -1
- package/lib/network/peers/discover.d.ts.map +0 -1
- package/lib/network/peers/index.d.ts.map +0 -1
- package/lib/network/peers/peerManager.d.ts.map +0 -1
- package/lib/network/peers/peersData.d.ts.map +0 -1
- package/lib/network/peers/score/constants.d.ts.map +0 -1
- package/lib/network/peers/score/index.d.ts.map +0 -1
- package/lib/network/peers/score/interface.d.ts.map +0 -1
- package/lib/network/peers/score/score.d.ts.map +0 -1
- package/lib/network/peers/score/store.d.ts.map +0 -1
- package/lib/network/peers/score/utils.d.ts.map +0 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +0 -1
- package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +0 -1
- package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +0 -1
- package/lib/network/peers/utils/index.d.ts.map +0 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +0 -1
- package/lib/network/peers/utils/subnetMap.d.ts.map +0 -1
- package/lib/network/processor/aggregatorTracker.d.ts.map +0 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +0 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/indexed.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/linear.d.ts.map +0 -1
- package/lib/network/processor/gossipQueues/types.d.ts.map +0 -1
- package/lib/network/processor/gossipValidatorFn.d.ts.map +0 -1
- package/lib/network/processor/index.d.ts.map +0 -1
- package/lib/network/processor/types.d.ts.map +0 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/index.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +0 -1
- package/lib/network/reqresp/index.d.ts.map +0 -1
- package/lib/network/reqresp/interface.d.ts.map +0 -1
- package/lib/network/reqresp/protocols.d.ts.map +0 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +0 -1
- package/lib/network/reqresp/score.d.ts.map +0 -1
- package/lib/network/reqresp/types.d.ts.map +0 -1
- package/lib/network/reqresp/utils/collect.d.ts.map +0 -1
- package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +0 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +0 -1
- package/lib/network/statusCache.d.ts.map +0 -1
- package/lib/network/subnets/attnetsService.d.ts.map +0 -1
- package/lib/network/subnets/index.d.ts.map +0 -1
- package/lib/network/subnets/interface.d.ts.map +0 -1
- package/lib/network/subnets/syncnetsService.d.ts.map +0 -1
- package/lib/network/subnets/util.d.ts.map +0 -1
- package/lib/network/util.d.ts.map +0 -1
- package/lib/node/index.d.ts.map +0 -1
- package/lib/node/nodejs.d.ts.map +0 -1
- package/lib/node/notifier.d.ts.map +0 -1
- package/lib/node/options.d.ts.map +0 -1
- package/lib/node/utils/interop/deposits.d.ts.map +0 -1
- package/lib/node/utils/interop/state.d.ts.map +0 -1
- package/lib/node/utils/lightclient.d.ts.map +0 -1
- package/lib/node/utils/state.d.ts.map +0 -1
- package/lib/sync/backfill/backfill.d.ts.map +0 -1
- package/lib/sync/backfill/errors.d.ts.map +0 -1
- package/lib/sync/backfill/index.d.ts.map +0 -1
- package/lib/sync/backfill/verify.d.ts.map +0 -1
- package/lib/sync/constants.d.ts.map +0 -1
- package/lib/sync/index.d.ts.map +0 -1
- package/lib/sync/interface.d.ts.map +0 -1
- package/lib/sync/options.d.ts.map +0 -1
- package/lib/sync/range/batch.d.ts.map +0 -1
- package/lib/sync/range/chain.d.ts.map +0 -1
- package/lib/sync/range/range.d.ts.map +0 -1
- package/lib/sync/range/utils/batches.d.ts.map +0 -1
- package/lib/sync/range/utils/chainTarget.d.ts.map +0 -1
- package/lib/sync/range/utils/hashBlocks.d.ts.map +0 -1
- package/lib/sync/range/utils/index.d.ts.map +0 -1
- package/lib/sync/range/utils/peerBalancer.d.ts.map +0 -1
- package/lib/sync/range/utils/updateChains.d.ts.map +0 -1
- package/lib/sync/sync.d.ts.map +0 -1
- package/lib/sync/types.d.ts.map +0 -1
- package/lib/sync/unknownBlock.d.ts.map +0 -1
- package/lib/sync/utils/downloadByRange.d.ts.map +0 -1
- package/lib/sync/utils/downloadByRoot.d.ts.map +0 -1
- package/lib/sync/utils/pendingBlocksTree.d.ts.map +0 -1
- package/lib/sync/utils/remoteSyncType.d.ts.map +0 -1
- package/lib/util/address.d.ts.map +0 -1
- package/lib/util/array.d.ts.map +0 -1
- package/lib/util/asyncIterableToEvents.d.ts.map +0 -1
- package/lib/util/binarySearch.d.ts.map +0 -1
- package/lib/util/bitArray.d.ts.map +0 -1
- package/lib/util/blobs.d.ts.map +0 -1
- package/lib/util/bufferPool.d.ts.map +0 -1
- package/lib/util/bytes.d.ts.map +0 -1
- package/lib/util/chunkify.d.ts.map +0 -1
- package/lib/util/clock.d.ts.map +0 -1
- package/lib/util/dataColumns.d.ts.map +0 -1
- package/lib/util/dependentRoot.d.ts.map +0 -1
- package/lib/util/enum.d.ts.map +0 -1
- package/lib/util/error.d.ts.map +0 -1
- package/lib/util/eventLoop.d.ts.map +0 -1
- package/lib/util/execution.d.ts.map +0 -1
- package/lib/util/file.d.ts.map +0 -1
- package/lib/util/forkChoice.d.ts.map +0 -1
- package/lib/util/forkName.d.ts.map +0 -1
- package/lib/util/graffiti.d.ts.map +0 -1
- package/lib/util/hex.d.ts.map +0 -1
- package/lib/util/index.d.ts.map +0 -1
- package/lib/util/ip.d.ts.map +0 -1
- package/lib/util/itTrigger.d.ts.map +0 -1
- package/lib/util/kzg.d.ts.map +0 -1
- package/lib/util/map.d.ts.map +0 -1
- package/lib/util/metadata.d.ts.map +0 -1
- package/lib/util/multifork.d.ts.map +0 -1
- package/lib/util/numpy.d.ts.map +0 -1
- package/lib/util/peerId.d.ts.map +0 -1
- package/lib/util/profile.d.ts.map +0 -1
- package/lib/util/promises.d.ts.map +0 -1
- package/lib/util/queue/errors.d.ts.map +0 -1
- package/lib/util/queue/fnQueue.d.ts.map +0 -1
- package/lib/util/queue/index.d.ts.map +0 -1
- package/lib/util/queue/itemQueue.d.ts.map +0 -1
- package/lib/util/queue/options.d.ts.map +0 -1
- package/lib/util/serializedCache.d.ts.map +0 -1
- package/lib/util/set.d.ts.map +0 -1
- package/lib/util/shuffle.d.ts.map +0 -1
- package/lib/util/sortBy.d.ts.map +0 -1
- package/lib/util/sszBytes.d.ts.map +0 -1
- package/lib/util/strictEvents.d.ts.map +0 -1
- package/lib/util/time.d.ts.map +0 -1
- package/lib/util/timeSeries.d.ts.map +0 -1
- package/lib/util/types.d.ts.map +0 -1
- package/lib/util/workerEvents.d.ts.map +0 -1
- package/lib/util/wrapError.d.ts.map +0 -1
- package/src/api/impl/api.ts +0 -26
- package/src/api/impl/beacon/blocks/index.ts +0 -744
- package/src/api/impl/beacon/blocks/utils.ts +0 -75
- package/src/api/impl/beacon/index.ts +0 -35
- package/src/api/impl/beacon/pool/index.ts +0 -314
- package/src/api/impl/beacon/rewards/index.ts +0 -30
- package/src/api/impl/beacon/state/index.ts +0 -406
- package/src/api/impl/beacon/state/utils.ts +0 -189
- package/src/api/impl/config/constants.ts +0 -127
- package/src/api/impl/config/index.ts +0 -59
- package/src/api/impl/debug/index.ts +0 -131
- package/src/api/impl/errors.ts +0 -50
- package/src/api/impl/events/index.ts +0 -33
- package/src/api/impl/index.ts +0 -6
- package/src/api/impl/lightclient/index.ts +0 -64
- package/src/api/impl/lodestar/index.ts +0 -257
- package/src/api/impl/node/index.ts +0 -88
- package/src/api/impl/node/utils.ts +0 -51
- package/src/api/impl/proof/index.ts +0 -60
- package/src/api/impl/types.ts +0 -17
- package/src/api/impl/utils.ts +0 -25
- package/src/api/impl/validator/index.ts +0 -1540
- package/src/api/impl/validator/utils.ts +0 -85
- package/src/api/index.ts +0 -2
- package/src/api/options.ts +0 -16
- package/src/api/rest/activeSockets.ts +0 -109
- package/src/api/rest/base.ts +0 -216
- package/src/api/rest/index.ts +0 -63
- package/src/api/rest/swaggerUI.ts +0 -80
- package/src/bun-wrappers/prometheus-gc-stats.ts +0 -7
- package/src/chain/ColumnReconstructionTracker.ts +0 -90
- package/src/chain/GetBlobsTracker.ts +0 -115
- package/src/chain/archiveStore/archiveStore.ts +0 -222
- package/src/chain/archiveStore/constants.ts +0 -5
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +0 -116
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +0 -68
- package/src/chain/archiveStore/historicalState/metrics.ts +0 -214
- package/src/chain/archiveStore/historicalState/types.ts +0 -41
- package/src/chain/archiveStore/historicalState/worker.ts +0 -77
- package/src/chain/archiveStore/index.ts +0 -3
- package/src/chain/archiveStore/interface.ts +0 -75
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +0 -138
- package/src/chain/archiveStore/utils/archiveBlocks.ts +0 -437
- package/src/chain/archiveStore/utils/pruneHistory.ts +0 -56
- package/src/chain/archiveStore/utils/updateBackfillRange.ts +0 -50
- package/src/chain/balancesCache.ts +0 -52
- package/src/chain/beaconProposerCache.ts +0 -43
- package/src/chain/blocks/blockInput/blockInput.ts +0 -852
- package/src/chain/blocks/blockInput/errors.ts +0 -48
- package/src/chain/blocks/blockInput/index.ts +0 -4
- package/src/chain/blocks/blockInput/types.ts +0 -145
- package/src/chain/blocks/blockInput/utils.ts +0 -21
- package/src/chain/blocks/importBlock.ts +0 -597
- package/src/chain/blocks/index.ts +0 -179
- package/src/chain/blocks/types.ts +0 -101
- package/src/chain/blocks/utils/blowfishBanner.ts +0 -28
- package/src/chain/blocks/utils/chainSegment.ts +0 -29
- package/src/chain/blocks/utils/checkpoint.ts +0 -25
- package/src/chain/blocks/utils/giraffeBanner.ts +0 -30
- package/src/chain/blocks/utils/ownBanner.ts +0 -20
- package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +0 -43
- package/src/chain/blocks/utils/zebraBanner.ts +0 -45
- package/src/chain/blocks/verifyBlock.ts +0 -242
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +0 -42
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +0 -438
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +0 -129
- package/src/chain/blocks/verifyBlocksSignatures.ts +0 -105
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +0 -114
- package/src/chain/blocks/writeBlockInputToDb.ts +0 -120
- package/src/chain/bls/index.ts +0 -4
- package/src/chain/bls/interface.ts +0 -68
- package/src/chain/bls/maybeBatch.ts +0 -45
- package/src/chain/bls/multithread/index.ts +0 -582
- package/src/chain/bls/multithread/jobItem.ts +0 -119
- package/src/chain/bls/multithread/poolSize.ts +0 -16
- package/src/chain/bls/multithread/types.ts +0 -38
- package/src/chain/bls/multithread/utils.ts +0 -19
- package/src/chain/bls/multithread/worker.ts +0 -114
- package/src/chain/bls/singleThread.ts +0 -87
- package/src/chain/bls/utils.ts +0 -30
- package/src/chain/chain.ts +0 -1354
- package/src/chain/emitter.ts +0 -113
- package/src/chain/errors/attestationError.ts +0 -194
- package/src/chain/errors/attesterSlashingError.ts +0 -11
- package/src/chain/errors/blobSidecarError.ts +0 -60
- package/src/chain/errors/blockError.ts +0 -166
- package/src/chain/errors/blsToExecutionChangeError.ts +0 -13
- package/src/chain/errors/dataColumnSidecarError.ts +0 -80
- package/src/chain/errors/gossipValidation.ts +0 -20
- package/src/chain/errors/index.ts +0 -10
- package/src/chain/errors/lightClientError.ts +0 -30
- package/src/chain/errors/proposerSlashingError.ts +0 -11
- package/src/chain/errors/syncCommitteeError.ts +0 -36
- package/src/chain/errors/voluntaryExitError.ts +0 -13
- package/src/chain/forkChoice/index.ts +0 -112
- package/src/chain/genesis/genesis.ts +0 -190
- package/src/chain/genesis/interface.ts +0 -14
- package/src/chain/index.ts +0 -6
- package/src/chain/initState.ts +0 -221
- package/src/chain/interface.ts +0 -280
- package/src/chain/lightClient/index.ts +0 -764
- package/src/chain/lightClient/proofs.ts +0 -85
- package/src/chain/lightClient/types.ts +0 -33
- package/src/chain/opPools/aggregatedAttestationPool.ts +0 -1063
- package/src/chain/opPools/attestationPool.ts +0 -282
- package/src/chain/opPools/index.ts +0 -5
- package/src/chain/opPools/opPool.ts +0 -462
- package/src/chain/opPools/syncCommitteeMessagePool.ts +0 -169
- package/src/chain/opPools/syncContributionAndProofPool.ts +0 -240
- package/src/chain/opPools/types.ts +0 -35
- package/src/chain/opPools/utils.ts +0 -65
- package/src/chain/options.ts +0 -138
- package/src/chain/prepareNextSlot.ts +0 -277
- package/src/chain/produceBlock/computeNewStateRoot.ts +0 -55
- package/src/chain/produceBlock/index.ts +0 -2
- package/src/chain/produceBlock/produceBlockBody.ts +0 -797
- package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +0 -54
- package/src/chain/regen/errors.ts +0 -30
- package/src/chain/regen/index.ts +0 -4
- package/src/chain/regen/interface.ts +0 -93
- package/src/chain/regen/queued.ts +0 -317
- package/src/chain/regen/regen.ts +0 -424
- package/src/chain/reprocess.ts +0 -161
- package/src/chain/rewards/attestationsRewards.ts +0 -196
- package/src/chain/rewards/blockRewards.ts +0 -150
- package/src/chain/rewards/syncCommitteeRewards.ts +0 -58
- package/src/chain/seenCache/index.ts +0 -5
- package/src/chain/seenCache/seenAggregateAndProof.ts +0 -120
- package/src/chain/seenCache/seenAttestationData.ts +0 -145
- package/src/chain/seenCache/seenAttesters.ts +0 -58
- package/src/chain/seenCache/seenBlockAttesters.ts +0 -18
- package/src/chain/seenCache/seenBlockProposers.ts +0 -48
- package/src/chain/seenCache/seenCommittee.ts +0 -43
- package/src/chain/seenCache/seenCommitteeContribution.ts +0 -104
- package/src/chain/seenCache/seenGossipBlockInput.ts +0 -373
- package/src/chain/serializeState.ts +0 -32
- package/src/chain/shufflingCache.ts +0 -238
- package/src/chain/stateCache/blockStateCacheImpl.ts +0 -150
- package/src/chain/stateCache/datastore/db.ts +0 -36
- package/src/chain/stateCache/datastore/file.ts +0 -53
- package/src/chain/stateCache/datastore/index.ts +0 -2
- package/src/chain/stateCache/datastore/types.ts +0 -13
- package/src/chain/stateCache/fifoBlockStateCache.ts +0 -208
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -198
- package/src/chain/stateCache/index.ts +0 -3
- package/src/chain/stateCache/mapMetrics.ts +0 -52
- package/src/chain/stateCache/persistentCheckpointsCache.ts +0 -837
- package/src/chain/stateCache/types.ts +0 -86
- package/src/chain/validation/aggregateAndProof.ts +0 -258
- package/src/chain/validation/attestation.ts +0 -885
- package/src/chain/validation/attesterSlashing.ts +0 -61
- package/src/chain/validation/blobSidecar.ts +0 -301
- package/src/chain/validation/block.ts +0 -188
- package/src/chain/validation/blsToExecutionChange.ts +0 -61
- package/src/chain/validation/dataColumnSidecar.ts +0 -381
- package/src/chain/validation/index.ts +0 -9
- package/src/chain/validation/lightClientFinalityUpdate.ts +0 -46
- package/src/chain/validation/lightClientOptimisticUpdate.ts +0 -68
- package/src/chain/validation/proposerSlashing.ts +0 -54
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +0 -38
- package/src/chain/validation/signatureSets/contributionAndProof.ts +0 -27
- package/src/chain/validation/signatureSets/index.ts +0 -6
- package/src/chain/validation/signatureSets/selectionProof.ts +0 -27
- package/src/chain/validation/signatureSets/syncCommittee.ts +0 -22
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +0 -18
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +0 -27
- package/src/chain/validation/syncCommittee.ts +0 -165
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +0 -122
- package/src/chain/validation/voluntaryExit.ts +0 -58
- package/src/chain/validatorMonitor.ts +0 -1309
- package/src/constants/constants.ts +0 -15
- package/src/constants/index.ts +0 -2
- package/src/constants/network.ts +0 -52
- package/src/db/beacon.ts +0 -113
- package/src/db/buckets.ts +0 -80
- package/src/db/index.ts +0 -2
- package/src/db/interface.ts +0 -76
- package/src/db/options.ts +0 -7
- package/src/db/repositories/attesterSlashing.ts +0 -38
- package/src/db/repositories/backfilledRanges.ts +0 -29
- package/src/db/repositories/blobSidecars.ts +0 -37
- package/src/db/repositories/blobSidecarsArchive.ts +0 -28
- package/src/db/repositories/block.ts +0 -33
- package/src/db/repositories/blockArchive.ts +0 -170
- package/src/db/repositories/blockArchiveIndex.ts +0 -45
- package/src/db/repositories/blsToExecutionChange.ts +0 -16
- package/src/db/repositories/checkpointState.ts +0 -31
- package/src/db/repositories/dataColumnSidecar.ts +0 -49
- package/src/db/repositories/dataColumnSidecarArchive.ts +0 -56
- package/src/db/repositories/depositDataRoot.ts +0 -80
- package/src/db/repositories/depositEvent.ts +0 -32
- package/src/db/repositories/eth1Data.ts +0 -33
- package/src/db/repositories/index.ts +0 -20
- package/src/db/repositories/lightclientBestUpdate.ts +0 -41
- package/src/db/repositories/lightclientCheckpointHeader.ts +0 -32
- package/src/db/repositories/lightclientSyncCommittee.ts +0 -16
- package/src/db/repositories/lightclientSyncCommitteeWitness.ts +0 -77
- package/src/db/repositories/proposerSlashing.ts +0 -15
- package/src/db/repositories/stateArchive.ts +0 -69
- package/src/db/repositories/stateArchiveIndex.ts +0 -18
- package/src/db/repositories/voluntaryExit.ts +0 -15
- package/src/db/single/index.ts +0 -2
- package/src/db/single/preGenesisState.ts +0 -37
- package/src/db/single/preGenesisStateLastProcessedBlock.ts +0 -34
- package/src/eth1/errors.ts +0 -40
- package/src/eth1/eth1DataCache.ts +0 -26
- package/src/eth1/eth1DepositDataTracker.ts +0 -410
- package/src/eth1/eth1DepositsCache.ts +0 -141
- package/src/eth1/eth1MergeBlockTracker.ts +0 -328
- package/src/eth1/index.ts +0 -157
- package/src/eth1/interface.ts +0 -131
- package/src/eth1/options.ts +0 -28
- package/src/eth1/provider/eth1Provider.ts +0 -229
- package/src/eth1/provider/jsonRpcHttpClient.ts +0 -390
- package/src/eth1/provider/jwt.ts +0 -36
- package/src/eth1/provider/utils.ts +0 -136
- package/src/eth1/stream.ts +0 -75
- package/src/eth1/utils/depositContract.ts +0 -37
- package/src/eth1/utils/deposits.ts +0 -70
- package/src/eth1/utils/eth1Data.ts +0 -100
- package/src/eth1/utils/eth1DepositEvent.ts +0 -12
- package/src/eth1/utils/eth1Vote.ts +0 -142
- package/src/eth1/utils/groupDepositEventsByBlock.ts +0 -19
- package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +0 -18
- package/src/execution/builder/cache.ts +0 -39
- package/src/execution/builder/http.ts +0 -229
- package/src/execution/builder/index.ts +0 -27
- package/src/execution/builder/interface.ts +0 -49
- package/src/execution/builder/utils.ts +0 -19
- package/src/execution/engine/disabled.ts +0 -35
- package/src/execution/engine/http.ts +0 -644
- package/src/execution/engine/index.ts +0 -63
- package/src/execution/engine/interface.ts +0 -199
- package/src/execution/engine/mock.ts +0 -493
- package/src/execution/engine/payloadIdCache.ts +0 -54
- package/src/execution/engine/types.ts +0 -640
- package/src/execution/engine/utils.ts +0 -136
- package/src/execution/index.ts +0 -4
- package/src/index.ts +0 -20
- package/src/metrics/index.ts +0 -4
- package/src/metrics/metrics/beacon.ts +0 -390
- package/src/metrics/metrics/lodestar.ts +0 -1870
- package/src/metrics/metrics.ts +0 -43
- package/src/metrics/nodeJsMetrics.ts +0 -19
- package/src/metrics/options.ts +0 -22
- package/src/metrics/server/http.ts +0 -114
- package/src/metrics/server/index.ts +0 -1
- package/src/metrics/utils/avgMinMax.ts +0 -87
- package/src/metrics/utils/gauge.ts +0 -22
- package/src/metrics/utils/registryMetricCreator.ts +0 -41
- package/src/monitoring/clientStats.ts +0 -297
- package/src/monitoring/index.ts +0 -2
- package/src/monitoring/options.ts +0 -19
- package/src/monitoring/properties.ts +0 -152
- package/src/monitoring/service.ts +0 -235
- package/src/monitoring/system.ts +0 -146
- package/src/monitoring/types.ts +0 -21
- package/src/network/core/events.ts +0 -59
- package/src/network/core/index.ts +0 -3
- package/src/network/core/metrics.ts +0 -304
- package/src/network/core/networkCore.ts +0 -599
- package/src/network/core/networkCoreWorker.ts +0 -176
- package/src/network/core/networkCoreWorkerHandler.ts +0 -284
- package/src/network/core/types.ts +0 -119
- package/src/network/discv5/index.ts +0 -132
- package/src/network/discv5/types.ts +0 -74
- package/src/network/discv5/utils.ts +0 -50
- package/src/network/discv5/worker.ts +0 -137
- package/src/network/events.ts +0 -51
- package/src/network/forks.ts +0 -94
- package/src/network/gossip/constants.ts +0 -15
- package/src/network/gossip/encoding.ts +0 -111
- package/src/network/gossip/errors.ts +0 -7
- package/src/network/gossip/gossipsub.ts +0 -384
- package/src/network/gossip/index.ts +0 -4
- package/src/network/gossip/interface.ts +0 -215
- package/src/network/gossip/metrics.ts +0 -71
- package/src/network/gossip/scoringParameters.ts +0 -333
- package/src/network/gossip/topic.ts +0 -332
- package/src/network/index.ts +0 -8
- package/src/network/interface.ts +0 -134
- package/src/network/libp2p/error.ts +0 -55
- package/src/network/libp2p/index.ts +0 -153
- package/src/network/metadata.ts +0 -162
- package/src/network/network.ts +0 -767
- package/src/network/networkConfig.ts +0 -12
- package/src/network/options.ts +0 -70
- package/src/network/peers/client.ts +0 -29
- package/src/network/peers/datastore.ts +0 -188
- package/src/network/peers/discover.ts +0 -647
- package/src/network/peers/index.ts +0 -2
- package/src/network/peers/peerManager.ts +0 -899
- package/src/network/peers/peersData.ts +0 -65
- package/src/network/peers/score/constants.ts +0 -34
- package/src/network/peers/score/index.ts +0 -4
- package/src/network/peers/score/interface.ts +0 -74
- package/src/network/peers/score/score.ts +0 -200
- package/src/network/peers/score/store.ts +0 -95
- package/src/network/peers/score/utils.ts +0 -37
- package/src/network/peers/utils/assertPeerRelevance.ts +0 -99
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +0 -27
- package/src/network/peers/utils/getConnectedPeerIds.ts +0 -33
- package/src/network/peers/utils/index.ts +0 -4
- package/src/network/peers/utils/prioritizePeers.ts +0 -627
- package/src/network/peers/utils/subnetMap.ts +0 -88
- package/src/network/processor/aggregatorTracker.ts +0 -38
- package/src/network/processor/extractSlotRootFns.ts +0 -64
- package/src/network/processor/gossipHandlers.ts +0 -951
- package/src/network/processor/gossipQueues/index.ts +0 -114
- package/src/network/processor/gossipQueues/indexed.ts +0 -219
- package/src/network/processor/gossipQueues/linear.ts +0 -162
- package/src/network/processor/gossipQueues/types.ts +0 -57
- package/src/network/processor/gossipValidatorFn.ts +0 -142
- package/src/network/processor/index.ts +0 -496
- package/src/network/processor/types.ts +0 -27
- package/src/network/reqresp/ReqRespBeaconNode.ts +0 -373
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +0 -101
- package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +0 -49
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -114
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -62
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +0 -144
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +0 -88
- package/src/network/reqresp/handlers/index.ts +0 -78
- package/src/network/reqresp/handlers/lightClientBootstrap.ts +0 -31
- package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +0 -21
- package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +0 -21
- package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +0 -39
- package/src/network/reqresp/index.ts +0 -2
- package/src/network/reqresp/interface.ts +0 -45
- package/src/network/reqresp/protocols.ts +0 -146
- package/src/network/reqresp/rateLimit.ts +0 -112
- package/src/network/reqresp/score.ts +0 -70
- package/src/network/reqresp/types.ts +0 -174
- package/src/network/reqresp/utils/collect.ts +0 -84
- package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +0 -57
- package/src/network/reqresp/utils/dataColumnResponseValidation.ts +0 -99
- package/src/network/statusCache.ts +0 -17
- package/src/network/subnets/attnetsService.ts +0 -385
- package/src/network/subnets/index.ts +0 -2
- package/src/network/subnets/interface.ts +0 -66
- package/src/network/subnets/syncnetsService.ts +0 -147
- package/src/network/subnets/util.ts +0 -63
- package/src/network/util.ts +0 -29
- package/src/node/index.ts +0 -2
- package/src/node/nodejs.ts +0 -349
- package/src/node/notifier.ts +0 -206
- package/src/node/options.ts +0 -51
- package/src/node/utils/interop/deposits.ts +0 -53
- package/src/node/utils/interop/state.ts +0 -59
- package/src/node/utils/lightclient.ts +0 -7
- package/src/node/utils/state.ts +0 -37
- package/src/sync/backfill/backfill.ts +0 -893
- package/src/sync/backfill/errors.ts +0 -23
- package/src/sync/backfill/index.ts +0 -1
- package/src/sync/backfill/verify.ts +0 -58
- package/src/sync/constants.ts +0 -71
- package/src/sync/index.ts +0 -2
- package/src/sync/interface.ts +0 -55
- package/src/sync/options.ts +0 -45
- package/src/sync/range/batch.ts +0 -455
- package/src/sync/range/chain.ts +0 -715
- package/src/sync/range/range.ts +0 -354
- package/src/sync/range/utils/batches.ts +0 -119
- package/src/sync/range/utils/chainTarget.ts +0 -62
- package/src/sync/range/utils/hashBlocks.ts +0 -27
- package/src/sync/range/utils/index.ts +0 -5
- package/src/sync/range/utils/peerBalancer.ts +0 -184
- package/src/sync/range/utils/updateChains.ts +0 -66
- package/src/sync/sync.ts +0 -290
- package/src/sync/types.ts +0 -57
- package/src/sync/unknownBlock.ts +0 -859
- package/src/sync/utils/downloadByRange.ts +0 -808
- package/src/sync/utils/downloadByRoot.ts +0 -560
- package/src/sync/utils/pendingBlocksTree.ts +0 -97
- package/src/sync/utils/remoteSyncType.ts +0 -144
- package/src/util/address.ts +0 -3
- package/src/util/array.ts +0 -311
- package/src/util/asyncIterableToEvents.ts +0 -164
- package/src/util/binarySearch.ts +0 -48
- package/src/util/bitArray.ts +0 -84
- package/src/util/blobs.ts +0 -210
- package/src/util/bufferPool.ts +0 -95
- package/src/util/bytes.ts +0 -11
- package/src/util/chunkify.ts +0 -27
- package/src/util/clock.ts +0 -212
- package/src/util/dataColumns.ts +0 -415
- package/src/util/dependentRoot.ts +0 -47
- package/src/util/enum.ts +0 -17
- package/src/util/error.ts +0 -56
- package/src/util/eventLoop.ts +0 -22
- package/src/util/execution.ts +0 -223
- package/src/util/file.ts +0 -52
- package/src/util/forkChoice.ts +0 -5
- package/src/util/forkName.ts +0 -20
- package/src/util/graffiti.ts +0 -39
- package/src/util/hex.ts +0 -9
- package/src/util/index.ts +0 -2
- package/src/util/ip.ts +0 -6
- package/src/util/itTrigger.ts +0 -49
- package/src/util/kzg.ts +0 -3
- package/src/util/map.ts +0 -77
- package/src/util/metadata.ts +0 -22
- package/src/util/multifork.ts +0 -69
- package/src/util/numpy.ts +0 -8
- package/src/util/peerId.ts +0 -16
- package/src/util/profile.ts +0 -54
- package/src/util/promises.ts +0 -14
- package/src/util/queue/errors.ts +0 -14
- package/src/util/queue/fnQueue.ts +0 -16
- package/src/util/queue/index.ts +0 -4
- package/src/util/queue/itemQueue.ts +0 -128
- package/src/util/queue/options.ts +0 -37
- package/src/util/serializedCache.ts +0 -20
- package/src/util/set.ts +0 -62
- package/src/util/shuffle.ts +0 -21
- package/src/util/sortBy.ts +0 -19
- package/src/util/sszBytes.ts +0 -481
- package/src/util/strictEvents.ts +0 -8
- package/src/util/time.ts +0 -13
- package/src/util/timeSeries.ts +0 -118
- package/src/util/types.ts +0 -31
- package/src/util/workerEvents.ts +0 -142
- package/src/util/wrapError.ts +0 -27
|
@@ -1,885 +0,0 @@
|
|
|
1
|
-
import {BitArray} from "@chainsafe/ssz";
|
|
2
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
3
|
-
import {ProtoBlock} from "@lodestar/fork-choice";
|
|
4
|
-
import {
|
|
5
|
-
ATTESTATION_SUBNET_COUNT,
|
|
6
|
-
DOMAIN_BEACON_ATTESTER,
|
|
7
|
-
ForkName,
|
|
8
|
-
ForkPostElectra,
|
|
9
|
-
ForkPreElectra,
|
|
10
|
-
ForkSeq,
|
|
11
|
-
SLOTS_PER_EPOCH,
|
|
12
|
-
isForkPostElectra,
|
|
13
|
-
} from "@lodestar/params";
|
|
14
|
-
import {
|
|
15
|
-
EpochCacheError,
|
|
16
|
-
EpochCacheErrorCode,
|
|
17
|
-
EpochShuffling,
|
|
18
|
-
SingleSignatureSet,
|
|
19
|
-
computeEpochAtSlot,
|
|
20
|
-
computeSigningRoot,
|
|
21
|
-
computeStartSlotAtEpoch,
|
|
22
|
-
createSingleSignatureSetFromComponents,
|
|
23
|
-
} from "@lodestar/state-transition";
|
|
24
|
-
import {
|
|
25
|
-
CommitteeIndex,
|
|
26
|
-
Epoch,
|
|
27
|
-
IndexedAttestation,
|
|
28
|
-
Root,
|
|
29
|
-
RootHex,
|
|
30
|
-
SingleAttestation,
|
|
31
|
-
Slot,
|
|
32
|
-
SubnetID,
|
|
33
|
-
ValidatorIndex,
|
|
34
|
-
isElectraSingleAttestation,
|
|
35
|
-
phase0,
|
|
36
|
-
ssz,
|
|
37
|
-
} from "@lodestar/types";
|
|
38
|
-
import {assert, toRootHex} from "@lodestar/utils";
|
|
39
|
-
import {MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC} from "../../constants/index.js";
|
|
40
|
-
import {sszDeserializeSingleAttestation} from "../../network/gossip/topic.js";
|
|
41
|
-
import {getShufflingDependentRoot} from "../../util/dependentRoot.js";
|
|
42
|
-
import {
|
|
43
|
-
getAggregationBitsFromAttestationSerialized,
|
|
44
|
-
getAttDataFromSignedAggregateAndProofElectra,
|
|
45
|
-
getAttDataFromSignedAggregateAndProofPhase0,
|
|
46
|
-
getAttesterIndexFromSingleAttestationSerialized,
|
|
47
|
-
getCommitteeIndexFromSingleAttestationSerialized,
|
|
48
|
-
getSignatureFromAttestationSerialized,
|
|
49
|
-
getSignatureFromSingleAttestationSerialized,
|
|
50
|
-
} from "../../util/sszBytes.js";
|
|
51
|
-
import {Result, wrapError} from "../../util/wrapError.js";
|
|
52
|
-
import {AttestationError, AttestationErrorCode, GossipAction} from "../errors/index.js";
|
|
53
|
-
import {IBeaconChain} from "../interface.js";
|
|
54
|
-
import {RegenCaller} from "../regen/index.js";
|
|
55
|
-
import {
|
|
56
|
-
AttestationDataCacheEntry,
|
|
57
|
-
PRE_ELECTRA_SINGLE_ATTESTATION_COMMITTEE_INDEX,
|
|
58
|
-
SeenAttDataKey,
|
|
59
|
-
} from "../seenCache/seenAttestationData.js";
|
|
60
|
-
|
|
61
|
-
export type BatchResult = {
|
|
62
|
-
results: Result<AttestationValidationResult>[];
|
|
63
|
-
batchableBls: boolean;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export type AttestationValidationResult = {
|
|
67
|
-
attestation: SingleAttestation;
|
|
68
|
-
indexedAttestation: IndexedAttestation;
|
|
69
|
-
subnet: SubnetID;
|
|
70
|
-
attDataRootHex: RootHex;
|
|
71
|
-
committeeIndex: CommitteeIndex;
|
|
72
|
-
validatorCommitteeIndex: number;
|
|
73
|
-
committeeSize: number;
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export type AttestationOrBytes = ApiAttestation | GossipAttestation;
|
|
77
|
-
|
|
78
|
-
/** attestation from api */
|
|
79
|
-
export type ApiAttestation = {attestation: SingleAttestation; serializedData: null};
|
|
80
|
-
|
|
81
|
-
/** attestation from gossip */
|
|
82
|
-
export type GossipAttestation = {
|
|
83
|
-
attestation: null;
|
|
84
|
-
serializedData: Uint8Array;
|
|
85
|
-
// available in NetworkProcessor since we check for unknown block root attestations
|
|
86
|
-
attSlot: Slot;
|
|
87
|
-
// for indexed gossip queue we have attDataBase64
|
|
88
|
-
attDataBase64: SeenAttDataKey;
|
|
89
|
-
subnet: SubnetID;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
export type Step0Result = AttestationValidationResult & {
|
|
93
|
-
signatureSet: SingleSignatureSet;
|
|
94
|
-
validatorIndex: number;
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Verify gossip attestations of the same attestation data. The main advantage is we can batch verify bls signatures
|
|
99
|
-
* through verifySignatureSetsSameMessage bls api to improve performance.
|
|
100
|
-
* - If there are less than 2 signatures (minSameMessageSignatureSetsToBatch), verify each signature individually with batchable = true
|
|
101
|
-
* - do not prioritize bls signature set
|
|
102
|
-
*/
|
|
103
|
-
export async function validateGossipAttestationsSameAttData(
|
|
104
|
-
fork: ForkName,
|
|
105
|
-
chain: IBeaconChain,
|
|
106
|
-
attestationOrBytesArr: GossipAttestation[],
|
|
107
|
-
// for unit test, consumers do not need to pass this
|
|
108
|
-
step0ValidationFn = validateAttestationNoSignatureCheck
|
|
109
|
-
): Promise<BatchResult> {
|
|
110
|
-
if (attestationOrBytesArr.length === 0) {
|
|
111
|
-
return {results: [], batchableBls: false};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// step0: do all verifications except for signature verification
|
|
115
|
-
// this for await pattern below seems to be bad but it's not
|
|
116
|
-
// for seen AttestationData, it's the same to await Promise.all() pattern
|
|
117
|
-
// for unseen AttestationData, the 1st call will be cached and the rest will be fast
|
|
118
|
-
const step0ResultOrErrors: Result<Step0Result>[] = [];
|
|
119
|
-
for (const attestationOrBytes of attestationOrBytesArr) {
|
|
120
|
-
const {subnet} = attestationOrBytes;
|
|
121
|
-
const resultOrError = await wrapError(step0ValidationFn(fork, chain, attestationOrBytes, subnet));
|
|
122
|
-
step0ResultOrErrors.push(resultOrError);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// step1: verify signatures of all valid attestations
|
|
126
|
-
// map new index to index in resultOrErrors
|
|
127
|
-
const newIndexToOldIndex = new Map<number, number>();
|
|
128
|
-
const signatureSets: SingleSignatureSet[] = [];
|
|
129
|
-
let newIndex = 0;
|
|
130
|
-
const step0Results: Step0Result[] = [];
|
|
131
|
-
for (const [i, resultOrError] of step0ResultOrErrors.entries()) {
|
|
132
|
-
if (resultOrError.err) {
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
step0Results.push(resultOrError.result);
|
|
136
|
-
newIndexToOldIndex.set(newIndex, i);
|
|
137
|
-
signatureSets.push(resultOrError.result.signatureSet);
|
|
138
|
-
newIndex++;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
let signatureValids: boolean[];
|
|
142
|
-
const batchableBls = signatureSets.length >= chain.opts.minSameMessageSignatureSetsToBatch;
|
|
143
|
-
if (batchableBls) {
|
|
144
|
-
// all signature sets should have same signing root since we filtered in network processor
|
|
145
|
-
signatureValids = await chain.bls.verifySignatureSetsSameMessage(
|
|
146
|
-
signatureSets.map((set) => ({publicKey: set.pubkey, signature: set.signature})),
|
|
147
|
-
signatureSets[0].signingRoot
|
|
148
|
-
);
|
|
149
|
-
} else {
|
|
150
|
-
// don't want to block the main thread if there are too few signatures
|
|
151
|
-
signatureValids = await Promise.all(
|
|
152
|
-
signatureSets.map((set) => chain.bls.verifySignatureSets([set], {batchable: true}))
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// phase0 post validation
|
|
157
|
-
for (const [i, sigValid] of signatureValids.entries()) {
|
|
158
|
-
const oldIndex = newIndexToOldIndex.get(i);
|
|
159
|
-
if (oldIndex == null) {
|
|
160
|
-
// should not happen
|
|
161
|
-
throw Error(`Cannot get old index for index ${i}`);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const {validatorIndex, attestation} = step0Results[i];
|
|
165
|
-
const targetEpoch = attestation.data.target.epoch;
|
|
166
|
-
if (sigValid) {
|
|
167
|
-
// Now that the attestation has been fully verified, store that we have received a valid attestation from this validator.
|
|
168
|
-
//
|
|
169
|
-
// It's important to double check that the attestation still hasn't been observed, since
|
|
170
|
-
// there can be a race-condition if we receive two attestations at the same time and
|
|
171
|
-
// process them in different threads.
|
|
172
|
-
if (chain.seenAttesters.isKnown(targetEpoch, validatorIndex)) {
|
|
173
|
-
step0ResultOrErrors[oldIndex] = {
|
|
174
|
-
err: new AttestationError(GossipAction.IGNORE, {
|
|
175
|
-
code: AttestationErrorCode.ATTESTATION_ALREADY_KNOWN,
|
|
176
|
-
targetEpoch,
|
|
177
|
-
validatorIndex,
|
|
178
|
-
}),
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// valid
|
|
183
|
-
chain.seenAttesters.add(targetEpoch, validatorIndex);
|
|
184
|
-
} else {
|
|
185
|
-
step0ResultOrErrors[oldIndex] = {
|
|
186
|
-
err: new AttestationError(GossipAction.IGNORE, {
|
|
187
|
-
code: AttestationErrorCode.INVALID_SIGNATURE,
|
|
188
|
-
}),
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return {
|
|
194
|
-
results: step0ResultOrErrors,
|
|
195
|
-
batchableBls,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Validate attestations from api
|
|
201
|
-
* - no need to deserialize attestation
|
|
202
|
-
* - no subnet
|
|
203
|
-
* - prioritize bls signature set
|
|
204
|
-
*/
|
|
205
|
-
export async function validateApiAttestation(
|
|
206
|
-
fork: ForkName,
|
|
207
|
-
chain: IBeaconChain,
|
|
208
|
-
attestationOrBytes: ApiAttestation
|
|
209
|
-
): Promise<AttestationValidationResult> {
|
|
210
|
-
const prioritizeBls = true;
|
|
211
|
-
const subnet = null;
|
|
212
|
-
|
|
213
|
-
try {
|
|
214
|
-
const step0Result = await validateAttestationNoSignatureCheck(fork, chain, attestationOrBytes, subnet);
|
|
215
|
-
const {attestation, signatureSet, validatorIndex} = step0Result;
|
|
216
|
-
const isValid = await chain.bls.verifySignatureSets([signatureSet], {batchable: true, priority: prioritizeBls});
|
|
217
|
-
|
|
218
|
-
if (isValid) {
|
|
219
|
-
const targetEpoch = attestation.data.target.epoch;
|
|
220
|
-
chain.seenAttesters.add(targetEpoch, validatorIndex);
|
|
221
|
-
return step0Result;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
225
|
-
code: AttestationErrorCode.INVALID_SIGNATURE,
|
|
226
|
-
});
|
|
227
|
-
} catch (err) {
|
|
228
|
-
if (err instanceof EpochCacheError && err.type.code === EpochCacheErrorCode.COMMITTEE_INDEX_OUT_OF_RANGE) {
|
|
229
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
230
|
-
code: AttestationErrorCode.BAD_TARGET_EPOCH,
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
throw err;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Only deserialize the single attestation if needed, use the cached AttestationData instead
|
|
239
|
-
* This is to avoid deserializing similar attestation multiple times which could help the gc
|
|
240
|
-
*/
|
|
241
|
-
async function validateAttestationNoSignatureCheck(
|
|
242
|
-
fork: ForkName,
|
|
243
|
-
chain: IBeaconChain,
|
|
244
|
-
attestationOrBytes: AttestationOrBytes,
|
|
245
|
-
/** Optional, to allow verifying attestations through API with unknown subnet */
|
|
246
|
-
subnet: SubnetID | null
|
|
247
|
-
): Promise<Step0Result> {
|
|
248
|
-
// Do checks in this order:
|
|
249
|
-
// - do early checks (w/o indexed attestation)
|
|
250
|
-
// - > obtain indexed attestation and committes per slot
|
|
251
|
-
// - do middle checks w/ indexed attestation
|
|
252
|
-
// - > verify signature
|
|
253
|
-
// - do late checks w/ a valid signature
|
|
254
|
-
|
|
255
|
-
// verify_early_checks
|
|
256
|
-
// Run the checks that happen before an indexed attestation is constructed.
|
|
257
|
-
|
|
258
|
-
let attestationOrCache:
|
|
259
|
-
| {attestation: SingleAttestation; cache: null}
|
|
260
|
-
| {attestation: null; cache: AttestationDataCacheEntry; serializedData: Uint8Array};
|
|
261
|
-
let attDataKey: SeenAttDataKey | null = null;
|
|
262
|
-
if (attestationOrBytes.serializedData) {
|
|
263
|
-
// gossip
|
|
264
|
-
const attSlot = attestationOrBytes.attSlot;
|
|
265
|
-
attDataKey = getSeenAttDataKeyFromGossipAttestation(attestationOrBytes);
|
|
266
|
-
const committeeIndexForLookup = isForkPostElectra(fork)
|
|
267
|
-
? (getCommitteeIndexFromAttestationOrBytes(fork, attestationOrBytes) ?? 0)
|
|
268
|
-
: PRE_ELECTRA_SINGLE_ATTESTATION_COMMITTEE_INDEX;
|
|
269
|
-
const cachedAttData =
|
|
270
|
-
attDataKey !== null ? chain.seenAttestationDatas.get(attSlot, committeeIndexForLookup, attDataKey) : null;
|
|
271
|
-
if (cachedAttData === null) {
|
|
272
|
-
const attestation = sszDeserializeSingleAttestation(fork, attestationOrBytes.serializedData);
|
|
273
|
-
// only deserialize on the first AttestationData that's not cached
|
|
274
|
-
attestationOrCache = {attestation, cache: null};
|
|
275
|
-
} else {
|
|
276
|
-
attestationOrCache = {attestation: null, cache: cachedAttData, serializedData: attestationOrBytes.serializedData};
|
|
277
|
-
}
|
|
278
|
-
} else {
|
|
279
|
-
// api
|
|
280
|
-
attDataKey = null;
|
|
281
|
-
attestationOrCache = {attestation: attestationOrBytes.attestation, cache: null};
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const attData: phase0.AttestationData = attestationOrCache.attestation
|
|
285
|
-
? attestationOrCache.attestation.data
|
|
286
|
-
: attestationOrCache.cache.attestationData;
|
|
287
|
-
const attSlot = attData.slot;
|
|
288
|
-
const attEpoch = computeEpochAtSlot(attSlot);
|
|
289
|
-
const attTarget = attData.target;
|
|
290
|
-
const targetEpoch = attTarget.epoch;
|
|
291
|
-
let committeeIndex: number | null;
|
|
292
|
-
if (attestationOrCache.attestation) {
|
|
293
|
-
if (isElectraSingleAttestation(attestationOrCache.attestation)) {
|
|
294
|
-
// api or first time validation of a gossip attestation
|
|
295
|
-
committeeIndex = attestationOrCache.attestation.committeeIndex;
|
|
296
|
-
|
|
297
|
-
// [REJECT] attestation.data.index == 0
|
|
298
|
-
if (attData.index !== 0) {
|
|
299
|
-
throw new AttestationError(GossipAction.REJECT, {code: AttestationErrorCode.NON_ZERO_ATTESTATION_DATA_INDEX});
|
|
300
|
-
}
|
|
301
|
-
} else {
|
|
302
|
-
// phase0 attestation
|
|
303
|
-
committeeIndex = attData.index;
|
|
304
|
-
}
|
|
305
|
-
} else {
|
|
306
|
-
// found a seen AttestationData
|
|
307
|
-
committeeIndex = attestationOrCache.cache.committeeIndex;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
chain.metrics?.gossipAttestation.attestationSlotToClockSlot.observe(
|
|
311
|
-
{caller: RegenCaller.validateGossipAttestation},
|
|
312
|
-
chain.clock.currentSlot - attSlot
|
|
313
|
-
);
|
|
314
|
-
|
|
315
|
-
if (!attestationOrCache.cache) {
|
|
316
|
-
// [REJECT] The attestation's epoch matches its target -- i.e. attestation.data.target.epoch == compute_epoch_at_slot(attestation.data.slot)
|
|
317
|
-
if (targetEpoch !== attEpoch) {
|
|
318
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
319
|
-
code: AttestationErrorCode.BAD_TARGET_EPOCH,
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Pre-deneb:
|
|
324
|
-
// [IGNORE] attestation.data.slot is within the last ATTESTATION_PROPAGATION_SLOT_RANGE slots (within a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance)
|
|
325
|
-
// -- i.e. attestation.data.slot + ATTESTATION_PROPAGATION_SLOT_RANGE >= current_slot >= attestation.data.slot
|
|
326
|
-
// (a client MAY queue future attestations for processing at the appropriate slot).
|
|
327
|
-
// Post-deneb:
|
|
328
|
-
// [IGNORE] `attestation.data.slot` is equal to or earlier than the `current_slot` (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance)
|
|
329
|
-
// -- i.e. `attestation.data.slot <= current_slot`
|
|
330
|
-
// (a client MAY queue future attestation for processing at the appropriate slot).
|
|
331
|
-
// [IGNORE] the epoch of `attestation.data.slot` is either the current or previous epoch
|
|
332
|
-
// (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance)
|
|
333
|
-
// -- i.e. `compute_epoch_at_slot(attestation.data.slot) in (get_previous_epoch(state), get_current_epoch(state))`
|
|
334
|
-
verifyPropagationSlotRange(fork, chain, attestationOrCache.attestation.data.slot);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
let aggregationBits: BitArray | null = null;
|
|
338
|
-
let validatorCommitteeIndex: number | null = null;
|
|
339
|
-
if (!isForkPostElectra(fork)) {
|
|
340
|
-
// [REJECT] The attestation is unaggregated -- that is, it has exactly one participating validator
|
|
341
|
-
// (len([bit for bit in attestation.aggregation_bits if bit]) == 1, i.e. exactly 1 bit is set).
|
|
342
|
-
// > TODO: Do this check **before** getting the target state but don't recompute zipIndexes
|
|
343
|
-
aggregationBits = attestationOrCache.attestation
|
|
344
|
-
? (attestationOrCache.attestation as SingleAttestation<ForkPreElectra>).aggregationBits
|
|
345
|
-
: getAggregationBitsFromAttestationSerialized(attestationOrCache.serializedData);
|
|
346
|
-
if (aggregationBits === null) {
|
|
347
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
348
|
-
code: AttestationErrorCode.INVALID_SERIALIZED_BYTES,
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
const bitIndex = aggregationBits.getSingleTrueBit();
|
|
353
|
-
if (bitIndex === null) {
|
|
354
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
355
|
-
code: AttestationErrorCode.NOT_EXACTLY_ONE_AGGREGATION_BIT_SET,
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
validatorCommitteeIndex = bitIndex;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
let committeeValidatorIndices: Uint32Array;
|
|
362
|
-
let getSigningRoot: () => Uint8Array;
|
|
363
|
-
let expectedSubnet: SubnetID;
|
|
364
|
-
if (attestationOrCache.cache) {
|
|
365
|
-
committeeValidatorIndices = attestationOrCache.cache.committeeValidatorIndices;
|
|
366
|
-
const signingRoot = attestationOrCache.cache.signingRoot;
|
|
367
|
-
getSigningRoot = () => signingRoot;
|
|
368
|
-
expectedSubnet = attestationOrCache.cache.subnet;
|
|
369
|
-
} else {
|
|
370
|
-
// Attestations must be for a known block. If the block is unknown, we simply drop the
|
|
371
|
-
// attestation and do not delay consideration for later.
|
|
372
|
-
//
|
|
373
|
-
// TODO (LH): Enforce a maximum skip distance for unaggregated attestations.
|
|
374
|
-
|
|
375
|
-
// [IGNORE] The block being voted for (attestation.data.beacon_block_root) has been seen (via both gossip
|
|
376
|
-
// and non-gossip sources) (a client MAY queue attestations for processing once block is retrieved).
|
|
377
|
-
const attHeadBlock = verifyHeadBlockAndTargetRoot(
|
|
378
|
-
chain,
|
|
379
|
-
attestationOrCache.attestation.data.beaconBlockRoot,
|
|
380
|
-
attestationOrCache.attestation.data.target.root,
|
|
381
|
-
attSlot,
|
|
382
|
-
attEpoch,
|
|
383
|
-
RegenCaller.validateGossipAttestation,
|
|
384
|
-
chain.opts.maxSkipSlots
|
|
385
|
-
);
|
|
386
|
-
|
|
387
|
-
// [REJECT] The block being voted for (attestation.data.beacon_block_root) passes validation.
|
|
388
|
-
// > Altready check in `verifyHeadBlockAndTargetRoot()`
|
|
389
|
-
|
|
390
|
-
// [IGNORE] The current finalized_checkpoint is an ancestor of the block defined by attestation.data.beacon_block_root
|
|
391
|
-
// -- i.e. get_ancestor(store, attestation.data.beacon_block_root, compute_start_slot_at_epoch(store.finalized_checkpoint.epoch)) == store.finalized_checkpoint.root
|
|
392
|
-
// > Altready check in `verifyHeadBlockAndTargetRoot()`
|
|
393
|
-
|
|
394
|
-
// [REJECT] The attestation's target block is an ancestor of the block named in the LMD vote
|
|
395
|
-
// --i.e. get_ancestor(store, attestation.data.beacon_block_root, compute_start_slot_at_epoch(attestation.data.target.epoch)) == attestation.data.target.root
|
|
396
|
-
// > Altready check in `verifyHeadBlockAndTargetRoot()`
|
|
397
|
-
|
|
398
|
-
const shuffling = await getShufflingForAttestationVerification(
|
|
399
|
-
chain,
|
|
400
|
-
attEpoch,
|
|
401
|
-
attHeadBlock,
|
|
402
|
-
RegenCaller.validateGossipAttestation
|
|
403
|
-
);
|
|
404
|
-
|
|
405
|
-
// [REJECT] The committee index is within the expected range
|
|
406
|
-
// -- i.e. data.index < get_committee_count_per_slot(state, data.target.epoch)
|
|
407
|
-
committeeValidatorIndices = getCommitteeValidatorIndices(shuffling, attSlot, committeeIndex);
|
|
408
|
-
getSigningRoot = () => getAttestationDataSigningRoot(chain.config, attData);
|
|
409
|
-
expectedSubnet = computeSubnetForSlot(shuffling, attSlot, committeeIndex);
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
let validatorIndex: number;
|
|
413
|
-
|
|
414
|
-
if (!isForkPostElectra(fork)) {
|
|
415
|
-
// The validity of aggregation bits are already checked above
|
|
416
|
-
assert.notNull(aggregationBits);
|
|
417
|
-
assert.notNull(validatorCommitteeIndex);
|
|
418
|
-
|
|
419
|
-
validatorIndex = committeeValidatorIndices[validatorCommitteeIndex];
|
|
420
|
-
// [REJECT] The number of aggregation bits matches the committee size
|
|
421
|
-
// -- i.e. len(attestation.aggregation_bits) == len(get_beacon_committee(state, data.slot, data.index)).
|
|
422
|
-
// > TODO: Is this necessary? Lighthouse does not do this check.
|
|
423
|
-
if (aggregationBits.bitLen !== committeeValidatorIndices.length) {
|
|
424
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
425
|
-
code: AttestationErrorCode.WRONG_NUMBER_OF_AGGREGATION_BITS,
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
} else {
|
|
429
|
-
if (attestationOrCache.attestation) {
|
|
430
|
-
validatorIndex = (attestationOrCache.attestation as SingleAttestation<ForkPostElectra>).attesterIndex;
|
|
431
|
-
} else {
|
|
432
|
-
const attesterIndex = getAttesterIndexFromSingleAttestationSerialized(attestationOrCache.serializedData);
|
|
433
|
-
if (attesterIndex === null) {
|
|
434
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
435
|
-
code: AttestationErrorCode.INVALID_SERIALIZED_BYTES,
|
|
436
|
-
});
|
|
437
|
-
}
|
|
438
|
-
validatorIndex = attesterIndex;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
// [REJECT] The attester is a member of the committee -- i.e.
|
|
442
|
-
// `attestation.attester_index in get_beacon_committee(state, attestation.data.slot, index)`.
|
|
443
|
-
// Position of the validator in its committee
|
|
444
|
-
validatorCommitteeIndex = committeeValidatorIndices.indexOf(validatorIndex);
|
|
445
|
-
if (validatorCommitteeIndex === -1) {
|
|
446
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
447
|
-
code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE,
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// LH > verify_middle_checks
|
|
453
|
-
// Run the checks that apply to the indexed attestation before the signature is checked.
|
|
454
|
-
// Check correct subnet
|
|
455
|
-
// The attestation is the first valid attestation received for the participating validator for the slot, attestation.data.slot.
|
|
456
|
-
|
|
457
|
-
// [REJECT] The attestation is for the correct subnet
|
|
458
|
-
// -- i.e. compute_subnet_for_attestation(committees_per_slot, attestation.data.slot, attestation.data.index) == subnet_id,
|
|
459
|
-
// where committees_per_slot = get_committee_count_per_slot(state, attestation.data.target.epoch),
|
|
460
|
-
// which may be pre-computed along with the committee information for the signature check.
|
|
461
|
-
if (subnet !== null && subnet !== expectedSubnet) {
|
|
462
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
463
|
-
code: AttestationErrorCode.INVALID_SUBNET_ID,
|
|
464
|
-
received: subnet,
|
|
465
|
-
expected: expectedSubnet,
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
// [IGNORE] There has been no other valid attestation seen on an attestation subnet that has an
|
|
470
|
-
// identical attestation.data.target.epoch and participating validator index.
|
|
471
|
-
if (chain.seenAttesters.isKnown(targetEpoch, validatorIndex)) {
|
|
472
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
473
|
-
code: AttestationErrorCode.ATTESTATION_ALREADY_KNOWN,
|
|
474
|
-
targetEpoch,
|
|
475
|
-
validatorIndex,
|
|
476
|
-
});
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
// [REJECT] The signature of attestation is valid.
|
|
480
|
-
const attestingIndices = [validatorIndex];
|
|
481
|
-
let signatureSet: SingleSignatureSet;
|
|
482
|
-
let attDataRootHex: RootHex;
|
|
483
|
-
const signature = attestationOrCache.attestation
|
|
484
|
-
? attestationOrCache.attestation.signature
|
|
485
|
-
: !isForkPostElectra(fork)
|
|
486
|
-
? getSignatureFromAttestationSerialized(attestationOrCache.serializedData)
|
|
487
|
-
: getSignatureFromSingleAttestationSerialized(attestationOrCache.serializedData);
|
|
488
|
-
if (signature === null) {
|
|
489
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
490
|
-
code: AttestationErrorCode.INVALID_SERIALIZED_BYTES,
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
if (attestationOrCache.cache) {
|
|
495
|
-
// there could be up to 6% of cpu time to compute signing root if we don't clone the signature set
|
|
496
|
-
signatureSet = createSingleSignatureSetFromComponents(
|
|
497
|
-
chain.index2pubkey[validatorIndex],
|
|
498
|
-
attestationOrCache.cache.signingRoot,
|
|
499
|
-
signature
|
|
500
|
-
);
|
|
501
|
-
attDataRootHex = attestationOrCache.cache.attDataRootHex;
|
|
502
|
-
} else {
|
|
503
|
-
signatureSet = createSingleSignatureSetFromComponents(
|
|
504
|
-
chain.index2pubkey[validatorIndex],
|
|
505
|
-
getSigningRoot(),
|
|
506
|
-
signature
|
|
507
|
-
);
|
|
508
|
-
|
|
509
|
-
// add cached attestation data before verifying signature
|
|
510
|
-
attDataRootHex = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(attData));
|
|
511
|
-
if (attDataKey) {
|
|
512
|
-
// for pre-electra, committee index key is 0. See SeenAttestationDatas.add() documentation
|
|
513
|
-
const committeeIndexKey = isForkPostElectra(fork)
|
|
514
|
-
? committeeIndex
|
|
515
|
-
: PRE_ELECTRA_SINGLE_ATTESTATION_COMMITTEE_INDEX;
|
|
516
|
-
chain.seenAttestationDatas.add(attSlot, committeeIndexKey, attDataKey, {
|
|
517
|
-
committeeValidatorIndices,
|
|
518
|
-
committeeIndex,
|
|
519
|
-
signingRoot: signatureSet.signingRoot,
|
|
520
|
-
subnet: expectedSubnet,
|
|
521
|
-
// precompute this to be used in forkchoice
|
|
522
|
-
// root of AttestationData was already cached during getIndexedAttestationSignatureSet
|
|
523
|
-
attDataRootHex,
|
|
524
|
-
attestationData: attData,
|
|
525
|
-
});
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
// no signature check, leave that for step1
|
|
530
|
-
const indexedAttestation: IndexedAttestation = {
|
|
531
|
-
attestingIndices,
|
|
532
|
-
data: attData,
|
|
533
|
-
signature,
|
|
534
|
-
};
|
|
535
|
-
|
|
536
|
-
const attestation: SingleAttestation = attestationOrCache.attestation
|
|
537
|
-
? attestationOrCache.attestation
|
|
538
|
-
: !isForkPostElectra(fork)
|
|
539
|
-
? {
|
|
540
|
-
// Aggregation bits are already asserted above to not be null
|
|
541
|
-
aggregationBits: aggregationBits as BitArray,
|
|
542
|
-
data: attData,
|
|
543
|
-
signature,
|
|
544
|
-
}
|
|
545
|
-
: {
|
|
546
|
-
committeeIndex,
|
|
547
|
-
attesterIndex: validatorIndex,
|
|
548
|
-
data: attData,
|
|
549
|
-
signature,
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
return {
|
|
553
|
-
attestation,
|
|
554
|
-
indexedAttestation,
|
|
555
|
-
subnet: expectedSubnet,
|
|
556
|
-
attDataRootHex,
|
|
557
|
-
signatureSet,
|
|
558
|
-
validatorIndex,
|
|
559
|
-
committeeIndex,
|
|
560
|
-
validatorCommitteeIndex,
|
|
561
|
-
committeeSize: committeeValidatorIndices.length,
|
|
562
|
-
};
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
/**
|
|
566
|
-
* Verify that the `attestation` is within the acceptable gossip propagation range, with reference
|
|
567
|
-
* to the current slot of the `chain`.
|
|
568
|
-
*
|
|
569
|
-
* Accounts for `MAXIMUM_GOSSIP_CLOCK_DISPARITY`.
|
|
570
|
-
* Note: We do not queue future attestations for later processing
|
|
571
|
-
*/
|
|
572
|
-
export function verifyPropagationSlotRange(fork: ForkName, chain: IBeaconChain, attestationSlot: Slot): void {
|
|
573
|
-
// slot with future tolerance of MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC
|
|
574
|
-
const latestPermissibleSlot = chain.clock.slotWithFutureTolerance(MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC);
|
|
575
|
-
if (attestationSlot > latestPermissibleSlot) {
|
|
576
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
577
|
-
code: AttestationErrorCode.FUTURE_SLOT,
|
|
578
|
-
latestPermissibleSlot,
|
|
579
|
-
attestationSlot,
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
// Post deneb the attestations are valid for current as well as previous epoch
|
|
584
|
-
// while pre deneb they are valid for ATTESTATION_PROPAGATION_SLOT_RANGE
|
|
585
|
-
//
|
|
586
|
-
// see: https://github.com/ethereum/consensus-specs/pull/3360
|
|
587
|
-
if (ForkSeq[fork] < ForkSeq.deneb) {
|
|
588
|
-
const earliestPermissibleSlot = Math.max(
|
|
589
|
-
// slot with past tolerance of MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC
|
|
590
|
-
// ATTESTATION_PROPAGATION_SLOT_RANGE = SLOTS_PER_EPOCH
|
|
591
|
-
chain.clock.slotWithPastTolerance(MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC) - SLOTS_PER_EPOCH,
|
|
592
|
-
0
|
|
593
|
-
);
|
|
594
|
-
|
|
595
|
-
if (attestationSlot < earliestPermissibleSlot) {
|
|
596
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
597
|
-
code: AttestationErrorCode.PAST_SLOT,
|
|
598
|
-
earliestPermissibleSlot,
|
|
599
|
-
attestationSlot,
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
} else {
|
|
603
|
-
const attestationEpoch = computeEpochAtSlot(attestationSlot);
|
|
604
|
-
|
|
605
|
-
// upper bound for current epoch is same as epoch of latestPermissibleSlot
|
|
606
|
-
const latestPermissibleCurrentEpoch = computeEpochAtSlot(latestPermissibleSlot);
|
|
607
|
-
if (attestationEpoch > latestPermissibleCurrentEpoch) {
|
|
608
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
609
|
-
code: AttestationErrorCode.FUTURE_EPOCH,
|
|
610
|
-
currentEpoch: latestPermissibleCurrentEpoch,
|
|
611
|
-
attestationEpoch,
|
|
612
|
-
});
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
// lower bound for previous epoch is same as epoch of earliestPermissibleSlot
|
|
616
|
-
const currentEpochWithPastTolerance = computeEpochAtSlot(
|
|
617
|
-
chain.clock.slotWithPastTolerance(MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC)
|
|
618
|
-
);
|
|
619
|
-
|
|
620
|
-
const earliestPermissiblePreviousEpoch = Math.max(currentEpochWithPastTolerance - 1, 0);
|
|
621
|
-
if (attestationEpoch < earliestPermissiblePreviousEpoch) {
|
|
622
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
623
|
-
code: AttestationErrorCode.PAST_EPOCH,
|
|
624
|
-
previousEpoch: earliestPermissiblePreviousEpoch,
|
|
625
|
-
attestationEpoch,
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
/**
|
|
632
|
-
* Verify:
|
|
633
|
-
* 1. head block is known
|
|
634
|
-
* 2. attestation's target block is an ancestor of the block named in the LMD vote
|
|
635
|
-
*/
|
|
636
|
-
export function verifyHeadBlockAndTargetRoot(
|
|
637
|
-
chain: IBeaconChain,
|
|
638
|
-
beaconBlockRoot: Root,
|
|
639
|
-
targetRoot: Root,
|
|
640
|
-
attestationSlot: Slot,
|
|
641
|
-
attestationEpoch: Epoch,
|
|
642
|
-
caller: RegenCaller,
|
|
643
|
-
maxSkipSlots?: number
|
|
644
|
-
): ProtoBlock {
|
|
645
|
-
const headBlock = verifyHeadBlockIsKnown(chain, beaconBlockRoot);
|
|
646
|
-
// Lighthouse rejects the attestation, however Lodestar only ignores considering it's not against the spec
|
|
647
|
-
// it's more about a DOS protection to us
|
|
648
|
-
// With verifyPropagationSlotRange() and maxSkipSlots = 32, it's unlikely we have to regenerate states in queue
|
|
649
|
-
// to validate beacon_attestation and aggregate_and_proof
|
|
650
|
-
const slotDistance = attestationSlot - headBlock.slot;
|
|
651
|
-
chain.metrics?.gossipAttestation.headSlotToAttestationSlot.observe({caller}, slotDistance);
|
|
652
|
-
|
|
653
|
-
if (maxSkipSlots !== undefined && slotDistance > maxSkipSlots) {
|
|
654
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
655
|
-
code: AttestationErrorCode.TOO_MANY_SKIPPED_SLOTS,
|
|
656
|
-
attestationSlot,
|
|
657
|
-
headBlockSlot: headBlock.slot,
|
|
658
|
-
});
|
|
659
|
-
}
|
|
660
|
-
verifyAttestationTargetRoot(headBlock, targetRoot, attestationEpoch);
|
|
661
|
-
return headBlock;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
/**
|
|
665
|
-
* Get a shuffling for attestation verification from the ShufflingCache.
|
|
666
|
-
* - if blockEpoch is attEpoch, use current shuffling of head state
|
|
667
|
-
* - if blockEpoch is attEpoch - 1, use next shuffling of head state
|
|
668
|
-
* - if blockEpoch is less than attEpoch - 1, dial head state to attEpoch - 1, and add to ShufflingCache
|
|
669
|
-
*
|
|
670
|
-
* This implementation does not require to dial head state to attSlot at fork boundary because we always get domain of attSlot
|
|
671
|
-
* in consumer context.
|
|
672
|
-
*
|
|
673
|
-
* This is similar to the old getStateForAttestationVerification
|
|
674
|
-
* see https://github.com/ChainSafe/lodestar/blob/v1.11.3/packages/beacon-node/src/chain/validation/attestation.ts#L566
|
|
675
|
-
*/
|
|
676
|
-
export async function getShufflingForAttestationVerification(
|
|
677
|
-
chain: IBeaconChain,
|
|
678
|
-
attEpoch: Epoch,
|
|
679
|
-
attHeadBlock: ProtoBlock,
|
|
680
|
-
regenCaller: RegenCaller
|
|
681
|
-
): Promise<EpochShuffling> {
|
|
682
|
-
const blockEpoch = computeEpochAtSlot(attHeadBlock.slot);
|
|
683
|
-
const shufflingDependentRoot = getShufflingDependentRoot(chain.forkChoice, attEpoch, blockEpoch, attHeadBlock);
|
|
684
|
-
|
|
685
|
-
const shuffling = await chain.shufflingCache.get(attEpoch, shufflingDependentRoot);
|
|
686
|
-
if (shuffling) {
|
|
687
|
-
// most of the time, we should get the shuffling from cache
|
|
688
|
-
chain.metrics?.gossipAttestation.shufflingCacheHit.inc({caller: regenCaller});
|
|
689
|
-
return shuffling;
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
chain.metrics?.gossipAttestation.shufflingCacheMiss.inc({caller: regenCaller});
|
|
693
|
-
try {
|
|
694
|
-
// for the 1st time of the same epoch and dependent root, it awaits for the regen state
|
|
695
|
-
// from the 2nd time, it should use the same cached promise and it should reach the above code
|
|
696
|
-
chain.metrics?.gossipAttestation.shufflingCacheRegenHit.inc({caller: regenCaller});
|
|
697
|
-
return await chain.regenStateForAttestationVerification(
|
|
698
|
-
attEpoch,
|
|
699
|
-
shufflingDependentRoot,
|
|
700
|
-
attHeadBlock,
|
|
701
|
-
regenCaller
|
|
702
|
-
);
|
|
703
|
-
} catch (e) {
|
|
704
|
-
chain.metrics?.gossipAttestation.shufflingCacheRegenMiss.inc({caller: regenCaller});
|
|
705
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
706
|
-
code: AttestationErrorCode.MISSING_STATE_TO_VERIFY_ATTESTATION,
|
|
707
|
-
error: e as Error,
|
|
708
|
-
});
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
/**
|
|
713
|
-
* Different version of getAttestationDataSigningRoot in state-transition which doesn't require a state.
|
|
714
|
-
*/
|
|
715
|
-
export function getAttestationDataSigningRoot(config: BeaconConfig, data: phase0.AttestationData): Uint8Array {
|
|
716
|
-
const slot = computeStartSlotAtEpoch(data.target.epoch);
|
|
717
|
-
// previously, we call `domain = config.getDomain(state.slot, DOMAIN_BEACON_ATTESTER, slot)`
|
|
718
|
-
// at fork boundary, it's required to dial to target epoch https://github.com/ChainSafe/lodestar/blob/v1.11.3/packages/beacon-node/src/chain/validation/attestation.ts#L573
|
|
719
|
-
// instead of that, just use the fork at slot in the attestation data
|
|
720
|
-
const fork = config.getForkName(slot);
|
|
721
|
-
const domain = config.getDomainAtFork(fork, DOMAIN_BEACON_ATTESTER);
|
|
722
|
-
return computeSigningRoot(ssz.phase0.AttestationData, data, domain);
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
/**
|
|
726
|
-
* Checks if the `attestation.data.beaconBlockRoot` is known to this chain.
|
|
727
|
-
*
|
|
728
|
-
* The block root may not be known for two reasons:
|
|
729
|
-
*
|
|
730
|
-
* 1. The block has never been verified by our application.
|
|
731
|
-
* 2. The block is prior to the latest finalized block.
|
|
732
|
-
*
|
|
733
|
-
* Case (1) is the exact thing we're trying to detect. However case (2) is a little different, but
|
|
734
|
-
* it's still fine to ignore here because there's no need for us to handle attestations that are
|
|
735
|
-
* already finalized.
|
|
736
|
-
*/
|
|
737
|
-
function verifyHeadBlockIsKnown(chain: IBeaconChain, beaconBlockRoot: Root): ProtoBlock {
|
|
738
|
-
// TODO (LH): Enforce a maximum skip distance for unaggregated attestations.
|
|
739
|
-
|
|
740
|
-
const headBlock = chain.forkChoice.getBlock(beaconBlockRoot);
|
|
741
|
-
if (headBlock === null) {
|
|
742
|
-
throw new AttestationError(GossipAction.IGNORE, {
|
|
743
|
-
code: AttestationErrorCode.UNKNOWN_OR_PREFINALIZED_BEACON_BLOCK_ROOT,
|
|
744
|
-
root: toRootHex(beaconBlockRoot),
|
|
745
|
-
});
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
return headBlock;
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
/**
|
|
752
|
-
* Verifies that the `attestation.data.target.root` is indeed the target root of the block at
|
|
753
|
-
* `attestation.data.beacon_block_root`.
|
|
754
|
-
*/
|
|
755
|
-
function verifyAttestationTargetRoot(headBlock: ProtoBlock, targetRoot: Root, attestationEpoch: Epoch): void {
|
|
756
|
-
// Check the attestation target root.
|
|
757
|
-
const headBlockEpoch = computeEpochAtSlot(headBlock.slot);
|
|
758
|
-
|
|
759
|
-
if (headBlockEpoch > attestationEpoch) {
|
|
760
|
-
// The epoch references an invalid head block from a future epoch.
|
|
761
|
-
//
|
|
762
|
-
// This check is not in the specification, however we guard against it since it opens us up
|
|
763
|
-
// to weird edge cases during verification.
|
|
764
|
-
//
|
|
765
|
-
// Whilst this attestation *technically* could be used to add value to a block, it is
|
|
766
|
-
// invalid in the spirit of the protocol. Here we choose safety over profit.
|
|
767
|
-
//
|
|
768
|
-
// Reference:
|
|
769
|
-
// https://github.com/ethereum/consensus-specs/pull/2001#issuecomment-699246659
|
|
770
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
771
|
-
code: AttestationErrorCode.INVALID_TARGET_ROOT,
|
|
772
|
-
targetRoot: toRootHex(targetRoot),
|
|
773
|
-
expected: null,
|
|
774
|
-
});
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
const expectedTargetRoot =
|
|
778
|
-
headBlockEpoch === attestationEpoch
|
|
779
|
-
? // If the block is in the same epoch as the attestation, then use the target root
|
|
780
|
-
// from the block.
|
|
781
|
-
headBlock.targetRoot
|
|
782
|
-
: // If the head block is from a previous epoch then skip slots will cause the head block
|
|
783
|
-
// root to become the target block root.
|
|
784
|
-
//
|
|
785
|
-
// We know the head block is from a previous epoch due to a previous check.
|
|
786
|
-
headBlock.blockRoot;
|
|
787
|
-
|
|
788
|
-
// TODO: Do a fast comparision to convert and compare byte by byte
|
|
789
|
-
if (expectedTargetRoot !== toRootHex(targetRoot)) {
|
|
790
|
-
// Reject any attestation with an invalid target root.
|
|
791
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
792
|
-
code: AttestationErrorCode.INVALID_TARGET_ROOT,
|
|
793
|
-
targetRoot: toRootHex(targetRoot),
|
|
794
|
-
expected: expectedTargetRoot,
|
|
795
|
-
});
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
/**
|
|
800
|
-
* Get a list of validator indices in the given committee
|
|
801
|
-
* attestationIndex - Index of the committee in shuffling.committees
|
|
802
|
-
*/
|
|
803
|
-
export function getCommitteeValidatorIndices(
|
|
804
|
-
shuffling: EpochShuffling,
|
|
805
|
-
attestationSlot: Slot,
|
|
806
|
-
attestationIndex: number
|
|
807
|
-
): Uint32Array {
|
|
808
|
-
const {committees} = shuffling;
|
|
809
|
-
const slotCommittees = committees[attestationSlot % SLOTS_PER_EPOCH];
|
|
810
|
-
|
|
811
|
-
if (attestationIndex >= slotCommittees.length) {
|
|
812
|
-
throw new AttestationError(GossipAction.REJECT, {
|
|
813
|
-
code: AttestationErrorCode.COMMITTEE_INDEX_OUT_OF_RANGE,
|
|
814
|
-
index: attestationIndex,
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
return slotCommittees[attestationIndex];
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
/**
|
|
821
|
-
* Compute the correct subnet for a slot/committee index
|
|
822
|
-
*/
|
|
823
|
-
export function computeSubnetForSlot(shuffling: EpochShuffling, slot: number, committeeIndex: number): SubnetID {
|
|
824
|
-
const slotsSinceEpochStart = slot % SLOTS_PER_EPOCH;
|
|
825
|
-
const committeesSinceEpochStart = shuffling.committeesPerSlot * slotsSinceEpochStart;
|
|
826
|
-
return (committeesSinceEpochStart + committeeIndex) % ATTESTATION_SUBNET_COUNT;
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
/**
|
|
830
|
-
* Return fork-dependent seen attestation key
|
|
831
|
-
* - for pre-electra, it's the AttestationData base64 from Attestation
|
|
832
|
-
* - for electra and later, it's the AttestationData base64 from SingleAttestation
|
|
833
|
-
* - consumers need to also pass slot + committeeIndex to get the correct SeenAttestationData
|
|
834
|
-
*/
|
|
835
|
-
export function getSeenAttDataKeyFromGossipAttestation(attestation: GossipAttestation): SeenAttDataKey | null {
|
|
836
|
-
// SeenAttDataKey is the same as gossip index
|
|
837
|
-
return attestation.attDataBase64;
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
/**
|
|
841
|
-
* Extract attestation data key from SignedAggregateAndProof Uint8Array to use cached data from SeenAttestationDatas
|
|
842
|
-
* - for both electra + pre-electra, it's the AttestationData base64
|
|
843
|
-
* - consumers need to also pass slot + committeeIndex to get the correct SeenAttestationData
|
|
844
|
-
*/
|
|
845
|
-
export function getSeenAttDataKeyFromSignedAggregateAndProof(
|
|
846
|
-
fork: ForkName,
|
|
847
|
-
aggregateAndProof: Uint8Array
|
|
848
|
-
): SeenAttDataKey | null {
|
|
849
|
-
return isForkPostElectra(fork)
|
|
850
|
-
? getAttDataFromSignedAggregateAndProofElectra(aggregateAndProof)
|
|
851
|
-
: getAttDataFromSignedAggregateAndProofPhase0(aggregateAndProof);
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
export function getCommitteeIndexFromAttestationOrBytes(
|
|
855
|
-
fork: ForkName,
|
|
856
|
-
attestationOrBytes: AttestationOrBytes
|
|
857
|
-
): CommitteeIndex | null {
|
|
858
|
-
const isGossipAttestation = attestationOrBytes.serializedData !== null;
|
|
859
|
-
|
|
860
|
-
if (isForkPostElectra(fork)) {
|
|
861
|
-
if (isGossipAttestation) {
|
|
862
|
-
return getCommitteeIndexFromSingleAttestationSerialized(ForkName.electra, attestationOrBytes.serializedData);
|
|
863
|
-
}
|
|
864
|
-
return (attestationOrBytes.attestation as SingleAttestation<ForkPostElectra>).committeeIndex;
|
|
865
|
-
}
|
|
866
|
-
if (isGossipAttestation) {
|
|
867
|
-
return getCommitteeIndexFromSingleAttestationSerialized(ForkName.phase0, attestationOrBytes.serializedData);
|
|
868
|
-
}
|
|
869
|
-
return (attestationOrBytes.attestation as SingleAttestation<ForkPreElectra>).data.index;
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
/**
|
|
873
|
-
* Convert pre-electra single attestation (`phase0.Attestation`) to post-electra `SingleAttestation`
|
|
874
|
-
*/
|
|
875
|
-
export function toElectraSingleAttestation(
|
|
876
|
-
attestation: SingleAttestation<ForkPreElectra>,
|
|
877
|
-
attesterIndex: ValidatorIndex
|
|
878
|
-
): SingleAttestation<ForkPostElectra> {
|
|
879
|
-
return {
|
|
880
|
-
committeeIndex: attestation.data.index,
|
|
881
|
-
attesterIndex,
|
|
882
|
-
data: attestation.data,
|
|
883
|
-
signature: attestation.signature,
|
|
884
|
-
};
|
|
885
|
-
}
|