@lodestar/beacon-node 1.51.0-dev.1b1888604e → 1.51.0-dev.1b22218e60
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.js +1 -1
- package/lib/api/impl/api.js.map +1 -1
- package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +48 -95
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/index.d.ts +2 -1
- package/lib/api/impl/beacon/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/index.js +2 -2
- package/lib/api/impl/beacon/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/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/index.js +8 -2
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +3 -2
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +17 -9
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +3 -0
- package/lib/api/impl/debug/index.js.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 +142 -34
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/options.d.ts +2 -0
- package/lib/api/options.d.ts.map +1 -1
- package/lib/api/options.js +1 -0
- package/lib/api/options.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/archiveStore/utils/archiveBlocks.d.ts +4 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
- package/lib/chain/archiveStore/utils/archiveBlocks.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 +42 -57
- 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 +82 -20
- 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 +4 -4
- 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 +7 -19
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +5 -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 +26 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +127 -43
- 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/executionPayloadBid.d.ts +11 -1
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadBid.js +2 -0
- package/lib/chain/errors/executionPayloadBid.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/inclusionList.d.ts +60 -0
- package/lib/chain/errors/inclusionList.d.ts.map +1 -0
- package/lib/chain/errors/inclusionList.js +19 -0
- package/lib/chain/errors/inclusionList.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -1
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +1 -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 +10 -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/inclusionListStore.d.ts +63 -0
- package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
- package/lib/chain/opPools/inclusionListStore.js +171 -0
- package/lib/chain/opPools/inclusionListStore.js.map +1 -0
- package/lib/chain/opPools/index.d.ts +2 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +2 -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 +6 -3
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +32 -11
- 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 +2 -2
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +1 -1
- package/lib/chain/regen/interface.js.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/aggregateAndProof.js +1 -1
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.js +1 -1
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +37 -158
- 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/validation/inclusionList.d.ts +14 -0
- package/lib/chain/validation/inclusionList.d.ts.map +1 -0
- package/lib/chain/validation/inclusionList.js +150 -0
- package/lib/chain/validation/inclusionList.js.map +1 -0
- package/lib/chain/validation/index.d.ts +1 -0
- package/lib/chain/validation/index.d.ts.map +1 -1
- package/lib/chain/validation/index.js +1 -0
- package/lib/chain/validation/index.js.map +1 -1
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +16 -10
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
- package/lib/chain/validation/syncCommitteeContributionAndProof.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/beacon.d.ts +7 -0
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +34 -0
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/dataColumnStore.d.ts +1 -1
- package/lib/db/dataColumnStore.d.ts.map +1 -1
- package/lib/db/dataColumnStore.js +1 -4
- package/lib/db/dataColumnStore.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/interface.d.ts +1 -0
- package/lib/db/interface.d.ts.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/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
- package/lib/db/repositories/dataColumnSidecarArchive.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/builder/validateBid.d.ts.map +1 -1
- package/lib/execution/builder/validateBid.js +14 -1
- package/lib/execution/builder/validateBid.js.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
- package/lib/execution/engine/disabled.d.ts +1 -0
- package/lib/execution/engine/disabled.d.ts.map +1 -1
- package/lib/execution/engine/disabled.js +3 -0
- package/lib/execution/engine/disabled.js.map +1 -1
- package/lib/execution/engine/http.d.ts +12 -8
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +35 -14
- 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 +29 -8
- 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 +5 -6
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +34 -20
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +31 -11
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +5 -3
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/payloadIdCache.js +15 -4
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +4 -5
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +4 -15
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +38 -47
- 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 +4 -14
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +25 -9
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +19 -14
- 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 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +16 -9
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +35 -30
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +42 -8
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +104 -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 +8 -9
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +1 -1
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -21
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +13 -24
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +5 -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 +9 -7
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +58 -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 +118 -149
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +6 -6
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +5 -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 +56 -29
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +6 -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/inclusionListsByIndices.d.ts +10 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +6 -12
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +1 -2
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +5 -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 +5 -17
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +6 -9
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +4 -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 +47 -21
- 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 +43 -25
- 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 +31 -32
- package/src/api/impl/api.ts +1 -1
- package/src/api/impl/beacon/blocks/index.ts +81 -126
- package/src/api/impl/beacon/index.ts +3 -1
- package/src/api/impl/beacon/pool/index.ts +31 -1
- package/src/api/impl/beacon/state/index.ts +10 -1
- package/src/api/impl/beacon/state/utils.ts +20 -10
- package/src/api/impl/debug/index.ts +4 -0
- package/src/api/impl/validator/index.ts +177 -38
- package/src/api/options.ts +3 -0
- package/src/chain/GetBlobsTracker.ts +82 -52
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
- 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 +58 -77
- package/src/chain/blocks/importExecutionPayload.ts +123 -36
- package/src/chain/blocks/index.ts +11 -4
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
- package/src/chain/blocks/types.ts +8 -29
- 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 +144 -42
- package/src/chain/emitter.ts +8 -8
- package/src/chain/errors/blockError.ts +1 -1
- package/src/chain/errors/executionPayloadBid.ts +12 -0
- package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
- package/src/chain/errors/inclusionList.ts +38 -0
- package/src/chain/errors/index.ts +1 -1
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +183 -0
- package/src/chain/interface.ts +11 -6
- package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/inclusionListStore.ts +208 -0
- package/src/chain/opPools/index.ts +2 -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 +67 -22
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +2 -2
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
- package/src/chain/validation/aggregateAndProof.ts +1 -1
- package/src/chain/validation/attestation.ts +1 -1
- package/src/chain/validation/executionPayloadBid.ts +54 -183
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validation/inclusionList.ts +192 -0
- package/src/chain/validation/index.ts +1 -0
- package/src/chain/validation/syncCommittee.ts +31 -15
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
- package/src/chain/validatorMonitor.ts +0 -6
- package/src/db/beacon.ts +44 -0
- package/src/db/dataColumnStore.ts +2 -4
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/interface.ts +2 -0
- package/src/db/repositories/blobSidecars.ts +0 -1
- package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
- package/src/execution/builder/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/builder/validateBid.ts +23 -2
- package/src/execution/engine/blobVersionedHashes.ts +1 -1
- package/src/execution/engine/disabled.ts +4 -0
- package/src/execution/engine/http.ts +59 -47
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +46 -13
- package/src/execution/engine/jsonRpcTransport.ts +56 -31
- package/src/execution/engine/mock.ts +32 -14
- package/src/execution/engine/payloadIdCache.ts +24 -6
- package/src/execution/engine/restTransport.ts +18 -23
- package/src/execution/engine/sszTypes.ts +0 -9
- package/src/execution/engine/transport.ts +13 -17
- package/src/execution/engine/types.ts +44 -24
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +2 -0
- package/src/metrics/metrics/beacon.ts +37 -30
- package/src/metrics/metrics/lodestar.ts +106 -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 +5 -5
- package/src/network/gossip/topic.ts +14 -25
- package/src/network/interface.ts +4 -5
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +66 -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 +150 -183
- package/src/network/processor/gossipQueues/index.ts +6 -6
- package/src/network/processor/gossipValidatorFn.ts +5 -5
- package/src/network/processor/index.ts +48 -27
- package/src/network/processor/types.ts +1 -1
- package/src/network/reqresp/ReqRespBeaconNode.ts +7 -7
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
- package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
- package/src/network/reqresp/handlers/index.ts +5 -17
- package/src/network/reqresp/protocols.ts +6 -12
- package/src/network/reqresp/rateLimit.ts +5 -17
- package/src/network/reqresp/types.ts +6 -13
- package/src/network/subnets/attnetsService.ts +94 -6
- package/src/network/subnets/interface.ts +7 -0
- package/src/node/nodejs.ts +58 -22
- 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 +48 -36
- 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
|
@@ -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,8 +14,8 @@ import {
|
|
|
14
14
|
SubnetID,
|
|
15
15
|
altair,
|
|
16
16
|
capella,
|
|
17
|
-
deneb,
|
|
18
17
|
gloas,
|
|
18
|
+
heze,
|
|
19
19
|
phase0,
|
|
20
20
|
} from "@lodestar/types";
|
|
21
21
|
import {Logger} from "@lodestar/utils";
|
|
@@ -26,7 +26,6 @@ import {JobItemQueue} from "../../util/queue/index.js";
|
|
|
26
26
|
|
|
27
27
|
export enum GossipType {
|
|
28
28
|
beacon_block = "beacon_block",
|
|
29
|
-
blob_sidecar = "blob_sidecar",
|
|
30
29
|
data_column_sidecar = "data_column_sidecar",
|
|
31
30
|
beacon_aggregate_and_proof = "beacon_aggregate_and_proof",
|
|
32
31
|
beacon_attestation = "beacon_attestation",
|
|
@@ -42,6 +41,7 @@ export enum GossipType {
|
|
|
42
41
|
payload_attestation_message = "payload_attestation_message",
|
|
43
42
|
execution_payload_bid = "execution_payload_bid",
|
|
44
43
|
proposer_preferences = "proposer_preferences",
|
|
44
|
+
inclusion_list = "inclusion_list",
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
export type SequentialGossipType = Exclude<GossipType, GossipType.beacon_attestation>;
|
|
@@ -62,7 +62,6 @@ export interface IGossipTopic {
|
|
|
62
62
|
|
|
63
63
|
export type GossipTopicTypeMap = {
|
|
64
64
|
[GossipType.beacon_block]: {type: GossipType.beacon_block};
|
|
65
|
-
[GossipType.blob_sidecar]: {type: GossipType.blob_sidecar; subnet: SubnetID};
|
|
66
65
|
[GossipType.data_column_sidecar]: {type: GossipType.data_column_sidecar; subnet: SubnetID};
|
|
67
66
|
[GossipType.beacon_aggregate_and_proof]: {type: GossipType.beacon_aggregate_and_proof};
|
|
68
67
|
[GossipType.beacon_attestation]: {type: GossipType.beacon_attestation; subnet: SubnetID};
|
|
@@ -80,6 +79,7 @@ export type GossipTopicTypeMap = {
|
|
|
80
79
|
[GossipType.payload_attestation_message]: {type: GossipType.payload_attestation_message};
|
|
81
80
|
[GossipType.execution_payload_bid]: {type: GossipType.execution_payload_bid};
|
|
82
81
|
[GossipType.proposer_preferences]: {type: GossipType.proposer_preferences};
|
|
82
|
+
[GossipType.inclusion_list]: {type: GossipType.inclusion_list};
|
|
83
83
|
};
|
|
84
84
|
|
|
85
85
|
export type GossipTopicMap = {
|
|
@@ -97,7 +97,6 @@ export type SSZTypeOfGossipTopic<T extends GossipTopic> = T extends {type: infer
|
|
|
97
97
|
|
|
98
98
|
export type GossipTypeMap = {
|
|
99
99
|
[GossipType.beacon_block]: SignedBeaconBlock;
|
|
100
|
-
[GossipType.blob_sidecar]: deneb.BlobSidecar;
|
|
101
100
|
[GossipType.beacon_aggregate_and_proof]: SignedAggregateAndProof;
|
|
102
101
|
[GossipType.beacon_attestation]: SingleAttestation;
|
|
103
102
|
[GossipType.data_column_sidecar]: DataColumnSidecar;
|
|
@@ -113,11 +112,11 @@ export type GossipTypeMap = {
|
|
|
113
112
|
[GossipType.payload_attestation_message]: gloas.PayloadAttestationMessage;
|
|
114
113
|
[GossipType.execution_payload_bid]: gloas.SignedExecutionPayloadBid;
|
|
115
114
|
[GossipType.proposer_preferences]: gloas.SignedProposerPreferences;
|
|
115
|
+
[GossipType.inclusion_list]: heze.SignedInclusionList;
|
|
116
116
|
};
|
|
117
117
|
|
|
118
118
|
export type GossipFnByType = {
|
|
119
119
|
[GossipType.beacon_block]: (signedBlock: SignedBeaconBlock) => Promise<void> | void;
|
|
120
|
-
[GossipType.blob_sidecar]: (blobSidecar: deneb.BlobSidecar) => Promise<void> | void;
|
|
121
120
|
[GossipType.beacon_aggregate_and_proof]: (aggregateAndProof: SignedAggregateAndProof) => Promise<void> | void;
|
|
122
121
|
[GossipType.beacon_attestation]: (attestation: SingleAttestation) => Promise<void> | void;
|
|
123
122
|
[GossipType.data_column_sidecar]: (dataColumnSidecar: DataColumnSidecar) => Promise<void> | void;
|
|
@@ -147,6 +146,7 @@ export type GossipFnByType = {
|
|
|
147
146
|
[GossipType.proposer_preferences]: (
|
|
148
147
|
signedProposerPreferences: gloas.SignedProposerPreferences
|
|
149
148
|
) => Promise<void> | void;
|
|
149
|
+
[GossipType.inclusion_list]: (signedInclusionList: heze.SignedInclusionList) => Promise<void> | void;
|
|
150
150
|
};
|
|
151
151
|
|
|
152
152
|
export type GossipFn = GossipFnByType[keyof GossipFnByType];
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
ATTESTATION_SUBNET_COUNT,
|
|
5
5
|
ForkName,
|
|
6
6
|
ForkSeq,
|
|
7
|
+
MAX_SIGNED_INCLUSION_LIST_SIZE,
|
|
7
8
|
SYNC_COMMITTEE_SUBNET_COUNT,
|
|
8
9
|
isForkPostAltair,
|
|
9
10
|
isForkPostElectra,
|
|
@@ -91,12 +92,11 @@ function stringifyGossipTopicType(topic: GossipTopic): string {
|
|
|
91
92
|
case GossipType.payload_attestation_message:
|
|
92
93
|
case GossipType.execution_payload_bid:
|
|
93
94
|
case GossipType.proposer_preferences:
|
|
95
|
+
case GossipType.inclusion_list:
|
|
94
96
|
return topic.type;
|
|
95
97
|
case GossipType.beacon_attestation:
|
|
96
98
|
case GossipType.sync_committee:
|
|
97
99
|
return `${topic.type}_${topic.subnet}`;
|
|
98
|
-
case GossipType.blob_sidecar:
|
|
99
|
-
return `${topic.type}_${topic.subnet}`;
|
|
100
100
|
case GossipType.data_column_sidecar:
|
|
101
101
|
return `${topic.type}_${topic.subnet}`;
|
|
102
102
|
}
|
|
@@ -108,8 +108,6 @@ export function getGossipSSZType(topic: GossipTopic) {
|
|
|
108
108
|
case GossipType.beacon_block:
|
|
109
109
|
// beacon_block is updated in altair to support the updated SignedBeaconBlock type
|
|
110
110
|
return ssz[fork].SignedBeaconBlock;
|
|
111
|
-
case GossipType.blob_sidecar:
|
|
112
|
-
return ssz.deneb.BlobSidecar;
|
|
113
111
|
case GossipType.data_column_sidecar:
|
|
114
112
|
return isForkPostFulu(fork) ? sszTypesFor(fork).DataColumnSidecar : ssz.fulu.DataColumnSidecar;
|
|
115
113
|
case GossipType.beacon_aggregate_and_proof:
|
|
@@ -144,6 +142,8 @@ export function getGossipSSZType(topic: GossipTopic) {
|
|
|
144
142
|
return isForkPostGloas(fork) ? sszTypesFor(fork).SignedExecutionPayloadBid : ssz.gloas.SignedExecutionPayloadBid;
|
|
145
143
|
case GossipType.proposer_preferences:
|
|
146
144
|
return ssz.gloas.SignedProposerPreferences;
|
|
145
|
+
case GossipType.inclusion_list:
|
|
146
|
+
return ssz.heze.SignedInclusionList;
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
|
|
@@ -152,6 +152,9 @@ export function getGossipSSZType(topic: GossipTopic) {
|
|
|
152
152
|
*/
|
|
153
153
|
export function getGossipSSZMaxSize(topic: GossipTopic, config: ChainForkConfig, sszType: CompositeTypeAny): number {
|
|
154
154
|
const maxSize = Math.min(sszType.maxSize, config.MAX_PAYLOAD_SIZE);
|
|
155
|
+
if (topic.type === GossipType.inclusion_list) {
|
|
156
|
+
return Math.min(maxSize, MAX_SIGNED_INCLUSION_LIST_SIZE);
|
|
157
|
+
}
|
|
155
158
|
if (isForkPostGloas(topic.boundary.fork) && topic.type === GossipType.data_column_sidecar) {
|
|
156
159
|
return Math.min(maxSize, computeMaxGloasDataColumnSidecarSize(config));
|
|
157
160
|
}
|
|
@@ -235,6 +238,7 @@ export function parseGossipTopic(forkDigestContext: ForkDigestContext, topicStr:
|
|
|
235
238
|
case GossipType.payload_attestation_message:
|
|
236
239
|
case GossipType.execution_payload_bid:
|
|
237
240
|
case GossipType.proposer_preferences:
|
|
241
|
+
case GossipType.inclusion_list:
|
|
238
242
|
return {type: gossipTypeStr, boundary, encoding};
|
|
239
243
|
}
|
|
240
244
|
|
|
@@ -247,13 +251,6 @@ export function parseGossipTopic(forkDigestContext: ForkDigestContext, topicStr:
|
|
|
247
251
|
}
|
|
248
252
|
}
|
|
249
253
|
|
|
250
|
-
if (gossipTypeStr.startsWith(GossipType.blob_sidecar)) {
|
|
251
|
-
const subnetStr = gossipTypeStr.slice(GossipType.blob_sidecar.length + 1); // +1 for '_' concatenating the topic name and the subnet
|
|
252
|
-
const subnet = parseInt(subnetStr, 10);
|
|
253
|
-
if (Number.isNaN(subnet)) throw Error(`subnet ${subnetStr} is not a number`);
|
|
254
|
-
return {type: GossipType.blob_sidecar, subnet, boundary, encoding};
|
|
255
|
-
}
|
|
256
|
-
|
|
257
254
|
if (gossipTypeStr.startsWith(GossipType.data_column_sidecar)) {
|
|
258
255
|
const subnetStr = gossipTypeStr.slice(GossipType.data_column_sidecar.length + 1); // +1 for '_' concatenating the topic name and the subnet
|
|
259
256
|
const subnet = parseInt(subnetStr, 10);
|
|
@@ -292,23 +289,15 @@ export function getCoreTopicsAtFork(
|
|
|
292
289
|
topics.push({type: GossipType.proposer_preferences});
|
|
293
290
|
}
|
|
294
291
|
|
|
292
|
+
if (ForkSeq[fork] >= ForkSeq.heze) {
|
|
293
|
+
topics.push({type: GossipType.inclusion_list});
|
|
294
|
+
}
|
|
295
|
+
|
|
295
296
|
// After fulu also track data_column_sidecar_{index}
|
|
296
297
|
if (ForkSeq[fork] >= ForkSeq.fulu) {
|
|
297
298
|
topics.push(...getDataColumnSidecarTopics(networkConfig, opts.subscribeAllColumnSubnets));
|
|
298
299
|
}
|
|
299
300
|
|
|
300
|
-
// After Deneb and before Fulu also track blob_sidecar_{subnet_id}
|
|
301
|
-
if (ForkSeq[fork] >= ForkSeq.deneb && ForkSeq[fork] < ForkSeq.fulu) {
|
|
302
|
-
const {config} = networkConfig;
|
|
303
|
-
const subnetCount = isForkPostElectra(fork)
|
|
304
|
-
? config.BLOB_SIDECAR_SUBNET_COUNT_ELECTRA
|
|
305
|
-
: config.BLOB_SIDECAR_SUBNET_COUNT;
|
|
306
|
-
|
|
307
|
-
for (let subnet = 0; subnet < subnetCount; subnet++) {
|
|
308
|
-
topics.push({type: GossipType.blob_sidecar, subnet});
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
301
|
// capella
|
|
313
302
|
if (ForkSeq[fork] >= ForkSeq.capella) {
|
|
314
303
|
topics.push({type: GossipType.bls_to_execution_change});
|
|
@@ -393,7 +382,6 @@ function parseEncodingStr(encodingStr: string): GossipEncoding {
|
|
|
393
382
|
// TODO: Review which yes, and which not
|
|
394
383
|
export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean> = {
|
|
395
384
|
[GossipType.beacon_block]: true,
|
|
396
|
-
[GossipType.blob_sidecar]: true,
|
|
397
385
|
[GossipType.data_column_sidecar]: true,
|
|
398
386
|
[GossipType.beacon_aggregate_and_proof]: true,
|
|
399
387
|
[GossipType.beacon_attestation]: true,
|
|
@@ -409,6 +397,7 @@ export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean>
|
|
|
409
397
|
[GossipType.payload_attestation_message]: true,
|
|
410
398
|
[GossipType.execution_payload_bid]: true,
|
|
411
399
|
[GossipType.proposer_preferences]: true,
|
|
400
|
+
[GossipType.inclusion_list]: true,
|
|
412
401
|
};
|
|
413
402
|
|
|
414
403
|
/**
|
|
@@ -425,7 +414,6 @@ export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean>
|
|
|
425
414
|
*/
|
|
426
415
|
export const gossipTopicAllowPublishToZeroPeers: Record<GossipType, boolean> = {
|
|
427
416
|
[GossipType.beacon_block]: false,
|
|
428
|
-
[GossipType.blob_sidecar]: false,
|
|
429
417
|
// data_column_sidecar: we ensure having all topic peers via prioritizePeers(). Even with 0 peers on the
|
|
430
418
|
// topic the overall publish can still succeed, because a supernode rebuilds and publishes the missing
|
|
431
419
|
// columns for us, so track sent peers as 0 instead of raising
|
|
@@ -447,4 +435,5 @@ export const gossipTopicAllowPublishToZeroPeers: Record<GossipType, boolean> = {
|
|
|
447
435
|
[GossipType.payload_attestation_message]: false,
|
|
448
436
|
[GossipType.execution_payload_bid]: false,
|
|
449
437
|
[GossipType.proposer_preferences]: false,
|
|
438
|
+
[GossipType.inclusion_list]: false,
|
|
450
439
|
};
|
package/src/network/interface.ts
CHANGED
|
@@ -30,17 +30,17 @@ import {
|
|
|
30
30
|
SubnetID,
|
|
31
31
|
altair,
|
|
32
32
|
capella,
|
|
33
|
-
deneb,
|
|
34
33
|
fulu,
|
|
35
34
|
gloas,
|
|
35
|
+
heze,
|
|
36
36
|
phase0,
|
|
37
37
|
} from "@lodestar/types";
|
|
38
38
|
import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
|
|
39
|
+
import {GoodByeReasonCode} from "../constants/index.js";
|
|
39
40
|
import {CustodyConfig} from "../util/dataColumns.js";
|
|
40
41
|
import {PeerIdStr} from "../util/peerId.js";
|
|
41
42
|
import {
|
|
42
43
|
BeaconBlocksByRootRequest,
|
|
43
|
-
BlobSidecarsByRootRequest,
|
|
44
44
|
DataColumnSidecarsByRootRequest,
|
|
45
45
|
ExecutionPayloadEnvelopesByRootRequest,
|
|
46
46
|
} from "../util/types.js";
|
|
@@ -73,14 +73,13 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
73
73
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
|
|
74
74
|
shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
|
|
75
75
|
reStatusPeers(peers: PeerIdStr[]): Promise<void>;
|
|
76
|
+
goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
|
|
76
77
|
searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
77
78
|
searchUnknownEnvelope(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
78
79
|
// ReqResp
|
|
79
80
|
sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<SignedBeaconBlock[]>;
|
|
80
81
|
sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<SignedBeaconBlock[]>;
|
|
81
82
|
sendBeaconBlocksByHead(peerId: PeerIdStr, request: fulu.BeaconBlocksByHeadRequest): Promise<SignedBeaconBlock[]>;
|
|
82
|
-
sendBlobSidecarsByRange(peerId: PeerIdStr, request: deneb.BlobSidecarsByRangeRequest): Promise<deneb.BlobSidecar[]>;
|
|
83
|
-
sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]>;
|
|
84
83
|
sendDataColumnSidecarsByRange(
|
|
85
84
|
peerId: PeerIdStr,
|
|
86
85
|
request: fulu.DataColumnSidecarsByRangeRequest
|
|
@@ -100,7 +99,6 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
100
99
|
|
|
101
100
|
// Gossip
|
|
102
101
|
publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
|
|
103
|
-
publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number>;
|
|
104
102
|
publishBeaconAggregateAndProof(aggregateAndProof: SignedAggregateAndProof): Promise<number>;
|
|
105
103
|
publishBeaconAttestation(attestation: SingleAttestation, subnet: SubnetID): Promise<number>;
|
|
106
104
|
publishDataColumnSidecar(
|
|
@@ -118,6 +116,7 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
118
116
|
publishSignedExecutionPayloadBid(signedBid: gloas.SignedExecutionPayloadBid): Promise<number>;
|
|
119
117
|
publishPayloadAttestationMessage(payloadAttestationMessage: gloas.PayloadAttestationMessage): Promise<number>;
|
|
120
118
|
publishProposerPreferences(signedProposerPreferences: gloas.SignedProposerPreferences): Promise<number>;
|
|
119
|
+
publishInclusionList(signedInclusionList: heze.SignedInclusionList): Promise<number>;
|
|
121
120
|
|
|
122
121
|
// Debug
|
|
123
122
|
dumpGossipQueue(gossipType: GossipType): Promise<PendingGossipsubMessage[]>;
|
|
@@ -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,20 +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
|
+
heze,
|
|
29
30
|
isGloasDataColumnSidecar,
|
|
30
31
|
phase0,
|
|
31
32
|
} from "@lodestar/types";
|
|
32
|
-
import {prettyPrintIndices, sleep} from "@lodestar/utils";
|
|
33
|
+
import {defer, prettyPrintIndices, sleep} from "@lodestar/utils";
|
|
33
34
|
import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
|
|
34
35
|
import {ChainEvent, IBeaconChain} from "../chain/index.js";
|
|
35
36
|
import {computeSubnetForDataColumnSidecar} from "../chain/validation/dataColumnSidecar.js";
|
|
37
|
+
import {GoodByeReasonCode} from "../constants/index.js";
|
|
36
38
|
import {IBeaconDb} from "../db/interface.js";
|
|
37
39
|
import {Metrics, RegistryMetricCreator} from "../metrics/index.js";
|
|
38
40
|
import {IClock} from "../util/clock.js";
|
|
@@ -41,7 +43,6 @@ import {PeerIdStr, peerIdToString} from "../util/peerId.js";
|
|
|
41
43
|
import {promiseAllMaybeAsync} from "../util/promises.js";
|
|
42
44
|
import {
|
|
43
45
|
BeaconBlocksByRootRequest,
|
|
44
|
-
BlobSidecarsByRootRequest,
|
|
45
46
|
DataColumnSidecarsByRootRequest,
|
|
46
47
|
ExecutionPayloadEnvelopesByRootRequest,
|
|
47
48
|
} from "../util/types.js";
|
|
@@ -126,6 +127,7 @@ export class Network implements INetwork {
|
|
|
126
127
|
|
|
127
128
|
private subscribedToCoreTopics = false;
|
|
128
129
|
private connectedPeersSyncMeta = new Map<PeerIdStr, Omit<PeerSyncMeta, "peerId">>();
|
|
130
|
+
private closePromise: Promise<void> | undefined;
|
|
129
131
|
|
|
130
132
|
constructor(modules: NetworkModules) {
|
|
131
133
|
this.peerId = peerIdFromPrivateKey(modules.privateKey);
|
|
@@ -143,17 +145,13 @@ export class Network implements INetwork {
|
|
|
143
145
|
this.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
144
146
|
this.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
145
147
|
this.chain.emitter.on(routes.events.EventType.head, this.onHead);
|
|
146
|
-
this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate,
|
|
147
|
-
|
|
148
|
-
);
|
|
149
|
-
this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, ({data}) =>
|
|
150
|
-
this.onLightClientOptimisticUpdate(data)
|
|
151
|
-
);
|
|
148
|
+
this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate, this.onLightClientFinalityUpdate);
|
|
149
|
+
this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
|
|
152
150
|
this.chain.emitter.on(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
|
|
153
151
|
this.chain.emitter.on(ChainEvent.publishDataColumns, this.onPublishDataColumns);
|
|
154
|
-
this.chain.emitter.on(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
|
|
155
152
|
this.chain.emitter.on(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
|
|
156
153
|
this.chain.emitter.on(ChainEvent.updateStatus, this.onUpdateStatus);
|
|
154
|
+
this.chain.emitter.on(ChainEvent.localProposalSlots, this.onLocalProposalSlots);
|
|
157
155
|
}
|
|
158
156
|
|
|
159
157
|
static async init({
|
|
@@ -238,9 +236,16 @@ export class Network implements INetwork {
|
|
|
238
236
|
return this.controller.signal.aborted;
|
|
239
237
|
}
|
|
240
238
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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();
|
|
244
249
|
|
|
245
250
|
this.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
246
251
|
this.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
@@ -249,13 +254,15 @@ export class Network implements INetwork {
|
|
|
249
254
|
this.chain.emitter.off(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
|
|
250
255
|
this.chain.emitter.off(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
|
|
251
256
|
this.chain.emitter.off(ChainEvent.publishDataColumns, this.onPublishDataColumns);
|
|
252
|
-
this.chain.emitter.off(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
|
|
253
257
|
this.chain.emitter.off(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
|
|
254
258
|
this.chain.emitter.off(ChainEvent.updateStatus, this.onUpdateStatus);
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
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
|
+
}
|
|
259
266
|
this.logger.debug("network core closed");
|
|
260
267
|
}
|
|
261
268
|
|
|
@@ -277,6 +284,13 @@ export class Network implements INetwork {
|
|
|
277
284
|
return this.core.prepareBeaconCommitteeSubnets(subscriptions);
|
|
278
285
|
}
|
|
279
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
|
+
|
|
280
294
|
async prepareSyncCommitteeSubnets(subscriptions: CommitteeSubscription[]): Promise<void> {
|
|
281
295
|
return this.core.prepareSyncCommitteeSubnets(subscriptions);
|
|
282
296
|
}
|
|
@@ -288,6 +302,10 @@ export class Network implements INetwork {
|
|
|
288
302
|
return this.core.reStatusPeers(peers);
|
|
289
303
|
}
|
|
290
304
|
|
|
305
|
+
async goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
|
|
306
|
+
return this.core.goodbyeAndDisconnect(peer, reason);
|
|
307
|
+
}
|
|
308
|
+
|
|
291
309
|
searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
|
|
292
310
|
this.networkProcessor.searchUnknownBlock(slotRoot, source, peer);
|
|
293
311
|
}
|
|
@@ -327,6 +345,7 @@ export class Network implements INetwork {
|
|
|
327
345
|
async subscribeGossipCoreTopics(): Promise<void> {
|
|
328
346
|
if (!this.subscribedToCoreTopics) {
|
|
329
347
|
await this.core.subscribeGossipCoreTopics();
|
|
348
|
+
if (this.closed) return;
|
|
330
349
|
// Only mark subscribedToCoreTopics if worker resolved this call
|
|
331
350
|
this.subscribedToCoreTopics = true;
|
|
332
351
|
}
|
|
@@ -360,15 +379,6 @@ export class Network implements INetwork {
|
|
|
360
379
|
return this.publishGossip<GossipType.beacon_block>({type: GossipType.beacon_block, boundary}, signedBlock);
|
|
361
380
|
}
|
|
362
381
|
|
|
363
|
-
async publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number> {
|
|
364
|
-
const epoch = computeEpochAtSlot(blobSidecar.signedBlockHeader.message.slot);
|
|
365
|
-
const boundary = this.config.getForkBoundaryAtEpoch(epoch);
|
|
366
|
-
|
|
367
|
-
const subnet = blobSidecar.index;
|
|
368
|
-
|
|
369
|
-
return this.publishGossip<GossipType.blob_sidecar>({type: GossipType.blob_sidecar, boundary, subnet}, blobSidecar);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
382
|
async publishDataColumnSidecar(
|
|
373
383
|
dataColumnSidecar: DataColumnSidecar
|
|
374
384
|
): Promise<{sentPeers: number; alreadyPublished: boolean}> {
|
|
@@ -531,6 +541,16 @@ export class Network implements INetwork {
|
|
|
531
541
|
);
|
|
532
542
|
}
|
|
533
543
|
|
|
544
|
+
async publishInclusionList(signedInclusionList: heze.SignedInclusionList): Promise<number> {
|
|
545
|
+
const epoch = computeEpochAtSlot(signedInclusionList.message.slot);
|
|
546
|
+
const boundary = this.config.getForkBoundaryAtEpoch(epoch);
|
|
547
|
+
|
|
548
|
+
return this.publishGossip<GossipType.inclusion_list>(
|
|
549
|
+
{type: GossipType.inclusion_list, boundary},
|
|
550
|
+
signedInclusionList
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
|
|
534
554
|
async publishProposerPreferences(signedProposerPreferences: gloas.SignedProposerPreferences): Promise<number> {
|
|
535
555
|
const epoch = computeEpochAtSlot(signedProposerPreferences.message.proposalSlot);
|
|
536
556
|
const boundary = this.config.getForkBoundaryAtEpoch(epoch);
|
|
@@ -639,28 +659,6 @@ export class Network implements INetwork {
|
|
|
639
659
|
);
|
|
640
660
|
}
|
|
641
661
|
|
|
642
|
-
async sendBlobSidecarsByRange(
|
|
643
|
-
peerId: PeerIdStr,
|
|
644
|
-
request: deneb.BlobSidecarsByRangeRequest
|
|
645
|
-
): Promise<deneb.BlobSidecar[]> {
|
|
646
|
-
const epoch = computeEpochAtSlot(request.startSlot);
|
|
647
|
-
return collectMaxResponseTyped(
|
|
648
|
-
this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRange, [Version.V1], request),
|
|
649
|
-
// request's count represent the slots, so the actual max count received could be slots * blobs per slot
|
|
650
|
-
request.count * this.config.getMaxBlobsPerBlock(epoch),
|
|
651
|
-
responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRange]
|
|
652
|
-
);
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
async sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]> {
|
|
656
|
-
return collectMaxResponseTyped(
|
|
657
|
-
this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRoot, [Version.V1], request),
|
|
658
|
-
request.length,
|
|
659
|
-
responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRoot],
|
|
660
|
-
this.chain.serializedCache
|
|
661
|
-
);
|
|
662
|
-
}
|
|
663
|
-
|
|
664
662
|
async sendDataColumnSidecarsByRange(
|
|
665
663
|
peerId: PeerIdStr,
|
|
666
664
|
request: fulu.DataColumnSidecarsByRangeRequest
|
|
@@ -787,26 +785,32 @@ export class Network implements INetwork {
|
|
|
787
785
|
return this.core.writeDiscv5HeapSnapshot(prefix, dirpath);
|
|
788
786
|
}
|
|
789
787
|
|
|
790
|
-
private onLightClientFinalityUpdate = async (
|
|
788
|
+
private onLightClientFinalityUpdate = async ({
|
|
789
|
+
data: finalityUpdate,
|
|
790
|
+
}: routes.events.EventData[routes.events.EventType.lightClientFinalityUpdate]): Promise<void> => {
|
|
791
791
|
// TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
|
|
792
792
|
|
|
793
793
|
try {
|
|
794
794
|
// messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
|
|
795
795
|
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
|
|
796
796
|
await this.waitForSyncMessageCutoff(finalityUpdate.signatureSlot);
|
|
797
|
+
if (this.closed) return;
|
|
797
798
|
await this.publishLightClientFinalityUpdate(finalityUpdate);
|
|
798
799
|
} catch (e) {
|
|
799
800
|
this.logger.debug("Error on BeaconGossipHandler.onLightclientFinalityUpdate", {}, e as Error);
|
|
800
801
|
}
|
|
801
802
|
};
|
|
802
803
|
|
|
803
|
-
private onLightClientOptimisticUpdate = async (
|
|
804
|
+
private onLightClientOptimisticUpdate = async ({
|
|
805
|
+
data: optimisticUpdate,
|
|
806
|
+
}: routes.events.EventData[routes.events.EventType.lightClientOptimisticUpdate]): Promise<void> => {
|
|
804
807
|
// TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
|
|
805
808
|
|
|
806
809
|
try {
|
|
807
810
|
// messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
|
|
808
811
|
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
|
|
809
812
|
await this.waitForSyncMessageCutoff(optimisticUpdate.signatureSlot);
|
|
813
|
+
if (this.closed) return;
|
|
810
814
|
await this.publishLightClientOptimisticUpdate(optimisticUpdate);
|
|
811
815
|
} catch (e) {
|
|
812
816
|
this.logger.debug("Error on BeaconGossipHandler.onLightclientOptimisticUpdate", {}, e as Error);
|
|
@@ -843,18 +847,18 @@ export class Network implements INetwork {
|
|
|
843
847
|
this.connectedPeersSyncMeta.delete(data.peer);
|
|
844
848
|
};
|
|
845
849
|
|
|
846
|
-
private onTargetGroupCountUpdated = (count: number): void => {
|
|
847
|
-
|
|
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
|
+
}
|
|
848
856
|
};
|
|
849
857
|
|
|
850
858
|
private onPublishDataColumns = async (sidecars: DataColumnSidecar[]): Promise<void> => {
|
|
851
859
|
await promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishDataColumnSidecar(sidecar)));
|
|
852
860
|
};
|
|
853
861
|
|
|
854
|
-
private onPublishBlobSidecars = (sidecars: deneb.BlobSidecar[]): Promise<number[]> => {
|
|
855
|
-
return promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishBlobSidecar(sidecar)));
|
|
856
|
-
};
|
|
857
|
-
|
|
858
862
|
private onPublishProposerSlashing = async (proposerSlashing: phase0.ProposerSlashing): Promise<void> => {
|
|
859
863
|
try {
|
|
860
864
|
await this.publishProposerSlashing(proposerSlashing);
|
|
@@ -868,6 +872,10 @@ export class Network implements INetwork {
|
|
|
868
872
|
};
|
|
869
873
|
|
|
870
874
|
private onUpdateStatus = async (): Promise<void> => {
|
|
871
|
-
|
|
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
|
+
}
|
|
872
880
|
};
|
|
873
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 {
|