@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,1540 +0,0 @@
|
|
|
1
|
-
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
2
|
-
import {routes} from "@lodestar/api";
|
|
3
|
-
import {ApplicationMethods} from "@lodestar/api/server";
|
|
4
|
-
import {ExecutionStatus} from "@lodestar/fork-choice";
|
|
5
|
-
import {
|
|
6
|
-
ForkName,
|
|
7
|
-
ForkPostBellatrix,
|
|
8
|
-
ForkSeq,
|
|
9
|
-
GENESIS_SLOT,
|
|
10
|
-
SLOTS_PER_EPOCH,
|
|
11
|
-
SLOTS_PER_HISTORICAL_ROOT,
|
|
12
|
-
SYNC_COMMITTEE_SUBNET_SIZE,
|
|
13
|
-
isForkPostBellatrix,
|
|
14
|
-
isForkPostDeneb,
|
|
15
|
-
isForkPostElectra,
|
|
16
|
-
} from "@lodestar/params";
|
|
17
|
-
import {
|
|
18
|
-
CachedBeaconStateAllForks,
|
|
19
|
-
DataAvailabilityStatus,
|
|
20
|
-
attesterShufflingDecisionRoot,
|
|
21
|
-
beaconBlockToBlinded,
|
|
22
|
-
calculateCommitteeAssignments,
|
|
23
|
-
computeEpochAtSlot,
|
|
24
|
-
computeStartSlotAtEpoch,
|
|
25
|
-
createCachedBeaconState,
|
|
26
|
-
getBlockRootAtSlot,
|
|
27
|
-
getCurrentSlot,
|
|
28
|
-
loadState,
|
|
29
|
-
proposerShufflingDecisionRoot,
|
|
30
|
-
} from "@lodestar/state-transition";
|
|
31
|
-
import {
|
|
32
|
-
BLSSignature,
|
|
33
|
-
BeaconBlock,
|
|
34
|
-
BlindedBeaconBlock,
|
|
35
|
-
BlockContents,
|
|
36
|
-
Bytes32,
|
|
37
|
-
CommitteeIndex,
|
|
38
|
-
Epoch,
|
|
39
|
-
ProducedBlockSource,
|
|
40
|
-
Root,
|
|
41
|
-
Slot,
|
|
42
|
-
ValidatorIndex,
|
|
43
|
-
Wei,
|
|
44
|
-
bellatrix,
|
|
45
|
-
getValidatorStatus,
|
|
46
|
-
phase0,
|
|
47
|
-
ssz,
|
|
48
|
-
} from "@lodestar/types";
|
|
49
|
-
import {
|
|
50
|
-
TimeoutError,
|
|
51
|
-
defer,
|
|
52
|
-
formatWeiToEth,
|
|
53
|
-
fromHex,
|
|
54
|
-
prettyWeiToEth,
|
|
55
|
-
resolveOrRacePromises,
|
|
56
|
-
toHex,
|
|
57
|
-
toRootHex,
|
|
58
|
-
} from "@lodestar/utils";
|
|
59
|
-
import {MAX_BUILDER_BOOST_FACTOR} from "@lodestar/validator";
|
|
60
|
-
import {BlockInputSource} from "../../../chain/blocks/blockInput/types.js";
|
|
61
|
-
import {
|
|
62
|
-
AttestationError,
|
|
63
|
-
AttestationErrorCode,
|
|
64
|
-
GossipAction,
|
|
65
|
-
SyncCommitteeError,
|
|
66
|
-
SyncCommitteeErrorCode,
|
|
67
|
-
} from "../../../chain/errors/index.js";
|
|
68
|
-
import {ChainEvent, CheckpointHex, CommonBlockBody} from "../../../chain/index.js";
|
|
69
|
-
import {PREPARE_NEXT_SLOT_BPS} from "../../../chain/prepareNextSlot.js";
|
|
70
|
-
import {BlockType, ProduceFullDeneb} from "../../../chain/produceBlock/index.js";
|
|
71
|
-
import {RegenCaller} from "../../../chain/regen/index.js";
|
|
72
|
-
import {validateApiAggregateAndProof} from "../../../chain/validation/index.js";
|
|
73
|
-
import {validateSyncCommitteeGossipContributionAndProof} from "../../../chain/validation/syncCommitteeContributionAndProof.js";
|
|
74
|
-
import {ZERO_HASH} from "../../../constants/index.js";
|
|
75
|
-
import {BuilderStatus, NoBidReceived} from "../../../execution/builder/http.js";
|
|
76
|
-
import {validateGossipFnRetryUnknownRoot} from "../../../network/processor/gossipHandlers.js";
|
|
77
|
-
import {CommitteeSubscription} from "../../../network/subnets/index.js";
|
|
78
|
-
import {SyncState} from "../../../sync/index.js";
|
|
79
|
-
import {callInNextEventLoop} from "../../../util/eventLoop.js";
|
|
80
|
-
import {isOptimisticBlock} from "../../../util/forkChoice.js";
|
|
81
|
-
import {getDefaultGraffiti, toGraffitiBytes} from "../../../util/graffiti.js";
|
|
82
|
-
import {getLodestarClientVersion} from "../../../util/metadata.js";
|
|
83
|
-
import {ApiOptions} from "../../options.js";
|
|
84
|
-
import {getStateResponseWithRegen} from "../beacon/state/utils.js";
|
|
85
|
-
import {ApiError, NodeIsSyncing, OnlySupportedByDVT} from "../errors.js";
|
|
86
|
-
import {ApiModules} from "../types.js";
|
|
87
|
-
import {computeSubnetForCommitteesAtSlot, getPubkeysForIndices, selectBlockProductionSource} from "./utils.js";
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* If the node is within this many epochs from the head, we declare it to be synced regardless of
|
|
91
|
-
* the network sync state.
|
|
92
|
-
*
|
|
93
|
-
* This helps prevent attacks where nodes can convince us that we're syncing some non-existent
|
|
94
|
-
* finalized head.
|
|
95
|
-
*
|
|
96
|
-
* TODO: Lighthouse uses 8 for the attack described above. However, 8 kills Lodestar since validators
|
|
97
|
-
* can trigger regen to fast-forward head state 8 epochs to be immediately invalidated as sync sets
|
|
98
|
-
* a new head. Then the checkpoint state cache grows unbounded with very different states (because
|
|
99
|
-
* they are 8 epochs apart) and causes an OOM. Research a proper solution once regen and the state
|
|
100
|
-
* caches are better.
|
|
101
|
-
*/
|
|
102
|
-
export const SYNC_TOLERANCE_EPOCHS = 1;
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Cutoff time to wait from start of the slot for execution and builder block production apis to resolve.
|
|
106
|
-
* Post this time, race execution and builder to pick whatever resolves first.
|
|
107
|
-
*
|
|
108
|
-
* Empirically the builder block resolves in ~1 second, and execution block resolves in <500 ms.
|
|
109
|
-
* A cutoff of 2 seconds gives enough time and if there are unexpected delays it ensures we publish
|
|
110
|
-
* in time as proposals post 4 seconds into the slot will likely be orphaned due to proposer boost reorg.
|
|
111
|
-
*
|
|
112
|
-
* TODO GLOAS: re-evaluate cutoff timing
|
|
113
|
-
*/
|
|
114
|
-
const BLOCK_PRODUCTION_RACE_CUTOFF_MS = 2_000;
|
|
115
|
-
/** Overall timeout for execution and block production apis */
|
|
116
|
-
const BLOCK_PRODUCTION_RACE_TIMEOUT_MS = 12_000;
|
|
117
|
-
|
|
118
|
-
type ProduceBlockContentsRes = {executionPayloadValue: Wei; consensusBlockValue: Wei} & {
|
|
119
|
-
data: BlockContents;
|
|
120
|
-
version: ForkName;
|
|
121
|
-
};
|
|
122
|
-
type ProduceBlindedBlockRes = {executionPayloadValue: Wei; consensusBlockValue: Wei} & {
|
|
123
|
-
data: BlindedBeaconBlock;
|
|
124
|
-
version: ForkPostBellatrix;
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
type ProduceBlindedBlockOrBlockContentsRes = {executionPayloadSource: ProducedBlockSource} & (
|
|
128
|
-
| (ProduceBlockContentsRes & {executionPayloadBlinded: false})
|
|
129
|
-
| (ProduceBlindedBlockRes & {executionPayloadBlinded: true})
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Engine block selection reasons tracked in metrics / logs
|
|
134
|
-
*/
|
|
135
|
-
export enum EngineBlockSelectionReason {
|
|
136
|
-
BuilderDisabled = "builder_disabled",
|
|
137
|
-
BuilderError = "builder_error",
|
|
138
|
-
BuilderTimeout = "builder_timeout",
|
|
139
|
-
BuilderPending = "builder_pending",
|
|
140
|
-
BuilderNoBid = "builder_no_bid",
|
|
141
|
-
BuilderCensorship = "builder_censorship",
|
|
142
|
-
BlockValue = "block_value",
|
|
143
|
-
EnginePreferred = "engine_preferred",
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Builder block selection reasons tracked in metrics / logs
|
|
148
|
-
*/
|
|
149
|
-
export enum BuilderBlockSelectionReason {
|
|
150
|
-
EngineDisabled = "engine_disabled",
|
|
151
|
-
EngineError = "engine_error",
|
|
152
|
-
EnginePending = "engine_pending",
|
|
153
|
-
BlockValue = "block_value",
|
|
154
|
-
BuilderPreferred = "builder_preferred",
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export type BlockSelectionResult =
|
|
158
|
-
| {
|
|
159
|
-
source: ProducedBlockSource.engine;
|
|
160
|
-
reason: EngineBlockSelectionReason;
|
|
161
|
-
}
|
|
162
|
-
| {
|
|
163
|
-
source: ProducedBlockSource.builder;
|
|
164
|
-
reason: BuilderBlockSelectionReason;
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Server implementation for handling validator duties.
|
|
169
|
-
* See `@lodestar/validator/src/api` for the client implementation).
|
|
170
|
-
*/
|
|
171
|
-
export function getValidatorApi(
|
|
172
|
-
opts: ApiOptions,
|
|
173
|
-
{chain, config, logger, metrics, network, sync}: ApiModules
|
|
174
|
-
): ApplicationMethods<routes.validator.Endpoints> {
|
|
175
|
-
let genesisBlockRoot: Root | null = null;
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Validator clock may be advanced from beacon's clock. If the validator requests a resource in a
|
|
179
|
-
* future slot, wait some time instead of rejecting the request because it's in the future.
|
|
180
|
-
* This value is the same to MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC.
|
|
181
|
-
* For very fast networks, reduce clock disparity to half a slot.
|
|
182
|
-
*/
|
|
183
|
-
const MAX_API_CLOCK_DISPARITY_SEC = Math.min(0.5, config.SECONDS_PER_SLOT / 2);
|
|
184
|
-
const MAX_API_CLOCK_DISPARITY_MS = MAX_API_CLOCK_DISPARITY_SEC * 1000;
|
|
185
|
-
|
|
186
|
-
/** Compute and cache the genesis block root */
|
|
187
|
-
async function getGenesisBlockRoot(state: CachedBeaconStateAllForks): Promise<Root> {
|
|
188
|
-
if (!genesisBlockRoot) {
|
|
189
|
-
// Close to genesis the genesis block may not be available in the DB
|
|
190
|
-
if (state.slot < SLOTS_PER_HISTORICAL_ROOT) {
|
|
191
|
-
genesisBlockRoot = state.blockRoots.get(0);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const blockRes = await chain.getCanonicalBlockAtSlot(GENESIS_SLOT);
|
|
195
|
-
if (blockRes) {
|
|
196
|
-
genesisBlockRoot = config
|
|
197
|
-
.getForkTypes(blockRes.block.message.slot)
|
|
198
|
-
.SignedBeaconBlock.hashTreeRoot(blockRes.block);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// If for some reason the genesisBlockRoot is not able don't prevent validators from
|
|
203
|
-
// proposing or attesting. If the genesisBlockRoot is wrong, at worst it may trigger a re-fetch of the duties
|
|
204
|
-
return genesisBlockRoot || ZERO_HASH;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* If advancing the local clock `MAX_API_CLOCK_DISPARITY_MS` ticks to the requested slot, wait for its start
|
|
209
|
-
* Prevents the validator from getting errors from the API if the clock is a bit advanced
|
|
210
|
-
*/
|
|
211
|
-
async function waitForSlot(slot: Slot): Promise<void> {
|
|
212
|
-
if (slot <= 0) {
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const slotStartSec = chain.genesisTime + slot * config.SECONDS_PER_SLOT;
|
|
217
|
-
const msToSlot = slotStartSec * 1000 - Date.now();
|
|
218
|
-
|
|
219
|
-
if (msToSlot > MAX_API_CLOCK_DISPARITY_MS) {
|
|
220
|
-
throw Error(`Requested slot ${slot} is in the future`);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
if (msToSlot > 0) {
|
|
224
|
-
await chain.clock.waitForSlot(slot);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// else, clock already in slot or slot is in the past
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* If advancing the local clock `MAX_API_CLOCK_DISPARITY_MS` ticks to the next epoch, wait for slot 0 of the next epoch.
|
|
232
|
-
* Prevents a validator from not being able to get the attestater duties correctly if the beacon and validator clocks are off
|
|
233
|
-
*/
|
|
234
|
-
async function waitForNextClosestEpoch(): Promise<void> {
|
|
235
|
-
const toNextEpochMs = msToNextEpoch();
|
|
236
|
-
if (toNextEpochMs > 0 && toNextEpochMs < MAX_API_CLOCK_DISPARITY_MS) {
|
|
237
|
-
const nextEpoch = chain.clock.currentEpoch + 1;
|
|
238
|
-
await chain.clock.waitForSlot(computeStartSlotAtEpoch(nextEpoch));
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Compute ms to the next epoch.
|
|
244
|
-
*/
|
|
245
|
-
function msToNextEpoch(): number {
|
|
246
|
-
const nextEpoch = chain.clock.currentEpoch + 1;
|
|
247
|
-
const secPerEpoch = SLOTS_PER_EPOCH * config.SECONDS_PER_SLOT;
|
|
248
|
-
const nextEpochStartSec = chain.genesisTime + nextEpoch * secPerEpoch;
|
|
249
|
-
return nextEpochStartSec * 1000 - Date.now();
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function currentEpochWithDisparity(): Epoch {
|
|
253
|
-
return computeEpochAtSlot(getCurrentSlot(config, chain.genesisTime - MAX_API_CLOCK_DISPARITY_SEC));
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function getBlockValueLogInfo(
|
|
257
|
-
block: {executionPayloadValue: bigint; consensusBlockValue: bigint},
|
|
258
|
-
source?: ProducedBlockSource
|
|
259
|
-
): Record<string, string> {
|
|
260
|
-
const executionValue = block.executionPayloadValue;
|
|
261
|
-
const consensusValue = block.consensusBlockValue;
|
|
262
|
-
const totalValue = executionValue + consensusValue;
|
|
263
|
-
|
|
264
|
-
if (source == null) {
|
|
265
|
-
return {
|
|
266
|
-
executionPayloadValue: prettyWeiToEth(executionValue),
|
|
267
|
-
consensusBlockValue: prettyWeiToEth(consensusValue),
|
|
268
|
-
blockTotalValue: prettyWeiToEth(totalValue),
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
if (source === ProducedBlockSource.builder) {
|
|
272
|
-
return {
|
|
273
|
-
builderExecutionPayloadValue: prettyWeiToEth(executionValue),
|
|
274
|
-
builderConsensusBlockValue: prettyWeiToEth(consensusValue),
|
|
275
|
-
builderBlockTotalValue: prettyWeiToEth(totalValue),
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
return {
|
|
279
|
-
engineExecutionPayloadValue: prettyWeiToEth(executionValue),
|
|
280
|
-
engineConsensusBlockValue: prettyWeiToEth(consensusValue),
|
|
281
|
-
engineBlockTotalValue: prettyWeiToEth(totalValue),
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* This function is called 1s before next epoch, usually at that time PrepareNextSlotScheduler finishes
|
|
287
|
-
* so we should have checkpoint state, otherwise wait for up to the slot 1 of epoch.
|
|
288
|
-
* slot epoch 0 1
|
|
289
|
-
* |------------|------------|
|
|
290
|
-
* ^ ^
|
|
291
|
-
* | |
|
|
292
|
-
* | |
|
|
293
|
-
* | waitForCheckpointState (1s before slot 0 of epoch, wait until slot 1 of epoch)
|
|
294
|
-
* |
|
|
295
|
-
* prepareNextSlot (4s before next slot)
|
|
296
|
-
*/
|
|
297
|
-
async function waitForCheckpointState(cpHex: CheckpointHex): Promise<CachedBeaconStateAllForks | null> {
|
|
298
|
-
const cpState = chain.regen.getCheckpointStateSync(cpHex);
|
|
299
|
-
if (cpState) {
|
|
300
|
-
return cpState;
|
|
301
|
-
}
|
|
302
|
-
const cp = {
|
|
303
|
-
epoch: cpHex.epoch,
|
|
304
|
-
root: fromHex(cpHex.rootHex),
|
|
305
|
-
};
|
|
306
|
-
const slot0 = computeStartSlotAtEpoch(cp.epoch);
|
|
307
|
-
// if not, wait for ChainEvent.checkpoint event until slot 1 of epoch
|
|
308
|
-
let listener: ((eventCp: phase0.Checkpoint) => void) | null = null;
|
|
309
|
-
const foundCPState = await Promise.race([
|
|
310
|
-
new Promise((resolve) => {
|
|
311
|
-
listener = (eventCp) => {
|
|
312
|
-
resolve(ssz.phase0.Checkpoint.equals(eventCp, cp));
|
|
313
|
-
};
|
|
314
|
-
chain.emitter.once(ChainEvent.checkpoint, listener);
|
|
315
|
-
}),
|
|
316
|
-
// in rare case, checkpoint state cache may happen up to 6s of slot 0 of epoch
|
|
317
|
-
// so we wait for it until the slot 1 of epoch
|
|
318
|
-
chain.clock.waitForSlot(slot0 + 1),
|
|
319
|
-
]);
|
|
320
|
-
|
|
321
|
-
if (listener != null) {
|
|
322
|
-
chain.emitter.off(ChainEvent.checkpoint, listener);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
if (foundCPState === true) {
|
|
326
|
-
return chain.regen.getCheckpointStateSync(cpHex);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
return null;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
* Reject any request while the node is syncing
|
|
334
|
-
*/
|
|
335
|
-
function notWhileSyncing(): void {
|
|
336
|
-
// Consider node synced before or close to genesis
|
|
337
|
-
if (chain.clock.currentSlot < SLOTS_PER_EPOCH) {
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
const syncState = sync.state;
|
|
342
|
-
switch (syncState) {
|
|
343
|
-
case SyncState.SyncingFinalized:
|
|
344
|
-
case SyncState.SyncingHead: {
|
|
345
|
-
const currentSlot = chain.clock.currentSlot;
|
|
346
|
-
const headSlot = chain.forkChoice.getHead().slot;
|
|
347
|
-
if (currentSlot - headSlot > SYNC_TOLERANCE_EPOCHS * SLOTS_PER_EPOCH) {
|
|
348
|
-
throw new NodeIsSyncing(`headSlot ${headSlot} currentSlot ${currentSlot}`);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
return;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
case SyncState.Synced:
|
|
355
|
-
return;
|
|
356
|
-
|
|
357
|
-
case SyncState.Stalled:
|
|
358
|
-
throw new NodeIsSyncing("waiting for peers");
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Post merge, the CL and EL could be out of step in the sync, and could result in
|
|
364
|
-
* Syncing status of the chain head. To be precise:
|
|
365
|
-
* 1. CL could be ahead of the EL, with the validity of head payload not yet verified
|
|
366
|
-
* 2. CL could be on an invalid chain of execution blocks with a non-existent
|
|
367
|
-
* or non-available parent that never syncs up
|
|
368
|
-
*
|
|
369
|
-
* Both the above scenarios could be problematic and hence validator shouldn't participate
|
|
370
|
-
* or weigh its vote on a head till it resolves to a Valid execution status.
|
|
371
|
-
* Following activities should be skipped on an Optimistic head (with Syncing status):
|
|
372
|
-
* 1. Attestation if targetRoot is optimistic
|
|
373
|
-
* 2. SyncCommitteeContribution if if the root for which to produce contribution is Optimistic.
|
|
374
|
-
* 3. ProduceBlock if the parentRoot (chain's current head is optimistic). However this doesn't
|
|
375
|
-
* need to be checked/aborted here as assembleBody would call EL's api for the latest
|
|
376
|
-
* executionStatus of the parentRoot. If still not validated, produceBlock will throw error.
|
|
377
|
-
*
|
|
378
|
-
* TODO/PENDING: SyncCommitteeSignatures should also be aborted, the best way to address this
|
|
379
|
-
* is still in flux and will be updated as and when other CL's figure this out.
|
|
380
|
-
*/
|
|
381
|
-
|
|
382
|
-
function notOnOptimisticBlockRoot(beaconBlockRoot: Root): void {
|
|
383
|
-
const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
|
|
384
|
-
if (!protoBeaconBlock) {
|
|
385
|
-
throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
if (protoBeaconBlock.executionStatus === ExecutionStatus.Syncing)
|
|
389
|
-
throw new NodeIsSyncing(
|
|
390
|
-
`Block's execution payload not yet validated, executionPayloadBlockHash=${protoBeaconBlock.executionPayloadBlockHash} number=${protoBeaconBlock.executionPayloadNumber}`
|
|
391
|
-
);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
function notOnOutOfRangeData(beaconBlockRoot: Root): void {
|
|
395
|
-
const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
|
|
396
|
-
if (!protoBeaconBlock) {
|
|
397
|
-
throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
if (protoBeaconBlock.dataAvailabilityStatus === DataAvailabilityStatus.OutOfRange)
|
|
401
|
-
throw new NodeIsSyncing("Block's data is out of range and not validated");
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
async function produceBuilderBlindedBlock(
|
|
405
|
-
slot: Slot,
|
|
406
|
-
randaoReveal: BLSSignature,
|
|
407
|
-
graffiti: Bytes32,
|
|
408
|
-
// as of now fee recipient checks can not be performed because builder does not return bid recipient
|
|
409
|
-
{
|
|
410
|
-
commonBlockBodyPromise,
|
|
411
|
-
parentBlockRoot,
|
|
412
|
-
parentSlot,
|
|
413
|
-
}: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
|
|
414
|
-
commonBlockBodyPromise: Promise<CommonBlockBody>;
|
|
415
|
-
parentBlockRoot: Root;
|
|
416
|
-
parentSlot: Slot;
|
|
417
|
-
}
|
|
418
|
-
): Promise<ProduceBlindedBlockRes> {
|
|
419
|
-
const version = config.getForkName(slot);
|
|
420
|
-
if (!isForkPostBellatrix(version)) {
|
|
421
|
-
throw Error(`Invalid fork=${version} for produceBuilderBlindedBlock`);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
const source = ProducedBlockSource.builder;
|
|
425
|
-
metrics?.blockProductionRequests.inc({source});
|
|
426
|
-
|
|
427
|
-
// Error early for builder if builder flow not active
|
|
428
|
-
if (!chain.executionBuilder) {
|
|
429
|
-
throw Error("External builder not configured");
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
switch (chain.executionBuilder.status) {
|
|
433
|
-
case BuilderStatus.disabled:
|
|
434
|
-
throw Error("External builder disabled due to failed status check");
|
|
435
|
-
case BuilderStatus.circuitBreaker:
|
|
436
|
-
throw Error("External builder circuit breaker is activated");
|
|
437
|
-
case BuilderStatus.enabled:
|
|
438
|
-
// continue
|
|
439
|
-
break;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
let timer: undefined | ((opts: {source: ProducedBlockSource}) => number);
|
|
443
|
-
try {
|
|
444
|
-
timer = metrics?.blockProductionTime.startTimer();
|
|
445
|
-
const {block, executionPayloadValue, consensusBlockValue} = await chain.produceBlindedBlock({
|
|
446
|
-
slot,
|
|
447
|
-
parentBlockRoot,
|
|
448
|
-
parentSlot,
|
|
449
|
-
randaoReveal,
|
|
450
|
-
graffiti,
|
|
451
|
-
commonBlockBodyPromise,
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
metrics?.blockProductionSuccess.inc({source});
|
|
455
|
-
metrics?.blockProductionNumAggregated.observe({source}, block.body.attestations.length);
|
|
456
|
-
metrics?.blockProductionConsensusBlockValue.observe({source}, Number(formatWeiToEth(consensusBlockValue)));
|
|
457
|
-
metrics?.blockProductionExecutionPayloadValue.observe({source}, Number(formatWeiToEth(executionPayloadValue)));
|
|
458
|
-
logger.verbose("Produced blinded block", {
|
|
459
|
-
slot,
|
|
460
|
-
executionPayloadValue,
|
|
461
|
-
consensusBlockValue,
|
|
462
|
-
root: toRootHex(config.getPostBellatrixForkTypes(slot).BlindedBeaconBlock.hashTreeRoot(block)),
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
if (chain.opts.persistProducedBlocks) {
|
|
466
|
-
void chain.persistBlock(block, "produced_builder_block");
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
return {data: block, version, executionPayloadValue, consensusBlockValue};
|
|
470
|
-
} finally {
|
|
471
|
-
if (timer) timer({source});
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
async function produceEngineBlockContents(
|
|
476
|
-
slot: Slot,
|
|
477
|
-
randaoReveal: BLSSignature,
|
|
478
|
-
graffiti: Bytes32,
|
|
479
|
-
{
|
|
480
|
-
feeRecipient,
|
|
481
|
-
strictFeeRecipientCheck,
|
|
482
|
-
commonBlockBodyPromise,
|
|
483
|
-
parentBlockRoot,
|
|
484
|
-
parentSlot,
|
|
485
|
-
}: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
|
|
486
|
-
commonBlockBodyPromise: Promise<CommonBlockBody>;
|
|
487
|
-
parentBlockRoot: Root;
|
|
488
|
-
parentSlot: Slot;
|
|
489
|
-
}
|
|
490
|
-
): Promise<ProduceBlockContentsRes & {shouldOverrideBuilder?: boolean}> {
|
|
491
|
-
const source = ProducedBlockSource.engine;
|
|
492
|
-
metrics?.blockProductionRequests.inc({source});
|
|
493
|
-
|
|
494
|
-
let timer: undefined | ((opts: {source: ProducedBlockSource}) => number);
|
|
495
|
-
try {
|
|
496
|
-
timer = metrics?.blockProductionTime.startTimer();
|
|
497
|
-
const {block, executionPayloadValue, consensusBlockValue, shouldOverrideBuilder} = await chain.produceBlock({
|
|
498
|
-
slot,
|
|
499
|
-
parentBlockRoot,
|
|
500
|
-
parentSlot,
|
|
501
|
-
randaoReveal,
|
|
502
|
-
graffiti,
|
|
503
|
-
feeRecipient,
|
|
504
|
-
commonBlockBodyPromise,
|
|
505
|
-
});
|
|
506
|
-
const version = config.getForkName(block.slot);
|
|
507
|
-
if (strictFeeRecipientCheck && feeRecipient && isForkPostBellatrix(version)) {
|
|
508
|
-
const blockFeeRecipient = toHex((block as bellatrix.BeaconBlock).body.executionPayload.feeRecipient);
|
|
509
|
-
if (blockFeeRecipient !== feeRecipient) {
|
|
510
|
-
throw Error(`Invalid feeRecipient set in engine block expected=${feeRecipient} actual=${blockFeeRecipient}`);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
metrics?.blockProductionSuccess.inc({source});
|
|
515
|
-
metrics?.blockProductionNumAggregated.observe({source}, block.body.attestations.length);
|
|
516
|
-
metrics?.blockProductionConsensusBlockValue.observe({source}, Number(formatWeiToEth(consensusBlockValue)));
|
|
517
|
-
metrics?.blockProductionExecutionPayloadValue.observe({source}, Number(formatWeiToEth(executionPayloadValue)));
|
|
518
|
-
|
|
519
|
-
const blockRoot = toRootHex(config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block));
|
|
520
|
-
logger.verbose("Produced execution block", {
|
|
521
|
-
slot,
|
|
522
|
-
executionPayloadValue,
|
|
523
|
-
consensusBlockValue,
|
|
524
|
-
root: blockRoot,
|
|
525
|
-
});
|
|
526
|
-
if (chain.opts.persistProducedBlocks) {
|
|
527
|
-
void chain.persistBlock(block, "produced_engine_block");
|
|
528
|
-
}
|
|
529
|
-
if (isForkPostDeneb(version)) {
|
|
530
|
-
const produceResult = chain.blockProductionCache.get(blockRoot);
|
|
531
|
-
if (produceResult === undefined) {
|
|
532
|
-
throw Error("production result missing in cache");
|
|
533
|
-
}
|
|
534
|
-
if (!isForkPostDeneb(produceResult.fork)) {
|
|
535
|
-
throw Error("production result is for pre-deneb fork");
|
|
536
|
-
}
|
|
537
|
-
if (produceResult.type !== BlockType.Full) {
|
|
538
|
-
throw Error("production result is not full block");
|
|
539
|
-
}
|
|
540
|
-
const blobsBundle = (produceResult as ProduceFullDeneb).blobsBundle;
|
|
541
|
-
|
|
542
|
-
return {
|
|
543
|
-
data: {
|
|
544
|
-
block,
|
|
545
|
-
blobs: blobsBundle.blobs,
|
|
546
|
-
kzgProofs: blobsBundle.proofs,
|
|
547
|
-
},
|
|
548
|
-
version,
|
|
549
|
-
executionPayloadValue,
|
|
550
|
-
consensusBlockValue,
|
|
551
|
-
shouldOverrideBuilder,
|
|
552
|
-
};
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
return {data: {block}, version, executionPayloadValue, consensusBlockValue, shouldOverrideBuilder};
|
|
556
|
-
} finally {
|
|
557
|
-
if (timer) timer({source});
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
async function produceEngineOrBuilderBlock(
|
|
562
|
-
slot: Slot,
|
|
563
|
-
randaoReveal: BLSSignature,
|
|
564
|
-
graffiti?: string,
|
|
565
|
-
// TODO deneb: skip randao verification
|
|
566
|
-
_skipRandaoVerification?: boolean,
|
|
567
|
-
builderBoostFactor?: bigint,
|
|
568
|
-
{feeRecipient, builderSelection, strictFeeRecipientCheck}: routes.validator.ExtraProduceBlockOpts = {}
|
|
569
|
-
): Promise<ProduceBlindedBlockOrBlockContentsRes> {
|
|
570
|
-
notWhileSyncing();
|
|
571
|
-
await waitForSlot(slot); // Must never request for a future slot > currentSlot
|
|
572
|
-
|
|
573
|
-
const {blockRoot: parentBlockRootHex, slot: parentSlot} = chain.getProposerHead(slot);
|
|
574
|
-
const parentBlockRoot = fromHex(parentBlockRootHex);
|
|
575
|
-
notOnOutOfRangeData(parentBlockRoot);
|
|
576
|
-
metrics?.blockProductionSlotDelta.set(slot - parentSlot);
|
|
577
|
-
|
|
578
|
-
const fork = config.getForkName(slot);
|
|
579
|
-
// set some sensible opts
|
|
580
|
-
// builderSelection will be deprecated and will run in mode MaxProfit if builder is enabled
|
|
581
|
-
// and the actual selection will be determined using builderBoostFactor passed by the validator
|
|
582
|
-
builderSelection = builderSelection ?? routes.validator.BuilderSelection.MaxProfit;
|
|
583
|
-
builderBoostFactor = builderBoostFactor ?? BigInt(100);
|
|
584
|
-
if (builderBoostFactor > MAX_BUILDER_BOOST_FACTOR) {
|
|
585
|
-
throw new ApiError(400, `Invalid builderBoostFactor=${builderBoostFactor} > MAX_BUILDER_BOOST_FACTOR`);
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
const isBuilderEnabled =
|
|
589
|
-
ForkSeq[fork] >= ForkSeq.bellatrix &&
|
|
590
|
-
chain.executionBuilder !== undefined &&
|
|
591
|
-
builderSelection !== routes.validator.BuilderSelection.ExecutionOnly;
|
|
592
|
-
|
|
593
|
-
// At any point either the builder or execution or both flows should be active.
|
|
594
|
-
//
|
|
595
|
-
// Ideally such a scenario should be prevented on startup, but proposerSettingsFile or keymanager
|
|
596
|
-
// configurations could cause a validator pubkey to have builder disabled with builder selection builder only
|
|
597
|
-
// (TODO: independently make sure such an options update is not successful for a validator pubkey)
|
|
598
|
-
//
|
|
599
|
-
// So if builder is disabled ignore builder selection of builder only if caused by user mistake
|
|
600
|
-
// https://github.com/ChainSafe/lodestar/issues/6338
|
|
601
|
-
const isEngineEnabled = !isBuilderEnabled || builderSelection !== routes.validator.BuilderSelection.BuilderOnly;
|
|
602
|
-
|
|
603
|
-
if (!isEngineEnabled && !isBuilderEnabled) {
|
|
604
|
-
throw Error(
|
|
605
|
-
`Internal Error: Neither builder nor execution proposal flow activated isBuilderEnabled=${isBuilderEnabled} builderSelection=${builderSelection}`
|
|
606
|
-
);
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
const graffitiBytes = toGraffitiBytes(
|
|
610
|
-
graffiti ?? getDefaultGraffiti(getLodestarClientVersion(opts), chain.executionEngine.clientVersion, opts)
|
|
611
|
-
);
|
|
612
|
-
|
|
613
|
-
const loggerContext = {
|
|
614
|
-
slot,
|
|
615
|
-
parentSlot,
|
|
616
|
-
parentBlockRoot: parentBlockRootHex,
|
|
617
|
-
fork,
|
|
618
|
-
builderSelection,
|
|
619
|
-
isBuilderEnabled,
|
|
620
|
-
isEngineEnabled,
|
|
621
|
-
strictFeeRecipientCheck,
|
|
622
|
-
// winston logger doesn't like bigint
|
|
623
|
-
builderBoostFactor: `${builderBoostFactor}`,
|
|
624
|
-
};
|
|
625
|
-
|
|
626
|
-
logger.verbose("Assembling block with produceEngineOrBuilderBlock", loggerContext);
|
|
627
|
-
|
|
628
|
-
// Defer common block body production to make sure we sent async builder and engine requests before
|
|
629
|
-
const deferredCommonBlockBody = defer<CommonBlockBody>();
|
|
630
|
-
const commonBlockBodyPromise = deferredCommonBlockBody.promise;
|
|
631
|
-
|
|
632
|
-
// use abort controller to stop waiting for both block sources
|
|
633
|
-
const controller = new AbortController();
|
|
634
|
-
|
|
635
|
-
// Start calls for building execution and builder blocks
|
|
636
|
-
const builderPromise = isBuilderEnabled
|
|
637
|
-
? produceBuilderBlindedBlock(slot, randaoReveal, graffitiBytes, {
|
|
638
|
-
feeRecipient,
|
|
639
|
-
// can't do fee recipient checks as builder bid doesn't return feeRecipient as of now
|
|
640
|
-
strictFeeRecipientCheck: false,
|
|
641
|
-
commonBlockBodyPromise,
|
|
642
|
-
parentBlockRoot,
|
|
643
|
-
parentSlot,
|
|
644
|
-
})
|
|
645
|
-
: Promise.reject(new Error("Builder disabled"));
|
|
646
|
-
|
|
647
|
-
const enginePromise = isEngineEnabled
|
|
648
|
-
? produceEngineBlockContents(slot, randaoReveal, graffitiBytes, {
|
|
649
|
-
feeRecipient,
|
|
650
|
-
strictFeeRecipientCheck,
|
|
651
|
-
commonBlockBodyPromise,
|
|
652
|
-
parentBlockRoot,
|
|
653
|
-
parentSlot,
|
|
654
|
-
}).then((engineBlock) => {
|
|
655
|
-
// Once the engine returns a block, in the event of either:
|
|
656
|
-
// - suspected builder censorship
|
|
657
|
-
// - builder boost factor set to 0 or builder selection `executionalways`
|
|
658
|
-
// we don't need to wait for builder block as engine block will always be selected
|
|
659
|
-
if (
|
|
660
|
-
engineBlock.shouldOverrideBuilder ||
|
|
661
|
-
builderBoostFactor === BigInt(0) ||
|
|
662
|
-
builderSelection === routes.validator.BuilderSelection.ExecutionAlways
|
|
663
|
-
) {
|
|
664
|
-
controller.abort();
|
|
665
|
-
}
|
|
666
|
-
return engineBlock;
|
|
667
|
-
})
|
|
668
|
-
: Promise.reject(new Error("Engine disabled"));
|
|
669
|
-
|
|
670
|
-
// Calculate cutoff time based on start of the slot
|
|
671
|
-
const cutoffMs = Math.max(0, BLOCK_PRODUCTION_RACE_CUTOFF_MS - chain.clock.msFromSlot(slot));
|
|
672
|
-
|
|
673
|
-
logger.verbose("Block production race (builder vs execution) starting", {
|
|
674
|
-
...loggerContext,
|
|
675
|
-
cutoffMs,
|
|
676
|
-
timeoutMs: BLOCK_PRODUCTION_RACE_TIMEOUT_MS,
|
|
677
|
-
});
|
|
678
|
-
|
|
679
|
-
const blockProductionRacePromise = resolveOrRacePromises([builderPromise, enginePromise], {
|
|
680
|
-
resolveTimeoutMs: cutoffMs,
|
|
681
|
-
raceTimeoutMs: BLOCK_PRODUCTION_RACE_TIMEOUT_MS,
|
|
682
|
-
signal: controller.signal,
|
|
683
|
-
});
|
|
684
|
-
|
|
685
|
-
// Ensure builder and engine HTTP requests are sent before starting common block body production
|
|
686
|
-
// by deferring the call to next event loop iteration, allowing pending I/O operations like
|
|
687
|
-
// HTTP requests to be processed first and sent out early in slot.
|
|
688
|
-
callInNextEventLoop(() => {
|
|
689
|
-
logger.verbose("Producing common block body", loggerContext);
|
|
690
|
-
const commonBlockBodyStartedAt = Date.now();
|
|
691
|
-
|
|
692
|
-
chain
|
|
693
|
-
.produceCommonBlockBody({
|
|
694
|
-
slot,
|
|
695
|
-
parentBlockRoot,
|
|
696
|
-
parentSlot,
|
|
697
|
-
randaoReveal,
|
|
698
|
-
graffiti: graffitiBytes,
|
|
699
|
-
})
|
|
700
|
-
.then((commonBlockBody) => {
|
|
701
|
-
deferredCommonBlockBody.resolve(commonBlockBody);
|
|
702
|
-
logger.verbose("Produced common block body", {
|
|
703
|
-
...loggerContext,
|
|
704
|
-
durationMs: Date.now() - commonBlockBodyStartedAt,
|
|
705
|
-
});
|
|
706
|
-
})
|
|
707
|
-
.catch(deferredCommonBlockBody.reject);
|
|
708
|
-
});
|
|
709
|
-
|
|
710
|
-
const [builder, engine] = await blockProductionRacePromise;
|
|
711
|
-
|
|
712
|
-
if (builder.status === "pending" && engine.status === "pending") {
|
|
713
|
-
throw Error("Builder and engine both failed to produce the block within timeout");
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
if (builder.status === "pending" && !isEngineEnabled) {
|
|
717
|
-
throw Error("Builder failed to produce the block within timeout");
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
if (engine.status === "pending" && !isBuilderEnabled) {
|
|
721
|
-
throw Error("Engine failed to produce the block within timeout");
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
if (isEngineEnabled) {
|
|
725
|
-
if (engine.status === "rejected") {
|
|
726
|
-
logger.warn(
|
|
727
|
-
"Engine failed to produce the block",
|
|
728
|
-
{
|
|
729
|
-
...loggerContext,
|
|
730
|
-
durationMs: engine.durationMs,
|
|
731
|
-
},
|
|
732
|
-
engine.reason
|
|
733
|
-
);
|
|
734
|
-
} else if (engine.status === "pending") {
|
|
735
|
-
logger.warn("Engine failed to produce the block within cutoff time", {
|
|
736
|
-
...loggerContext,
|
|
737
|
-
cutoffMs,
|
|
738
|
-
});
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
if (isBuilderEnabled) {
|
|
743
|
-
if (builder.status === "rejected") {
|
|
744
|
-
if (builder.reason instanceof NoBidReceived) {
|
|
745
|
-
logger.info("Builder did not provide a bid", {
|
|
746
|
-
...loggerContext,
|
|
747
|
-
durationMs: builder.durationMs,
|
|
748
|
-
});
|
|
749
|
-
} else {
|
|
750
|
-
logger.warn(
|
|
751
|
-
"Builder failed to produce the block",
|
|
752
|
-
{
|
|
753
|
-
...loggerContext,
|
|
754
|
-
durationMs: builder.durationMs,
|
|
755
|
-
},
|
|
756
|
-
builder.reason
|
|
757
|
-
);
|
|
758
|
-
}
|
|
759
|
-
} else if (builder.status === "pending") {
|
|
760
|
-
logger.warn("Builder failed to produce the block within cutoff time", {
|
|
761
|
-
...loggerContext,
|
|
762
|
-
cutoffMs,
|
|
763
|
-
});
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
if (builder.status === "rejected" && engine.status === "rejected") {
|
|
768
|
-
throw Error(
|
|
769
|
-
`${isBuilderEnabled && isEngineEnabled ? "Builder and engine both" : isBuilderEnabled ? "Builder" : "Engine"} failed to produce the block`
|
|
770
|
-
);
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
// handle shouldOverrideBuilder separately
|
|
774
|
-
if (engine.status === "fulfilled" && engine.value.shouldOverrideBuilder) {
|
|
775
|
-
logger.info("Selected engine block: censorship suspected in builder blocks", {
|
|
776
|
-
...loggerContext,
|
|
777
|
-
durationMs: engine.durationMs,
|
|
778
|
-
shouldOverrideBuilder: engine.value.shouldOverrideBuilder,
|
|
779
|
-
...getBlockValueLogInfo(engine.value),
|
|
780
|
-
});
|
|
781
|
-
|
|
782
|
-
metrics?.blockProductionSelectionResults.inc({
|
|
783
|
-
source: ProducedBlockSource.engine,
|
|
784
|
-
reason: EngineBlockSelectionReason.BuilderCensorship,
|
|
785
|
-
});
|
|
786
|
-
|
|
787
|
-
return {...engine.value, executionPayloadBlinded: false, executionPayloadSource: ProducedBlockSource.engine};
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
if (builder.status === "fulfilled" && engine.status !== "fulfilled") {
|
|
791
|
-
const reason =
|
|
792
|
-
isEngineEnabled === false
|
|
793
|
-
? BuilderBlockSelectionReason.EngineDisabled
|
|
794
|
-
: engine.status === "pending"
|
|
795
|
-
? BuilderBlockSelectionReason.EnginePending
|
|
796
|
-
: BuilderBlockSelectionReason.EngineError;
|
|
797
|
-
|
|
798
|
-
logger.info("Selected builder block: no engine block produced", {
|
|
799
|
-
reason,
|
|
800
|
-
...loggerContext,
|
|
801
|
-
durationMs: builder.durationMs,
|
|
802
|
-
...getBlockValueLogInfo(builder.value),
|
|
803
|
-
});
|
|
804
|
-
|
|
805
|
-
metrics?.blockProductionSelectionResults.inc({
|
|
806
|
-
source: ProducedBlockSource.builder,
|
|
807
|
-
reason,
|
|
808
|
-
});
|
|
809
|
-
|
|
810
|
-
return {...builder.value, executionPayloadBlinded: true, executionPayloadSource: ProducedBlockSource.builder};
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
if (engine.status === "fulfilled" && builder.status !== "fulfilled") {
|
|
814
|
-
const reason =
|
|
815
|
-
isBuilderEnabled === false
|
|
816
|
-
? EngineBlockSelectionReason.BuilderDisabled
|
|
817
|
-
: builder.status === "pending"
|
|
818
|
-
? EngineBlockSelectionReason.BuilderPending
|
|
819
|
-
: builder.reason instanceof NoBidReceived
|
|
820
|
-
? EngineBlockSelectionReason.BuilderNoBid
|
|
821
|
-
: builder.reason instanceof TimeoutError
|
|
822
|
-
? EngineBlockSelectionReason.BuilderTimeout
|
|
823
|
-
: EngineBlockSelectionReason.BuilderError;
|
|
824
|
-
|
|
825
|
-
logger.info("Selected engine block: no builder block produced", {
|
|
826
|
-
reason,
|
|
827
|
-
...loggerContext,
|
|
828
|
-
durationMs: engine.durationMs,
|
|
829
|
-
...getBlockValueLogInfo(engine.value),
|
|
830
|
-
});
|
|
831
|
-
|
|
832
|
-
metrics?.blockProductionSelectionResults.inc({
|
|
833
|
-
source: ProducedBlockSource.engine,
|
|
834
|
-
reason,
|
|
835
|
-
});
|
|
836
|
-
|
|
837
|
-
return {...engine.value, executionPayloadBlinded: false, executionPayloadSource: ProducedBlockSource.engine};
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
if (engine.status === "fulfilled" && builder.status === "fulfilled") {
|
|
841
|
-
const result = selectBlockProductionSource({
|
|
842
|
-
builderExecutionPayloadValue: builder.value.executionPayloadValue,
|
|
843
|
-
engineExecutionPayloadValue: engine.value.executionPayloadValue,
|
|
844
|
-
builderBoostFactor,
|
|
845
|
-
builderSelection,
|
|
846
|
-
});
|
|
847
|
-
const executionPayloadSource = result.source;
|
|
848
|
-
|
|
849
|
-
metrics?.blockProductionSelectionResults.inc(result);
|
|
850
|
-
|
|
851
|
-
logger.info(`Selected ${executionPayloadSource} block`, {
|
|
852
|
-
reason: result.reason,
|
|
853
|
-
...loggerContext,
|
|
854
|
-
engineDurationMs: engine.durationMs,
|
|
855
|
-
...getBlockValueLogInfo(engine.value, ProducedBlockSource.engine),
|
|
856
|
-
builderDurationMs: builder.durationMs,
|
|
857
|
-
...getBlockValueLogInfo(builder.value, ProducedBlockSource.builder),
|
|
858
|
-
});
|
|
859
|
-
|
|
860
|
-
if (executionPayloadSource === ProducedBlockSource.engine) {
|
|
861
|
-
return {
|
|
862
|
-
...engine.value,
|
|
863
|
-
executionPayloadBlinded: false,
|
|
864
|
-
executionPayloadSource,
|
|
865
|
-
};
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
return {
|
|
869
|
-
...builder.value,
|
|
870
|
-
executionPayloadBlinded: true,
|
|
871
|
-
executionPayloadSource,
|
|
872
|
-
};
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
throw Error("Unreachable error occurred during the builder and execution block production");
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
return {
|
|
879
|
-
async produceBlockV3({slot, randaoReveal, graffiti, skipRandaoVerification, builderBoostFactor, ...opts}) {
|
|
880
|
-
const {data, ...meta} = await produceEngineOrBuilderBlock(
|
|
881
|
-
slot,
|
|
882
|
-
randaoReveal,
|
|
883
|
-
graffiti,
|
|
884
|
-
skipRandaoVerification,
|
|
885
|
-
builderBoostFactor,
|
|
886
|
-
opts
|
|
887
|
-
);
|
|
888
|
-
|
|
889
|
-
if (opts.blindedLocal === true && ForkSeq[meta.version] >= ForkSeq.bellatrix) {
|
|
890
|
-
if (meta.executionPayloadBlinded) {
|
|
891
|
-
return {data, meta};
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
const {block} = data as BlockContents;
|
|
895
|
-
const blindedBlock = beaconBlockToBlinded(config, block as BeaconBlock<ForkPostBellatrix>);
|
|
896
|
-
return {
|
|
897
|
-
data: blindedBlock,
|
|
898
|
-
meta: {...meta, executionPayloadBlinded: true},
|
|
899
|
-
};
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
return {data, meta};
|
|
903
|
-
},
|
|
904
|
-
|
|
905
|
-
async produceAttestationData({committeeIndex, slot}) {
|
|
906
|
-
notWhileSyncing();
|
|
907
|
-
|
|
908
|
-
await waitForSlot(slot); // Must never request for a future slot > currentSlot
|
|
909
|
-
|
|
910
|
-
// This needs a state in the same epoch as `slot` such that state.currentJustifiedCheckpoint is correct.
|
|
911
|
-
// Note: This may trigger an epoch transition if there skipped slots at the beginning of the epoch.
|
|
912
|
-
const headState = chain.getHeadState();
|
|
913
|
-
const headSlot = headState.slot;
|
|
914
|
-
const attEpoch = computeEpochAtSlot(slot);
|
|
915
|
-
const headBlockRootHex = chain.forkChoice.getHead().blockRoot;
|
|
916
|
-
const headBlockRoot = fromHex(headBlockRootHex);
|
|
917
|
-
const fork = config.getForkName(slot);
|
|
918
|
-
|
|
919
|
-
let index: CommitteeIndex;
|
|
920
|
-
if (isForkPostElectra(fork)) {
|
|
921
|
-
index = 0;
|
|
922
|
-
} else {
|
|
923
|
-
if (committeeIndex === undefined) {
|
|
924
|
-
throw new ApiError(400, `Committee index must be provided for pre-electra fork=${fork}`);
|
|
925
|
-
}
|
|
926
|
-
index = committeeIndex;
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
const beaconBlockRoot =
|
|
930
|
-
slot >= headSlot
|
|
931
|
-
? // When attesting to the head slot or later, always use the head of the chain.
|
|
932
|
-
headBlockRoot
|
|
933
|
-
: // Permit attesting to slots *prior* to the current head. This is desirable when
|
|
934
|
-
// the VC and BN are out-of-sync due to time issues or overloading.
|
|
935
|
-
getBlockRootAtSlot(headState, slot);
|
|
936
|
-
|
|
937
|
-
const targetSlot = computeStartSlotAtEpoch(attEpoch);
|
|
938
|
-
const targetRoot =
|
|
939
|
-
targetSlot >= headSlot
|
|
940
|
-
? // If the state is earlier than the target slot then the target *must* be the head block root.
|
|
941
|
-
headBlockRoot
|
|
942
|
-
: getBlockRootAtSlot(headState, targetSlot);
|
|
943
|
-
|
|
944
|
-
// Check the execution status as validator shouldn't vote on an optimistic head
|
|
945
|
-
// Check on target is sufficient as a valid target would imply a valid source
|
|
946
|
-
notOnOptimisticBlockRoot(targetRoot);
|
|
947
|
-
notOnOutOfRangeData(targetRoot);
|
|
948
|
-
|
|
949
|
-
// To get the correct source we must get a state in the same epoch as the attestation's epoch.
|
|
950
|
-
// An epoch transition may change state.currentJustifiedCheckpoint
|
|
951
|
-
const attEpochState = await chain.getHeadStateAtEpoch(attEpoch, RegenCaller.produceAttestationData);
|
|
952
|
-
|
|
953
|
-
// TODO confirm if the below is correct assertion
|
|
954
|
-
// notOnOutOfRangeData(attEpochState.currentJustifiedCheckpoint.root);
|
|
955
|
-
|
|
956
|
-
return {
|
|
957
|
-
data: {
|
|
958
|
-
slot,
|
|
959
|
-
index,
|
|
960
|
-
beaconBlockRoot,
|
|
961
|
-
source: attEpochState.currentJustifiedCheckpoint,
|
|
962
|
-
target: {epoch: attEpoch, root: targetRoot},
|
|
963
|
-
},
|
|
964
|
-
};
|
|
965
|
-
},
|
|
966
|
-
|
|
967
|
-
/**
|
|
968
|
-
* GET `/eth/v1/validator/sync_committee_contribution`
|
|
969
|
-
*
|
|
970
|
-
* Requests that the beacon node produce a sync committee contribution.
|
|
971
|
-
*
|
|
972
|
-
* https://github.com/ethereum/beacon-APIs/pull/138
|
|
973
|
-
*
|
|
974
|
-
* @param slot The slot for which a sync committee contribution should be created.
|
|
975
|
-
* @param subcommitteeIndex The subcommittee index for which to produce the contribution.
|
|
976
|
-
* @param beaconBlockRoot The block root for which to produce the contribution.
|
|
977
|
-
*/
|
|
978
|
-
async produceSyncCommitteeContribution({slot, subcommitteeIndex, beaconBlockRoot}) {
|
|
979
|
-
// when a validator is configured with multiple beacon node urls, this beaconBlockRoot may come from another beacon node
|
|
980
|
-
// and it hasn't been in our forkchoice since we haven't seen / processing that block
|
|
981
|
-
// see https://github.com/ChainSafe/lodestar/issues/5063
|
|
982
|
-
if (!chain.forkChoice.hasBlock(beaconBlockRoot)) {
|
|
983
|
-
const rootHex = toRootHex(beaconBlockRoot);
|
|
984
|
-
network.searchUnknownSlotRoot({slot, root: rootHex}, BlockInputSource.api);
|
|
985
|
-
// if result of this call is false, i.e. block hasn't seen after 1 slot then the below notOnOptimisticBlockRoot call will throw error
|
|
986
|
-
await chain.waitForBlock(slot, rootHex);
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
// Check the execution status as validator shouldn't contribute on an optimistic head
|
|
990
|
-
notOnOptimisticBlockRoot(beaconBlockRoot);
|
|
991
|
-
notOnOutOfRangeData(beaconBlockRoot);
|
|
992
|
-
|
|
993
|
-
const contribution = chain.syncCommitteeMessagePool.getContribution(subcommitteeIndex, slot, beaconBlockRoot);
|
|
994
|
-
if (!contribution) {
|
|
995
|
-
throw new ApiError(
|
|
996
|
-
404,
|
|
997
|
-
`No sync committee contribution for slot=${slot}, subnet=${subcommitteeIndex}, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`
|
|
998
|
-
);
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
metrics?.production.producedSyncContributionParticipants.observe(
|
|
1002
|
-
contribution.aggregationBits.getTrueBitIndexes().length
|
|
1003
|
-
);
|
|
1004
|
-
|
|
1005
|
-
return {data: contribution};
|
|
1006
|
-
},
|
|
1007
|
-
|
|
1008
|
-
async getProposerDuties({epoch}) {
|
|
1009
|
-
notWhileSyncing();
|
|
1010
|
-
|
|
1011
|
-
// Early check that epoch is no more than current_epoch + 1, or allow for pre-genesis
|
|
1012
|
-
const currentEpoch = currentEpochWithDisparity();
|
|
1013
|
-
const nextEpoch = currentEpoch + 1;
|
|
1014
|
-
if (currentEpoch >= 0 && epoch > nextEpoch) {
|
|
1015
|
-
throw new ApiError(400, `Requested epoch ${epoch} must not be more than one epoch in the future`);
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
|
-
const head = chain.forkChoice.getHead();
|
|
1019
|
-
let state: CachedBeaconStateAllForks | undefined = undefined;
|
|
1020
|
-
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
1021
|
-
const slotMs = config.SECONDS_PER_SLOT * 1000;
|
|
1022
|
-
const prepareNextSlotLookAheadMs = slotMs - config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS);
|
|
1023
|
-
const toNextEpochMs = msToNextEpoch();
|
|
1024
|
-
// validators may request next epoch's duties when it's close to next epoch
|
|
1025
|
-
// this is to avoid missed block proposal due to 0 epoch look ahead
|
|
1026
|
-
if (epoch === nextEpoch && toNextEpochMs < prepareNextSlotLookAheadMs) {
|
|
1027
|
-
// wait for maximum 1 slot for cp state which is the timeout of validator api
|
|
1028
|
-
const cpState = await waitForCheckpointState({rootHex: head.blockRoot, epoch});
|
|
1029
|
-
if (cpState) {
|
|
1030
|
-
state = cpState;
|
|
1031
|
-
metrics?.duties.requestNextEpochProposalDutiesHit.inc();
|
|
1032
|
-
} else {
|
|
1033
|
-
metrics?.duties.requestNextEpochProposalDutiesMiss.inc();
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
if (!state) {
|
|
1038
|
-
if (epoch >= currentEpoch - 1) {
|
|
1039
|
-
// Cached beacon state stores proposers for previous, current and next epoch. The
|
|
1040
|
-
// requested epoch is within that range, we can use the head state at current epoch
|
|
1041
|
-
state = await chain.getHeadStateAtCurrentEpoch(RegenCaller.getDuties);
|
|
1042
|
-
} else {
|
|
1043
|
-
const res = await getStateResponseWithRegen(chain, startSlot);
|
|
1044
|
-
|
|
1045
|
-
const stateViewDU =
|
|
1046
|
-
res.state instanceof Uint8Array
|
|
1047
|
-
? loadState(config, chain.getHeadState(), res.state).state
|
|
1048
|
-
: res.state.clone();
|
|
1049
|
-
|
|
1050
|
-
state = createCachedBeaconState(
|
|
1051
|
-
stateViewDU,
|
|
1052
|
-
{
|
|
1053
|
-
config: chain.config,
|
|
1054
|
-
// Not required to compute proposers
|
|
1055
|
-
pubkey2index: new PubkeyIndexMap(),
|
|
1056
|
-
index2pubkey: [],
|
|
1057
|
-
},
|
|
1058
|
-
{skipSyncPubkeys: true, skipSyncCommitteeCache: true}
|
|
1059
|
-
);
|
|
1060
|
-
|
|
1061
|
-
if (state.epochCtx.epoch !== epoch) {
|
|
1062
|
-
throw Error(`Loaded state epoch ${state.epochCtx.epoch} does not match requested epoch ${epoch}`);
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
const stateEpoch = state.epochCtx.epoch;
|
|
1068
|
-
let indexes: ValidatorIndex[] = [];
|
|
1069
|
-
|
|
1070
|
-
switch (epoch) {
|
|
1071
|
-
case stateEpoch:
|
|
1072
|
-
indexes = state.epochCtx.getBeaconProposers();
|
|
1073
|
-
break;
|
|
1074
|
-
|
|
1075
|
-
case stateEpoch + 1:
|
|
1076
|
-
// make sure shuffling is calculated and ready for next call to calculate nextProposers
|
|
1077
|
-
await chain.shufflingCache.get(state.epochCtx.nextEpoch, state.epochCtx.nextDecisionRoot);
|
|
1078
|
-
// Requesting duties for next epoch is allowed since they can be predicted with high probabilities.
|
|
1079
|
-
// @see `epochCtx.getBeaconProposersNextEpoch` JSDocs for rationale.
|
|
1080
|
-
indexes = state.epochCtx.getBeaconProposersNextEpoch();
|
|
1081
|
-
break;
|
|
1082
|
-
|
|
1083
|
-
case stateEpoch - 1: {
|
|
1084
|
-
const indexesPrevEpoch = state.epochCtx.getBeaconProposersPrevEpoch();
|
|
1085
|
-
if (indexesPrevEpoch === null) {
|
|
1086
|
-
// Should not happen as previous proposer duties should be initialized for head state
|
|
1087
|
-
// and if we load state from `Uint8Array` it will always be the state of requested epoch
|
|
1088
|
-
throw Error(`Proposer duties for previous epoch ${epoch} not yet initialized`);
|
|
1089
|
-
}
|
|
1090
|
-
indexes = indexesPrevEpoch;
|
|
1091
|
-
break;
|
|
1092
|
-
}
|
|
1093
|
-
|
|
1094
|
-
default:
|
|
1095
|
-
// Should never happen, epoch is checked to be in bounds above
|
|
1096
|
-
throw Error(`Proposer duties for epoch ${epoch} not supported, current epoch ${stateEpoch}`);
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
|
-
// NOTE: this is the fastest way of getting compressed pubkeys.
|
|
1100
|
-
// See benchmark -> packages/lodestar/test/perf/api/impl/validator/attester.test.ts
|
|
1101
|
-
// After dropping the flat caches attached to the CachedBeaconState it's no longer available.
|
|
1102
|
-
// TODO: Add a flag to just send 0x00 as pubkeys since the Lodestar validator does not need them.
|
|
1103
|
-
const pubkeys = getPubkeysForIndices(state.validators, indexes);
|
|
1104
|
-
|
|
1105
|
-
const duties: routes.validator.ProposerDuty[] = [];
|
|
1106
|
-
for (let i = 0; i < SLOTS_PER_EPOCH; i++) {
|
|
1107
|
-
duties.push({slot: startSlot + i, validatorIndex: indexes[i], pubkey: pubkeys[i]});
|
|
1108
|
-
}
|
|
1109
|
-
|
|
1110
|
-
// Returns `null` on the one-off scenario where the genesis block decides its own shuffling.
|
|
1111
|
-
// It should be set to the latest block applied to `self` or the genesis block root.
|
|
1112
|
-
const dependentRoot = proposerShufflingDecisionRoot(state) || (await getGenesisBlockRoot(state));
|
|
1113
|
-
|
|
1114
|
-
return {
|
|
1115
|
-
data: duties,
|
|
1116
|
-
meta: {
|
|
1117
|
-
dependentRoot: toRootHex(dependentRoot),
|
|
1118
|
-
executionOptimistic: isOptimisticBlock(head),
|
|
1119
|
-
},
|
|
1120
|
-
};
|
|
1121
|
-
},
|
|
1122
|
-
|
|
1123
|
-
async getAttesterDuties({epoch, indices}) {
|
|
1124
|
-
notWhileSyncing();
|
|
1125
|
-
|
|
1126
|
-
if (indices.length === 0) {
|
|
1127
|
-
throw new ApiError(400, "No validator to get attester duties");
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
// May request for an epoch that's in the future
|
|
1131
|
-
await waitForNextClosestEpoch();
|
|
1132
|
-
|
|
1133
|
-
// should not compare to headEpoch in order to handle skipped slots
|
|
1134
|
-
// Check if the epoch is in the future after waiting for requested slot
|
|
1135
|
-
if (epoch > chain.clock.currentEpoch + 1) {
|
|
1136
|
-
throw new ApiError(400, "Cannot get duties for epoch more than one ahead");
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
const head = chain.forkChoice.getHead();
|
|
1140
|
-
const state = await chain.getHeadStateAtCurrentEpoch(RegenCaller.getDuties);
|
|
1141
|
-
|
|
1142
|
-
// TODO: Determine what the current epoch would be if we fast-forward our system clock by
|
|
1143
|
-
// `MAXIMUM_GOSSIP_CLOCK_DISPARITY`.
|
|
1144
|
-
//
|
|
1145
|
-
// Most of the time, `tolerantCurrentEpoch` will be equal to `currentEpoch`. However, during
|
|
1146
|
-
// the first `MAXIMUM_GOSSIP_CLOCK_DISPARITY` duration of the epoch `tolerantCurrentEpoch`
|
|
1147
|
-
// will equal `currentEpoch + 1`
|
|
1148
|
-
|
|
1149
|
-
// Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
|
|
1150
|
-
const pubkeys = getPubkeysForIndices(state.validators, indices);
|
|
1151
|
-
const decisionRoot = state.epochCtx.getShufflingDecisionRoot(epoch);
|
|
1152
|
-
const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
|
|
1153
|
-
if (!shuffling) {
|
|
1154
|
-
throw new ApiError(
|
|
1155
|
-
500,
|
|
1156
|
-
`No shuffling found to calculate committee assignments for epoch: ${epoch} and decisionRoot: ${decisionRoot}`
|
|
1157
|
-
);
|
|
1158
|
-
}
|
|
1159
|
-
const committeeAssignments = calculateCommitteeAssignments(shuffling, indices);
|
|
1160
|
-
const duties: routes.validator.AttesterDuty[] = [];
|
|
1161
|
-
for (let i = 0, len = indices.length; i < len; i++) {
|
|
1162
|
-
const validatorIndex = indices[i];
|
|
1163
|
-
const duty = committeeAssignments.get(validatorIndex) as routes.validator.AttesterDuty | undefined;
|
|
1164
|
-
if (duty) {
|
|
1165
|
-
// Mutate existing object instead of re-creating another new object with spread operator
|
|
1166
|
-
// Should be faster and require less memory
|
|
1167
|
-
duty.pubkey = pubkeys[i];
|
|
1168
|
-
duties.push(duty);
|
|
1169
|
-
}
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
|
-
const dependentRoot = attesterShufflingDecisionRoot(state, epoch) || (await getGenesisBlockRoot(state));
|
|
1173
|
-
|
|
1174
|
-
return {
|
|
1175
|
-
data: duties,
|
|
1176
|
-
meta: {
|
|
1177
|
-
dependentRoot: toRootHex(dependentRoot),
|
|
1178
|
-
executionOptimistic: isOptimisticBlock(head),
|
|
1179
|
-
},
|
|
1180
|
-
};
|
|
1181
|
-
},
|
|
1182
|
-
|
|
1183
|
-
/**
|
|
1184
|
-
* `POST /eth/v1/validator/duties/sync/{epoch}`
|
|
1185
|
-
*
|
|
1186
|
-
* Requests the beacon node to provide a set of sync committee duties for a particular epoch.
|
|
1187
|
-
* - Although pubkey can be inferred from the index we return it to keep this call analogous with the one that
|
|
1188
|
-
* fetches attester duties.
|
|
1189
|
-
* - `sync_committee_index` is the index of the validator in the sync committee. This can be used to infer the
|
|
1190
|
-
* subnet to which the contribution should be broadcast. Note, there can be multiple per validator.
|
|
1191
|
-
*
|
|
1192
|
-
* https://github.com/ethereum/beacon-APIs/pull/134
|
|
1193
|
-
*
|
|
1194
|
-
* @param validatorIndices an array of the validator indices for which to obtain the duties.
|
|
1195
|
-
*/
|
|
1196
|
-
async getSyncCommitteeDuties({epoch, indices}) {
|
|
1197
|
-
notWhileSyncing();
|
|
1198
|
-
|
|
1199
|
-
if (indices.length === 0) {
|
|
1200
|
-
throw new ApiError(400, "No validator to get attester duties");
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
// May request for an epoch that's in the future
|
|
1204
|
-
await waitForNextClosestEpoch();
|
|
1205
|
-
|
|
1206
|
-
// sync committee duties have a lookahead of 1 day. Assuming the validator only requests duties for upcoming
|
|
1207
|
-
// epochs, the head state will very likely have the duties available for the requested epoch.
|
|
1208
|
-
// Note: does not support requesting past duties
|
|
1209
|
-
const head = chain.forkChoice.getHead();
|
|
1210
|
-
const state = chain.getHeadState();
|
|
1211
|
-
|
|
1212
|
-
// Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
|
|
1213
|
-
const pubkeys = getPubkeysForIndices(state.validators, indices);
|
|
1214
|
-
// Ensures `epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD <= current_epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD + 1`
|
|
1215
|
-
const syncCommitteeCache = state.epochCtx.getIndexedSyncCommitteeAtEpoch(epoch);
|
|
1216
|
-
const validatorSyncCommitteeIndexMap = syncCommitteeCache.validatorIndexMap;
|
|
1217
|
-
|
|
1218
|
-
const duties: routes.validator.SyncDuty[] = [];
|
|
1219
|
-
for (let i = 0, len = indices.length; i < len; i++) {
|
|
1220
|
-
const validatorIndex = indices[i];
|
|
1221
|
-
const validatorSyncCommitteeIndices = validatorSyncCommitteeIndexMap.get(validatorIndex);
|
|
1222
|
-
if (validatorSyncCommitteeIndices) {
|
|
1223
|
-
duties.push({
|
|
1224
|
-
pubkey: pubkeys[i],
|
|
1225
|
-
validatorIndex,
|
|
1226
|
-
validatorSyncCommitteeIndices,
|
|
1227
|
-
});
|
|
1228
|
-
}
|
|
1229
|
-
}
|
|
1230
|
-
|
|
1231
|
-
return {
|
|
1232
|
-
data: duties,
|
|
1233
|
-
meta: {executionOptimistic: isOptimisticBlock(head)},
|
|
1234
|
-
};
|
|
1235
|
-
},
|
|
1236
|
-
|
|
1237
|
-
async getAggregatedAttestation({attestationDataRoot, slot}) {
|
|
1238
|
-
notWhileSyncing();
|
|
1239
|
-
|
|
1240
|
-
await waitForSlot(slot); // Must never request for a future slot > currentSlot
|
|
1241
|
-
|
|
1242
|
-
const dataRootHex = toRootHex(attestationDataRoot);
|
|
1243
|
-
const aggregate = chain.attestationPool.getAggregate(slot, dataRootHex, null);
|
|
1244
|
-
const fork = chain.config.getForkName(slot);
|
|
1245
|
-
|
|
1246
|
-
if (isForkPostElectra(fork)) {
|
|
1247
|
-
throw new ApiError(
|
|
1248
|
-
400,
|
|
1249
|
-
`Use getAggregatedAttestationV2 to retrieve aggregated attestations for post-electra fork=${fork}`
|
|
1250
|
-
);
|
|
1251
|
-
}
|
|
1252
|
-
|
|
1253
|
-
if (!aggregate) {
|
|
1254
|
-
throw new ApiError(404, `No aggregated attestation for slot=${slot}, dataRoot=${dataRootHex}`);
|
|
1255
|
-
}
|
|
1256
|
-
|
|
1257
|
-
metrics?.production.producedAggregateParticipants.observe(aggregate.aggregationBits.getTrueBitIndexes().length);
|
|
1258
|
-
|
|
1259
|
-
return {
|
|
1260
|
-
data: aggregate,
|
|
1261
|
-
};
|
|
1262
|
-
},
|
|
1263
|
-
|
|
1264
|
-
async getAggregatedAttestationV2({attestationDataRoot, slot, committeeIndex}) {
|
|
1265
|
-
notWhileSyncing();
|
|
1266
|
-
|
|
1267
|
-
await waitForSlot(slot); // Must never request for a future slot > currentSlot
|
|
1268
|
-
|
|
1269
|
-
const dataRootHex = toRootHex(attestationDataRoot);
|
|
1270
|
-
const aggregate = chain.attestationPool.getAggregate(slot, dataRootHex, committeeIndex);
|
|
1271
|
-
|
|
1272
|
-
if (!aggregate) {
|
|
1273
|
-
throw new ApiError(
|
|
1274
|
-
404,
|
|
1275
|
-
`No aggregated attestation for slot=${slot}, dataRoot=${dataRootHex}, committeeIndex=${committeeIndex}`
|
|
1276
|
-
);
|
|
1277
|
-
}
|
|
1278
|
-
|
|
1279
|
-
metrics?.production.producedAggregateParticipants.observe(aggregate.aggregationBits.getTrueBitIndexes().length);
|
|
1280
|
-
|
|
1281
|
-
return {
|
|
1282
|
-
data: aggregate,
|
|
1283
|
-
meta: {version: config.getForkName(slot)},
|
|
1284
|
-
};
|
|
1285
|
-
},
|
|
1286
|
-
|
|
1287
|
-
async publishAggregateAndProofs({signedAggregateAndProofs}) {
|
|
1288
|
-
await this.publishAggregateAndProofsV2({signedAggregateAndProofs});
|
|
1289
|
-
},
|
|
1290
|
-
|
|
1291
|
-
async publishAggregateAndProofsV2({signedAggregateAndProofs}) {
|
|
1292
|
-
notWhileSyncing();
|
|
1293
|
-
|
|
1294
|
-
const seenTimestampSec = Date.now() / 1000;
|
|
1295
|
-
const errors: Error[] = [];
|
|
1296
|
-
const fork = chain.config.getForkName(chain.clock.currentSlot);
|
|
1297
|
-
|
|
1298
|
-
await Promise.all(
|
|
1299
|
-
signedAggregateAndProofs.map(async (signedAggregateAndProof, i) => {
|
|
1300
|
-
try {
|
|
1301
|
-
// TODO: Validate in batch
|
|
1302
|
-
const validateFn = () => validateApiAggregateAndProof(fork, chain, signedAggregateAndProof);
|
|
1303
|
-
const {slot, beaconBlockRoot} = signedAggregateAndProof.message.aggregate.data;
|
|
1304
|
-
// when a validator is configured with multiple beacon node urls, this attestation may come from another beacon node
|
|
1305
|
-
// and the block hasn't been in our forkchoice since we haven't seen / processing that block
|
|
1306
|
-
// see https://github.com/ChainSafe/lodestar/issues/5098
|
|
1307
|
-
const {indexedAttestation, committeeValidatorIndices, attDataRootHex} =
|
|
1308
|
-
await validateGossipFnRetryUnknownRoot(validateFn, network, chain, slot, beaconBlockRoot);
|
|
1309
|
-
|
|
1310
|
-
const insertOutcome = chain.aggregatedAttestationPool.add(
|
|
1311
|
-
signedAggregateAndProof.message.aggregate,
|
|
1312
|
-
attDataRootHex,
|
|
1313
|
-
indexedAttestation.attestingIndices.length,
|
|
1314
|
-
committeeValidatorIndices
|
|
1315
|
-
);
|
|
1316
|
-
metrics?.opPool.aggregatedAttestationPool.apiInsertOutcome.inc({insertOutcome});
|
|
1317
|
-
|
|
1318
|
-
const sentPeers = await network.publishBeaconAggregateAndProof(signedAggregateAndProof);
|
|
1319
|
-
chain.validatorMonitor?.onPoolSubmitAggregatedAttestation(seenTimestampSec, indexedAttestation, sentPeers);
|
|
1320
|
-
} catch (e) {
|
|
1321
|
-
const logCtx = {
|
|
1322
|
-
slot: signedAggregateAndProof.message.aggregate.data.slot,
|
|
1323
|
-
index: signedAggregateAndProof.message.aggregate.data.index,
|
|
1324
|
-
};
|
|
1325
|
-
|
|
1326
|
-
if (e instanceof AttestationError && e.type.code === AttestationErrorCode.AGGREGATOR_ALREADY_KNOWN) {
|
|
1327
|
-
logger.debug("Ignoring known signedAggregateAndProof", logCtx);
|
|
1328
|
-
return; // Ok to submit the same aggregate twice
|
|
1329
|
-
}
|
|
1330
|
-
|
|
1331
|
-
errors.push(e as Error);
|
|
1332
|
-
logger.error(`Error on publishAggregateAndProofs [${i}]`, logCtx, e as Error);
|
|
1333
|
-
if (e instanceof AttestationError && e.action === GossipAction.REJECT) {
|
|
1334
|
-
chain.persistInvalidSszValue(ssz.phase0.SignedAggregateAndProof, signedAggregateAndProof, "api_reject");
|
|
1335
|
-
}
|
|
1336
|
-
}
|
|
1337
|
-
})
|
|
1338
|
-
);
|
|
1339
|
-
|
|
1340
|
-
if (errors.length > 1) {
|
|
1341
|
-
throw Error("Multiple errors on publishAggregateAndProofs\n" + errors.map((e) => e.message).join("\n"));
|
|
1342
|
-
}
|
|
1343
|
-
|
|
1344
|
-
if (errors.length === 1) {
|
|
1345
|
-
throw errors[0];
|
|
1346
|
-
}
|
|
1347
|
-
},
|
|
1348
|
-
|
|
1349
|
-
/**
|
|
1350
|
-
* POST `/eth/v1/validator/contribution_and_proofs`
|
|
1351
|
-
*
|
|
1352
|
-
* Publish multiple signed sync committee contribution and proofs
|
|
1353
|
-
*
|
|
1354
|
-
* https://github.com/ethereum/beacon-APIs/pull/137
|
|
1355
|
-
*/
|
|
1356
|
-
async publishContributionAndProofs({contributionAndProofs}) {
|
|
1357
|
-
notWhileSyncing();
|
|
1358
|
-
|
|
1359
|
-
const errors: Error[] = [];
|
|
1360
|
-
|
|
1361
|
-
await Promise.all(
|
|
1362
|
-
contributionAndProofs.map(async (contributionAndProof, i) => {
|
|
1363
|
-
try {
|
|
1364
|
-
// TODO: Validate in batch
|
|
1365
|
-
const {syncCommitteeParticipantIndices} = await validateSyncCommitteeGossipContributionAndProof(
|
|
1366
|
-
chain,
|
|
1367
|
-
contributionAndProof,
|
|
1368
|
-
true // skip known participants check
|
|
1369
|
-
);
|
|
1370
|
-
const insertOutcome = chain.syncContributionAndProofPool.add(
|
|
1371
|
-
contributionAndProof.message,
|
|
1372
|
-
syncCommitteeParticipantIndices.length,
|
|
1373
|
-
true
|
|
1374
|
-
);
|
|
1375
|
-
metrics?.opPool.syncContributionAndProofPool.apiInsertOutcome.inc({insertOutcome});
|
|
1376
|
-
await network.publishContributionAndProof(contributionAndProof);
|
|
1377
|
-
} catch (e) {
|
|
1378
|
-
const logCtx = {
|
|
1379
|
-
slot: contributionAndProof.message.contribution.slot,
|
|
1380
|
-
subcommitteeIndex: contributionAndProof.message.contribution.subcommitteeIndex,
|
|
1381
|
-
};
|
|
1382
|
-
|
|
1383
|
-
if (
|
|
1384
|
-
e instanceof SyncCommitteeError &&
|
|
1385
|
-
e.type.code === SyncCommitteeErrorCode.SYNC_COMMITTEE_AGGREGATOR_ALREADY_KNOWN
|
|
1386
|
-
) {
|
|
1387
|
-
logger.debug("Ignoring known contributionAndProof", logCtx);
|
|
1388
|
-
return; // Ok to submit the same aggregate twice
|
|
1389
|
-
}
|
|
1390
|
-
|
|
1391
|
-
errors.push(e as Error);
|
|
1392
|
-
logger.error(`Error on publishContributionAndProofs [${i}]`, logCtx, e as Error);
|
|
1393
|
-
if (e instanceof SyncCommitteeError && e.action === GossipAction.REJECT) {
|
|
1394
|
-
chain.persistInvalidSszValue(ssz.altair.SignedContributionAndProof, contributionAndProof, "api_reject");
|
|
1395
|
-
}
|
|
1396
|
-
}
|
|
1397
|
-
})
|
|
1398
|
-
);
|
|
1399
|
-
|
|
1400
|
-
if (errors.length > 1) {
|
|
1401
|
-
throw Error("Multiple errors on publishContributionAndProofs\n" + errors.map((e) => e.message).join("\n"));
|
|
1402
|
-
}
|
|
1403
|
-
|
|
1404
|
-
if (errors.length === 1) {
|
|
1405
|
-
throw errors[0];
|
|
1406
|
-
}
|
|
1407
|
-
},
|
|
1408
|
-
|
|
1409
|
-
async prepareBeaconCommitteeSubnet({subscriptions}) {
|
|
1410
|
-
notWhileSyncing();
|
|
1411
|
-
|
|
1412
|
-
await network.prepareBeaconCommitteeSubnets(
|
|
1413
|
-
subscriptions.map(({validatorIndex, slot, isAggregator, committeesAtSlot, committeeIndex}) => ({
|
|
1414
|
-
validatorIndex: validatorIndex,
|
|
1415
|
-
subnet: computeSubnetForCommitteesAtSlot(slot, committeesAtSlot, committeeIndex),
|
|
1416
|
-
slot: slot,
|
|
1417
|
-
isAggregator: isAggregator,
|
|
1418
|
-
}))
|
|
1419
|
-
);
|
|
1420
|
-
|
|
1421
|
-
// TODO:
|
|
1422
|
-
// If the discovery mechanism isn't disabled, attempt to set up a peer discovery for the
|
|
1423
|
-
// required subnets.
|
|
1424
|
-
|
|
1425
|
-
if (metrics) {
|
|
1426
|
-
for (const subscription of subscriptions) {
|
|
1427
|
-
chain.validatorMonitor?.registerLocalValidator(subscription.validatorIndex);
|
|
1428
|
-
}
|
|
1429
|
-
}
|
|
1430
|
-
},
|
|
1431
|
-
|
|
1432
|
-
/**
|
|
1433
|
-
* POST `/eth/v1/validator/sync_committee_subscriptions`
|
|
1434
|
-
*
|
|
1435
|
-
* Subscribe to a number of sync committee subnets.
|
|
1436
|
-
* Sync committees are not present in phase0, but are required for Altair networks.
|
|
1437
|
-
* Subscribing to sync committee subnets is an action performed by VC to enable network participation in Altair networks,
|
|
1438
|
-
* and only required if the VC has an active validator in an active sync committee.
|
|
1439
|
-
*
|
|
1440
|
-
* https://github.com/ethereum/beacon-APIs/pull/136
|
|
1441
|
-
*/
|
|
1442
|
-
async prepareSyncCommitteeSubnets({subscriptions}) {
|
|
1443
|
-
notWhileSyncing();
|
|
1444
|
-
|
|
1445
|
-
// A `validatorIndex` can be in multiple subnets, so compute the CommitteeSubscription with double for loop
|
|
1446
|
-
const subs: CommitteeSubscription[] = [];
|
|
1447
|
-
for (const sub of subscriptions) {
|
|
1448
|
-
for (const committeeIndex of sub.syncCommitteeIndices) {
|
|
1449
|
-
const subnet = Math.floor(committeeIndex / SYNC_COMMITTEE_SUBNET_SIZE);
|
|
1450
|
-
subs.push({
|
|
1451
|
-
validatorIndex: sub.validatorIndex,
|
|
1452
|
-
subnet: subnet,
|
|
1453
|
-
// Subscribe until the end of `untilEpoch`: https://github.com/ethereum/beacon-APIs/pull/136#issuecomment-840315097
|
|
1454
|
-
slot: computeStartSlotAtEpoch(sub.untilEpoch + 1),
|
|
1455
|
-
isAggregator: true,
|
|
1456
|
-
});
|
|
1457
|
-
}
|
|
1458
|
-
}
|
|
1459
|
-
|
|
1460
|
-
await network.prepareSyncCommitteeSubnets(subs);
|
|
1461
|
-
|
|
1462
|
-
if (metrics) {
|
|
1463
|
-
for (const subscription of subscriptions) {
|
|
1464
|
-
chain.validatorMonitor?.registerLocalValidatorInSyncCommittee(
|
|
1465
|
-
subscription.validatorIndex,
|
|
1466
|
-
subscription.untilEpoch
|
|
1467
|
-
);
|
|
1468
|
-
}
|
|
1469
|
-
}
|
|
1470
|
-
},
|
|
1471
|
-
|
|
1472
|
-
async prepareBeaconProposer({proposers}) {
|
|
1473
|
-
await chain.updateBeaconProposerData(chain.clock.currentEpoch, proposers);
|
|
1474
|
-
},
|
|
1475
|
-
|
|
1476
|
-
async submitBeaconCommitteeSelections() {
|
|
1477
|
-
throw new OnlySupportedByDVT();
|
|
1478
|
-
},
|
|
1479
|
-
|
|
1480
|
-
async submitSyncCommitteeSelections() {
|
|
1481
|
-
throw new OnlySupportedByDVT();
|
|
1482
|
-
},
|
|
1483
|
-
|
|
1484
|
-
async getLiveness({epoch, indices}) {
|
|
1485
|
-
if (indices.length === 0) {
|
|
1486
|
-
return {
|
|
1487
|
-
data: [],
|
|
1488
|
-
};
|
|
1489
|
-
}
|
|
1490
|
-
const currentEpoch = chain.clock.currentEpoch;
|
|
1491
|
-
if (epoch < currentEpoch - 1 || epoch > currentEpoch + 1) {
|
|
1492
|
-
throw new ApiError(
|
|
1493
|
-
400,
|
|
1494
|
-
`Request epoch ${epoch} is more than one epoch before or after the current epoch ${currentEpoch}`
|
|
1495
|
-
);
|
|
1496
|
-
}
|
|
1497
|
-
|
|
1498
|
-
return {
|
|
1499
|
-
data: indices.map((index) => ({
|
|
1500
|
-
index,
|
|
1501
|
-
isLive: chain.validatorSeenAtEpoch(index, epoch),
|
|
1502
|
-
})),
|
|
1503
|
-
};
|
|
1504
|
-
},
|
|
1505
|
-
|
|
1506
|
-
async registerValidator({registrations}) {
|
|
1507
|
-
if (!chain.executionBuilder) {
|
|
1508
|
-
throw Error("External builder not configured");
|
|
1509
|
-
}
|
|
1510
|
-
|
|
1511
|
-
// should only send active or pending validator to builder
|
|
1512
|
-
// Spec: https://ethereum.github.io/builder-specs/#/Builder/registerValidator
|
|
1513
|
-
const headState = chain.getHeadState();
|
|
1514
|
-
const currentEpoch = chain.clock.currentEpoch;
|
|
1515
|
-
|
|
1516
|
-
const filteredRegistrations = registrations.filter((registration) => {
|
|
1517
|
-
const {pubkey} = registration.message;
|
|
1518
|
-
const validatorIndex = headState.epochCtx.pubkey2index.get(pubkey);
|
|
1519
|
-
if (validatorIndex === null) return false;
|
|
1520
|
-
|
|
1521
|
-
const validator = headState.validators.getReadonly(validatorIndex);
|
|
1522
|
-
const status = getValidatorStatus(validator, currentEpoch);
|
|
1523
|
-
return (
|
|
1524
|
-
status === "active_exiting" ||
|
|
1525
|
-
status === "active_ongoing" ||
|
|
1526
|
-
status === "active_slashed" ||
|
|
1527
|
-
status === "pending_initialized" ||
|
|
1528
|
-
status === "pending_queued"
|
|
1529
|
-
);
|
|
1530
|
-
});
|
|
1531
|
-
|
|
1532
|
-
await chain.executionBuilder.registerValidator(currentEpoch, filteredRegistrations);
|
|
1533
|
-
|
|
1534
|
-
logger.debug("Forwarded validator registrations to connected builder", {
|
|
1535
|
-
epoch: currentEpoch,
|
|
1536
|
-
count: filteredRegistrations.length,
|
|
1537
|
-
});
|
|
1538
|
-
},
|
|
1539
|
-
};
|
|
1540
|
-
}
|