@lodestar/beacon-node 1.35.0-dev.b42a298a7c → 1.35.0-dev.ba92bd8a88
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/api.d.ts.map +1 -0
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/blocks/utils.d.ts.map +1 -0
- package/lib/api/impl/beacon/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/rewards/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -0
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -0
- package/lib/api/impl/config/constants.d.ts.map +1 -0
- package/lib/api/impl/config/index.d.ts.map +1 -0
- package/lib/api/impl/debug/index.d.ts.map +1 -0
- package/lib/api/impl/errors.d.ts.map +1 -0
- package/lib/api/impl/events/index.d.ts.map +1 -0
- package/lib/api/impl/index.d.ts.map +1 -0
- package/lib/api/impl/lightclient/index.d.ts.map +1 -0
- package/lib/api/impl/lodestar/index.d.ts.map +1 -0
- package/lib/api/impl/node/index.d.ts.map +1 -0
- package/lib/api/impl/node/utils.d.ts.map +1 -0
- package/lib/api/impl/proof/index.d.ts.map +1 -0
- package/lib/api/impl/types.d.ts.map +1 -0
- package/lib/api/impl/utils.d.ts.map +1 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -0
- package/lib/api/impl/validator/utils.d.ts.map +1 -0
- package/lib/api/index.d.ts.map +1 -0
- package/lib/api/options.d.ts.map +1 -0
- package/lib/api/rest/activeSockets.d.ts.map +1 -0
- package/lib/api/rest/base.d.ts.map +1 -0
- package/lib/api/rest/index.d.ts.map +1 -0
- package/lib/api/rest/swaggerUI.d.ts.map +1 -0
- package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +1 -0
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -0
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -0
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -0
- package/lib/chain/archiveStore/constants.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/worker.d.ts.map +1 -0
- package/lib/chain/archiveStore/historicalState/worker.js +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/index.d.ts.map +1 -0
- package/lib/chain/archiveStore/interface.d.ts.map +1 -0
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +1 -0
- package/lib/chain/balancesCache.d.ts.map +1 -0
- package/lib/chain/beaconProposerCache.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/index.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -0
- package/lib/chain/blocks/blockInput/utils.d.ts.map +1 -0
- package/lib/chain/blocks/importBlock.d.ts.map +1 -0
- package/lib/chain/blocks/index.d.ts.map +1 -0
- package/lib/chain/blocks/types.d.ts.map +1 -0
- package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -0
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -0
- package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/ownBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/zebraBanner.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -0
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -0
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -0
- package/lib/chain/bls/index.d.ts.map +1 -0
- package/lib/chain/bls/interface.d.ts.map +1 -0
- package/lib/chain/bls/maybeBatch.d.ts.map +1 -0
- package/lib/chain/bls/multithread/index.d.ts.map +1 -0
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -0
- package/lib/chain/bls/multithread/poolSize.d.ts.map +1 -0
- package/lib/chain/bls/multithread/types.d.ts.map +1 -0
- package/lib/chain/bls/multithread/utils.d.ts.map +1 -0
- package/lib/chain/bls/multithread/worker.d.ts.map +1 -0
- package/lib/chain/bls/singleThread.d.ts.map +1 -0
- package/lib/chain/bls/utils.d.ts.map +1 -0
- package/lib/chain/chain.d.ts.map +1 -0
- package/lib/chain/emitter.d.ts +2 -2
- package/lib/chain/emitter.d.ts.map +1 -0
- package/lib/chain/errors/attestationError.d.ts.map +1 -0
- package/lib/chain/errors/attesterSlashingError.d.ts.map +1 -0
- package/lib/chain/errors/blobSidecarError.d.ts.map +1 -0
- package/lib/chain/errors/blockError.d.ts.map +1 -0
- package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +1 -0
- package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -0
- package/lib/chain/errors/gossipValidation.d.ts.map +1 -0
- package/lib/chain/errors/index.d.ts.map +1 -0
- package/lib/chain/errors/lightClientError.d.ts.map +1 -0
- package/lib/chain/errors/proposerSlashingError.d.ts.map +1 -0
- package/lib/chain/errors/syncCommitteeError.d.ts.map +1 -0
- package/lib/chain/errors/voluntaryExitError.d.ts.map +1 -0
- package/lib/chain/forkChoice/index.d.ts.map +1 -0
- package/lib/chain/genesis/genesis.d.ts.map +1 -0
- package/lib/chain/genesis/interface.d.ts.map +1 -0
- package/lib/chain/index.d.ts.map +1 -0
- package/lib/chain/initState.d.ts.map +1 -0
- package/lib/chain/interface.d.ts.map +1 -0
- package/lib/chain/lightClient/index.d.ts.map +1 -0
- package/lib/chain/lightClient/proofs.d.ts.map +1 -0
- package/lib/chain/lightClient/types.d.ts.map +1 -0
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -0
- package/lib/chain/opPools/opPool.d.ts.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -0
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -0
- package/lib/chain/opPools/types.d.ts.map +1 -0
- package/lib/chain/opPools/utils.d.ts.map +1 -0
- package/lib/chain/options.d.ts.map +1 -0
- package/lib/chain/prepareNextSlot.d.ts.map +1 -0
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -0
- package/lib/chain/produceBlock/index.d.ts.map +1 -0
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -0
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +1 -0
- package/lib/chain/regen/errors.d.ts.map +1 -0
- package/lib/chain/regen/index.d.ts.map +1 -0
- package/lib/chain/regen/interface.d.ts.map +1 -0
- package/lib/chain/regen/queued.d.ts.map +1 -0
- package/lib/chain/regen/regen.d.ts.map +1 -0
- package/lib/chain/reprocess.d.ts.map +1 -0
- package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -0
- package/lib/chain/rewards/blockRewards.d.ts.map +1 -0
- package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -0
- package/lib/chain/seenCache/index.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAttestationData.d.ts.map +1 -0
- package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -0
- package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +1 -0
- package/lib/chain/seenCache/seenBlockProposers.d.ts.map +1 -0
- package/lib/chain/seenCache/seenCommittee.d.ts.map +1 -0
- package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +1 -0
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -0
- package/lib/chain/serializeState.d.ts.map +1 -0
- package/lib/chain/shufflingCache.d.ts.map +1 -0
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/db.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/file.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/index.d.ts.map +1 -0
- package/lib/chain/stateCache/datastore/types.d.ts.map +1 -0
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -0
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -0
- package/lib/chain/stateCache/index.d.ts.map +1 -0
- package/lib/chain/stateCache/mapMetrics.d.ts.map +1 -0
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -0
- package/lib/chain/stateCache/types.d.ts.map +1 -0
- package/lib/chain/validation/aggregateAndProof.d.ts.map +1 -0
- package/lib/chain/validation/attestation.d.ts.map +1 -0
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -0
- package/lib/chain/validation/blobSidecar.d.ts.map +1 -0
- package/lib/chain/validation/block.d.ts.map +1 -0
- package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -0
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -0
- package/lib/chain/validation/index.d.ts.map +1 -0
- package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +1 -0
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +1 -0
- package/lib/chain/validation/proposerSlashing.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/index.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -0
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -0
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -0
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -0
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -0
- package/lib/chain/validatorMonitor.d.ts.map +1 -0
- package/lib/constants/constants.d.ts.map +1 -0
- package/lib/constants/index.d.ts.map +1 -0
- package/lib/constants/network.d.ts.map +1 -0
- package/lib/db/beacon.d.ts.map +1 -0
- package/lib/db/buckets.d.ts +4 -4
- package/lib/db/buckets.d.ts.map +1 -0
- package/lib/db/buckets.js +4 -4
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/index.d.ts.map +1 -0
- package/lib/db/interface.d.ts.map +1 -0
- package/lib/db/options.d.ts.map +1 -0
- package/lib/db/repositories/attesterSlashing.d.ts.map +1 -0
- package/lib/db/repositories/backfilledRanges.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecars.js +1 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/db/repositories/blobSidecarsArchive.d.ts.map +1 -0
- package/lib/db/repositories/blobSidecarsArchive.js +1 -1
- package/lib/db/repositories/blobSidecarsArchive.js.map +1 -1
- package/lib/db/repositories/block.d.ts.map +1 -0
- package/lib/db/repositories/blockArchive.d.ts.map +1 -0
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -0
- package/lib/db/repositories/blsToExecutionChange.d.ts.map +1 -0
- package/lib/db/repositories/checkpointState.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecar.js +1 -1
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/db/repositories/depositDataRoot.d.ts.map +1 -0
- package/lib/db/repositories/depositEvent.d.ts.map +1 -0
- package/lib/db/repositories/eth1Data.d.ts.map +1 -0
- package/lib/db/repositories/index.d.ts.map +1 -0
- package/lib/db/repositories/lightclientBestUpdate.d.ts.map +1 -0
- package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +1 -0
- package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +1 -0
- package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +1 -0
- package/lib/db/repositories/proposerSlashing.d.ts.map +1 -0
- package/lib/db/repositories/stateArchive.d.ts.map +1 -0
- package/lib/db/repositories/stateArchiveIndex.d.ts.map +1 -0
- package/lib/db/repositories/voluntaryExit.d.ts.map +1 -0
- package/lib/db/single/index.d.ts.map +1 -0
- package/lib/db/single/preGenesisState.d.ts.map +1 -0
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +1 -0
- package/lib/eth1/errors.d.ts.map +1 -0
- package/lib/eth1/eth1DataCache.d.ts.map +1 -0
- package/lib/eth1/eth1DepositDataTracker.d.ts.map +1 -0
- package/lib/eth1/eth1DepositsCache.d.ts.map +1 -0
- package/lib/eth1/eth1MergeBlockTracker.d.ts.map +1 -0
- package/lib/eth1/index.d.ts.map +1 -0
- package/lib/eth1/interface.d.ts.map +1 -0
- package/lib/eth1/options.d.ts.map +1 -0
- package/lib/eth1/provider/eth1Provider.d.ts.map +1 -0
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +1 -0
- package/lib/eth1/provider/jwt.d.ts.map +1 -0
- package/lib/eth1/provider/utils.d.ts.map +1 -0
- package/lib/eth1/stream.d.ts.map +1 -0
- package/lib/eth1/utils/depositContract.d.ts.map +1 -0
- package/lib/eth1/utils/deposits.d.ts.map +1 -0
- package/lib/eth1/utils/eth1Data.d.ts.map +1 -0
- package/lib/eth1/utils/eth1DepositEvent.d.ts.map +1 -0
- package/lib/eth1/utils/eth1Vote.d.ts.map +1 -0
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +1 -0
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +1 -0
- package/lib/execution/builder/cache.d.ts.map +1 -0
- package/lib/execution/builder/http.d.ts.map +1 -0
- package/lib/execution/builder/index.d.ts.map +1 -0
- package/lib/execution/builder/interface.d.ts.map +1 -0
- package/lib/execution/builder/utils.d.ts.map +1 -0
- package/lib/execution/engine/disabled.d.ts.map +1 -0
- package/lib/execution/engine/http.d.ts.map +1 -0
- package/lib/execution/engine/index.d.ts.map +1 -0
- package/lib/execution/engine/interface.d.ts.map +1 -0
- package/lib/execution/engine/mock.d.ts.map +1 -0
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -0
- package/lib/execution/engine/types.d.ts.map +1 -0
- package/lib/execution/engine/utils.d.ts.map +1 -0
- package/lib/execution/index.d.ts.map +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/metrics/index.d.ts.map +1 -0
- package/lib/metrics/metrics/beacon.d.ts.map +1 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -0
- package/lib/metrics/metrics.d.ts.map +1 -0
- package/lib/metrics/nodeJsMetrics.d.ts.map +1 -0
- package/lib/metrics/options.d.ts.map +1 -0
- package/lib/metrics/server/http.d.ts.map +1 -0
- package/lib/metrics/server/index.d.ts.map +1 -0
- package/lib/metrics/utils/avgMinMax.d.ts.map +1 -0
- package/lib/metrics/utils/gauge.d.ts.map +1 -0
- package/lib/metrics/utils/registryMetricCreator.d.ts.map +1 -0
- package/lib/monitoring/clientStats.d.ts.map +1 -0
- package/lib/monitoring/index.d.ts.map +1 -0
- package/lib/monitoring/options.d.ts.map +1 -0
- package/lib/monitoring/properties.d.ts.map +1 -0
- package/lib/monitoring/service.d.ts.map +1 -0
- package/lib/monitoring/system.d.ts.map +1 -0
- package/lib/monitoring/types.d.ts.map +1 -0
- package/lib/network/core/events.d.ts.map +1 -0
- package/lib/network/core/index.d.ts.map +1 -0
- package/lib/network/core/metrics.d.ts.map +1 -0
- package/lib/network/core/networkCore.d.ts.map +1 -0
- package/lib/network/core/networkCoreWorker.d.ts.map +1 -0
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -0
- package/lib/network/core/types.d.ts.map +1 -0
- package/lib/network/discv5/index.d.ts.map +1 -0
- package/lib/network/discv5/types.d.ts.map +1 -0
- package/lib/network/discv5/utils.d.ts.map +1 -0
- package/lib/network/discv5/worker.d.ts.map +1 -0
- package/lib/network/events.d.ts.map +1 -0
- package/lib/network/forks.d.ts.map +1 -0
- package/lib/network/gossip/constants.d.ts.map +1 -0
- package/lib/network/gossip/encoding.d.ts.map +1 -0
- package/lib/network/gossip/errors.d.ts.map +1 -0
- package/lib/network/gossip/gossipsub.d.ts +1 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -0
- package/lib/network/gossip/gossipsub.js +35 -16
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/index.d.ts.map +1 -0
- package/lib/network/gossip/interface.d.ts.map +1 -0
- package/lib/network/gossip/metrics.d.ts +15 -7
- package/lib/network/gossip/metrics.d.ts.map +1 -0
- package/lib/network/gossip/metrics.js +16 -6
- package/lib/network/gossip/metrics.js.map +1 -1
- package/lib/network/gossip/scoringParameters.d.ts.map +1 -0
- package/lib/network/gossip/topic.d.ts.map +1 -0
- package/lib/network/index.d.ts.map +1 -0
- package/lib/network/interface.d.ts.map +1 -0
- package/lib/network/libp2p/error.d.ts.map +1 -0
- package/lib/network/libp2p/index.d.ts.map +1 -0
- package/lib/network/metadata.d.ts.map +1 -0
- package/lib/network/metadata.js +2 -1
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts.map +1 -0
- package/lib/network/network.js +2 -4
- package/lib/network/network.js.map +1 -1
- package/lib/network/networkConfig.d.ts.map +1 -0
- package/lib/network/options.d.ts.map +1 -0
- package/lib/network/peers/client.d.ts.map +1 -0
- package/lib/network/peers/datastore.d.ts.map +1 -0
- package/lib/network/peers/discover.d.ts.map +1 -0
- package/lib/network/peers/index.d.ts.map +1 -0
- package/lib/network/peers/peerManager.d.ts.map +1 -0
- package/lib/network/peers/peersData.d.ts.map +1 -0
- package/lib/network/peers/score/constants.d.ts.map +1 -0
- package/lib/network/peers/score/index.d.ts.map +1 -0
- package/lib/network/peers/score/interface.d.ts.map +1 -0
- package/lib/network/peers/score/score.d.ts.map +1 -0
- package/lib/network/peers/score/store.d.ts.map +1 -0
- package/lib/network/peers/score/utils.d.ts.map +1 -0
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -0
- package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -0
- package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +1 -0
- package/lib/network/peers/utils/index.d.ts.map +1 -0
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -0
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -0
- package/lib/network/processor/aggregatorTracker.d.ts.map +1 -0
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -0
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/linear.d.ts.map +1 -0
- package/lib/network/processor/gossipQueues/types.d.ts.map +1 -0
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -0
- package/lib/network/processor/index.d.ts +1 -1
- package/lib/network/processor/index.d.ts.map +1 -0
- package/lib/network/processor/index.js +2 -3
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/processor/types.d.ts.map +1 -0
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +1 -0
- package/lib/network/reqresp/index.d.ts.map +1 -0
- package/lib/network/reqresp/interface.d.ts.map +1 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -0
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -0
- package/lib/network/reqresp/score.d.ts.map +1 -0
- package/lib/network/reqresp/types.d.ts.map +1 -0
- package/lib/network/reqresp/utils/collect.d.ts.map +1 -0
- package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +1 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -0
- package/lib/network/statusCache.d.ts.map +1 -0
- package/lib/network/subnets/attnetsService.d.ts.map +1 -0
- package/lib/network/subnets/index.d.ts.map +1 -0
- package/lib/network/subnets/interface.d.ts.map +1 -0
- package/lib/network/subnets/syncnetsService.d.ts.map +1 -0
- package/lib/network/subnets/util.d.ts.map +1 -0
- package/lib/network/util.d.ts.map +1 -0
- package/lib/node/index.d.ts.map +1 -0
- package/lib/node/nodejs.d.ts.map +1 -0
- package/lib/node/notifier.d.ts.map +1 -0
- package/lib/node/options.d.ts.map +1 -0
- package/lib/node/utils/interop/deposits.d.ts.map +1 -0
- package/lib/node/utils/interop/state.d.ts.map +1 -0
- package/lib/node/utils/lightclient.d.ts.map +1 -0
- package/lib/node/utils/state.d.ts.map +1 -0
- package/lib/sync/backfill/backfill.d.ts.map +1 -0
- package/lib/sync/backfill/errors.d.ts.map +1 -0
- package/lib/sync/backfill/index.d.ts.map +1 -0
- package/lib/sync/backfill/verify.d.ts.map +1 -0
- package/lib/sync/constants.d.ts.map +1 -0
- package/lib/sync/index.d.ts.map +1 -0
- package/lib/sync/interface.d.ts.map +1 -0
- package/lib/sync/options.d.ts.map +1 -0
- package/lib/sync/range/batch.d.ts.map +1 -0
- package/lib/sync/range/chain.d.ts.map +1 -0
- package/lib/sync/range/range.d.ts.map +1 -0
- package/lib/sync/range/utils/batches.d.ts.map +1 -0
- package/lib/sync/range/utils/chainTarget.d.ts.map +1 -0
- package/lib/sync/range/utils/hashBlocks.d.ts.map +1 -0
- package/lib/sync/range/utils/index.d.ts.map +1 -0
- package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -0
- package/lib/sync/range/utils/updateChains.d.ts.map +1 -0
- package/lib/sync/sync.d.ts.map +1 -0
- package/lib/sync/types.d.ts +0 -1
- package/lib/sync/types.d.ts.map +1 -0
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -0
- package/lib/sync/unknownBlock.js +12 -14
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -0
- package/lib/sync/utils/downloadByRoot.d.ts +3 -1
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -0
- package/lib/sync/utils/downloadByRoot.js +32 -5
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -0
- package/lib/sync/utils/remoteSyncType.d.ts.map +1 -0
- package/lib/util/address.d.ts.map +1 -0
- package/lib/util/array.d.ts.map +1 -0
- package/lib/util/asyncIterableToEvents.d.ts.map +1 -0
- package/lib/util/binarySearch.d.ts.map +1 -0
- package/lib/util/bitArray.d.ts.map +1 -0
- package/lib/util/blobs.d.ts.map +1 -0
- package/lib/util/blobs.js +5 -3
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/bufferPool.d.ts.map +1 -0
- package/lib/util/bytes.d.ts.map +1 -0
- package/lib/util/chunkify.d.ts.map +1 -0
- package/lib/util/clock.d.ts.map +1 -0
- package/lib/util/dataColumns.d.ts.map +1 -0
- package/lib/util/dependentRoot.d.ts.map +1 -0
- package/lib/util/enum.d.ts.map +1 -0
- package/lib/util/error.d.ts.map +1 -0
- package/lib/util/eventLoop.d.ts.map +1 -0
- package/lib/util/execution.d.ts.map +1 -0
- package/lib/util/file.d.ts.map +1 -0
- package/lib/util/forkChoice.d.ts.map +1 -0
- package/lib/util/forkName.d.ts.map +1 -0
- package/lib/util/graffiti.d.ts.map +1 -0
- package/lib/util/hex.d.ts.map +1 -0
- package/lib/util/index.d.ts.map +1 -0
- package/lib/util/ip.d.ts.map +1 -0
- package/lib/util/itTrigger.d.ts.map +1 -0
- package/lib/util/kzg.d.ts.map +1 -0
- package/lib/util/map.d.ts.map +1 -0
- package/lib/util/metadata.d.ts.map +1 -0
- package/lib/util/multifork.d.ts.map +1 -0
- package/lib/util/numpy.d.ts.map +1 -0
- package/lib/util/peerId.d.ts.map +1 -0
- package/lib/util/profile.d.ts.map +1 -0
- package/lib/util/promises.d.ts.map +1 -0
- package/lib/util/queue/errors.d.ts.map +1 -0
- package/lib/util/queue/fnQueue.d.ts.map +1 -0
- package/lib/util/queue/index.d.ts.map +1 -0
- package/lib/util/queue/itemQueue.d.ts.map +1 -0
- package/lib/util/queue/options.d.ts.map +1 -0
- package/lib/util/serializedCache.d.ts.map +1 -0
- package/lib/util/set.d.ts.map +1 -0
- package/lib/util/shuffle.d.ts.map +1 -0
- package/lib/util/sortBy.d.ts.map +1 -0
- package/lib/util/sszBytes.d.ts.map +1 -0
- package/lib/util/strictEvents.d.ts.map +1 -0
- package/lib/util/time.d.ts.map +1 -0
- package/lib/util/timeSeries.d.ts.map +1 -0
- package/lib/util/types.d.ts.map +1 -0
- package/lib/util/workerEvents.d.ts.map +1 -0
- package/lib/util/wrapError.d.ts.map +1 -0
- package/package.json +18 -20
- package/src/api/impl/api.ts +26 -0
- package/src/api/impl/beacon/blocks/index.ts +744 -0
- package/src/api/impl/beacon/blocks/utils.ts +75 -0
- package/src/api/impl/beacon/index.ts +35 -0
- package/src/api/impl/beacon/pool/index.ts +314 -0
- package/src/api/impl/beacon/rewards/index.ts +30 -0
- package/src/api/impl/beacon/state/index.ts +406 -0
- package/src/api/impl/beacon/state/utils.ts +189 -0
- package/src/api/impl/config/constants.ts +127 -0
- package/src/api/impl/config/index.ts +59 -0
- package/src/api/impl/debug/index.ts +131 -0
- package/src/api/impl/errors.ts +50 -0
- package/src/api/impl/events/index.ts +33 -0
- package/src/api/impl/index.ts +6 -0
- package/src/api/impl/lightclient/index.ts +64 -0
- package/src/api/impl/lodestar/index.ts +257 -0
- package/src/api/impl/node/index.ts +88 -0
- package/src/api/impl/node/utils.ts +51 -0
- package/src/api/impl/proof/index.ts +60 -0
- package/src/api/impl/types.ts +17 -0
- package/src/api/impl/utils.ts +25 -0
- package/src/api/impl/validator/index.ts +1538 -0
- package/src/api/impl/validator/utils.ts +85 -0
- package/src/api/index.ts +2 -0
- package/src/api/options.ts +16 -0
- package/src/api/rest/activeSockets.ts +109 -0
- package/src/api/rest/base.ts +216 -0
- package/src/api/rest/index.ts +63 -0
- package/src/api/rest/swaggerUI.ts +80 -0
- package/src/bun-wrappers/prometheus-gc-stats.ts +7 -0
- package/src/chain/ColumnReconstructionTracker.ts +90 -0
- package/src/chain/GetBlobsTracker.ts +115 -0
- package/src/chain/archiveStore/archiveStore.ts +222 -0
- package/src/chain/archiveStore/constants.ts +5 -0
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +116 -0
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +68 -0
- package/src/chain/archiveStore/historicalState/metrics.ts +214 -0
- package/src/chain/archiveStore/historicalState/types.ts +41 -0
- package/src/chain/archiveStore/historicalState/worker.ts +77 -0
- package/src/chain/archiveStore/index.ts +3 -0
- package/src/chain/archiveStore/interface.ts +75 -0
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +138 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +437 -0
- package/src/chain/archiveStore/utils/pruneHistory.ts +56 -0
- package/src/chain/archiveStore/utils/updateBackfillRange.ts +50 -0
- package/src/chain/balancesCache.ts +52 -0
- package/src/chain/beaconProposerCache.ts +43 -0
- package/src/chain/blocks/blockInput/blockInput.ts +851 -0
- package/src/chain/blocks/blockInput/errors.ts +48 -0
- package/src/chain/blocks/blockInput/index.ts +4 -0
- package/src/chain/blocks/blockInput/types.ts +145 -0
- package/src/chain/blocks/blockInput/utils.ts +21 -0
- package/src/chain/blocks/importBlock.ts +603 -0
- package/src/chain/blocks/index.ts +179 -0
- package/src/chain/blocks/types.ts +101 -0
- package/src/chain/blocks/utils/blowfishBanner.ts +28 -0
- package/src/chain/blocks/utils/chainSegment.ts +29 -0
- package/src/chain/blocks/utils/checkpoint.ts +25 -0
- package/src/chain/blocks/utils/giraffeBanner.ts +30 -0
- package/src/chain/blocks/utils/ownBanner.ts +20 -0
- package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +43 -0
- package/src/chain/blocks/utils/zebraBanner.ts +45 -0
- package/src/chain/blocks/verifyBlock.ts +242 -0
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +34 -0
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +438 -0
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +129 -0
- package/src/chain/blocks/verifyBlocksSignatures.ts +105 -0
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +114 -0
- package/src/chain/blocks/writeBlockInputToDb.ts +128 -0
- package/src/chain/bls/index.ts +4 -0
- package/src/chain/bls/interface.ts +68 -0
- package/src/chain/bls/maybeBatch.ts +45 -0
- package/src/chain/bls/multithread/index.ts +582 -0
- package/src/chain/bls/multithread/jobItem.ts +119 -0
- package/src/chain/bls/multithread/poolSize.ts +16 -0
- package/src/chain/bls/multithread/types.ts +38 -0
- package/src/chain/bls/multithread/utils.ts +19 -0
- package/src/chain/bls/multithread/worker.ts +114 -0
- package/src/chain/bls/singleThread.ts +87 -0
- package/src/chain/bls/utils.ts +30 -0
- package/src/chain/chain.ts +1365 -0
- package/src/chain/emitter.ts +113 -0
- package/src/chain/errors/attestationError.ts +194 -0
- package/src/chain/errors/attesterSlashingError.ts +11 -0
- package/src/chain/errors/blobSidecarError.ts +60 -0
- package/src/chain/errors/blockError.ts +166 -0
- package/src/chain/errors/blsToExecutionChangeError.ts +13 -0
- package/src/chain/errors/dataColumnSidecarError.ts +80 -0
- package/src/chain/errors/gossipValidation.ts +20 -0
- package/src/chain/errors/index.ts +10 -0
- package/src/chain/errors/lightClientError.ts +30 -0
- package/src/chain/errors/proposerSlashingError.ts +11 -0
- package/src/chain/errors/syncCommitteeError.ts +36 -0
- package/src/chain/errors/voluntaryExitError.ts +13 -0
- package/src/chain/forkChoice/index.ts +112 -0
- package/src/chain/genesis/genesis.ts +190 -0
- package/src/chain/genesis/interface.ts +14 -0
- package/src/chain/index.ts +6 -0
- package/src/chain/initState.ts +221 -0
- package/src/chain/interface.ts +280 -0
- package/src/chain/lightClient/index.ts +764 -0
- package/src/chain/lightClient/proofs.ts +85 -0
- package/src/chain/lightClient/types.ts +33 -0
- package/src/chain/opPools/aggregatedAttestationPool.ts +1063 -0
- package/src/chain/opPools/attestationPool.ts +283 -0
- package/src/chain/opPools/index.ts +5 -0
- package/src/chain/opPools/opPool.ts +462 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +167 -0
- package/src/chain/opPools/syncContributionAndProofPool.ts +240 -0
- package/src/chain/opPools/types.ts +35 -0
- package/src/chain/opPools/utils.ts +65 -0
- package/src/chain/options.ts +138 -0
- package/src/chain/prepareNextSlot.ts +277 -0
- package/src/chain/produceBlock/computeNewStateRoot.ts +55 -0
- package/src/chain/produceBlock/index.ts +2 -0
- package/src/chain/produceBlock/produceBlockBody.ts +797 -0
- package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +54 -0
- package/src/chain/regen/errors.ts +30 -0
- package/src/chain/regen/index.ts +4 -0
- package/src/chain/regen/interface.ts +93 -0
- package/src/chain/regen/queued.ts +317 -0
- package/src/chain/regen/regen.ts +424 -0
- package/src/chain/reprocess.ts +161 -0
- package/src/chain/rewards/attestationsRewards.ts +196 -0
- package/src/chain/rewards/blockRewards.ts +150 -0
- package/src/chain/rewards/syncCommitteeRewards.ts +58 -0
- package/src/chain/seenCache/index.ts +5 -0
- package/src/chain/seenCache/seenAggregateAndProof.ts +120 -0
- package/src/chain/seenCache/seenAttestationData.ts +145 -0
- package/src/chain/seenCache/seenAttesters.ts +58 -0
- package/src/chain/seenCache/seenBlockAttesters.ts +18 -0
- package/src/chain/seenCache/seenBlockProposers.ts +48 -0
- package/src/chain/seenCache/seenCommittee.ts +43 -0
- package/src/chain/seenCache/seenCommitteeContribution.ts +104 -0
- package/src/chain/seenCache/seenGossipBlockInput.ts +373 -0
- package/src/chain/serializeState.ts +32 -0
- package/src/chain/shufflingCache.ts +238 -0
- package/src/chain/stateCache/blockStateCacheImpl.ts +150 -0
- package/src/chain/stateCache/datastore/db.ts +36 -0
- package/src/chain/stateCache/datastore/file.ts +53 -0
- package/src/chain/stateCache/datastore/index.ts +2 -0
- package/src/chain/stateCache/datastore/types.ts +13 -0
- package/src/chain/stateCache/fifoBlockStateCache.ts +208 -0
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +198 -0
- package/src/chain/stateCache/index.ts +3 -0
- package/src/chain/stateCache/mapMetrics.ts +52 -0
- package/src/chain/stateCache/persistentCheckpointsCache.ts +835 -0
- package/src/chain/stateCache/types.ts +86 -0
- package/src/chain/validation/aggregateAndProof.ts +258 -0
- package/src/chain/validation/attestation.ts +885 -0
- package/src/chain/validation/attesterSlashing.ts +61 -0
- package/src/chain/validation/blobSidecar.ts +301 -0
- package/src/chain/validation/block.ts +188 -0
- package/src/chain/validation/blsToExecutionChange.ts +61 -0
- package/src/chain/validation/dataColumnSidecar.ts +381 -0
- package/src/chain/validation/index.ts +9 -0
- package/src/chain/validation/lightClientFinalityUpdate.ts +45 -0
- package/src/chain/validation/lightClientOptimisticUpdate.ts +67 -0
- package/src/chain/validation/proposerSlashing.ts +54 -0
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +38 -0
- package/src/chain/validation/signatureSets/contributionAndProof.ts +27 -0
- package/src/chain/validation/signatureSets/index.ts +6 -0
- package/src/chain/validation/signatureSets/selectionProof.ts +27 -0
- package/src/chain/validation/signatureSets/syncCommittee.ts +22 -0
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +18 -0
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +27 -0
- package/src/chain/validation/syncCommittee.ts +165 -0
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +122 -0
- package/src/chain/validation/voluntaryExit.ts +58 -0
- package/src/chain/validatorMonitor.ts +1299 -0
- package/src/constants/constants.ts +15 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/network.ts +52 -0
- package/src/db/beacon.ts +113 -0
- package/src/db/buckets.ts +80 -0
- package/src/db/index.ts +2 -0
- package/src/db/interface.ts +76 -0
- package/src/db/options.ts +7 -0
- package/src/db/repositories/attesterSlashing.ts +38 -0
- package/src/db/repositories/backfilledRanges.ts +29 -0
- package/src/db/repositories/blobSidecars.ts +37 -0
- package/src/db/repositories/blobSidecarsArchive.ts +28 -0
- package/src/db/repositories/block.ts +33 -0
- package/src/db/repositories/blockArchive.ts +170 -0
- package/src/db/repositories/blockArchiveIndex.ts +45 -0
- package/src/db/repositories/blsToExecutionChange.ts +16 -0
- package/src/db/repositories/checkpointState.ts +31 -0
- package/src/db/repositories/dataColumnSidecar.ts +49 -0
- package/src/db/repositories/dataColumnSidecarArchive.ts +56 -0
- package/src/db/repositories/depositDataRoot.ts +80 -0
- package/src/db/repositories/depositEvent.ts +32 -0
- package/src/db/repositories/eth1Data.ts +33 -0
- package/src/db/repositories/index.ts +20 -0
- package/src/db/repositories/lightclientBestUpdate.ts +41 -0
- package/src/db/repositories/lightclientCheckpointHeader.ts +32 -0
- package/src/db/repositories/lightclientSyncCommittee.ts +16 -0
- package/src/db/repositories/lightclientSyncCommitteeWitness.ts +77 -0
- package/src/db/repositories/proposerSlashing.ts +15 -0
- package/src/db/repositories/stateArchive.ts +69 -0
- package/src/db/repositories/stateArchiveIndex.ts +18 -0
- package/src/db/repositories/voluntaryExit.ts +15 -0
- package/src/db/single/index.ts +2 -0
- package/src/db/single/preGenesisState.ts +37 -0
- package/src/db/single/preGenesisStateLastProcessedBlock.ts +34 -0
- package/src/eth1/errors.ts +40 -0
- package/src/eth1/eth1DataCache.ts +26 -0
- package/src/eth1/eth1DepositDataTracker.ts +410 -0
- package/src/eth1/eth1DepositsCache.ts +141 -0
- package/src/eth1/eth1MergeBlockTracker.ts +328 -0
- package/src/eth1/index.ts +157 -0
- package/src/eth1/interface.ts +131 -0
- package/src/eth1/options.ts +28 -0
- package/src/eth1/provider/eth1Provider.ts +229 -0
- package/src/eth1/provider/jsonRpcHttpClient.ts +390 -0
- package/src/eth1/provider/jwt.ts +36 -0
- package/src/eth1/provider/utils.ts +136 -0
- package/src/eth1/stream.ts +75 -0
- package/src/eth1/utils/depositContract.ts +37 -0
- package/src/eth1/utils/deposits.ts +70 -0
- package/src/eth1/utils/eth1Data.ts +100 -0
- package/src/eth1/utils/eth1DepositEvent.ts +12 -0
- package/src/eth1/utils/eth1Vote.ts +142 -0
- package/src/eth1/utils/groupDepositEventsByBlock.ts +19 -0
- package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +18 -0
- package/src/execution/builder/cache.ts +39 -0
- package/src/execution/builder/http.ts +229 -0
- package/src/execution/builder/index.ts +27 -0
- package/src/execution/builder/interface.ts +49 -0
- package/src/execution/builder/utils.ts +19 -0
- package/src/execution/engine/disabled.ts +35 -0
- package/src/execution/engine/http.ts +644 -0
- package/src/execution/engine/index.ts +63 -0
- package/src/execution/engine/interface.ts +199 -0
- package/src/execution/engine/mock.ts +493 -0
- package/src/execution/engine/payloadIdCache.ts +54 -0
- package/src/execution/engine/types.ts +640 -0
- package/src/execution/engine/utils.ts +136 -0
- package/src/execution/index.ts +4 -0
- package/src/index.ts +20 -0
- package/src/metrics/index.ts +4 -0
- package/src/metrics/metrics/beacon.ts +390 -0
- package/src/metrics/metrics/lodestar.ts +1870 -0
- package/src/metrics/metrics.ts +43 -0
- package/src/metrics/nodeJsMetrics.ts +19 -0
- package/src/metrics/options.ts +22 -0
- package/src/metrics/server/http.ts +114 -0
- package/src/metrics/server/index.ts +1 -0
- package/src/metrics/utils/avgMinMax.ts +87 -0
- package/src/metrics/utils/gauge.ts +22 -0
- package/src/metrics/utils/registryMetricCreator.ts +41 -0
- package/src/monitoring/clientStats.ts +297 -0
- package/src/monitoring/index.ts +2 -0
- package/src/monitoring/options.ts +19 -0
- package/src/monitoring/properties.ts +152 -0
- package/src/monitoring/service.ts +235 -0
- package/src/monitoring/system.ts +146 -0
- package/src/monitoring/types.ts +21 -0
- package/src/network/core/events.ts +59 -0
- package/src/network/core/index.ts +3 -0
- package/src/network/core/metrics.ts +304 -0
- package/src/network/core/networkCore.ts +599 -0
- package/src/network/core/networkCoreWorker.ts +176 -0
- package/src/network/core/networkCoreWorkerHandler.ts +284 -0
- package/src/network/core/types.ts +119 -0
- package/src/network/discv5/index.ts +132 -0
- package/src/network/discv5/types.ts +74 -0
- package/src/network/discv5/utils.ts +50 -0
- package/src/network/discv5/worker.ts +137 -0
- package/src/network/events.ts +51 -0
- package/src/network/forks.ts +94 -0
- package/src/network/gossip/constants.ts +15 -0
- package/src/network/gossip/encoding.ts +111 -0
- package/src/network/gossip/errors.ts +7 -0
- package/src/network/gossip/gossipsub.ts +384 -0
- package/src/network/gossip/index.ts +4 -0
- package/src/network/gossip/interface.ts +215 -0
- package/src/network/gossip/metrics.ts +71 -0
- package/src/network/gossip/scoringParameters.ts +333 -0
- package/src/network/gossip/topic.ts +332 -0
- package/src/network/index.ts +8 -0
- package/src/network/interface.ts +134 -0
- package/src/network/libp2p/error.ts +55 -0
- package/src/network/libp2p/index.ts +153 -0
- package/src/network/metadata.ts +162 -0
- package/src/network/network.ts +767 -0
- package/src/network/networkConfig.ts +12 -0
- package/src/network/options.ts +70 -0
- package/src/network/peers/client.ts +29 -0
- package/src/network/peers/datastore.ts +188 -0
- package/src/network/peers/discover.ts +647 -0
- package/src/network/peers/index.ts +2 -0
- package/src/network/peers/peerManager.ts +899 -0
- package/src/network/peers/peersData.ts +65 -0
- package/src/network/peers/score/constants.ts +34 -0
- package/src/network/peers/score/index.ts +4 -0
- package/src/network/peers/score/interface.ts +74 -0
- package/src/network/peers/score/score.ts +200 -0
- package/src/network/peers/score/store.ts +95 -0
- package/src/network/peers/score/utils.ts +37 -0
- package/src/network/peers/utils/assertPeerRelevance.ts +99 -0
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +27 -0
- package/src/network/peers/utils/getConnectedPeerIds.ts +33 -0
- package/src/network/peers/utils/index.ts +4 -0
- package/src/network/peers/utils/prioritizePeers.ts +627 -0
- package/src/network/peers/utils/subnetMap.ts +88 -0
- package/src/network/processor/aggregatorTracker.ts +38 -0
- package/src/network/processor/extractSlotRootFns.ts +64 -0
- package/src/network/processor/gossipHandlers.ts +951 -0
- package/src/network/processor/gossipQueues/index.ts +114 -0
- package/src/network/processor/gossipQueues/indexed.ts +219 -0
- package/src/network/processor/gossipQueues/linear.ts +162 -0
- package/src/network/processor/gossipQueues/types.ts +57 -0
- package/src/network/processor/gossipValidatorFn.ts +142 -0
- package/src/network/processor/index.ts +496 -0
- package/src/network/processor/types.ts +27 -0
- package/src/network/reqresp/ReqRespBeaconNode.ts +373 -0
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +101 -0
- package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +49 -0
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +114 -0
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +62 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +144 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +88 -0
- package/src/network/reqresp/handlers/index.ts +78 -0
- package/src/network/reqresp/handlers/lightClientBootstrap.ts +31 -0
- package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +21 -0
- package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +21 -0
- package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +39 -0
- package/src/network/reqresp/index.ts +2 -0
- package/src/network/reqresp/interface.ts +45 -0
- package/src/network/reqresp/protocols.ts +146 -0
- package/src/network/reqresp/rateLimit.ts +112 -0
- package/src/network/reqresp/score.ts +70 -0
- package/src/network/reqresp/types.ts +174 -0
- package/src/network/reqresp/utils/collect.ts +84 -0
- package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +57 -0
- package/src/network/reqresp/utils/dataColumnResponseValidation.ts +99 -0
- package/src/network/statusCache.ts +17 -0
- package/src/network/subnets/attnetsService.ts +385 -0
- package/src/network/subnets/index.ts +2 -0
- package/src/network/subnets/interface.ts +66 -0
- package/src/network/subnets/syncnetsService.ts +147 -0
- package/src/network/subnets/util.ts +63 -0
- package/src/network/util.ts +29 -0
- package/src/node/index.ts +2 -0
- package/src/node/nodejs.ts +349 -0
- package/src/node/notifier.ts +206 -0
- package/src/node/options.ts +51 -0
- package/src/node/utils/interop/deposits.ts +53 -0
- package/src/node/utils/interop/state.ts +59 -0
- package/src/node/utils/lightclient.ts +7 -0
- package/src/node/utils/state.ts +37 -0
- package/src/sync/backfill/backfill.ts +893 -0
- package/src/sync/backfill/errors.ts +23 -0
- package/src/sync/backfill/index.ts +1 -0
- package/src/sync/backfill/verify.ts +58 -0
- package/src/sync/constants.ts +71 -0
- package/src/sync/index.ts +2 -0
- package/src/sync/interface.ts +55 -0
- package/src/sync/options.ts +45 -0
- package/src/sync/range/batch.ts +455 -0
- package/src/sync/range/chain.ts +715 -0
- package/src/sync/range/range.ts +354 -0
- package/src/sync/range/utils/batches.ts +119 -0
- package/src/sync/range/utils/chainTarget.ts +62 -0
- package/src/sync/range/utils/hashBlocks.ts +27 -0
- package/src/sync/range/utils/index.ts +5 -0
- package/src/sync/range/utils/peerBalancer.ts +184 -0
- package/src/sync/range/utils/updateChains.ts +66 -0
- package/src/sync/sync.ts +290 -0
- package/src/sync/types.ts +57 -0
- package/src/sync/unknownBlock.ts +859 -0
- package/src/sync/utils/downloadByRange.ts +808 -0
- package/src/sync/utils/downloadByRoot.ts +560 -0
- package/src/sync/utils/pendingBlocksTree.ts +97 -0
- package/src/sync/utils/remoteSyncType.ts +144 -0
- package/src/util/address.ts +3 -0
- package/src/util/array.ts +311 -0
- package/src/util/asyncIterableToEvents.ts +164 -0
- package/src/util/binarySearch.ts +48 -0
- package/src/util/bitArray.ts +84 -0
- package/src/util/blobs.ts +210 -0
- package/src/util/bufferPool.ts +95 -0
- package/src/util/bytes.ts +11 -0
- package/src/util/chunkify.ts +27 -0
- package/src/util/clock.ts +204 -0
- package/src/util/dataColumns.ts +415 -0
- package/src/util/dependentRoot.ts +47 -0
- package/src/util/enum.ts +17 -0
- package/src/util/error.ts +56 -0
- package/src/util/eventLoop.ts +22 -0
- package/src/util/execution.ts +223 -0
- package/src/util/file.ts +52 -0
- package/src/util/forkChoice.ts +5 -0
- package/src/util/forkName.ts +20 -0
- package/src/util/graffiti.ts +39 -0
- package/src/util/hex.ts +9 -0
- package/src/util/index.ts +2 -0
- package/src/util/ip.ts +6 -0
- package/src/util/itTrigger.ts +49 -0
- package/src/util/kzg.ts +3 -0
- package/src/util/map.ts +77 -0
- package/src/util/metadata.ts +22 -0
- package/src/util/multifork.ts +69 -0
- package/src/util/numpy.ts +8 -0
- package/src/util/peerId.ts +16 -0
- package/src/util/profile.ts +54 -0
- package/src/util/promises.ts +14 -0
- package/src/util/queue/errors.ts +14 -0
- package/src/util/queue/fnQueue.ts +16 -0
- package/src/util/queue/index.ts +4 -0
- package/src/util/queue/itemQueue.ts +128 -0
- package/src/util/queue/options.ts +37 -0
- package/src/util/serializedCache.ts +20 -0
- package/src/util/set.ts +62 -0
- package/src/util/shuffle.ts +21 -0
- package/src/util/sortBy.ts +19 -0
- package/src/util/sszBytes.ts +481 -0
- package/src/util/strictEvents.ts +8 -0
- package/src/util/time.ts +13 -0
- package/src/util/timeSeries.ts +118 -0
- package/src/util/types.ts +31 -0
- package/src/util/workerEvents.ts +142 -0
- package/src/util/wrapError.ts +27 -0
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import {Worker, spawn} from "@chainsafe/threads";
|
|
3
|
+
|
|
4
|
+
// `threads` library creates self global variable which breaks `timeout-abort-controller` https://github.com/jacobheun/timeout-abort-controller/issues/9
|
|
5
|
+
// @ts-expect-error
|
|
6
|
+
// biome-ignore lint/suspicious/noGlobalAssign: We need the global `self` to reassign module properties later
|
|
7
|
+
self = undefined;
|
|
8
|
+
|
|
9
|
+
import {PublicKey} from "@chainsafe/blst";
|
|
10
|
+
import {ISignatureSet} from "@lodestar/state-transition";
|
|
11
|
+
import {Logger} from "@lodestar/utils";
|
|
12
|
+
import {Metrics} from "../../../metrics/index.js";
|
|
13
|
+
import {LinkedList} from "../../../util/array.js";
|
|
14
|
+
import {callInNextEventLoop} from "../../../util/eventLoop.js";
|
|
15
|
+
import {QueueError, QueueErrorCode} from "../../../util/queue/index.js";
|
|
16
|
+
import {IBlsVerifier, VerifySignatureOpts} from "../interface.js";
|
|
17
|
+
import {verifySignatureSetsMaybeBatch} from "../maybeBatch.js";
|
|
18
|
+
import {getAggregatedPubkey, getAggregatedPubkeysCount} from "../utils.js";
|
|
19
|
+
import {
|
|
20
|
+
JobQueueItem,
|
|
21
|
+
JobQueueItemSameMessage,
|
|
22
|
+
JobQueueItemType,
|
|
23
|
+
jobItemSameMessageToMultiSet,
|
|
24
|
+
jobItemSigSets,
|
|
25
|
+
jobItemWorkReq,
|
|
26
|
+
} from "./jobItem.js";
|
|
27
|
+
import {defaultPoolSize} from "./poolSize.js";
|
|
28
|
+
import {BlsWorkReq, BlsWorkResult, WorkResultCode, WorkResultError, WorkerData} from "./types.js";
|
|
29
|
+
import {chunkifyMaximizeChunkSize} from "./utils.js";
|
|
30
|
+
|
|
31
|
+
// Worker constructor consider the path relative to the current working directory
|
|
32
|
+
const workerDir = process.env.NODE_ENV === "test" ? "../../../../lib/chain/bls/multithread" : "./";
|
|
33
|
+
|
|
34
|
+
export type BlsMultiThreadWorkerPoolModules = {
|
|
35
|
+
logger: Logger;
|
|
36
|
+
metrics: Metrics | null;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type BlsMultiThreadWorkerPoolOptions = {
|
|
40
|
+
blsVerifyAllMultiThread?: boolean;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export type {JobQueueItemType};
|
|
44
|
+
|
|
45
|
+
// 1 worker for the main thread
|
|
46
|
+
const blsPoolSize = Math.max(defaultPoolSize - 1, 1);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Split big signature sets into smaller sets so they can be sent to multiple workers.
|
|
50
|
+
*
|
|
51
|
+
* The biggest sets happen during sync, on mainnet batches of 64 blocks have around ~8000 signatures.
|
|
52
|
+
* The latency cost of sending the job to and from the worker is approx a single sig verification.
|
|
53
|
+
* If you split a big signature into 2, the extra time cost is `(2+2N)/(1+2N)`.
|
|
54
|
+
* For 128, the extra time cost is about 0.3%. No specific reasoning for `128`, it's just good enough.
|
|
55
|
+
*/
|
|
56
|
+
const MAX_SIGNATURE_SETS_PER_JOB = 128;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* If there are more than `MAX_BUFFERED_SIGS` buffered sigs, verify them immediately without waiting `MAX_BUFFER_WAIT_MS`.
|
|
60
|
+
*
|
|
61
|
+
* The efficiency improvement of batching sets asymptotically reaches x2. However, for batching large sets
|
|
62
|
+
* has more risk in case a signature is invalid, requiring to revalidate all sets in the batch. 32 is sweet
|
|
63
|
+
* point for this tradeoff.
|
|
64
|
+
*/
|
|
65
|
+
const MAX_BUFFERED_SIGS = 32;
|
|
66
|
+
/**
|
|
67
|
+
* Gossip objects usually come in bursts. Buffering them for a short period of time allows to increase batching
|
|
68
|
+
* efficiency, at the cost of delaying validation. Unless running in production shows otherwise, it's not critical
|
|
69
|
+
* to hold attestations and aggregates for 100ms. Lodestar existing queues may hold those objects for much more anyway.
|
|
70
|
+
*
|
|
71
|
+
* There's no exact reasoning for the `100` milliseconds number. The metric `batchSigsSuccess` should indicate if this
|
|
72
|
+
* value needs revision
|
|
73
|
+
*/
|
|
74
|
+
const MAX_BUFFER_WAIT_MS = 100;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Max concurrent jobs on `canAcceptWork` status
|
|
78
|
+
*/
|
|
79
|
+
const MAX_JOBS_CAN_ACCEPT_WORK = 512;
|
|
80
|
+
|
|
81
|
+
type WorkerApi = {
|
|
82
|
+
verifyManySignatureSets(workReqArr: BlsWorkReq[]): Promise<BlsWorkResult>;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
enum WorkerStatusCode {
|
|
86
|
+
notInitialized,
|
|
87
|
+
initializing,
|
|
88
|
+
initializationError,
|
|
89
|
+
idle,
|
|
90
|
+
running,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
type WorkerStatus =
|
|
94
|
+
| {code: WorkerStatusCode.notInitialized}
|
|
95
|
+
| {code: WorkerStatusCode.initializing; initPromise: Promise<WorkerApi>}
|
|
96
|
+
| {code: WorkerStatusCode.initializationError; error: Error}
|
|
97
|
+
| {code: WorkerStatusCode.idle; workerApi: WorkerApi}
|
|
98
|
+
| {code: WorkerStatusCode.running; workerApi: WorkerApi};
|
|
99
|
+
|
|
100
|
+
type WorkerDescriptor = {
|
|
101
|
+
worker: Worker;
|
|
102
|
+
status: WorkerStatus;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Wraps "threads" library thread pool queue system with the goals:
|
|
107
|
+
* - Complete total outstanding jobs in total minimum time possible.
|
|
108
|
+
* Will split large signature sets into smaller sets and send to different workers
|
|
109
|
+
* - Reduce the latency cost for small signature sets. In NodeJS 12,14 worker <-> main thread
|
|
110
|
+
* communication has very high latency, of around ~5 ms. So package multiple small signature
|
|
111
|
+
* sets into packages of work and send at once to a worker to distribute the latency cost
|
|
112
|
+
*/
|
|
113
|
+
export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
114
|
+
private readonly logger: Logger;
|
|
115
|
+
private readonly metrics: Metrics | null;
|
|
116
|
+
|
|
117
|
+
private readonly workers: WorkerDescriptor[];
|
|
118
|
+
private readonly jobs = new LinkedList<JobQueueItem>();
|
|
119
|
+
private bufferedJobs: {
|
|
120
|
+
jobs: LinkedList<JobQueueItem>;
|
|
121
|
+
prioritizedJobs: LinkedList<JobQueueItem>;
|
|
122
|
+
sigCount: number;
|
|
123
|
+
firstPush: number;
|
|
124
|
+
timeout: NodeJS.Timeout;
|
|
125
|
+
} | null = null;
|
|
126
|
+
private blsVerifyAllMultiThread: boolean;
|
|
127
|
+
private closed = false;
|
|
128
|
+
private workersBusy = 0;
|
|
129
|
+
|
|
130
|
+
constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules) {
|
|
131
|
+
const {logger, metrics} = modules;
|
|
132
|
+
this.logger = logger;
|
|
133
|
+
this.metrics = metrics;
|
|
134
|
+
this.blsVerifyAllMultiThread = options.blsVerifyAllMultiThread ?? false;
|
|
135
|
+
|
|
136
|
+
// Use compressed for herumi for now.
|
|
137
|
+
// THe worker is not able to deserialize from uncompressed
|
|
138
|
+
// `Error: err _wrapDeserialize`
|
|
139
|
+
this.workers = this.createWorkers(blsPoolSize);
|
|
140
|
+
|
|
141
|
+
if (metrics) {
|
|
142
|
+
metrics.blsThreadPool.queueLength.addCollect(() => {
|
|
143
|
+
metrics.blsThreadPool.queueLength.set(this.jobs.length);
|
|
144
|
+
metrics.blsThreadPool.workersBusy.set(this.workersBusy);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
canAcceptWork(): boolean {
|
|
150
|
+
return (
|
|
151
|
+
this.workersBusy < blsPoolSize &&
|
|
152
|
+
// TODO: Should also bound the jobs queue?
|
|
153
|
+
this.jobs.length < MAX_JOBS_CAN_ACCEPT_WORK
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async verifySignatureSets(sets: ISignatureSet[], opts: VerifySignatureOpts = {}): Promise<boolean> {
|
|
158
|
+
// Pubkeys are aggregated in the main thread regardless if verified in workers or in main thread
|
|
159
|
+
this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
|
|
160
|
+
this.metrics?.blsThreadPool.totalSigSets.inc(sets.length);
|
|
161
|
+
if (opts.priority) {
|
|
162
|
+
this.metrics?.blsThreadPool.prioritizedSigSets.inc(sets.length);
|
|
163
|
+
}
|
|
164
|
+
if (opts.batchable) {
|
|
165
|
+
this.metrics?.blsThreadPool.batchableSigSets.inc(sets.length);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (opts.verifyOnMainThread && !this.blsVerifyAllMultiThread) {
|
|
169
|
+
const timer = this.metrics?.blsThreadPool.mainThreadDurationInThreadPool.startTimer();
|
|
170
|
+
try {
|
|
171
|
+
return verifySignatureSetsMaybeBatch(
|
|
172
|
+
sets.map((set) => ({
|
|
173
|
+
publicKey: getAggregatedPubkey(set),
|
|
174
|
+
message: set.signingRoot.valueOf(),
|
|
175
|
+
signature: set.signature,
|
|
176
|
+
}))
|
|
177
|
+
);
|
|
178
|
+
} finally {
|
|
179
|
+
if (timer) timer();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Split large array of sets into smaller.
|
|
184
|
+
// Very helpful when syncing finalized, sync may submit +1000 sets so chunkify allows to distribute to many workers
|
|
185
|
+
const results = await Promise.all(
|
|
186
|
+
chunkifyMaximizeChunkSize(sets, MAX_SIGNATURE_SETS_PER_JOB).map(
|
|
187
|
+
(setsChunk) =>
|
|
188
|
+
new Promise<boolean>((resolve, reject) => {
|
|
189
|
+
return this.queueBlsWork({
|
|
190
|
+
type: JobQueueItemType.default,
|
|
191
|
+
resolve,
|
|
192
|
+
reject,
|
|
193
|
+
addedTimeMs: Date.now(),
|
|
194
|
+
opts,
|
|
195
|
+
sets: setsChunk,
|
|
196
|
+
});
|
|
197
|
+
})
|
|
198
|
+
)
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
// .every on an empty array returns true
|
|
202
|
+
if (results.length === 0) {
|
|
203
|
+
throw Error("Empty results array");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return results.every((isValid) => isValid === true);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Verify signature sets of the same message, only supports worker verification.
|
|
211
|
+
*/
|
|
212
|
+
async verifySignatureSetsSameMessage(
|
|
213
|
+
sets: {publicKey: PublicKey; signature: Uint8Array}[],
|
|
214
|
+
message: Uint8Array,
|
|
215
|
+
opts: Omit<VerifySignatureOpts, "verifyOnMainThread"> = {}
|
|
216
|
+
): Promise<boolean[]> {
|
|
217
|
+
// chunkify so that it reduce the risk of retrying when there is at least one invalid signature
|
|
218
|
+
const results = await Promise.all(
|
|
219
|
+
chunkifyMaximizeChunkSize(sets, MAX_SIGNATURE_SETS_PER_JOB).map(
|
|
220
|
+
(setsChunk) =>
|
|
221
|
+
new Promise<boolean[]>((resolve, reject) => {
|
|
222
|
+
this.queueBlsWork({
|
|
223
|
+
type: JobQueueItemType.sameMessage,
|
|
224
|
+
resolve,
|
|
225
|
+
reject,
|
|
226
|
+
addedTimeMs: Date.now(),
|
|
227
|
+
opts,
|
|
228
|
+
sets: setsChunk,
|
|
229
|
+
message,
|
|
230
|
+
});
|
|
231
|
+
})
|
|
232
|
+
)
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
return results.flat();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async close(): Promise<void> {
|
|
239
|
+
if (this.bufferedJobs) {
|
|
240
|
+
clearTimeout(this.bufferedJobs.timeout);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Abort all jobs
|
|
244
|
+
for (const job of this.jobs) {
|
|
245
|
+
job.reject(new QueueError({code: QueueErrorCode.QUEUE_ABORTED}));
|
|
246
|
+
}
|
|
247
|
+
this.jobs.clear();
|
|
248
|
+
|
|
249
|
+
// Terminate all workers. await to ensure no workers are left hanging
|
|
250
|
+
await Promise.all(
|
|
251
|
+
Array.from(this.workers.entries()).map(([id, worker]) =>
|
|
252
|
+
// NOTE: 'threads' has not yet updated types, and NodeJS complains with
|
|
253
|
+
// [DEP0132] DeprecationWarning: Passing a callback to worker.terminate() is deprecated. It returns a Promise instead.
|
|
254
|
+
(worker.worker.terminate() as unknown as Promise<void>).catch((e: Error) => {
|
|
255
|
+
this.logger.error("Error terminating worker", {id}, e);
|
|
256
|
+
})
|
|
257
|
+
)
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private createWorkers(poolSize: number): WorkerDescriptor[] {
|
|
262
|
+
const workers: WorkerDescriptor[] = [];
|
|
263
|
+
|
|
264
|
+
for (let i = 0; i < poolSize; i++) {
|
|
265
|
+
const workerData: WorkerData = {workerId: i};
|
|
266
|
+
const worker = new Worker(path.join(workerDir, "worker.js"), {
|
|
267
|
+
suppressTranspileTS: Boolean(globalThis.Bun),
|
|
268
|
+
workerData,
|
|
269
|
+
} as ConstructorParameters<typeof Worker>[1]);
|
|
270
|
+
|
|
271
|
+
const workerDescriptor: WorkerDescriptor = {
|
|
272
|
+
worker,
|
|
273
|
+
status: {code: WorkerStatusCode.notInitialized},
|
|
274
|
+
};
|
|
275
|
+
workers.push(workerDescriptor);
|
|
276
|
+
|
|
277
|
+
// TODO: Consider initializing only when necessary
|
|
278
|
+
const initPromise = spawn<WorkerApi>(worker, {
|
|
279
|
+
// A Lodestar Node may do very expensive task at start blocking the event loop and causing
|
|
280
|
+
// the initialization to timeout. The number below is big enough to almost disable the timeout
|
|
281
|
+
timeout: 5 * 60 * 1000,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
workerDescriptor.status = {code: WorkerStatusCode.initializing, initPromise};
|
|
285
|
+
|
|
286
|
+
initPromise
|
|
287
|
+
.then((workerApi) => {
|
|
288
|
+
workerDescriptor.status = {code: WorkerStatusCode.idle, workerApi};
|
|
289
|
+
// Potentially run jobs that were queued before initialization of the first worker
|
|
290
|
+
setTimeout(this.runJob, 0);
|
|
291
|
+
})
|
|
292
|
+
.catch((error: Error) => {
|
|
293
|
+
workerDescriptor.status = {code: WorkerStatusCode.initializationError, error};
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return workers;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Register BLS work to be done eventually in a worker
|
|
302
|
+
*/
|
|
303
|
+
private queueBlsWork(job: JobQueueItem): void {
|
|
304
|
+
if (this.closed) {
|
|
305
|
+
throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// TODO: Consider if limiting queue size is necessary here.
|
|
309
|
+
// It would be bad to reject signatures because the node is slow.
|
|
310
|
+
// However, if the worker communication broke jobs won't ever finish
|
|
311
|
+
|
|
312
|
+
if (
|
|
313
|
+
this.workers.length > 0 &&
|
|
314
|
+
this.workers[0].status.code === WorkerStatusCode.initializationError &&
|
|
315
|
+
this.workers.every((worker) => worker.status.code === WorkerStatusCode.initializationError)
|
|
316
|
+
) {
|
|
317
|
+
job.reject(this.workers[0].status.error);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Append batchable sets to `bufferedJobs`, starting a timeout to push them into `jobs`.
|
|
322
|
+
// Do not call `runJob()`, it is called from `runBufferedJobs()`
|
|
323
|
+
if (job.opts.batchable) {
|
|
324
|
+
if (!this.bufferedJobs) {
|
|
325
|
+
this.bufferedJobs = {
|
|
326
|
+
jobs: new LinkedList(),
|
|
327
|
+
prioritizedJobs: new LinkedList(),
|
|
328
|
+
sigCount: 0,
|
|
329
|
+
firstPush: Date.now(),
|
|
330
|
+
timeout: setTimeout(this.runBufferedJobs, MAX_BUFFER_WAIT_MS),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const jobs = job.opts.priority ? this.bufferedJobs.prioritizedJobs : this.bufferedJobs.jobs;
|
|
334
|
+
jobs.push(job);
|
|
335
|
+
this.bufferedJobs.sigCount += jobItemSigSets(job);
|
|
336
|
+
if (this.bufferedJobs.sigCount > MAX_BUFFERED_SIGS) {
|
|
337
|
+
clearTimeout(this.bufferedJobs.timeout);
|
|
338
|
+
this.runBufferedJobs();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Push job and schedule to call `runJob` in the next macro event loop cycle.
|
|
343
|
+
// This is useful to allow batching job submitted from a synchronous for loop,
|
|
344
|
+
// and to prevent large stacks since runJob may be called recursively.
|
|
345
|
+
else {
|
|
346
|
+
if (job.opts.priority) {
|
|
347
|
+
this.jobs.unshift(job);
|
|
348
|
+
} else {
|
|
349
|
+
this.jobs.push(job);
|
|
350
|
+
}
|
|
351
|
+
callInNextEventLoop(this.runJob);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Potentially submit jobs to an idle worker, only if there's a worker and jobs
|
|
357
|
+
*/
|
|
358
|
+
private runJob = async (): Promise<void> => {
|
|
359
|
+
if (this.closed) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Find idle worker
|
|
364
|
+
const worker = this.workers.find((worker) => worker.status.code === WorkerStatusCode.idle);
|
|
365
|
+
if (!worker || worker.status.code !== WorkerStatusCode.idle) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Prepare work package
|
|
370
|
+
const jobsInput = this.prepareWork();
|
|
371
|
+
if (jobsInput.length === 0) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// TODO: After sending the work to the worker the main thread can drop the job arguments
|
|
376
|
+
// and free-up memory, only needs to keep the job's Promise handlers.
|
|
377
|
+
// Maybe it's not useful since all data referenced in jobs is likely referenced by others
|
|
378
|
+
|
|
379
|
+
const workerApi = worker.status.workerApi;
|
|
380
|
+
worker.status = {code: WorkerStatusCode.running, workerApi};
|
|
381
|
+
this.workersBusy++;
|
|
382
|
+
|
|
383
|
+
try {
|
|
384
|
+
let startedJobsDefault = 0;
|
|
385
|
+
let startedJobsSameMessage = 0;
|
|
386
|
+
let startedSetsDefault = 0;
|
|
387
|
+
let startedSetsSameMessage = 0;
|
|
388
|
+
const workReqs: BlsWorkReq[] = [];
|
|
389
|
+
const jobsStarted: JobQueueItem[] = [];
|
|
390
|
+
|
|
391
|
+
for (const job of jobsInput) {
|
|
392
|
+
this.metrics?.blsThreadPool.jobWaitTime.observe((Date.now() - job.addedTimeMs) / 1000);
|
|
393
|
+
|
|
394
|
+
let workReq: BlsWorkReq;
|
|
395
|
+
try {
|
|
396
|
+
// Note: This can throw, must be handled per-job.
|
|
397
|
+
// Pubkey and signature aggregation is defered here
|
|
398
|
+
workReq = await jobItemWorkReq(job, this.metrics);
|
|
399
|
+
} catch (e) {
|
|
400
|
+
this.metrics?.blsThreadPool.errorAggregateSignatureSetsCount.inc({type: job.type});
|
|
401
|
+
|
|
402
|
+
switch (job.type) {
|
|
403
|
+
case JobQueueItemType.default:
|
|
404
|
+
job.reject(e as Error);
|
|
405
|
+
break;
|
|
406
|
+
|
|
407
|
+
case JobQueueItemType.sameMessage:
|
|
408
|
+
// there could be an invalid pubkey/signature, retry each individually
|
|
409
|
+
this.retryJobItemSameMessage(job);
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
// Re-push all jobs with matching workReq for easier accounting of results
|
|
416
|
+
workReqs.push(workReq);
|
|
417
|
+
jobsStarted.push(job);
|
|
418
|
+
|
|
419
|
+
if (job.type === JobQueueItemType.sameMessage) {
|
|
420
|
+
startedJobsSameMessage += 1;
|
|
421
|
+
startedSetsSameMessage += job.sets.length;
|
|
422
|
+
} else {
|
|
423
|
+
startedJobsDefault += 1;
|
|
424
|
+
startedSetsDefault += job.sets.length;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
const startedSigSets = startedSetsDefault + startedSetsSameMessage;
|
|
429
|
+
this.metrics?.blsThreadPool.totalJobsGroupsStarted.inc(1);
|
|
430
|
+
this.metrics?.blsThreadPool.totalJobsStarted.inc({type: JobQueueItemType.default}, startedJobsDefault);
|
|
431
|
+
this.metrics?.blsThreadPool.totalJobsStarted.inc({type: JobQueueItemType.sameMessage}, startedJobsSameMessage);
|
|
432
|
+
this.metrics?.blsThreadPool.totalSigSetsStarted.inc({type: JobQueueItemType.default}, startedSetsDefault);
|
|
433
|
+
this.metrics?.blsThreadPool.totalSigSetsStarted.inc({type: JobQueueItemType.sameMessage}, startedSetsSameMessage);
|
|
434
|
+
|
|
435
|
+
// Send work package to the worker
|
|
436
|
+
// If the job, metrics or any code below throws: the job will reject never going stale.
|
|
437
|
+
// Only downside is the job promise may be resolved twice, but that's not an issue
|
|
438
|
+
|
|
439
|
+
const [jobStartSec, jobStartNs] = process.hrtime();
|
|
440
|
+
const workResult = await workerApi.verifyManySignatureSets(workReqs);
|
|
441
|
+
const [jobEndSec, jobEndNs] = process.hrtime();
|
|
442
|
+
const {workerId, batchRetries, batchSigsSuccess, workerStartTime, workerEndTime, results} = workResult;
|
|
443
|
+
|
|
444
|
+
const [workerStartSec, workerStartNs] = workerStartTime;
|
|
445
|
+
const [workerEndSec, workerEndNs] = workerEndTime;
|
|
446
|
+
|
|
447
|
+
let successCount = 0;
|
|
448
|
+
let errorCount = 0;
|
|
449
|
+
|
|
450
|
+
// Un-wrap work package
|
|
451
|
+
for (let i = 0; i < jobsStarted.length; i++) {
|
|
452
|
+
const job = jobsStarted[i];
|
|
453
|
+
const jobResult = results[i];
|
|
454
|
+
const sigSetCount = jobItemSigSets(job);
|
|
455
|
+
|
|
456
|
+
// TODO: enable exhaustive switch case checks lint rule
|
|
457
|
+
switch (job.type) {
|
|
458
|
+
case JobQueueItemType.default:
|
|
459
|
+
if (!jobResult || jobResult.code !== WorkResultCode.success) {
|
|
460
|
+
job.reject(getJobResultError(jobResult, i));
|
|
461
|
+
errorCount += sigSetCount;
|
|
462
|
+
} else {
|
|
463
|
+
job.resolve(jobResult.result);
|
|
464
|
+
successCount += sigSetCount;
|
|
465
|
+
}
|
|
466
|
+
break;
|
|
467
|
+
|
|
468
|
+
// handle result of the verification of aggregated signature against aggregated pubkeys
|
|
469
|
+
case JobQueueItemType.sameMessage:
|
|
470
|
+
if (!jobResult || jobResult.code !== WorkResultCode.success) {
|
|
471
|
+
job.reject(getJobResultError(jobResult, i));
|
|
472
|
+
errorCount += 1;
|
|
473
|
+
} else {
|
|
474
|
+
if (jobResult.result) {
|
|
475
|
+
// All are valid, most of the time it goes here
|
|
476
|
+
job.resolve(job.sets.map(() => true));
|
|
477
|
+
} else {
|
|
478
|
+
// Retry each individually
|
|
479
|
+
this.retryJobItemSameMessage(job);
|
|
480
|
+
}
|
|
481
|
+
successCount += 1;
|
|
482
|
+
}
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
const workerJobTimeSec = workerEndSec - workerStartSec + (workerEndNs - workerStartNs) / 1e9;
|
|
488
|
+
const latencyToWorkerSec = workerStartSec - jobStartSec + (workerStartNs - jobStartNs) / 1e9;
|
|
489
|
+
const latencyFromWorkerSec = jobEndSec - workerEndSec + Number(jobEndNs - workerEndNs) / 1e9;
|
|
490
|
+
|
|
491
|
+
this.metrics?.blsThreadPool.timePerSigSet.observe(workerJobTimeSec / startedSigSets);
|
|
492
|
+
this.metrics?.blsThreadPool.jobsWorkerTime.inc({workerId}, workerJobTimeSec);
|
|
493
|
+
this.metrics?.blsThreadPool.latencyToWorker.observe(latencyToWorkerSec);
|
|
494
|
+
this.metrics?.blsThreadPool.latencyFromWorker.observe(latencyFromWorkerSec);
|
|
495
|
+
this.metrics?.blsThreadPool.successJobsSignatureSetsCount.inc(successCount);
|
|
496
|
+
this.metrics?.blsThreadPool.errorJobsSignatureSetsCount.inc(errorCount);
|
|
497
|
+
this.metrics?.blsThreadPool.batchRetries.inc(batchRetries);
|
|
498
|
+
this.metrics?.blsThreadPool.batchSigsSuccess.inc(batchSigsSuccess);
|
|
499
|
+
} catch (e) {
|
|
500
|
+
// Worker communications should never reject
|
|
501
|
+
if (!this.closed) {
|
|
502
|
+
this.logger.error("BlsMultiThreadWorkerPool error", {}, e as Error);
|
|
503
|
+
}
|
|
504
|
+
// Reject all
|
|
505
|
+
for (const job of jobsInput) {
|
|
506
|
+
job.reject(e as Error);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
worker.status = {code: WorkerStatusCode.idle, workerApi};
|
|
511
|
+
this.workersBusy--;
|
|
512
|
+
|
|
513
|
+
// Potentially run a new job
|
|
514
|
+
callInNextEventLoop(this.runJob);
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Grab pending work up to a max number of signatures
|
|
519
|
+
*/
|
|
520
|
+
private prepareWork(): JobQueueItem[] {
|
|
521
|
+
const jobs: JobQueueItem[] = [];
|
|
522
|
+
let totalSigs = 0;
|
|
523
|
+
|
|
524
|
+
while (totalSigs < MAX_SIGNATURE_SETS_PER_JOB) {
|
|
525
|
+
const job = this.jobs.shift();
|
|
526
|
+
if (!job) {
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
jobs.push(job);
|
|
531
|
+
totalSigs += jobItemSigSets(job);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
return jobs;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Add all buffered jobs to the job queue and potentially run them immediately
|
|
539
|
+
*/
|
|
540
|
+
private runBufferedJobs = (): void => {
|
|
541
|
+
if (this.bufferedJobs) {
|
|
542
|
+
for (const job of this.bufferedJobs.jobs) {
|
|
543
|
+
this.jobs.push(job);
|
|
544
|
+
}
|
|
545
|
+
for (const job of this.bufferedJobs.prioritizedJobs) {
|
|
546
|
+
this.jobs.unshift(job);
|
|
547
|
+
}
|
|
548
|
+
this.bufferedJobs = null;
|
|
549
|
+
callInNextEventLoop(this.runJob);
|
|
550
|
+
}
|
|
551
|
+
};
|
|
552
|
+
|
|
553
|
+
private retryJobItemSameMessage(job: JobQueueItemSameMessage): void {
|
|
554
|
+
// Create new jobs for each pubkey set, and Promise.all all the results
|
|
555
|
+
for (const j of jobItemSameMessageToMultiSet(job)) {
|
|
556
|
+
if (j.opts.priority) {
|
|
557
|
+
this.jobs.unshift(j);
|
|
558
|
+
} else {
|
|
559
|
+
this.jobs.push(j);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
this.metrics?.blsThreadPool.sameMessageRetryJobs.inc(1);
|
|
563
|
+
this.metrics?.blsThreadPool.sameMessageRetrySets.inc(job.sets.length);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/** For testing */
|
|
567
|
+
protected async waitTillInitialized(): Promise<void> {
|
|
568
|
+
await Promise.all(
|
|
569
|
+
this.workers.map(async (worker) => {
|
|
570
|
+
if (worker.status.code === WorkerStatusCode.initializing) {
|
|
571
|
+
await worker.status.initPromise;
|
|
572
|
+
}
|
|
573
|
+
})
|
|
574
|
+
);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function getJobResultError(jobResult: WorkResultError | null, i: number): Error {
|
|
579
|
+
const workerError = jobResult ? Error(jobResult.error.message) : Error(`No jobResult for index ${i}`);
|
|
580
|
+
if (jobResult?.error?.stack) workerError.stack = jobResult.error.stack;
|
|
581
|
+
return workerError;
|
|
582
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {PublicKey, asyncAggregateWithRandomness} from "@chainsafe/blst";
|
|
2
|
+
import {ISignatureSet, SignatureSetType} from "@lodestar/state-transition";
|
|
3
|
+
import {Metrics} from "../../../metrics/metrics.js";
|
|
4
|
+
import {LinkedList} from "../../../util/array.js";
|
|
5
|
+
import {VerifySignatureOpts} from "../interface.js";
|
|
6
|
+
import {getAggregatedPubkey} from "../utils.js";
|
|
7
|
+
import {BlsWorkReq} from "./types.js";
|
|
8
|
+
|
|
9
|
+
export type JobQueueItem = JobQueueItemDefault | JobQueueItemSameMessage;
|
|
10
|
+
|
|
11
|
+
export type JobQueueItemDefault = {
|
|
12
|
+
type: JobQueueItemType.default;
|
|
13
|
+
resolve: (result: boolean) => void;
|
|
14
|
+
reject: (error?: Error) => void;
|
|
15
|
+
addedTimeMs: number;
|
|
16
|
+
opts: VerifySignatureOpts;
|
|
17
|
+
sets: ISignatureSet[];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type JobQueueItemSameMessage = {
|
|
21
|
+
type: JobQueueItemType.sameMessage;
|
|
22
|
+
resolve: (result: boolean[]) => void;
|
|
23
|
+
reject: (error?: Error) => void;
|
|
24
|
+
addedTimeMs: number;
|
|
25
|
+
opts: VerifySignatureOpts;
|
|
26
|
+
sets: {publicKey: PublicKey; signature: Uint8Array}[];
|
|
27
|
+
message: Uint8Array;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export enum JobQueueItemType {
|
|
31
|
+
default = "default",
|
|
32
|
+
sameMessage = "same_message",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Return count of signature sets from a JobQueueItem
|
|
37
|
+
*/
|
|
38
|
+
export function jobItemSigSets(job: JobQueueItem): number {
|
|
39
|
+
switch (job.type) {
|
|
40
|
+
case JobQueueItemType.default:
|
|
41
|
+
return job.sets.length;
|
|
42
|
+
case JobQueueItemType.sameMessage:
|
|
43
|
+
return 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Prepare BlsWorkReq from JobQueueItem
|
|
49
|
+
* WARNING: May throw with untrusted user input
|
|
50
|
+
*/
|
|
51
|
+
export async function jobItemWorkReq(job: JobQueueItem, metrics: Metrics | null): Promise<BlsWorkReq> {
|
|
52
|
+
switch (job.type) {
|
|
53
|
+
case JobQueueItemType.default:
|
|
54
|
+
return {
|
|
55
|
+
opts: job.opts,
|
|
56
|
+
sets: job.sets.map((set) => ({
|
|
57
|
+
// this can throw, handled in the consumer code
|
|
58
|
+
publicKey: getAggregatedPubkey(set, metrics).toBytes(),
|
|
59
|
+
signature: set.signature,
|
|
60
|
+
message: set.signingRoot,
|
|
61
|
+
})),
|
|
62
|
+
};
|
|
63
|
+
case JobQueueItemType.sameMessage: {
|
|
64
|
+
const timer = metrics?.blsThreadPool.aggregateWithRandomnessAsyncDuration.startTimer();
|
|
65
|
+
const {pk, sig} = await asyncAggregateWithRandomness(
|
|
66
|
+
job.sets.map((set) => ({pk: set.publicKey, sig: set.signature}))
|
|
67
|
+
);
|
|
68
|
+
timer?.();
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
opts: job.opts,
|
|
72
|
+
sets: [
|
|
73
|
+
{
|
|
74
|
+
publicKey: pk.toBytes(),
|
|
75
|
+
signature: sig.toBytes(),
|
|
76
|
+
message: job.message,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Convert a JobQueueItemSameMessage into multiple JobQueueItemDefault linked to the original promise
|
|
86
|
+
*/
|
|
87
|
+
export function jobItemSameMessageToMultiSet(job: JobQueueItemSameMessage): LinkedList<JobQueueItemDefault> {
|
|
88
|
+
// Retry each individually
|
|
89
|
+
// Create new jobs for each pubkey set, and Promise.all all the results
|
|
90
|
+
const promises: Promise<boolean>[] = [];
|
|
91
|
+
const jobs = new LinkedList<JobQueueItemDefault>();
|
|
92
|
+
|
|
93
|
+
for (const set of job.sets) {
|
|
94
|
+
promises.push(
|
|
95
|
+
new Promise<boolean>((resolve, reject) => {
|
|
96
|
+
jobs.push({
|
|
97
|
+
type: JobQueueItemType.default,
|
|
98
|
+
resolve,
|
|
99
|
+
reject,
|
|
100
|
+
addedTimeMs: job.addedTimeMs,
|
|
101
|
+
opts: {batchable: false, priority: job.opts.priority},
|
|
102
|
+
sets: [
|
|
103
|
+
{
|
|
104
|
+
type: SignatureSetType.single,
|
|
105
|
+
pubkey: set.publicKey,
|
|
106
|
+
signature: set.signature,
|
|
107
|
+
signingRoot: job.message,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
});
|
|
111
|
+
})
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Connect jobs to main job
|
|
116
|
+
Promise.all(promises).then(job.resolve, job.reject);
|
|
117
|
+
|
|
118
|
+
return jobs;
|
|
119
|
+
}
|