@lodestar/beacon-node 1.42.0-dev.7b5ce3932d → 1.42.0-dev.7bdb87e586
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 +25 -13
- 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 +5 -1
- 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 +38 -40
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +4 -4
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +7 -10
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.d.ts.map +1 -1
- package/lib/api/impl/lodestar/index.js +8 -6
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/proof/index.d.ts.map +1 -1
- package/lib/api/impl/proof/index.js +2 -6
- package/lib/api/impl/proof/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +33 -27
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +2 -2
- package/lib/api/impl/validator/utils.d.ts.map +1 -1
- package/lib/api/impl/validator/utils.js +3 -3
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts +2 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.js +5 -5
- package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +2 -1
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +14 -12
- 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/historicalState/getHistoricalState.d.ts +3 -7
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -3
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +1 -0
- package/lib/chain/archiveStore/interface.d.ts.map +1 -1
- package/lib/chain/balancesCache.d.ts +2 -2
- package/lib/chain/balancesCache.d.ts.map +1 -1
- package/lib/chain/balancesCache.js +4 -4
- package/lib/chain/balancesCache.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +5 -5
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +5 -4
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/types.js +1 -0
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts +3 -3
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +37 -23
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +10 -8
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +87 -51
- 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 -2
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +14 -6
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +33 -2
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +2 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.d.ts +21 -15
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
- package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts +2 -2
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +4 -4
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -4
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +4 -2
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/chain.d.ts +15 -14
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +110 -62
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +31 -9
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +12 -3
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +4 -4
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts +31 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.js +7 -0
- package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +4 -4
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +30 -24
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/initState.d.ts +2 -2
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +1 -1
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +15 -14
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/lightClient/index.d.ts +2 -2
- package/lib/chain/lightClient/index.d.ts.map +1 -1
- package/lib/chain/lightClient/index.js +11 -4
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +13 -13
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.d.ts +2 -2
- package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.js +2 -2
- package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
- package/lib/chain/opPools/opPool.d.ts +3 -3
- package/lib/chain/opPools/opPool.d.ts.map +1 -1
- package/lib/chain/opPools/opPool.js +7 -7
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +2 -2
- 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 +1 -0
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +2 -2
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +10 -4
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +3 -4
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +21 -16
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +13 -13
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +14 -14
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +6 -5
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +6 -6
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +2 -2
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
- package/lib/chain/serializeState.d.ts +2 -2
- package/lib/chain/serializeState.d.ts.map +1 -1
- package/lib/chain/serializeState.js +1 -1
- package/lib/chain/serializeState.js.map +1 -1
- package/lib/chain/shufflingCache.d.ts +2 -2
- package/lib/chain/shufflingCache.d.ts.map +1 -1
- package/lib/chain/shufflingCache.js +3 -4
- package/lib/chain/shufflingCache.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +14 -14
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +3 -3
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/blobSidecar.js +1 -1
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +3 -3
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/blsToExecutionChange.js +2 -2
- package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +11 -4
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +185 -6
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +10 -7
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +5 -3
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +5 -3
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
- package/lib/chain/validation/syncCommittee.d.ts +4 -4
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +17 -12
- 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 +5 -2
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +3 -3
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +3 -3
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +11 -9
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/buckets.d.ts +2 -2
- package/lib/db/buckets.d.ts.map +1 -1
- package/lib/db/buckets.js +2 -2
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecar.js +4 -2
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +4 -2
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +32 -4
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +52 -15
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/encoding.d.ts.map +1 -1
- package/lib/network/gossip/encoding.js +15 -0
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/interface.d.ts +7 -4
- 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 +22 -11
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +7 -4
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +12 -3
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +7 -2
- package/lib/network/options.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +25 -5
- 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 +269 -80
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/index.d.ts +22 -7
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +313 -80
- 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 +9 -0
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +11 -1
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +2 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +10 -0
- 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 +8 -0
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +2 -0
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +10 -4
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +16 -4
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/node/nodejs.d.ts +2 -2
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +3 -3
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.d.ts.map +1 -1
- package/lib/node/notifier.js +3 -3
- package/lib/node/notifier.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts +2 -2
- package/lib/sync/backfill/backfill.d.ts.map +1 -1
- package/lib/sync/backfill/backfill.js +2 -2
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +3 -9
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +10 -43
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +3 -3
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +4 -2
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +3 -3
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +10 -5
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.d.ts +3 -3
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js +21 -10
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +18 -11
- package/lib/util/dataColumns.d.ts.map +1 -1
- package/lib/util/dataColumns.js +51 -17
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/execution.d.ts +6 -2
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +49 -25
- package/lib/util/execution.js.map +1 -1
- package/lib/util/sszBytes.d.ts +25 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +189 -2
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +2 -0
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -0
- package/lib/util/types.js.map +1 -1
- package/package.json +16 -16
- package/src/api/impl/beacon/blocks/index.ts +33 -16
- package/src/api/impl/beacon/pool/index.ts +5 -1
- package/src/api/impl/beacon/state/index.ts +43 -55
- package/src/api/impl/beacon/state/utils.ts +11 -25
- package/src/api/impl/debug/index.ts +2 -2
- package/src/api/impl/lodestar/index.ts +8 -8
- package/src/api/impl/proof/index.ts +2 -9
- package/src/api/impl/validator/index.ts +36 -41
- package/src/api/impl/validator/utils.ts +4 -7
- package/src/chain/ColumnReconstructionTracker.ts +6 -5
- package/src/chain/GetBlobsTracker.ts +14 -12
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
- package/src/chain/archiveStore/historicalState/types.ts +2 -0
- package/src/chain/archiveStore/historicalState/worker.ts +1 -4
- package/src/chain/archiveStore/interface.ts +1 -0
- package/src/chain/balancesCache.ts +5 -11
- package/src/chain/blocks/blockInput/blockInput.ts +8 -8
- package/src/chain/blocks/blockInput/types.ts +5 -4
- package/src/chain/blocks/importBlock.ts +50 -31
- package/src/chain/blocks/importExecutionPayload.ts +98 -62
- package/src/chain/blocks/index.ts +3 -2
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +53 -12
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +2 -1
- package/src/chain/blocks/types.ts +26 -15
- package/src/chain/blocks/utils/checkpoint.ts +2 -2
- package/src/chain/blocks/verifyBlock.ts +5 -10
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +10 -14
- package/src/chain/blocks/verifyBlocksSignatures.ts +10 -3
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
- package/src/chain/chain.ts +148 -95
- package/src/chain/emitter.ts +27 -9
- package/src/chain/errors/blockError.ts +4 -4
- package/src/chain/errors/dataColumnSidecarError.ts +32 -1
- package/src/chain/forkChoice/index.ts +35 -41
- package/src/chain/initState.ts +7 -2
- package/src/chain/interface.ts +16 -15
- package/src/chain/lightClient/index.ts +17 -18
- package/src/chain/opPools/aggregatedAttestationPool.ts +20 -21
- package/src/chain/opPools/executionPayloadBidPool.ts +3 -3
- package/src/chain/opPools/opPool.ts +13 -14
- package/src/chain/opPools/utils.ts +3 -3
- package/src/chain/options.ts +2 -0
- package/src/chain/prepareNextSlot.ts +14 -8
- package/src/chain/produceBlock/computeNewStateRoot.ts +7 -10
- package/src/chain/produceBlock/produceBlockBody.ts +38 -45
- package/src/chain/regen/interface.ts +13 -17
- package/src/chain/regen/queued.ts +16 -20
- package/src/chain/regen/regen.ts +16 -17
- package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +2 -2
- package/src/chain/serializeState.ts +3 -3
- package/src/chain/shufflingCache.ts +5 -7
- package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
- package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
- package/src/chain/stateCache/types.ts +14 -18
- package/src/chain/validation/attesterSlashing.ts +3 -3
- package/src/chain/validation/blobSidecar.ts +1 -1
- package/src/chain/validation/block.ts +3 -4
- package/src/chain/validation/blsToExecutionChange.ts +2 -2
- package/src/chain/validation/dataColumnSidecar.ts +231 -8
- package/src/chain/validation/executionPayloadBid.ts +10 -10
- package/src/chain/validation/executionPayloadEnvelope.ts +5 -4
- package/src/chain/validation/payloadAttestationMessage.ts +6 -4
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
- package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
- package/src/chain/validation/syncCommittee.ts +25 -20
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +9 -10
- package/src/chain/validation/voluntaryExit.ts +3 -8
- package/src/chain/validatorMonitor.ts +15 -13
- package/src/db/buckets.ts +2 -2
- package/src/db/repositories/dataColumnSidecar.ts +4 -2
- package/src/db/repositories/dataColumnSidecarArchive.ts +4 -2
- package/src/metrics/metrics/lodestar.ts +57 -19
- package/src/network/gossip/encoding.ts +16 -0
- package/src/network/interface.ts +18 -4
- package/src/network/libp2p/index.ts +24 -13
- package/src/network/network.ts +39 -8
- package/src/network/options.ts +7 -2
- package/src/network/processor/extractSlotRootFns.ts +32 -6
- package/src/network/processor/gossipHandlers.ts +334 -94
- package/src/network/processor/index.ts +395 -92
- package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
- package/src/network/reqresp/handlers/index.ts +12 -0
- package/src/network/reqresp/protocols.ts +12 -0
- package/src/network/reqresp/rateLimit.ts +18 -0
- package/src/network/reqresp/score.ts +2 -0
- package/src/network/reqresp/types.ts +26 -5
- package/src/node/nodejs.ts +6 -5
- package/src/node/notifier.ts +5 -6
- package/src/sync/backfill/backfill.ts +3 -3
- package/src/sync/unknownBlock.ts +13 -53
- package/src/sync/utils/downloadByRange.ts +9 -7
- package/src/sync/utils/downloadByRoot.ts +16 -12
- package/src/util/blobs.ts +35 -15
- package/src/util/dataColumns.ts +69 -25
- package/src/util/execution.ts +49 -30
- package/src/util/sszBytes.ts +245 -3
- package/src/util/types.ts +6 -0
|
@@ -27,11 +27,11 @@ export type NetworkProcessorOpts = GossipHandlerOpts & {
|
|
|
27
27
|
*/
|
|
28
28
|
export declare enum ReprocessRejectReason {
|
|
29
29
|
/**
|
|
30
|
-
* There are too many
|
|
30
|
+
* There are too many gossip messages that have unknown block root.
|
|
31
31
|
*/
|
|
32
32
|
reached_limit = "reached_limit",
|
|
33
33
|
/**
|
|
34
|
-
* The awaiting
|
|
34
|
+
* The awaiting gossip message is pruned per clock slot.
|
|
35
35
|
*/
|
|
36
36
|
expired = "expired"
|
|
37
37
|
}
|
|
@@ -59,7 +59,7 @@ export declare enum CannotAcceptWorkReason {
|
|
|
59
59
|
*
|
|
60
60
|
* ### PendingGossipsubMessage beacon_attestation example
|
|
61
61
|
*
|
|
62
|
-
* For
|
|
62
|
+
* For gossip messages, processing the message includes the steps:
|
|
63
63
|
* 1. Pre shuffling sync validation
|
|
64
64
|
* 2. Retrieve shuffling: async + goes into the regen queue and can be expensive
|
|
65
65
|
* 3. Pre sig validation sync validation
|
|
@@ -79,17 +79,30 @@ export declare class NetworkProcessor {
|
|
|
79
79
|
private readonly gossipQueues;
|
|
80
80
|
private readonly gossipTopicConcurrency;
|
|
81
81
|
private readonly extractBlockSlotRootFns;
|
|
82
|
-
private readonly
|
|
83
|
-
private
|
|
84
|
-
private
|
|
82
|
+
private readonly awaitingMessagesByBlockRoot;
|
|
83
|
+
private readonly awaitingMessagesByPayloadBlockRoot;
|
|
84
|
+
private unknownBlocksBySlot;
|
|
85
|
+
private unknownEnvelopesBySlot;
|
|
85
86
|
constructor(modules: NetworkProcessorModules, opts: NetworkProcessorOpts);
|
|
86
87
|
stop(): Promise<void>;
|
|
87
88
|
dropAllJobs(): void;
|
|
88
89
|
dumpGossipQueue(topic: GossipType): PendingGossipsubMessage[];
|
|
89
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Search block via `ChainEvent.unknownBlockRoot` event
|
|
92
|
+
* Slot is the message slot, which is not necessarily the same as the block's slot, but it can be used for a good prune strategy.
|
|
93
|
+
* In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
|
|
94
|
+
*/
|
|
95
|
+
searchUnknownBlock({ slot, root }: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
96
|
+
/**
|
|
97
|
+
* Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` event
|
|
98
|
+
* Slot is the message slot, which is not necessarily the same as the envelope's slot, but it can be used for a good prune strategy.
|
|
99
|
+
* In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
|
|
100
|
+
*/
|
|
101
|
+
searchUnknownEnvelope({ slot, root }: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
90
102
|
private onPendingGossipsubMessage;
|
|
91
103
|
private pushPendingGossipsubMessageToQueue;
|
|
92
104
|
private onBlockProcessed;
|
|
105
|
+
private onPayloadEnvelopeProcessed;
|
|
93
106
|
private onClockSlot;
|
|
94
107
|
private executeWork;
|
|
95
108
|
private processPendingGossipsubMessage;
|
|
@@ -98,5 +111,7 @@ export declare class NetworkProcessor {
|
|
|
98
111
|
* Return null if chain can accept work, otherwise return the reason why it cannot accept work
|
|
99
112
|
*/
|
|
100
113
|
private checkAcceptWork;
|
|
114
|
+
private get unknownBlockGossipsubMessagesCount();
|
|
115
|
+
private get unknownPayloadGossipsubMessagesCount();
|
|
101
116
|
}
|
|
102
117
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/processor/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/processor/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAC,MAAM,EAA2B,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAC,gBAAgB,EAAC,MAAM,wCAAwC,CAAC;AAGxE,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAGjD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAW/C,OAAO,EAAe,eAAe,EAAC,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,cAAc,EAEd,UAAU,EAGX,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,iBAAiB,EAAE,mBAAmB,EAAoB,MAAM,qBAAqB,CAAC;AAE9F,OAAO,EAAC,kBAAkB,EAAkD,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAC,uBAAuB,EAAC,MAAM,YAAY,CAAC;AAEnD,cAAc,YAAY,CAAC;AAE3B,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GACvD,kBAAkB,GAAG;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAExB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEJ,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG;IACrD,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AA2DF;;GAEG;AACH,oBAAY,qBAAqB;IAC/B;;OAEG;IACH,aAAa,kBAAkB;IAC/B;;OAEG;IACH,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,oBAAY,sBAAsB;IAChC;;OAEG;IACH,GAAG,aAAa;IAChB;;OAEG;IACH,KAAK,eAAe;CACrB;AAgBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAgB;IAqBzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IApBvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyB;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA8B;IACrE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAmC;IAG3E,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAgD;IAG5F,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAgD;IACnG,OAAO,CAAC,mBAAmB,CAAmD;IAC9E,OAAO,CAAC,sBAAsB,CAAmD;IAEjF,YACE,OAAO,EAAE,uBAAuB,EACf,IAAI,EAAE,oBAAoB,EA+C5C;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAK1B;IAED,WAAW,IAAI,IAAI,CAIlB;IAED,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,uBAAuB,EAAE,CAO5D;IAED;;;;OAIG;IACH,kBAAkB,CAAC,EAAC,IAAI,EAAE,IAAI,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAW9F;IAED;;;;OAIG;IACH,qBAAqB,CAAC,EAAC,IAAI,EAAE,IAAI,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAUjG;IAED,OAAO,CAAC,yBAAyB,CAoO/B;IAEF,OAAO,CAAC,kCAAkC;IAY1C,OAAO,CAAC,gBAAgB,CA2BtB;IAEF,OAAO,CAAC,0BAA0B,CAwBhC;IAEF,OAAO,CAAC,WAAW,CAiDjB;IAEF,OAAO,CAAC,WAAW;YAkDL,8BAA8B;IA0D5C,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB,OAAO,KAAK,kCAAkC,GAM7C;IAED,OAAO,KAAK,oCAAoC,GAM/C;CACF"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { routes } from "@lodestar/api";
|
|
2
2
|
import { ForkSeq } from "@lodestar/params";
|
|
3
3
|
import { computeStartSlotAtEpoch } from "@lodestar/state-transition";
|
|
4
|
-
import { MapDef, mapValues,
|
|
4
|
+
import { MapDef, mapValues, sleep } from "@lodestar/utils";
|
|
5
5
|
import { BlockInputSource } from "../../chain/blocks/blockInput/types.js";
|
|
6
6
|
import { ChainEvent } from "../../chain/emitter.js";
|
|
7
7
|
import { GossipErrorCode } from "../../chain/errors/gossipValidation.js";
|
|
8
8
|
import { ClockEvent } from "../../util/clock.js";
|
|
9
9
|
import { callInNextEventLoop } from "../../util/eventLoop.js";
|
|
10
|
+
import { getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized, getDataIndexFromSignedAggregateAndProofSerialized, getDataIndexFromSingleAttestationSerialized, getParentBlockHashFromGloasSignedBeaconBlockSerialized, getParentBlockHashFromSignedExecutionPayloadBidSerialized, getParentBlockRootFromSignedExecutionPayloadBidSerialized, getParentRootFromSignedBeaconBlockSerialized, getPayloadPresentFromPayloadAttestationMessageSerialized, } from "../../util/sszBytes.js";
|
|
10
11
|
import { NetworkEvent } from "../events.js";
|
|
11
12
|
import { GossipType, } from "../gossip/interface.js";
|
|
12
13
|
import { createExtractBlockSlotRootFns } from "./extractSlotRootFns.js";
|
|
@@ -50,14 +51,16 @@ const executeGossipWorkOrderObj = {
|
|
|
50
51
|
const executeGossipWorkOrder = Object.keys(executeGossipWorkOrderObj);
|
|
51
52
|
// TODO: Arbitrary constant, check metrics
|
|
52
53
|
const MAX_JOBS_SUBMITTED_PER_TICK = 128;
|
|
53
|
-
// How many
|
|
54
|
+
// How many gossip messages we keep before new ones get dropped.
|
|
54
55
|
const MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS = 16_384;
|
|
55
|
-
//
|
|
56
|
-
|
|
56
|
+
// TODO gloas: arbitrary constant, check metrics.
|
|
57
|
+
const MAX_QUEUED_UNKNOWN_PAYLOAD_GOSSIP_OBJECTS = 1024;
|
|
58
|
+
// We don't want to process too many gossip messages in a single tick
|
|
59
|
+
// As seen on mainnet, gossip messages concurrency metric ranges from 1000 to 2000
|
|
57
60
|
// so make this constant a little bit conservative
|
|
58
|
-
const
|
|
61
|
+
const MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK = 1024;
|
|
59
62
|
// Same motivation to JobItemQueue, we don't want to block the event loop
|
|
60
|
-
const
|
|
63
|
+
const AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS = 50;
|
|
61
64
|
export { ReprocessRejectReason };
|
|
62
65
|
/**
|
|
63
66
|
* Reprocess reject reason for metrics
|
|
@@ -65,11 +68,11 @@ export { ReprocessRejectReason };
|
|
|
65
68
|
var ReprocessRejectReason;
|
|
66
69
|
(function (ReprocessRejectReason) {
|
|
67
70
|
/**
|
|
68
|
-
* There are too many
|
|
71
|
+
* There are too many gossip messages that have unknown block root.
|
|
69
72
|
*/
|
|
70
73
|
ReprocessRejectReason["reached_limit"] = "reached_limit";
|
|
71
74
|
/**
|
|
72
|
-
* The awaiting
|
|
75
|
+
* The awaiting gossip message is pruned per clock slot.
|
|
73
76
|
*/
|
|
74
77
|
ReprocessRejectReason["expired"] = "expired";
|
|
75
78
|
})(ReprocessRejectReason || (ReprocessRejectReason = {}));
|
|
@@ -88,6 +91,15 @@ var CannotAcceptWorkReason;
|
|
|
88
91
|
*/
|
|
89
92
|
CannotAcceptWorkReason["regen"] = "regen_busy";
|
|
90
93
|
})(CannotAcceptWorkReason || (CannotAcceptWorkReason = {}));
|
|
94
|
+
/**
|
|
95
|
+
* No metrics needed here; using a number to keep it lightweight
|
|
96
|
+
*/
|
|
97
|
+
var PreprocessAction;
|
|
98
|
+
(function (PreprocessAction) {
|
|
99
|
+
PreprocessAction[PreprocessAction["AwaitBlock"] = 0] = "AwaitBlock";
|
|
100
|
+
PreprocessAction[PreprocessAction["AwaitEnvelope"] = 1] = "AwaitEnvelope";
|
|
101
|
+
PreprocessAction[PreprocessAction["PushToQueue"] = 2] = "PushToQueue";
|
|
102
|
+
})(PreprocessAction || (PreprocessAction = {}));
|
|
91
103
|
/**
|
|
92
104
|
* Network processor handles the gossip queues and throtles processing to not overload the main thread
|
|
93
105
|
* - Decides when to process work and what to process
|
|
@@ -99,7 +111,7 @@ var CannotAcceptWorkReason;
|
|
|
99
111
|
*
|
|
100
112
|
* ### PendingGossipsubMessage beacon_attestation example
|
|
101
113
|
*
|
|
102
|
-
* For
|
|
114
|
+
* For gossip messages, processing the message includes the steps:
|
|
103
115
|
* 1. Pre shuffling sync validation
|
|
104
116
|
* 2. Retrieve shuffling: async + goes into the regen queue and can be expensive
|
|
105
117
|
* 3. Pre sig validation sync validation
|
|
@@ -119,11 +131,14 @@ export class NetworkProcessor {
|
|
|
119
131
|
gossipQueues;
|
|
120
132
|
gossipTopicConcurrency;
|
|
121
133
|
extractBlockSlotRootFns = createExtractBlockSlotRootFns();
|
|
122
|
-
// we may not receive the block for Attestation and SignedAggregateAndProof messages, in that case PendingGossipsubMessage needs
|
|
134
|
+
// we may not receive the block for messages like Attestation and SignedAggregateAndProof messages, in that case PendingGossipsubMessage needs
|
|
123
135
|
// to be stored in this Map and reprocessed once the block comes
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
136
|
+
awaitingMessagesByBlockRoot;
|
|
137
|
+
// we may not receive the payload for messages that require the FULL payload variant to be processed,
|
|
138
|
+
// in that case PendingGossipsubMessage needs to be stored in this Map and reprocessed once the payload comes
|
|
139
|
+
awaitingMessagesByPayloadBlockRoot;
|
|
140
|
+
unknownBlocksBySlot = new MapDef(() => new Set());
|
|
141
|
+
unknownEnvelopesBySlot = new MapDef(() => new Set());
|
|
127
142
|
constructor(modules, opts) {
|
|
128
143
|
this.opts = opts;
|
|
129
144
|
const { chain, events, logger, metrics } = modules;
|
|
@@ -136,10 +151,12 @@ export class NetworkProcessor {
|
|
|
136
151
|
this.gossipTopicConcurrency = mapValues(this.gossipQueues, () => 0);
|
|
137
152
|
this.gossipValidatorFn = getGossipValidatorFn(modules.gossipHandlers ?? getGossipHandlers(modules, opts), modules);
|
|
138
153
|
this.gossipValidatorBatchFn = getGossipValidatorBatchFn(modules.gossipHandlers ?? getGossipHandlers(modules, opts), modules);
|
|
139
|
-
events.on(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage
|
|
140
|
-
this.chain.emitter.on(routes.events.EventType.block, this.onBlockProcessed
|
|
141
|
-
this.chain.
|
|
142
|
-
this.
|
|
154
|
+
events.on(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage);
|
|
155
|
+
this.chain.emitter.on(routes.events.EventType.block, this.onBlockProcessed);
|
|
156
|
+
this.chain.emitter.on(routes.events.EventType.executionPayload, this.onPayloadEnvelopeProcessed);
|
|
157
|
+
this.chain.clock.on(ClockEvent.slot, this.onClockSlot);
|
|
158
|
+
this.awaitingMessagesByBlockRoot = new MapDef(() => new Set());
|
|
159
|
+
this.awaitingMessagesByPayloadBlockRoot = new MapDef(() => new Set());
|
|
143
160
|
// TODO: Implement queues and priorization for ReqResp incoming requests
|
|
144
161
|
// Listens to NetworkEvent.reqRespIncomingRequest event
|
|
145
162
|
if (metrics) {
|
|
@@ -149,7 +166,8 @@ export class NetworkProcessor {
|
|
|
149
166
|
metrics.gossipValidationQueue.keySize.set({ topic }, this.gossipQueues[topic].keySize);
|
|
150
167
|
metrics.gossipValidationQueue.concurrency.set({ topic }, this.gossipTopicConcurrency[topic]);
|
|
151
168
|
}
|
|
152
|
-
metrics.
|
|
169
|
+
metrics.awaitingBlockGossipMessages.countPerSlot.set(this.unknownBlockGossipsubMessagesCount);
|
|
170
|
+
metrics.awaitingPayloadGossipMessages.countPerSlot.set(this.unknownPayloadGossipsubMessagesCount);
|
|
153
171
|
// specific metric for beacon_attestation topic
|
|
154
172
|
metrics.gossipValidationQueue.keyAge.reset();
|
|
155
173
|
for (const ageMs of this.gossipQueues.beacon_attestation.getDataAgeMs()) {
|
|
@@ -164,6 +182,7 @@ export class NetworkProcessor {
|
|
|
164
182
|
async stop() {
|
|
165
183
|
this.events.off(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage);
|
|
166
184
|
this.chain.emitter.off(routes.events.EventType.block, this.onBlockProcessed);
|
|
185
|
+
this.chain.emitter.off(routes.events.EventType.executionPayload, this.onPayloadEnvelopeProcessed);
|
|
167
186
|
this.chain.emitter.off(ClockEvent.slot, this.onClockSlot);
|
|
168
187
|
}
|
|
169
188
|
dropAllJobs() {
|
|
@@ -178,112 +197,312 @@ export class NetworkProcessor {
|
|
|
178
197
|
}
|
|
179
198
|
return queue.getAll();
|
|
180
199
|
}
|
|
181
|
-
|
|
182
|
-
|
|
200
|
+
/**
|
|
201
|
+
* Search block via `ChainEvent.unknownBlockRoot` event
|
|
202
|
+
* Slot is the message slot, which is not necessarily the same as the block's slot, but it can be used for a good prune strategy.
|
|
203
|
+
* In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
|
|
204
|
+
*/
|
|
205
|
+
searchUnknownBlock({ slot, root }, source, peer) {
|
|
206
|
+
if (this.chain.seenBlock(root) ||
|
|
207
|
+
this.awaitingMessagesByBlockRoot.has(root) ||
|
|
208
|
+
this.unknownBlocksBySlot.getOrDefault(slot).has(root)) {
|
|
183
209
|
return;
|
|
184
210
|
}
|
|
185
211
|
// Search for the unknown block
|
|
186
|
-
this.
|
|
212
|
+
this.unknownBlocksBySlot.getOrDefault(slot).add(root);
|
|
187
213
|
this.chain.emitter.emit(ChainEvent.unknownBlockRoot, { rootHex: root, peer, source });
|
|
188
214
|
}
|
|
189
|
-
|
|
215
|
+
/**
|
|
216
|
+
* Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` event
|
|
217
|
+
* Slot is the message slot, which is not necessarily the same as the envelope's slot, but it can be used for a good prune strategy.
|
|
218
|
+
* In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
|
|
219
|
+
*/
|
|
220
|
+
searchUnknownEnvelope({ slot, root }, source, peer) {
|
|
221
|
+
if (this.chain.seenPayloadEnvelope(root) ||
|
|
222
|
+
this.awaitingMessagesByPayloadBlockRoot.has(root) ||
|
|
223
|
+
this.unknownEnvelopesBySlot.getOrDefault(slot).has(root)) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
this.unknownEnvelopesBySlot.getOrDefault(slot).add(root);
|
|
227
|
+
this.chain.emitter.emit(ChainEvent.unknownEnvelopeBlockRoot, { rootHex: root, peer, source });
|
|
228
|
+
}
|
|
229
|
+
onPendingGossipsubMessage = (message) => {
|
|
190
230
|
const topicType = message.topic.type;
|
|
191
231
|
const extractBlockSlotRootFn = this.extractBlockSlotRootFns[topicType];
|
|
192
|
-
//
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
232
|
+
// 1st extract round: make sure slot is in range and if block root is not available
|
|
233
|
+
// proactively search for it + queue the message
|
|
234
|
+
const slotRoot = extractBlockSlotRootFn
|
|
235
|
+
? extractBlockSlotRootFn(message.msg.data, message.topic.boundary.fork)
|
|
236
|
+
: null;
|
|
237
|
+
if (slotRoot === null) {
|
|
238
|
+
// some messages don't have slot and root
|
|
239
|
+
// if the msg.data is invalid, message will be rejected when deserializing data in later phase (gossipValidatorFn)
|
|
240
|
+
this.pushPendingGossipsubMessageToQueue(message);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
// common check for all topics
|
|
244
|
+
// DOS protection: avoid processing messages that are too old
|
|
245
|
+
const { slot, root } = slotRoot;
|
|
246
|
+
const clockSlot = this.chain.clock.currentSlot;
|
|
247
|
+
const { fork } = message.topic.boundary;
|
|
248
|
+
let earliestPermissableSlot = clockSlot - DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE;
|
|
249
|
+
if (ForkSeq[fork] >= ForkSeq.deneb && topicType === GossipType.beacon_attestation) {
|
|
250
|
+
// post deneb, the attestations could be in current or previous epoch
|
|
251
|
+
earliestPermissableSlot = computeStartSlotAtEpoch(this.chain.clock.currentEpoch - 1);
|
|
252
|
+
}
|
|
253
|
+
if (slot < earliestPermissableSlot) {
|
|
254
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
255
|
+
this.metrics?.networkProcessor.gossipValidationError.inc({
|
|
256
|
+
topic: topicType,
|
|
257
|
+
error: GossipErrorCode.PAST_SLOT,
|
|
258
|
+
});
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
message.msgSlot = slot;
|
|
262
|
+
// this determines whether this message needs to wait for a Block or Envelope
|
|
263
|
+
// a message should only wait for what it voted for, hence we don't want to put it on both queues
|
|
264
|
+
let preprocessResult = { action: PreprocessAction.PushToQueue };
|
|
265
|
+
// no need to check if root is a descendant of the current finalized block, it will be checked once we validate the message if needed
|
|
266
|
+
if (root && !this.chain.forkChoice.hasBlockHexUnsafe(root)) {
|
|
267
|
+
// starting from GLOAS, unknown root from data_column_sidecar also falls into this case
|
|
268
|
+
this.searchUnknownBlock({ slot, root }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
269
|
+
// for beacon_attestation and beacon_aggregate_and_proof messages, this is only temporary.
|
|
270
|
+
// if "index = 1" we need to await for the Envelope instead
|
|
271
|
+
preprocessResult = { action: PreprocessAction.AwaitBlock, root };
|
|
272
|
+
}
|
|
273
|
+
// 2nd extract round for some specific topics
|
|
274
|
+
// we separate the search action from the await action
|
|
275
|
+
// beacon_block: proactively search for parent block/envelope across all forks, but never queue.
|
|
276
|
+
// BlockInputSync handles cascading recovery if the gossip handler throws.
|
|
277
|
+
if (topicType === GossipType.beacon_block) {
|
|
278
|
+
const parentRoot = getParentRootFromSignedBeaconBlockSerialized(message.msg.data);
|
|
279
|
+
if (parentRoot) {
|
|
280
|
+
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
281
|
+
// GLOAS: also check parent envelope, same logic as execution_payload_bid
|
|
282
|
+
const parentBlockHash = getParentBlockHashFromGloasSignedBeaconBlockSerialized(message.msg.data);
|
|
283
|
+
if (parentBlockHash && !this.chain.forkChoice.getBlockHexAndBlockHash(parentRoot, parentBlockHash)) {
|
|
284
|
+
const protoBlock = this.chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
|
|
285
|
+
if (protoBlock === null) {
|
|
286
|
+
this.searchUnknownBlock({ slot, root: parentRoot }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
287
|
+
}
|
|
288
|
+
else if (protoBlock.executionPayloadBlockHash &&
|
|
289
|
+
protoBlock.executionPayloadBlockHash !== parentBlockHash) {
|
|
290
|
+
// only search for the envelope by block root if we're sure there is one. Otherwise UnknownBlockSync will penalize the peer.
|
|
291
|
+
this.searchUnknownEnvelope({ slot, root: parentRoot }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else if (!this.chain.forkChoice.hasBlockHexUnsafe(parentRoot)) {
|
|
296
|
+
this.searchUnknownBlock({ slot, root: parentRoot }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
preprocessResult = { action: PreprocessAction.PushToQueue };
|
|
300
|
+
}
|
|
301
|
+
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
302
|
+
// specific check for each topic
|
|
303
|
+
// note that it's supposed to NOT queue beacon_block (handled above) and execution_payload because it's not a one-off;
|
|
304
|
+
// for those topics, gossip handlers will throw and BlockInputSync will handle a tree of them instead
|
|
305
|
+
switch (topicType) {
|
|
306
|
+
case GossipType.beacon_attestation:
|
|
307
|
+
case GossipType.beacon_aggregate_and_proof: {
|
|
308
|
+
if (root == null)
|
|
309
|
+
break;
|
|
310
|
+
const attIndex = topicType === GossipType.beacon_attestation
|
|
311
|
+
? getDataIndexFromSingleAttestationSerialized(fork, message.msg.data)
|
|
312
|
+
: getDataIndexFromSignedAggregateAndProofSerialized(message.msg.data);
|
|
313
|
+
if (attIndex === 1 && !this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
314
|
+
// attestation votes that the payload is available but it is not yet known
|
|
315
|
+
this.searchUnknownEnvelope({ slot, root }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
316
|
+
preprocessResult = { action: PreprocessAction.AwaitEnvelope, root };
|
|
317
|
+
}
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
case GossipType.payload_attestation_message: {
|
|
321
|
+
if (root == null)
|
|
322
|
+
break;
|
|
323
|
+
const payloadPresent = getPayloadPresentFromPayloadAttestationMessageSerialized(message.msg.data);
|
|
324
|
+
if (payloadPresent && !this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
325
|
+
// payload attestation votes that the payload is available but it is not yet known
|
|
326
|
+
this.searchUnknownEnvelope({ slot, root }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
327
|
+
// do not await the envelope, payload attestation processing only requires that the block is known
|
|
328
|
+
// also do not reset preprocessResult, we may already await for the block
|
|
329
|
+
}
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
case GossipType.data_column_sidecar: {
|
|
333
|
+
if (root == null)
|
|
334
|
+
break;
|
|
335
|
+
if (!this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
336
|
+
this.searchUnknownEnvelope({ slot, root }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
337
|
+
// do not await the envelope, we can do gossip validation
|
|
338
|
+
// also do not reset preprocessResult, we may already await for the block
|
|
339
|
+
}
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
case GossipType.execution_payload: {
|
|
343
|
+
// extractBlockSlotRootFn does not return a root for this topic.
|
|
344
|
+
// Extract beacon_block_root directly and proactively trigger block sync if missing.
|
|
345
|
+
// Do NOT await the block — the handler runs immediately; BlockInputSync handles recovery.
|
|
346
|
+
const blockRoot = getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized(message.msg.data);
|
|
347
|
+
if (blockRoot && !this.chain.forkChoice.hasBlockHexUnsafe(blockRoot)) {
|
|
348
|
+
this.searchUnknownBlock({ slot, root: blockRoot }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
349
|
+
}
|
|
350
|
+
// do not await the block, we want UnknownBlockSync to handle it.
|
|
351
|
+
preprocessResult = { action: PreprocessAction.PushToQueue };
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
case GossipType.execution_payload_bid: {
|
|
355
|
+
// instead of searching for the message root, this searches for the parent root
|
|
356
|
+
const parentBlockRoot = getParentBlockRootFromSignedExecutionPayloadBidSerialized(message.msg.data);
|
|
357
|
+
const parentBlockHash = getParentBlockHashFromSignedExecutionPayloadBidSerialized(message.msg.data);
|
|
358
|
+
if (parentBlockRoot &&
|
|
359
|
+
parentBlockHash &&
|
|
360
|
+
!this.chain.forkChoice.getBlockHexAndBlockHash(parentBlockRoot, parentBlockHash)) {
|
|
361
|
+
const protoBlock = this.chain.forkChoice.getBlockHexDefaultStatus(parentBlockRoot);
|
|
362
|
+
if (protoBlock === null) {
|
|
363
|
+
this.searchUnknownBlock({ slot, root: parentBlockRoot }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
364
|
+
preprocessResult = { action: PreprocessAction.AwaitBlock, root: parentBlockRoot };
|
|
365
|
+
}
|
|
366
|
+
else if (protoBlock.executionPayloadBlockHash &&
|
|
367
|
+
protoBlock.executionPayloadBlockHash !== parentBlockHash) {
|
|
368
|
+
this.searchUnknownEnvelope({ slot, root: parentBlockRoot }, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
369
|
+
preprocessResult = { action: PreprocessAction.AwaitEnvelope, root: parentBlockRoot };
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
break;
|
|
206
373
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
switch (preprocessResult.action) {
|
|
377
|
+
case PreprocessAction.PushToQueue:
|
|
378
|
+
this.pushPendingGossipsubMessageToQueue(message);
|
|
379
|
+
break;
|
|
380
|
+
case PreprocessAction.AwaitBlock: {
|
|
381
|
+
if (this.unknownBlockGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS) {
|
|
382
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
383
|
+
this.metrics?.awaitingBlockGossipMessages.reject.inc({
|
|
384
|
+
reason: ReprocessRejectReason.reached_limit,
|
|
210
385
|
topic: topicType,
|
|
211
|
-
error: GossipErrorCode.PAST_SLOT,
|
|
212
386
|
});
|
|
213
387
|
return;
|
|
214
388
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const awaitingGossipsubMessagesByRoot = this.awaitingGossipsubMessagesByRootBySlot.getOrDefault(slot);
|
|
227
|
-
const awaitingGossipsubMessages = awaitingGossipsubMessagesByRoot.getOrDefault(root);
|
|
228
|
-
awaitingGossipsubMessages.add(message);
|
|
229
|
-
this.unknownBlockGossipsubMessagesCount++;
|
|
389
|
+
this.metrics?.awaitingBlockGossipMessages.queue.inc({ topic: topicType });
|
|
390
|
+
const awaitingGossipsubMessages = this.awaitingMessagesByBlockRoot.getOrDefault(preprocessResult.root);
|
|
391
|
+
awaitingGossipsubMessages.add(message);
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
case PreprocessAction.AwaitEnvelope: {
|
|
395
|
+
if (this.unknownPayloadGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_PAYLOAD_GOSSIP_OBJECTS) {
|
|
396
|
+
this.metrics?.awaitingPayloadGossipMessages.reject.inc({
|
|
397
|
+
reason: ReprocessRejectReason.reached_limit,
|
|
398
|
+
topic: topicType,
|
|
399
|
+
});
|
|
230
400
|
return;
|
|
231
401
|
}
|
|
402
|
+
this.metrics?.awaitingPayloadGossipMessages.queue.inc({ topic: topicType });
|
|
403
|
+
const awaitingPayloadGossipsubMessages = this.awaitingMessagesByPayloadBlockRoot.getOrDefault(preprocessResult.root);
|
|
404
|
+
awaitingPayloadGossipsubMessages.add(message);
|
|
405
|
+
break;
|
|
232
406
|
}
|
|
233
407
|
}
|
|
234
|
-
|
|
235
|
-
this.pushPendingGossipsubMessageToQueue(message);
|
|
236
|
-
}
|
|
408
|
+
};
|
|
237
409
|
pushPendingGossipsubMessageToQueue(message) {
|
|
238
410
|
const topicType = message.topic.type;
|
|
239
411
|
const droppedCount = this.gossipQueues[topicType].add(message);
|
|
240
412
|
if (droppedCount) {
|
|
241
|
-
//
|
|
413
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
242
414
|
this.metrics?.gossipValidationQueue.droppedJobs.inc({ topic: message.topic.type }, droppedCount);
|
|
243
415
|
}
|
|
244
416
|
// Tentatively perform work
|
|
245
417
|
this.executeWork();
|
|
246
418
|
}
|
|
247
|
-
async
|
|
248
|
-
const
|
|
249
|
-
|
|
250
|
-
if (waitingGossipsubMessages.size === 0) {
|
|
419
|
+
onBlockProcessed = async ({ block: rootHex }) => {
|
|
420
|
+
const waitingGossipsubMessages = this.awaitingMessagesByBlockRoot.get(rootHex);
|
|
421
|
+
if (!waitingGossipsubMessages || waitingGossipsubMessages.size === 0) {
|
|
251
422
|
return;
|
|
252
423
|
}
|
|
253
|
-
this.metrics?.reprocessGossipAttestations.resolve.inc(waitingGossipsubMessages.size);
|
|
254
424
|
const nowSec = Date.now() / 1000;
|
|
255
425
|
let count = 0;
|
|
256
426
|
// TODO: we can group attestations to process in batches but since we have the SeenAttestationDatas
|
|
257
427
|
// cache, it may not be necessary at this time
|
|
258
428
|
for (const message of waitingGossipsubMessages) {
|
|
259
|
-
|
|
429
|
+
const topicType = message.topic.type;
|
|
430
|
+
this.metrics?.awaitingBlockGossipMessages.waitSecBeforeResolve.set({ topic: topicType }, nowSec - message.seenTimestampSec);
|
|
431
|
+
this.metrics?.awaitingBlockGossipMessages.resolve.inc({ topic: topicType });
|
|
260
432
|
this.pushPendingGossipsubMessageToQueue(message);
|
|
261
433
|
count++;
|
|
262
434
|
// don't want to block the event loop, worse case it'd wait for 16_084 / 1024 * 50ms = 800ms which is not a big deal
|
|
263
|
-
if (count ===
|
|
435
|
+
if (count === MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK) {
|
|
264
436
|
count = 0;
|
|
265
|
-
await sleep(
|
|
437
|
+
await sleep(AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS);
|
|
266
438
|
}
|
|
267
439
|
}
|
|
268
|
-
|
|
269
|
-
}
|
|
270
|
-
|
|
440
|
+
this.awaitingMessagesByBlockRoot.delete(rootHex);
|
|
441
|
+
};
|
|
442
|
+
onPayloadEnvelopeProcessed = async ({ blockRoot: rootHex }) => {
|
|
443
|
+
const waitingGossipsubMessages = this.awaitingMessagesByPayloadBlockRoot.get(rootHex);
|
|
444
|
+
if (!waitingGossipsubMessages || waitingGossipsubMessages.size === 0) {
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
const nowSec = Date.now() / 1000;
|
|
448
|
+
let count = 0;
|
|
449
|
+
for (const message of waitingGossipsubMessages) {
|
|
450
|
+
const topicType = message.topic.type;
|
|
451
|
+
this.metrics?.awaitingPayloadGossipMessages.waitSecBeforeResolve.set({ topic: topicType }, nowSec - message.seenTimestampSec);
|
|
452
|
+
this.metrics?.awaitingPayloadGossipMessages.resolve.inc({ topic: topicType });
|
|
453
|
+
this.pushPendingGossipsubMessageToQueue(message);
|
|
454
|
+
count++;
|
|
455
|
+
if (count === MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK) {
|
|
456
|
+
count = 0;
|
|
457
|
+
await sleep(AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
this.awaitingMessagesByPayloadBlockRoot.delete(rootHex);
|
|
461
|
+
};
|
|
462
|
+
onClockSlot = (clockSlot) => {
|
|
271
463
|
const nowSec = Date.now() / 1000;
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
464
|
+
const minSlot = clockSlot - MAX_UNKNOWN_ROOTS_SLOT_CACHE_SIZE;
|
|
465
|
+
for (const [slot, roots] of this.unknownBlocksBySlot) {
|
|
466
|
+
if (slot > minSlot)
|
|
467
|
+
continue;
|
|
468
|
+
for (const rootHex of roots) {
|
|
469
|
+
const gossipMessages = this.awaitingMessagesByBlockRoot.get(rootHex);
|
|
470
|
+
if (gossipMessages !== undefined) {
|
|
275
471
|
for (const message of gossipMessages) {
|
|
276
|
-
|
|
277
|
-
this.metrics?.
|
|
278
|
-
|
|
472
|
+
const topicType = message.topic.type;
|
|
473
|
+
this.metrics?.awaitingBlockGossipMessages.reject.inc({
|
|
474
|
+
topic: topicType,
|
|
475
|
+
reason: ReprocessRejectReason.expired,
|
|
476
|
+
});
|
|
477
|
+
this.metrics?.awaitingBlockGossipMessages.waitSecBeforeReject.set({ topic: topicType, reason: ReprocessRejectReason.expired }, nowSec - message.seenTimestampSec);
|
|
478
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
279
479
|
}
|
|
480
|
+
this.awaitingMessagesByBlockRoot.delete(rootHex);
|
|
280
481
|
}
|
|
281
|
-
this.awaitingGossipsubMessagesByRootBySlot.delete(slot);
|
|
282
482
|
}
|
|
483
|
+
this.unknownBlocksBySlot.delete(slot);
|
|
283
484
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
485
|
+
for (const [slot, roots] of this.unknownEnvelopesBySlot) {
|
|
486
|
+
if (slot > minSlot)
|
|
487
|
+
continue;
|
|
488
|
+
for (const rootHex of roots) {
|
|
489
|
+
const gossipMessages = this.awaitingMessagesByPayloadBlockRoot.get(rootHex);
|
|
490
|
+
if (gossipMessages !== undefined) {
|
|
491
|
+
for (const message of gossipMessages) {
|
|
492
|
+
const topicType = message.topic.type;
|
|
493
|
+
this.metrics?.awaitingPayloadGossipMessages.reject.inc({
|
|
494
|
+
topic: topicType,
|
|
495
|
+
reason: ReprocessRejectReason.expired,
|
|
496
|
+
});
|
|
497
|
+
this.metrics?.awaitingPayloadGossipMessages.waitSecBeforeReject.set({ topic: topicType, reason: ReprocessRejectReason.expired }, nowSec - message.seenTimestampSec);
|
|
498
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
499
|
+
}
|
|
500
|
+
this.awaitingMessagesByPayloadBlockRoot.delete(rootHex);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
this.unknownEnvelopesBySlot.delete(slot);
|
|
504
|
+
}
|
|
505
|
+
};
|
|
287
506
|
executeWork() {
|
|
288
507
|
// TODO: Maybe de-bounce by timing the last time executeWork was run
|
|
289
508
|
this.metrics?.networkProcessor.executeWorkCalls.inc();
|
|
@@ -397,5 +616,19 @@ export class NetworkProcessor {
|
|
|
397
616
|
}
|
|
398
617
|
return null;
|
|
399
618
|
}
|
|
619
|
+
get unknownBlockGossipsubMessagesCount() {
|
|
620
|
+
let count = 0;
|
|
621
|
+
for (const messages of this.awaitingMessagesByBlockRoot.values()) {
|
|
622
|
+
count += messages.size;
|
|
623
|
+
}
|
|
624
|
+
return count;
|
|
625
|
+
}
|
|
626
|
+
get unknownPayloadGossipsubMessagesCount() {
|
|
627
|
+
let count = 0;
|
|
628
|
+
for (const messages of this.awaitingMessagesByPayloadBlockRoot.values()) {
|
|
629
|
+
count += messages.size;
|
|
630
|
+
}
|
|
631
|
+
return count;
|
|
632
|
+
}
|
|
400
633
|
}
|
|
401
634
|
//# sourceMappingURL=index.js.map
|