@lodestar/beacon-node 1.51.0-dev.fa491bf50f → 1.51.0-dev.fb216e169a
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/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +36 -88
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +22 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/validator/index.d.ts +6 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +38 -25
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +13 -2
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +69 -35
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +5 -241
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/errors.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +2 -18
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/types.js +0 -1
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +36 -53
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +32 -18
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +3 -3
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -20
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +0 -24
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +18 -7
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/interface.d.ts +2 -0
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +1 -1
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +50 -22
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +1 -1
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/worker.js +1 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.js +1 -1
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.js +1 -1
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +25 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +120 -39
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +7 -7
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -5
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +1 -1
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +1 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
- package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/errors/index.d.ts +0 -1
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +0 -1
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +11 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +11 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
- package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
- package/lib/chain/forkChoiceExecutionEngine.js +117 -0
- package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
- package/lib/chain/interface.d.ts +9 -7
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +15 -4
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +17 -7
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
- package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/singleAttestationPool.js +209 -0
- package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +5 -3
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +3 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/proposerTracker.d.ts +31 -0
- package/lib/chain/proposerTracker.d.ts.map +1 -0
- package/lib/chain/proposerTracker.js +75 -0
- package/lib/chain/proposerTracker.js.map +1 -0
- package/lib/chain/regen/interface.d.ts +1 -1
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +1 -1
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +5 -3
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -13
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -2
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +0 -3
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/flatFileStore/flatFileStore.js +5 -5
- package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
- package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
- package/lib/db/flatFileStore/slotIndex.js +2 -2
- package/lib/db/flatFileStore/slotIndex.js.map +1 -1
- package/lib/db/repositories/blobSidecars.d.ts +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
- package/lib/db/repositories/blobSidecars.js +0 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/execution/builder/apiClient.d.ts +14 -8
- package/lib/execution/builder/apiClient.d.ts.map +1 -1
- package/lib/execution/builder/apiClient.js +12 -10
- package/lib/execution/builder/apiClient.js.map +1 -1
- package/lib/execution/builder/http.d.ts +2 -0
- package/lib/execution/builder/http.d.ts.map +1 -1
- package/lib/execution/builder/http.js +2 -0
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/engine/http.d.ts +4 -6
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +8 -10
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +18 -6
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +2 -12
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +0 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +0 -4
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +2 -4
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +1 -15
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +0 -9
- package/lib/execution/engine/sszTypes.d.ts.map +1 -1
- package/lib/execution/engine/sszTypes.js +0 -5
- package/lib/execution/engine/sszTypes.js.map +1 -1
- package/lib/execution/engine/transport.d.ts +1 -14
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +0 -8
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +2 -10
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.d.ts.map +1 -1
- package/lib/execution/engine/utils.js +3 -2
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +0 -9
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +0 -30
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +30 -8
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +79 -18
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/server/http.js +5 -5
- package/lib/metrics/server/http.js.map +1 -1
- package/lib/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +4 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +7 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +6 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +6 -1
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +1 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +10 -0
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +1 -8
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +0 -1
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +0 -16
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +0 -23
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +4 -5
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +8 -7
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +53 -35
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +2 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js +28 -1
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.js +8 -16
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/peers/utils/subnetMap.d.ts +5 -2
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
- package/lib/network/peers/utils/subnetMap.js +6 -3
- package/lib/network/peers/utils/subnetMap.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +1 -8
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +52 -131
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +0 -6
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +1 -5
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +6 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +29 -4
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +1 -12
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +0 -2
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +0 -10
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +1 -17
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +2 -8
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +1 -7
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts +35 -5
- package/lib/network/subnets/attnetsService.d.ts.map +1 -1
- package/lib/network/subnets/attnetsService.js +84 -6
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +7 -0
- package/lib/network/subnets/interface.d.ts.map +1 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/node/nodejs.d.ts +3 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +38 -20
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/options.d.ts +3 -1
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +4 -2
- package/lib/node/options.js.map +1 -1
- package/lib/sync/interface.d.ts.map +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/range/batch.d.ts +2 -3
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +9 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +2 -15
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/sync.d.ts +15 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +103 -25
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +1 -7
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +6 -34
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +24 -128
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +2 -18
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +14 -99
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.d.ts +1 -7
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js +0 -19
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/execution.d.ts +3 -4
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +1 -73
- package/lib/util/execution.js.map +1 -1
- package/lib/util/file.d.ts.map +1 -1
- package/lib/util/file.js +8 -9
- package/lib/util/file.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +5 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +36 -19
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +0 -5
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -2
- package/lib/util/types.js.map +1 -1
- package/package.json +16 -17
- package/src/api/impl/beacon/blocks/index.ts +59 -109
- package/src/api/impl/beacon/pool/index.ts +31 -1
- package/src/api/impl/beacon/state/utils.ts +1 -1
- package/src/api/impl/validator/index.ts +43 -29
- package/src/chain/GetBlobsTracker.ts +82 -52
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/blocks/blockInput/blockInput.ts +11 -343
- package/src/chain/blocks/blockInput/errors.ts +1 -2
- package/src/chain/blocks/blockInput/types.ts +2 -20
- package/src/chain/blocks/importBlock.ts +56 -72
- package/src/chain/blocks/importExecutionPayload.ts +55 -34
- package/src/chain/blocks/index.ts +10 -3
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
- package/src/chain/blocks/types.ts +5 -31
- package/src/chain/blocks/verifyBlock.ts +31 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +48 -24
- package/src/chain/bls/multithread/types.ts +1 -1
- package/src/chain/bls/multithread/worker.ts +1 -5
- package/src/chain/bls/singleThread.ts +1 -1
- package/src/chain/bls/utils.ts +1 -1
- package/src/chain/chain.ts +136 -38
- package/src/chain/emitter.ts +8 -8
- package/src/chain/errors/blockError.ts +1 -1
- package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
- package/src/chain/errors/index.ts +0 -1
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +183 -0
- package/src/chain/interface.ts +9 -6
- package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
- package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/options.ts +5 -4
- package/src/chain/produceBlock/produceBlockBody.ts +7 -3
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +1 -1
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
- package/src/chain/validation/executionPayloadBid.ts +14 -13
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validatorMonitor.ts +0 -6
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/repositories/blobSidecars.ts +0 -1
- package/src/execution/builder/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/engine/http.ts +19 -42
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +19 -10
- package/src/execution/engine/jsonRpcTransport.ts +10 -22
- package/src/execution/engine/mock.ts +0 -7
- package/src/execution/engine/restTransport.ts +3 -22
- package/src/execution/engine/sszTypes.ts +0 -9
- package/src/execution/engine/transport.ts +8 -17
- package/src/execution/engine/types.ts +3 -18
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +1 -1
- package/src/metrics/metrics/beacon.ts +0 -30
- package/src/metrics/metrics/lodestar.ts +80 -18
- package/src/metrics/server/http.ts +5 -5
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +11 -1
- package/src/network/core/networkCoreWorker.ts +2 -0
- package/src/network/core/networkCoreWorkerHandler.ts +8 -1
- package/src/network/core/types.ts +6 -1
- package/src/network/gossip/gossipsub.ts +11 -0
- package/src/network/gossip/interface.ts +0 -5
- package/src/network/gossip/topic.ts +0 -25
- package/src/network/interface.ts +2 -5
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +55 -58
- package/src/network/options.ts +4 -0
- package/src/network/peers/peerManager.ts +28 -3
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/peers/utils/prioritizePeers.ts +14 -22
- package/src/network/peers/utils/subnetMap.ts +6 -3
- package/src/network/processor/extractSlotRootFns.ts +0 -9
- package/src/network/processor/gossipHandlers.ts +65 -164
- package/src/network/processor/gossipQueues/index.ts +0 -6
- package/src/network/processor/gossipValidatorFn.ts +0 -5
- package/src/network/processor/index.ts +25 -4
- package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
- package/src/network/reqresp/handlers/index.ts +0 -17
- package/src/network/reqresp/protocols.ts +0 -12
- package/src/network/reqresp/rateLimit.ts +1 -17
- package/src/network/reqresp/types.ts +0 -13
- package/src/network/subnets/attnetsService.ts +94 -6
- package/src/network/subnets/interface.ts +7 -0
- package/src/node/nodejs.ts +40 -21
- package/src/node/options.ts +9 -6
- package/src/sync/interface.ts +1 -0
- package/src/sync/range/batch.ts +9 -21
- package/src/sync/range/chain.ts +2 -14
- package/src/sync/sync.ts +108 -26
- package/src/sync/unknownBlock.ts +1 -8
- package/src/sync/utils/downloadByRange.ts +31 -230
- package/src/sync/utils/downloadByRoot.ts +15 -142
- package/src/util/blobs.ts +0 -34
- package/src/util/execution.ts +8 -102
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +42 -24
- package/src/util/types.ts +1 -8
- package/lib/chain/errors/blobSidecarError.d.ts +0 -108
- package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/blobSidecarError.js +0 -38
- package/lib/chain/errors/blobSidecarError.js.map +0 -1
- package/lib/chain/validation/blobSidecar.d.ts +0 -16
- package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
- package/lib/chain/validation/blobSidecar.js +0 -276
- package/lib/chain/validation/blobSidecar.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
- package/src/chain/errors/blobSidecarError.ts +0 -70
- package/src/chain/validation/blobSidecar.ts +0 -357
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
|
@@ -9,8 +9,9 @@ import {routes} from "@lodestar/api";
|
|
|
9
9
|
import {BeaconConfig, chainConfigToJson} from "@lodestar/config";
|
|
10
10
|
import type {LoggerNode} from "@lodestar/logger/node";
|
|
11
11
|
import {ResponseIncoming, ResponseOutgoing} from "@lodestar/reqresp";
|
|
12
|
-
import {Status} from "@lodestar/types";
|
|
12
|
+
import {Slot, Status} from "@lodestar/types";
|
|
13
13
|
import {withTimeout} from "@lodestar/utils";
|
|
14
|
+
import {GoodByeReasonCode} from "../../constants/index.js";
|
|
14
15
|
import {Metrics} from "../../metrics/index.js";
|
|
15
16
|
import {AsyncIterableBridgeCaller, AsyncIterableBridgeHandler} from "../../util/asyncIterableToEvents.js";
|
|
16
17
|
import {PeerIdStr, peerIdFromString} from "../../util/peerId.js";
|
|
@@ -205,6 +206,9 @@ export class WorkerNetworkCore implements INetworkCore {
|
|
|
205
206
|
reStatusPeers(peers: PeerIdStr[]): Promise<void> {
|
|
206
207
|
return this.getApi().reStatusPeers(peers);
|
|
207
208
|
}
|
|
209
|
+
goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
|
|
210
|
+
return this.getApi().goodbyeAndDisconnect(peer, reason);
|
|
211
|
+
}
|
|
208
212
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): Promise<void> {
|
|
209
213
|
return this.getApi().reportPeer(peer, action, actionName);
|
|
210
214
|
}
|
|
@@ -216,6 +220,9 @@ export class WorkerNetworkCore implements INetworkCore {
|
|
|
216
220
|
prepareSyncCommitteeSubnets(subscriptions: CommitteeSubscription[]): Promise<void> {
|
|
217
221
|
return this.getApi().prepareSyncCommitteeSubnets(subscriptions);
|
|
218
222
|
}
|
|
223
|
+
addLocalProposalSlots(slots: Slot[]): Promise<void> {
|
|
224
|
+
return this.getApi().addLocalProposalSlots(slots);
|
|
225
|
+
}
|
|
219
226
|
subscribeGossipCoreTopics(): Promise<void> {
|
|
220
227
|
return this.getApi().subscribeGossipCoreTopics();
|
|
221
228
|
}
|
|
@@ -4,7 +4,8 @@ import {routes} from "@lodestar/api";
|
|
|
4
4
|
import {SpecJson} from "@lodestar/config";
|
|
5
5
|
import {LoggerNodeOpts} from "@lodestar/logger/node";
|
|
6
6
|
import {ResponseIncoming} from "@lodestar/reqresp";
|
|
7
|
-
import {Status} from "@lodestar/types";
|
|
7
|
+
import {Slot, Status} from "@lodestar/types";
|
|
8
|
+
import {GoodByeReasonCode} from "../../constants/index.js";
|
|
8
9
|
import {PeerIdStr} from "../../util/peerId.js";
|
|
9
10
|
import {NetworkOptions} from "../options.js";
|
|
10
11
|
import {PeerAction, PeerScoreStats} from "../peers/index.js";
|
|
@@ -53,6 +54,7 @@ export interface INetworkCore extends INetworkCorePublic {
|
|
|
53
54
|
// Sync method
|
|
54
55
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
|
|
55
56
|
reStatusPeers(peers: PeerIdStr[]): Promise<void>;
|
|
57
|
+
goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
|
|
56
58
|
|
|
57
59
|
// TODO: Duplicated methods with INetwork interface
|
|
58
60
|
getConnectedPeers(): Promise<PeerIdStr[]>;
|
|
@@ -60,6 +62,8 @@ export interface INetworkCore extends INetworkCorePublic {
|
|
|
60
62
|
|
|
61
63
|
/** Chain must push status updates to the network core */
|
|
62
64
|
updateStatus(status: Status): Promise<void>;
|
|
65
|
+
/** Block proposal slots of connected validators, used to subscribe to all attestation subnets before them */
|
|
66
|
+
addLocalProposalSlots(slots: Slot[]): Promise<void>;
|
|
63
67
|
|
|
64
68
|
setTargetGroupCount(count: number): Promise<void>;
|
|
65
69
|
/** Opens stream to handle ReqResp outgoing request */
|
|
@@ -109,6 +113,7 @@ export type NetworkWorkerApi = INetworkCorePublic & {
|
|
|
109
113
|
getConnectedPeers(): Promise<PeerIdStr[]>;
|
|
110
114
|
getConnectedPeerCount(): Promise<number>;
|
|
111
115
|
updateStatus(status: Status): Promise<void>;
|
|
116
|
+
addLocalProposalSlots(slots: Slot[]): Promise<void>;
|
|
112
117
|
|
|
113
118
|
setTargetGroupCount(count: number): Promise<void>;
|
|
114
119
|
|
|
@@ -108,6 +108,7 @@ type GossipSubInternal = GossipSub & {
|
|
|
108
108
|
score: {score: (peerIdStr: string) => number};
|
|
109
109
|
direct: Set<string>;
|
|
110
110
|
topics: Map<string, Set<string>>;
|
|
111
|
+
streamsOutbound: ReadonlyMap<string, unknown>;
|
|
111
112
|
start: () => Promise<void>;
|
|
112
113
|
stop: () => Promise<void>;
|
|
113
114
|
publish: (topic: TopicStr, data: Uint8Array, opts?: PublishOpts) => Promise<PublishResult>;
|
|
@@ -248,6 +249,16 @@ export class Eth2Gossipsub {
|
|
|
248
249
|
return this.gossipsub.getMeshPeers(topic);
|
|
249
250
|
}
|
|
250
251
|
|
|
252
|
+
getSubscribersWithOutboundStream(topic: GossipTopic): Set<string> {
|
|
253
|
+
const topicStr = stringifyGossipTopic(this.config, topic);
|
|
254
|
+
const peers = new Set<string>();
|
|
255
|
+
for (const peer of this.gossipsub.getSubscribers(topicStr)) {
|
|
256
|
+
const id = peer.toString();
|
|
257
|
+
if (this.gossipsub.streamsOutbound.has(id)) peers.add(id);
|
|
258
|
+
}
|
|
259
|
+
return peers;
|
|
260
|
+
}
|
|
261
|
+
|
|
251
262
|
publish(topic: TopicStr, data: Uint8Array, opts?: PublishOpts): Promise<PublishResult> {
|
|
252
263
|
return this.gossipsub.publish(topic, data, opts);
|
|
253
264
|
}
|
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
SubnetID,
|
|
15
15
|
altair,
|
|
16
16
|
capella,
|
|
17
|
-
deneb,
|
|
18
17
|
gloas,
|
|
19
18
|
heze,
|
|
20
19
|
phase0,
|
|
@@ -27,7 +26,6 @@ import {JobItemQueue} from "../../util/queue/index.js";
|
|
|
27
26
|
|
|
28
27
|
export enum GossipType {
|
|
29
28
|
beacon_block = "beacon_block",
|
|
30
|
-
blob_sidecar = "blob_sidecar",
|
|
31
29
|
data_column_sidecar = "data_column_sidecar",
|
|
32
30
|
beacon_aggregate_and_proof = "beacon_aggregate_and_proof",
|
|
33
31
|
beacon_attestation = "beacon_attestation",
|
|
@@ -64,7 +62,6 @@ export interface IGossipTopic {
|
|
|
64
62
|
|
|
65
63
|
export type GossipTopicTypeMap = {
|
|
66
64
|
[GossipType.beacon_block]: {type: GossipType.beacon_block};
|
|
67
|
-
[GossipType.blob_sidecar]: {type: GossipType.blob_sidecar; subnet: SubnetID};
|
|
68
65
|
[GossipType.data_column_sidecar]: {type: GossipType.data_column_sidecar; subnet: SubnetID};
|
|
69
66
|
[GossipType.beacon_aggregate_and_proof]: {type: GossipType.beacon_aggregate_and_proof};
|
|
70
67
|
[GossipType.beacon_attestation]: {type: GossipType.beacon_attestation; subnet: SubnetID};
|
|
@@ -100,7 +97,6 @@ export type SSZTypeOfGossipTopic<T extends GossipTopic> = T extends {type: infer
|
|
|
100
97
|
|
|
101
98
|
export type GossipTypeMap = {
|
|
102
99
|
[GossipType.beacon_block]: SignedBeaconBlock;
|
|
103
|
-
[GossipType.blob_sidecar]: deneb.BlobSidecar;
|
|
104
100
|
[GossipType.beacon_aggregate_and_proof]: SignedAggregateAndProof;
|
|
105
101
|
[GossipType.beacon_attestation]: SingleAttestation;
|
|
106
102
|
[GossipType.data_column_sidecar]: DataColumnSidecar;
|
|
@@ -121,7 +117,6 @@ export type GossipTypeMap = {
|
|
|
121
117
|
|
|
122
118
|
export type GossipFnByType = {
|
|
123
119
|
[GossipType.beacon_block]: (signedBlock: SignedBeaconBlock) => Promise<void> | void;
|
|
124
|
-
[GossipType.blob_sidecar]: (blobSidecar: deneb.BlobSidecar) => Promise<void> | void;
|
|
125
120
|
[GossipType.beacon_aggregate_and_proof]: (aggregateAndProof: SignedAggregateAndProof) => Promise<void> | void;
|
|
126
121
|
[GossipType.beacon_attestation]: (attestation: SingleAttestation) => Promise<void> | void;
|
|
127
122
|
[GossipType.data_column_sidecar]: (dataColumnSidecar: DataColumnSidecar) => Promise<void> | void;
|
|
@@ -97,8 +97,6 @@ function stringifyGossipTopicType(topic: GossipTopic): string {
|
|
|
97
97
|
case GossipType.beacon_attestation:
|
|
98
98
|
case GossipType.sync_committee:
|
|
99
99
|
return `${topic.type}_${topic.subnet}`;
|
|
100
|
-
case GossipType.blob_sidecar:
|
|
101
|
-
return `${topic.type}_${topic.subnet}`;
|
|
102
100
|
case GossipType.data_column_sidecar:
|
|
103
101
|
return `${topic.type}_${topic.subnet}`;
|
|
104
102
|
}
|
|
@@ -110,8 +108,6 @@ export function getGossipSSZType(topic: GossipTopic) {
|
|
|
110
108
|
case GossipType.beacon_block:
|
|
111
109
|
// beacon_block is updated in altair to support the updated SignedBeaconBlock type
|
|
112
110
|
return ssz[fork].SignedBeaconBlock;
|
|
113
|
-
case GossipType.blob_sidecar:
|
|
114
|
-
return ssz.deneb.BlobSidecar;
|
|
115
111
|
case GossipType.data_column_sidecar:
|
|
116
112
|
return isForkPostFulu(fork) ? sszTypesFor(fork).DataColumnSidecar : ssz.fulu.DataColumnSidecar;
|
|
117
113
|
case GossipType.beacon_aggregate_and_proof:
|
|
@@ -255,13 +251,6 @@ export function parseGossipTopic(forkDigestContext: ForkDigestContext, topicStr:
|
|
|
255
251
|
}
|
|
256
252
|
}
|
|
257
253
|
|
|
258
|
-
if (gossipTypeStr.startsWith(GossipType.blob_sidecar)) {
|
|
259
|
-
const subnetStr = gossipTypeStr.slice(GossipType.blob_sidecar.length + 1); // +1 for '_' concatenating the topic name and the subnet
|
|
260
|
-
const subnet = parseInt(subnetStr, 10);
|
|
261
|
-
if (Number.isNaN(subnet)) throw Error(`subnet ${subnetStr} is not a number`);
|
|
262
|
-
return {type: GossipType.blob_sidecar, subnet, boundary, encoding};
|
|
263
|
-
}
|
|
264
|
-
|
|
265
254
|
if (gossipTypeStr.startsWith(GossipType.data_column_sidecar)) {
|
|
266
255
|
const subnetStr = gossipTypeStr.slice(GossipType.data_column_sidecar.length + 1); // +1 for '_' concatenating the topic name and the subnet
|
|
267
256
|
const subnet = parseInt(subnetStr, 10);
|
|
@@ -309,18 +298,6 @@ export function getCoreTopicsAtFork(
|
|
|
309
298
|
topics.push(...getDataColumnSidecarTopics(networkConfig, opts.subscribeAllColumnSubnets));
|
|
310
299
|
}
|
|
311
300
|
|
|
312
|
-
// After Deneb and before Fulu also track blob_sidecar_{subnet_id}
|
|
313
|
-
if (ForkSeq[fork] >= ForkSeq.deneb && ForkSeq[fork] < ForkSeq.fulu) {
|
|
314
|
-
const {config} = networkConfig;
|
|
315
|
-
const subnetCount = isForkPostElectra(fork)
|
|
316
|
-
? config.BLOB_SIDECAR_SUBNET_COUNT_ELECTRA
|
|
317
|
-
: config.BLOB_SIDECAR_SUBNET_COUNT;
|
|
318
|
-
|
|
319
|
-
for (let subnet = 0; subnet < subnetCount; subnet++) {
|
|
320
|
-
topics.push({type: GossipType.blob_sidecar, subnet});
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
301
|
// capella
|
|
325
302
|
if (ForkSeq[fork] >= ForkSeq.capella) {
|
|
326
303
|
topics.push({type: GossipType.bls_to_execution_change});
|
|
@@ -405,7 +382,6 @@ function parseEncodingStr(encodingStr: string): GossipEncoding {
|
|
|
405
382
|
// TODO: Review which yes, and which not
|
|
406
383
|
export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean> = {
|
|
407
384
|
[GossipType.beacon_block]: true,
|
|
408
|
-
[GossipType.blob_sidecar]: true,
|
|
409
385
|
[GossipType.data_column_sidecar]: true,
|
|
410
386
|
[GossipType.beacon_aggregate_and_proof]: true,
|
|
411
387
|
[GossipType.beacon_attestation]: true,
|
|
@@ -438,7 +414,6 @@ export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean>
|
|
|
438
414
|
*/
|
|
439
415
|
export const gossipTopicAllowPublishToZeroPeers: Record<GossipType, boolean> = {
|
|
440
416
|
[GossipType.beacon_block]: false,
|
|
441
|
-
[GossipType.blob_sidecar]: false,
|
|
442
417
|
// data_column_sidecar: we ensure having all topic peers via prioritizePeers(). Even with 0 peers on the
|
|
443
418
|
// topic the overall publish can still succeed, because a supernode rebuilds and publishes the missing
|
|
444
419
|
// columns for us, so track sent peers as 0 instead of raising
|
package/src/network/interface.ts
CHANGED
|
@@ -30,18 +30,17 @@ import {
|
|
|
30
30
|
SubnetID,
|
|
31
31
|
altair,
|
|
32
32
|
capella,
|
|
33
|
-
deneb,
|
|
34
33
|
fulu,
|
|
35
34
|
gloas,
|
|
36
35
|
heze,
|
|
37
36
|
phase0,
|
|
38
37
|
} from "@lodestar/types";
|
|
39
38
|
import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
|
|
39
|
+
import {GoodByeReasonCode} from "../constants/index.js";
|
|
40
40
|
import {CustodyConfig} from "../util/dataColumns.js";
|
|
41
41
|
import {PeerIdStr} from "../util/peerId.js";
|
|
42
42
|
import {
|
|
43
43
|
BeaconBlocksByRootRequest,
|
|
44
|
-
BlobSidecarsByRootRequest,
|
|
45
44
|
DataColumnSidecarsByRootRequest,
|
|
46
45
|
ExecutionPayloadEnvelopesByRootRequest,
|
|
47
46
|
} from "../util/types.js";
|
|
@@ -74,14 +73,13 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
74
73
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
|
|
75
74
|
shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
|
|
76
75
|
reStatusPeers(peers: PeerIdStr[]): Promise<void>;
|
|
76
|
+
goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
|
|
77
77
|
searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
78
78
|
searchUnknownEnvelope(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
79
79
|
// ReqResp
|
|
80
80
|
sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<SignedBeaconBlock[]>;
|
|
81
81
|
sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<SignedBeaconBlock[]>;
|
|
82
82
|
sendBeaconBlocksByHead(peerId: PeerIdStr, request: fulu.BeaconBlocksByHeadRequest): Promise<SignedBeaconBlock[]>;
|
|
83
|
-
sendBlobSidecarsByRange(peerId: PeerIdStr, request: deneb.BlobSidecarsByRangeRequest): Promise<deneb.BlobSidecar[]>;
|
|
84
|
-
sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]>;
|
|
85
83
|
sendDataColumnSidecarsByRange(
|
|
86
84
|
peerId: PeerIdStr,
|
|
87
85
|
request: fulu.DataColumnSidecarsByRangeRequest
|
|
@@ -101,7 +99,6 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
101
99
|
|
|
102
100
|
// Gossip
|
|
103
101
|
publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
|
|
104
|
-
publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number>;
|
|
105
102
|
publishBeaconAggregateAndProof(aggregateAndProof: SignedAggregateAndProof): Promise<number>;
|
|
106
103
|
publishBeaconAttestation(attestation: SingleAttestation, subnet: SubnetID): Promise<number>;
|
|
107
104
|
publishDataColumnSidecar(
|
|
@@ -150,7 +150,11 @@ export async function createNodeJsLibp2p(
|
|
|
150
150
|
nodeInfo: {
|
|
151
151
|
name: "lodestar",
|
|
152
152
|
version: networkOpts.version ?? "unknown",
|
|
153
|
-
userAgent: networkOpts.private
|
|
153
|
+
userAgent: networkOpts.private
|
|
154
|
+
? ""
|
|
155
|
+
: networkOpts.advertiseVersion && networkOpts.version
|
|
156
|
+
? `lodestar/${networkOpts.version}`
|
|
157
|
+
: "lodestar",
|
|
154
158
|
},
|
|
155
159
|
addresses: {
|
|
156
160
|
listen: localMultiaddrs,
|
package/src/network/network.ts
CHANGED
|
@@ -19,21 +19,22 @@ import {
|
|
|
19
19
|
SignedAggregateAndProof,
|
|
20
20
|
SignedBeaconBlock,
|
|
21
21
|
SingleAttestation,
|
|
22
|
+
Slot,
|
|
22
23
|
SlotRootHex,
|
|
23
24
|
SubnetID,
|
|
24
25
|
altair,
|
|
25
26
|
capella,
|
|
26
|
-
deneb,
|
|
27
27
|
fulu,
|
|
28
28
|
gloas,
|
|
29
29
|
heze,
|
|
30
30
|
isGloasDataColumnSidecar,
|
|
31
31
|
phase0,
|
|
32
32
|
} from "@lodestar/types";
|
|
33
|
-
import {prettyPrintIndices, sleep} from "@lodestar/utils";
|
|
33
|
+
import {defer, prettyPrintIndices, sleep} from "@lodestar/utils";
|
|
34
34
|
import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
|
|
35
35
|
import {ChainEvent, IBeaconChain} from "../chain/index.js";
|
|
36
36
|
import {computeSubnetForDataColumnSidecar} from "../chain/validation/dataColumnSidecar.js";
|
|
37
|
+
import {GoodByeReasonCode} from "../constants/index.js";
|
|
37
38
|
import {IBeaconDb} from "../db/interface.js";
|
|
38
39
|
import {Metrics, RegistryMetricCreator} from "../metrics/index.js";
|
|
39
40
|
import {IClock} from "../util/clock.js";
|
|
@@ -42,7 +43,6 @@ import {PeerIdStr, peerIdToString} from "../util/peerId.js";
|
|
|
42
43
|
import {promiseAllMaybeAsync} from "../util/promises.js";
|
|
43
44
|
import {
|
|
44
45
|
BeaconBlocksByRootRequest,
|
|
45
|
-
BlobSidecarsByRootRequest,
|
|
46
46
|
DataColumnSidecarsByRootRequest,
|
|
47
47
|
ExecutionPayloadEnvelopesByRootRequest,
|
|
48
48
|
} from "../util/types.js";
|
|
@@ -127,6 +127,7 @@ export class Network implements INetwork {
|
|
|
127
127
|
|
|
128
128
|
private subscribedToCoreTopics = false;
|
|
129
129
|
private connectedPeersSyncMeta = new Map<PeerIdStr, Omit<PeerSyncMeta, "peerId">>();
|
|
130
|
+
private closePromise: Promise<void> | undefined;
|
|
130
131
|
|
|
131
132
|
constructor(modules: NetworkModules) {
|
|
132
133
|
this.peerId = peerIdFromPrivateKey(modules.privateKey);
|
|
@@ -144,17 +145,13 @@ export class Network implements INetwork {
|
|
|
144
145
|
this.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
145
146
|
this.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
146
147
|
this.chain.emitter.on(routes.events.EventType.head, this.onHead);
|
|
147
|
-
this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate,
|
|
148
|
-
|
|
149
|
-
);
|
|
150
|
-
this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, ({data}) =>
|
|
151
|
-
this.onLightClientOptimisticUpdate(data)
|
|
152
|
-
);
|
|
148
|
+
this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate, this.onLightClientFinalityUpdate);
|
|
149
|
+
this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
|
|
153
150
|
this.chain.emitter.on(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
|
|
154
151
|
this.chain.emitter.on(ChainEvent.publishDataColumns, this.onPublishDataColumns);
|
|
155
|
-
this.chain.emitter.on(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
|
|
156
152
|
this.chain.emitter.on(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
|
|
157
153
|
this.chain.emitter.on(ChainEvent.updateStatus, this.onUpdateStatus);
|
|
154
|
+
this.chain.emitter.on(ChainEvent.localProposalSlots, this.onLocalProposalSlots);
|
|
158
155
|
}
|
|
159
156
|
|
|
160
157
|
static async init({
|
|
@@ -239,9 +236,16 @@ export class Network implements INetwork {
|
|
|
239
236
|
return this.controller.signal.aborted;
|
|
240
237
|
}
|
|
241
238
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
239
|
+
close(): Promise<void> {
|
|
240
|
+
if (this.closePromise !== undefined) return this.closePromise;
|
|
241
|
+
const completion = defer<void>();
|
|
242
|
+
this.closePromise = completion.promise;
|
|
243
|
+
void this.closeInternal().then(completion.resolve, completion.reject);
|
|
244
|
+
return this.closePromise;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
private async closeInternal(): Promise<void> {
|
|
248
|
+
this.controller.abort();
|
|
245
249
|
|
|
246
250
|
this.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
247
251
|
this.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
@@ -250,13 +254,15 @@ export class Network implements INetwork {
|
|
|
250
254
|
this.chain.emitter.off(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
|
|
251
255
|
this.chain.emitter.off(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
|
|
252
256
|
this.chain.emitter.off(ChainEvent.publishDataColumns, this.onPublishDataColumns);
|
|
253
|
-
this.chain.emitter.off(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
|
|
254
257
|
this.chain.emitter.off(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
|
|
255
258
|
this.chain.emitter.off(ChainEvent.updateStatus, this.onUpdateStatus);
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
this.
|
|
259
|
+
this.chain.emitter.off(ChainEvent.localProposalSlots, this.onLocalProposalSlots);
|
|
260
|
+
this.connectedPeersSyncMeta.clear();
|
|
261
|
+
this.subscribedToCoreTopics = false;
|
|
262
|
+
const results = await Promise.allSettled([this.networkProcessor.stop(), this.core.close()]);
|
|
263
|
+
for (const result of results) {
|
|
264
|
+
if (result.status === "rejected") throw result.reason;
|
|
265
|
+
}
|
|
260
266
|
this.logger.debug("network core closed");
|
|
261
267
|
}
|
|
262
268
|
|
|
@@ -278,6 +284,13 @@ export class Network implements INetwork {
|
|
|
278
284
|
return this.core.prepareBeaconCommitteeSubnets(subscriptions);
|
|
279
285
|
}
|
|
280
286
|
|
|
287
|
+
/** The core subscribes to all attestation subnets before these proposals, see `slotsToSubscribeBeforeProposalDuty` */
|
|
288
|
+
private onLocalProposalSlots = (proposalSlots: Slot[]): void => {
|
|
289
|
+
this.core.addLocalProposalSlots(proposalSlots).catch((e) => {
|
|
290
|
+
this.logger.debug("Error adding local proposal slots", {slots: proposalSlots.join(",")}, e as Error);
|
|
291
|
+
});
|
|
292
|
+
};
|
|
293
|
+
|
|
281
294
|
async prepareSyncCommitteeSubnets(subscriptions: CommitteeSubscription[]): Promise<void> {
|
|
282
295
|
return this.core.prepareSyncCommitteeSubnets(subscriptions);
|
|
283
296
|
}
|
|
@@ -289,6 +302,10 @@ export class Network implements INetwork {
|
|
|
289
302
|
return this.core.reStatusPeers(peers);
|
|
290
303
|
}
|
|
291
304
|
|
|
305
|
+
async goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
|
|
306
|
+
return this.core.goodbyeAndDisconnect(peer, reason);
|
|
307
|
+
}
|
|
308
|
+
|
|
292
309
|
searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
|
|
293
310
|
this.networkProcessor.searchUnknownBlock(slotRoot, source, peer);
|
|
294
311
|
}
|
|
@@ -328,6 +345,7 @@ export class Network implements INetwork {
|
|
|
328
345
|
async subscribeGossipCoreTopics(): Promise<void> {
|
|
329
346
|
if (!this.subscribedToCoreTopics) {
|
|
330
347
|
await this.core.subscribeGossipCoreTopics();
|
|
348
|
+
if (this.closed) return;
|
|
331
349
|
// Only mark subscribedToCoreTopics if worker resolved this call
|
|
332
350
|
this.subscribedToCoreTopics = true;
|
|
333
351
|
}
|
|
@@ -361,15 +379,6 @@ export class Network implements INetwork {
|
|
|
361
379
|
return this.publishGossip<GossipType.beacon_block>({type: GossipType.beacon_block, boundary}, signedBlock);
|
|
362
380
|
}
|
|
363
381
|
|
|
364
|
-
async publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number> {
|
|
365
|
-
const epoch = computeEpochAtSlot(blobSidecar.signedBlockHeader.message.slot);
|
|
366
|
-
const boundary = this.config.getForkBoundaryAtEpoch(epoch);
|
|
367
|
-
|
|
368
|
-
const subnet = blobSidecar.index;
|
|
369
|
-
|
|
370
|
-
return this.publishGossip<GossipType.blob_sidecar>({type: GossipType.blob_sidecar, boundary, subnet}, blobSidecar);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
382
|
async publishDataColumnSidecar(
|
|
374
383
|
dataColumnSidecar: DataColumnSidecar
|
|
375
384
|
): Promise<{sentPeers: number; alreadyPublished: boolean}> {
|
|
@@ -650,28 +659,6 @@ export class Network implements INetwork {
|
|
|
650
659
|
);
|
|
651
660
|
}
|
|
652
661
|
|
|
653
|
-
async sendBlobSidecarsByRange(
|
|
654
|
-
peerId: PeerIdStr,
|
|
655
|
-
request: deneb.BlobSidecarsByRangeRequest
|
|
656
|
-
): Promise<deneb.BlobSidecar[]> {
|
|
657
|
-
const epoch = computeEpochAtSlot(request.startSlot);
|
|
658
|
-
return collectMaxResponseTyped(
|
|
659
|
-
this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRange, [Version.V1], request),
|
|
660
|
-
// request's count represent the slots, so the actual max count received could be slots * blobs per slot
|
|
661
|
-
request.count * this.config.getMaxBlobsPerBlock(epoch),
|
|
662
|
-
responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRange]
|
|
663
|
-
);
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
async sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]> {
|
|
667
|
-
return collectMaxResponseTyped(
|
|
668
|
-
this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRoot, [Version.V1], request),
|
|
669
|
-
request.length,
|
|
670
|
-
responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRoot],
|
|
671
|
-
this.chain.serializedCache
|
|
672
|
-
);
|
|
673
|
-
}
|
|
674
|
-
|
|
675
662
|
async sendDataColumnSidecarsByRange(
|
|
676
663
|
peerId: PeerIdStr,
|
|
677
664
|
request: fulu.DataColumnSidecarsByRangeRequest
|
|
@@ -798,26 +785,32 @@ export class Network implements INetwork {
|
|
|
798
785
|
return this.core.writeDiscv5HeapSnapshot(prefix, dirpath);
|
|
799
786
|
}
|
|
800
787
|
|
|
801
|
-
private onLightClientFinalityUpdate = async (
|
|
788
|
+
private onLightClientFinalityUpdate = async ({
|
|
789
|
+
data: finalityUpdate,
|
|
790
|
+
}: routes.events.EventData[routes.events.EventType.lightClientFinalityUpdate]): Promise<void> => {
|
|
802
791
|
// TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
|
|
803
792
|
|
|
804
793
|
try {
|
|
805
794
|
// messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
|
|
806
795
|
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
|
|
807
796
|
await this.waitForSyncMessageCutoff(finalityUpdate.signatureSlot);
|
|
797
|
+
if (this.closed) return;
|
|
808
798
|
await this.publishLightClientFinalityUpdate(finalityUpdate);
|
|
809
799
|
} catch (e) {
|
|
810
800
|
this.logger.debug("Error on BeaconGossipHandler.onLightclientFinalityUpdate", {}, e as Error);
|
|
811
801
|
}
|
|
812
802
|
};
|
|
813
803
|
|
|
814
|
-
private onLightClientOptimisticUpdate = async (
|
|
804
|
+
private onLightClientOptimisticUpdate = async ({
|
|
805
|
+
data: optimisticUpdate,
|
|
806
|
+
}: routes.events.EventData[routes.events.EventType.lightClientOptimisticUpdate]): Promise<void> => {
|
|
815
807
|
// TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
|
|
816
808
|
|
|
817
809
|
try {
|
|
818
810
|
// messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
|
|
819
811
|
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
|
|
820
812
|
await this.waitForSyncMessageCutoff(optimisticUpdate.signatureSlot);
|
|
813
|
+
if (this.closed) return;
|
|
821
814
|
await this.publishLightClientOptimisticUpdate(optimisticUpdate);
|
|
822
815
|
} catch (e) {
|
|
823
816
|
this.logger.debug("Error on BeaconGossipHandler.onLightclientOptimisticUpdate", {}, e as Error);
|
|
@@ -854,18 +847,18 @@ export class Network implements INetwork {
|
|
|
854
847
|
this.connectedPeersSyncMeta.delete(data.peer);
|
|
855
848
|
};
|
|
856
849
|
|
|
857
|
-
private onTargetGroupCountUpdated = (count: number): void => {
|
|
858
|
-
|
|
850
|
+
private onTargetGroupCountUpdated = async (count: number): Promise<void> => {
|
|
851
|
+
try {
|
|
852
|
+
await this.core.setTargetGroupCount(count);
|
|
853
|
+
} catch (error) {
|
|
854
|
+
this.logger.error("Error updating network custody group count", {count}, error as Error);
|
|
855
|
+
}
|
|
859
856
|
};
|
|
860
857
|
|
|
861
858
|
private onPublishDataColumns = async (sidecars: DataColumnSidecar[]): Promise<void> => {
|
|
862
859
|
await promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishDataColumnSidecar(sidecar)));
|
|
863
860
|
};
|
|
864
861
|
|
|
865
|
-
private onPublishBlobSidecars = (sidecars: deneb.BlobSidecar[]): Promise<number[]> => {
|
|
866
|
-
return promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishBlobSidecar(sidecar)));
|
|
867
|
-
};
|
|
868
|
-
|
|
869
862
|
private onPublishProposerSlashing = async (proposerSlashing: phase0.ProposerSlashing): Promise<void> => {
|
|
870
863
|
try {
|
|
871
864
|
await this.publishProposerSlashing(proposerSlashing);
|
|
@@ -879,6 +872,10 @@ export class Network implements INetwork {
|
|
|
879
872
|
};
|
|
880
873
|
|
|
881
874
|
private onUpdateStatus = async (): Promise<void> => {
|
|
882
|
-
|
|
875
|
+
try {
|
|
876
|
+
await this.core.updateStatus(this.chain.getStatus());
|
|
877
|
+
} catch (error) {
|
|
878
|
+
this.logger.error("Error updating network status", {}, error as Error);
|
|
879
|
+
}
|
|
883
880
|
};
|
|
884
881
|
}
|
package/src/network/options.ts
CHANGED
|
@@ -25,6 +25,8 @@ export interface NetworkOptions
|
|
|
25
25
|
mdns?: boolean;
|
|
26
26
|
connectToDiscv5Bootnodes?: boolean;
|
|
27
27
|
version?: string;
|
|
28
|
+
/** Include the version in libp2p Identify. Private mode takes precedence. */
|
|
29
|
+
advertiseVersion?: boolean;
|
|
28
30
|
private?: boolean;
|
|
29
31
|
useWorker?: boolean;
|
|
30
32
|
maxYoungGenerationSizeMb?: number;
|
|
@@ -72,6 +74,8 @@ export const defaultNetworkOptions: NetworkOptions = {
|
|
|
72
74
|
maxYoungGenerationSizeMb: 152,
|
|
73
75
|
// subscribe 2 slots before aggregator dutied slot to get stable mesh peers as monitored on goerli
|
|
74
76
|
slotsToSubscribeBeforeAggregatorDuty: 2,
|
|
77
|
+
// up to the max number of attestations per block
|
|
78
|
+
slotsToSubscribeBeforeProposalDuty: 8,
|
|
75
79
|
// This will enable the light client server by default
|
|
76
80
|
disableLightClientServer: false,
|
|
77
81
|
quic: true,
|
|
@@ -14,6 +14,7 @@ import {NetworkCoreMetrics} from "../core/metrics.js";
|
|
|
14
14
|
import {LodestarDiscv5Opts} from "../discv5/types.js";
|
|
15
15
|
import {INetworkEventBus, NetworkEvent, NetworkEventData} from "../events.js";
|
|
16
16
|
import {Eth2Gossipsub} from "../gossip/gossipsub.js";
|
|
17
|
+
import {GossipType} from "../gossip/interface.js";
|
|
17
18
|
import {Libp2p} from "../interface.js";
|
|
18
19
|
import {SubnetType} from "../metadata.js";
|
|
19
20
|
import {NetworkConfig} from "../networkConfig.js";
|
|
@@ -577,6 +578,8 @@ export class PeerManager {
|
|
|
577
578
|
this.lastStatus = status;
|
|
578
579
|
this.metrics?.peerManager.starved.set(starved ? 1 : 0);
|
|
579
580
|
const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
|
|
581
|
+
const boundary = this.config.getForkBoundaryAtEpoch(this.clock.currentEpoch);
|
|
582
|
+
const connectedHealthyPeerIds = new Set(connectedHealthyPeers.map((peer) => peer.toString()));
|
|
580
583
|
|
|
581
584
|
const prioritizeTimer = this.metrics?.peerManager.prioritizePeersDuration.startTimer();
|
|
582
585
|
const {peersToDisconnect, peersToConnect, attnetQueries, syncnetQueries, custodyGroupQueries} = prioritizePeers(
|
|
@@ -594,8 +597,30 @@ export class PeerManager {
|
|
|
594
597
|
};
|
|
595
598
|
}),
|
|
596
599
|
// Collect subnets which we need peers for in the current slot
|
|
597
|
-
this.attnetsService.getActiveSubnets()
|
|
598
|
-
|
|
600
|
+
this.attnetsService.getActiveSubnets().map((request) => {
|
|
601
|
+
const subscribers = this.gossipsub.getSubscribersWithOutboundStream({
|
|
602
|
+
type: GossipType.beacon_attestation,
|
|
603
|
+
boundary,
|
|
604
|
+
subnet: request.subnet,
|
|
605
|
+
});
|
|
606
|
+
let peerCount = 0;
|
|
607
|
+
for (const peer of subscribers) {
|
|
608
|
+
if (connectedHealthyPeerIds.has(peer)) peerCount++;
|
|
609
|
+
}
|
|
610
|
+
return {...request, peerCount};
|
|
611
|
+
}),
|
|
612
|
+
this.syncnetsService.getActiveSubnets().map((request) => {
|
|
613
|
+
const subscribers = this.gossipsub.getSubscribersWithOutboundStream({
|
|
614
|
+
type: GossipType.sync_committee,
|
|
615
|
+
boundary,
|
|
616
|
+
subnet: request.subnet,
|
|
617
|
+
});
|
|
618
|
+
let peerCount = 0;
|
|
619
|
+
for (const peer of subscribers) {
|
|
620
|
+
if (connectedHealthyPeerIds.has(peer)) peerCount++;
|
|
621
|
+
}
|
|
622
|
+
return {...request, peerCount};
|
|
623
|
+
}),
|
|
599
624
|
// ignore samplingGroups for pre-fulu forks
|
|
600
625
|
forkSeq >= ForkSeq.fulu ? this.networkConfig.custodyConfig.sampleGroups : undefined,
|
|
601
626
|
{
|
|
@@ -893,7 +918,7 @@ export class PeerManager {
|
|
|
893
918
|
}
|
|
894
919
|
}
|
|
895
920
|
|
|
896
|
-
|
|
921
|
+
async goodbyeAndDisconnect(peer: PeerId, goodbye: GoodByeReasonCode): Promise<void> {
|
|
897
922
|
const reason = GOODBYE_KNOWN_CODES[goodbye.toString()] || "";
|
|
898
923
|
const peerIdStr = peer.toString();
|
|
899
924
|
try {
|