@lodestar/beacon-node 1.42.0-dev.f6213da56d → 1.42.0-dev.fb8f8a700e
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 +4 -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/gossip/topic.d.ts +2 -729
- package/lib/network/gossip/topic.d.ts.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 +9 -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
|
@@ -2,7 +2,7 @@ import {routes} from "@lodestar/api";
|
|
|
2
2
|
import {ForkSeq} from "@lodestar/params";
|
|
3
3
|
import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
4
4
|
import {RootHex, Slot, SlotRootHex} from "@lodestar/types";
|
|
5
|
-
import {Logger, MapDef, mapValues,
|
|
5
|
+
import {Logger, MapDef, mapValues, sleep} from "@lodestar/utils";
|
|
6
6
|
import {BlockInputSource} from "../../chain/blocks/blockInput/types.js";
|
|
7
7
|
import {ChainEvent} from "../../chain/emitter.js";
|
|
8
8
|
import {GossipErrorCode} from "../../chain/errors/gossipValidation.js";
|
|
@@ -12,6 +12,16 @@ import {Metrics} from "../../metrics/metrics.js";
|
|
|
12
12
|
import {ClockEvent} from "../../util/clock.js";
|
|
13
13
|
import {callInNextEventLoop} from "../../util/eventLoop.js";
|
|
14
14
|
import {PeerIdStr} from "../../util/peerId.js";
|
|
15
|
+
import {
|
|
16
|
+
getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized,
|
|
17
|
+
getDataIndexFromSignedAggregateAndProofSerialized,
|
|
18
|
+
getDataIndexFromSingleAttestationSerialized,
|
|
19
|
+
getParentBlockHashFromGloasSignedBeaconBlockSerialized,
|
|
20
|
+
getParentBlockHashFromSignedExecutionPayloadBidSerialized,
|
|
21
|
+
getParentBlockRootFromSignedExecutionPayloadBidSerialized,
|
|
22
|
+
getParentRootFromSignedBeaconBlockSerialized,
|
|
23
|
+
getPayloadPresentFromPayloadAttestationMessageSerialized,
|
|
24
|
+
} from "../../util/sszBytes.js";
|
|
15
25
|
import {NetworkEvent, NetworkEventBus} from "../events.js";
|
|
16
26
|
import {
|
|
17
27
|
GossipHandlers,
|
|
@@ -87,27 +97,29 @@ const executeGossipWorkOrder = Object.keys(executeGossipWorkOrderObj) as (keyof
|
|
|
87
97
|
// TODO: Arbitrary constant, check metrics
|
|
88
98
|
const MAX_JOBS_SUBMITTED_PER_TICK = 128;
|
|
89
99
|
|
|
90
|
-
// How many
|
|
100
|
+
// How many gossip messages we keep before new ones get dropped.
|
|
91
101
|
const MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS = 16_384;
|
|
102
|
+
// TODO gloas: arbitrary constant, check metrics.
|
|
103
|
+
const MAX_QUEUED_UNKNOWN_PAYLOAD_GOSSIP_OBJECTS = 1024;
|
|
92
104
|
|
|
93
|
-
// We don't want to process too many
|
|
94
|
-
// As seen on mainnet,
|
|
105
|
+
// We don't want to process too many gossip messages in a single tick
|
|
106
|
+
// As seen on mainnet, gossip messages concurrency metric ranges from 1000 to 2000
|
|
95
107
|
// so make this constant a little bit conservative
|
|
96
|
-
const
|
|
108
|
+
const MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK = 1024;
|
|
97
109
|
|
|
98
110
|
// Same motivation to JobItemQueue, we don't want to block the event loop
|
|
99
|
-
const
|
|
111
|
+
const AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS = 50;
|
|
100
112
|
|
|
101
113
|
/**
|
|
102
114
|
* Reprocess reject reason for metrics
|
|
103
115
|
*/
|
|
104
116
|
export enum ReprocessRejectReason {
|
|
105
117
|
/**
|
|
106
|
-
* There are too many
|
|
118
|
+
* There are too many gossip messages that have unknown block root.
|
|
107
119
|
*/
|
|
108
120
|
reached_limit = "reached_limit",
|
|
109
121
|
/**
|
|
110
|
-
* The awaiting
|
|
122
|
+
* The awaiting gossip message is pruned per clock slot.
|
|
111
123
|
*/
|
|
112
124
|
expired = "expired",
|
|
113
125
|
}
|
|
@@ -126,6 +138,20 @@ export enum CannotAcceptWorkReason {
|
|
|
126
138
|
regen = "regen_busy",
|
|
127
139
|
}
|
|
128
140
|
|
|
141
|
+
/**
|
|
142
|
+
* No metrics needed here; using a number to keep it lightweight
|
|
143
|
+
*/
|
|
144
|
+
enum PreprocessAction {
|
|
145
|
+
AwaitBlock,
|
|
146
|
+
AwaitEnvelope,
|
|
147
|
+
PushToQueue,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
type PreprocessResult =
|
|
151
|
+
| {action: PreprocessAction.PushToQueue}
|
|
152
|
+
| {action: PreprocessAction.AwaitBlock; root: RootHex}
|
|
153
|
+
| {action: PreprocessAction.AwaitEnvelope; root: RootHex};
|
|
154
|
+
|
|
129
155
|
/**
|
|
130
156
|
* Network processor handles the gossip queues and throtles processing to not overload the main thread
|
|
131
157
|
* - Decides when to process work and what to process
|
|
@@ -137,7 +163,7 @@ export enum CannotAcceptWorkReason {
|
|
|
137
163
|
*
|
|
138
164
|
* ### PendingGossipsubMessage beacon_attestation example
|
|
139
165
|
*
|
|
140
|
-
* For
|
|
166
|
+
* For gossip messages, processing the message includes the steps:
|
|
141
167
|
* 1. Pre shuffling sync validation
|
|
142
168
|
* 2. Retrieve shuffling: async + goes into the regen queue and can be expensive
|
|
143
169
|
* 3. Pre sig validation sync validation
|
|
@@ -156,11 +182,14 @@ export class NetworkProcessor {
|
|
|
156
182
|
private readonly gossipQueues: ReturnType<typeof createGossipQueues>;
|
|
157
183
|
private readonly gossipTopicConcurrency: {[K in GossipType]: number};
|
|
158
184
|
private readonly extractBlockSlotRootFns = createExtractBlockSlotRootFns();
|
|
159
|
-
// we may not receive the block for Attestation and SignedAggregateAndProof messages, in that case PendingGossipsubMessage needs
|
|
185
|
+
// we may not receive the block for messages like Attestation and SignedAggregateAndProof messages, in that case PendingGossipsubMessage needs
|
|
160
186
|
// to be stored in this Map and reprocessed once the block comes
|
|
161
|
-
private readonly
|
|
162
|
-
|
|
163
|
-
|
|
187
|
+
private readonly awaitingMessagesByBlockRoot: MapDef<RootHex, Set<PendingGossipsubMessage>>;
|
|
188
|
+
// we may not receive the payload for messages that require the FULL payload variant to be processed,
|
|
189
|
+
// in that case PendingGossipsubMessage needs to be stored in this Map and reprocessed once the payload comes
|
|
190
|
+
private readonly awaitingMessagesByPayloadBlockRoot: MapDef<RootHex, Set<PendingGossipsubMessage>>;
|
|
191
|
+
private unknownBlocksBySlot = new MapDef<Slot, Set<RootHex>>(() => new Set());
|
|
192
|
+
private unknownEnvelopesBySlot = new MapDef<Slot, Set<RootHex>>(() => new Set());
|
|
164
193
|
|
|
165
194
|
constructor(
|
|
166
195
|
modules: NetworkProcessorModules,
|
|
@@ -180,13 +209,13 @@ export class NetworkProcessor {
|
|
|
180
209
|
modules
|
|
181
210
|
);
|
|
182
211
|
|
|
183
|
-
events.on(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage
|
|
184
|
-
this.chain.emitter.on(routes.events.EventType.block, this.onBlockProcessed
|
|
185
|
-
this.chain.
|
|
212
|
+
events.on(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage);
|
|
213
|
+
this.chain.emitter.on(routes.events.EventType.block, this.onBlockProcessed);
|
|
214
|
+
this.chain.emitter.on(routes.events.EventType.executionPayload, this.onPayloadEnvelopeProcessed);
|
|
215
|
+
this.chain.clock.on(ClockEvent.slot, this.onClockSlot);
|
|
186
216
|
|
|
187
|
-
this.
|
|
188
|
-
|
|
189
|
-
);
|
|
217
|
+
this.awaitingMessagesByBlockRoot = new MapDef<RootHex, Set<PendingGossipsubMessage>>(() => new Set());
|
|
218
|
+
this.awaitingMessagesByPayloadBlockRoot = new MapDef<RootHex, Set<PendingGossipsubMessage>>(() => new Set());
|
|
190
219
|
|
|
191
220
|
// TODO: Implement queues and priorization for ReqResp incoming requests
|
|
192
221
|
// Listens to NetworkEvent.reqRespIncomingRequest event
|
|
@@ -198,7 +227,8 @@ export class NetworkProcessor {
|
|
|
198
227
|
metrics.gossipValidationQueue.keySize.set({topic}, this.gossipQueues[topic].keySize);
|
|
199
228
|
metrics.gossipValidationQueue.concurrency.set({topic}, this.gossipTopicConcurrency[topic]);
|
|
200
229
|
}
|
|
201
|
-
metrics.
|
|
230
|
+
metrics.awaitingBlockGossipMessages.countPerSlot.set(this.unknownBlockGossipsubMessagesCount);
|
|
231
|
+
metrics.awaitingPayloadGossipMessages.countPerSlot.set(this.unknownPayloadGossipsubMessagesCount);
|
|
202
232
|
// specific metric for beacon_attestation topic
|
|
203
233
|
metrics.gossipValidationQueue.keyAge.reset();
|
|
204
234
|
for (const ageMs of this.gossipQueues.beacon_attestation.getDataAgeMs()) {
|
|
@@ -215,6 +245,7 @@ export class NetworkProcessor {
|
|
|
215
245
|
async stop(): Promise<void> {
|
|
216
246
|
this.events.off(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage);
|
|
217
247
|
this.chain.emitter.off(routes.events.EventType.block, this.onBlockProcessed);
|
|
248
|
+
this.chain.emitter.off(routes.events.EventType.executionPayload, this.onPayloadEnvelopeProcessed);
|
|
218
249
|
this.chain.emitter.off(ClockEvent.slot, this.onClockSlot);
|
|
219
250
|
}
|
|
220
251
|
|
|
@@ -233,72 +264,276 @@ export class NetworkProcessor {
|
|
|
233
264
|
return queue.getAll();
|
|
234
265
|
}
|
|
235
266
|
|
|
236
|
-
|
|
237
|
-
|
|
267
|
+
/**
|
|
268
|
+
* Search block via `ChainEvent.unknownBlockRoot` event
|
|
269
|
+
* 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.
|
|
270
|
+
* 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.
|
|
271
|
+
*/
|
|
272
|
+
searchUnknownBlock({slot, root}: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
|
|
273
|
+
if (
|
|
274
|
+
this.chain.seenBlock(root) ||
|
|
275
|
+
this.awaitingMessagesByBlockRoot.has(root) ||
|
|
276
|
+
this.unknownBlocksBySlot.getOrDefault(slot).has(root)
|
|
277
|
+
) {
|
|
238
278
|
return;
|
|
239
279
|
}
|
|
240
280
|
// Search for the unknown block
|
|
241
|
-
this.
|
|
281
|
+
this.unknownBlocksBySlot.getOrDefault(slot).add(root);
|
|
242
282
|
this.chain.emitter.emit(ChainEvent.unknownBlockRoot, {rootHex: root, peer, source});
|
|
243
283
|
}
|
|
244
284
|
|
|
245
|
-
|
|
285
|
+
/**
|
|
286
|
+
* Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` event
|
|
287
|
+
* 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.
|
|
288
|
+
* 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.
|
|
289
|
+
*/
|
|
290
|
+
searchUnknownEnvelope({slot, root}: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
|
|
291
|
+
if (
|
|
292
|
+
this.chain.seenPayloadEnvelope(root) ||
|
|
293
|
+
this.awaitingMessagesByPayloadBlockRoot.has(root) ||
|
|
294
|
+
this.unknownEnvelopesBySlot.getOrDefault(slot).has(root)
|
|
295
|
+
) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
this.unknownEnvelopesBySlot.getOrDefault(slot).add(root);
|
|
299
|
+
this.chain.emitter.emit(ChainEvent.unknownEnvelopeBlockRoot, {rootHex: root, peer, source});
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
private onPendingGossipsubMessage = (message: PendingGossipsubMessage): void => {
|
|
246
303
|
const topicType = message.topic.type;
|
|
247
304
|
const extractBlockSlotRootFn = this.extractBlockSlotRootFns[topicType];
|
|
248
|
-
|
|
249
|
-
if
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
305
|
+
|
|
306
|
+
// 1st extract round: make sure slot is in range and if block root is not available
|
|
307
|
+
// proactively search for it + queue the message
|
|
308
|
+
const slotRoot = extractBlockSlotRootFn
|
|
309
|
+
? extractBlockSlotRootFn(message.msg.data, message.topic.boundary.fork)
|
|
310
|
+
: null;
|
|
311
|
+
if (slotRoot === null) {
|
|
312
|
+
// some messages don't have slot and root
|
|
313
|
+
// if the msg.data is invalid, message will be rejected when deserializing data in later phase (gossipValidatorFn)
|
|
314
|
+
this.pushPendingGossipsubMessageToQueue(message);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// common check for all topics
|
|
319
|
+
// DOS protection: avoid processing messages that are too old
|
|
320
|
+
const {slot, root} = slotRoot;
|
|
321
|
+
const clockSlot = this.chain.clock.currentSlot;
|
|
322
|
+
const {fork} = message.topic.boundary;
|
|
323
|
+
let earliestPermissableSlot = clockSlot - DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE;
|
|
324
|
+
if (ForkSeq[fork] >= ForkSeq.deneb && topicType === GossipType.beacon_attestation) {
|
|
325
|
+
// post deneb, the attestations could be in current or previous epoch
|
|
326
|
+
earliestPermissableSlot = computeStartSlotAtEpoch(this.chain.clock.currentEpoch - 1);
|
|
327
|
+
}
|
|
328
|
+
if (slot < earliestPermissableSlot) {
|
|
329
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
330
|
+
this.metrics?.networkProcessor.gossipValidationError.inc({
|
|
331
|
+
topic: topicType,
|
|
332
|
+
error: GossipErrorCode.PAST_SLOT,
|
|
333
|
+
});
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
message.msgSlot = slot;
|
|
338
|
+
|
|
339
|
+
// this determines whether this message needs to wait for a Block or Envelope
|
|
340
|
+
// a message should only wait for what it voted for, hence we don't want to put it on both queues
|
|
341
|
+
let preprocessResult: PreprocessResult = {action: PreprocessAction.PushToQueue};
|
|
342
|
+
// 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
|
|
343
|
+
if (root && !this.chain.forkChoice.hasBlockHexUnsafe(root)) {
|
|
344
|
+
// starting from GLOAS, unknown root from data_column_sidecar also falls into this case
|
|
345
|
+
this.searchUnknownBlock({slot, root}, BlockInputSource.network_processor, message.propagationSource.toString());
|
|
346
|
+
// for beacon_attestation and beacon_aggregate_and_proof messages, this is only temporary.
|
|
347
|
+
// if "index = 1" we need to await for the Envelope instead
|
|
348
|
+
preprocessResult = {action: PreprocessAction.AwaitBlock, root};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// 2nd extract round for some specific topics
|
|
352
|
+
// we separate the search action from the await action
|
|
353
|
+
|
|
354
|
+
// beacon_block: proactively search for parent block/envelope across all forks, but never queue.
|
|
355
|
+
// BlockInputSync handles cascading recovery if the gossip handler throws.
|
|
356
|
+
if (topicType === GossipType.beacon_block) {
|
|
357
|
+
const parentRoot = getParentRootFromSignedBeaconBlockSerialized(message.msg.data);
|
|
358
|
+
if (parentRoot) {
|
|
359
|
+
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
360
|
+
// GLOAS: also check parent envelope, same logic as execution_payload_bid
|
|
361
|
+
const parentBlockHash = getParentBlockHashFromGloasSignedBeaconBlockSerialized(message.msg.data);
|
|
362
|
+
if (parentBlockHash && !this.chain.forkChoice.getBlockHexAndBlockHash(parentRoot, parentBlockHash)) {
|
|
363
|
+
const protoBlock = this.chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
|
|
364
|
+
if (protoBlock === null) {
|
|
365
|
+
this.searchUnknownBlock(
|
|
366
|
+
{slot, root: parentRoot},
|
|
367
|
+
BlockInputSource.network_processor,
|
|
368
|
+
message.propagationSource.toString()
|
|
369
|
+
);
|
|
370
|
+
} else if (
|
|
371
|
+
protoBlock.executionPayloadBlockHash &&
|
|
372
|
+
protoBlock.executionPayloadBlockHash !== parentBlockHash
|
|
373
|
+
) {
|
|
374
|
+
// only search for the envelope by block root if we're sure there is one. Otherwise UnknownBlockSync will penalize the peer.
|
|
375
|
+
this.searchUnknownEnvelope(
|
|
376
|
+
{slot, root: parentRoot},
|
|
377
|
+
BlockInputSource.network_processor,
|
|
378
|
+
message.propagationSource.toString()
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
} else if (!this.chain.forkChoice.hasBlockHexUnsafe(parentRoot)) {
|
|
383
|
+
this.searchUnknownBlock(
|
|
384
|
+
{slot, root: parentRoot},
|
|
385
|
+
BlockInputSource.network_processor,
|
|
386
|
+
message.propagationSource.toString()
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
preprocessResult = {action: PreprocessAction.PushToQueue};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
394
|
+
// specific check for each topic
|
|
395
|
+
// note that it's supposed to NOT queue beacon_block (handled above) and execution_payload because it's not a one-off;
|
|
396
|
+
// for those topics, gossip handlers will throw and BlockInputSync will handle a tree of them instead
|
|
397
|
+
switch (topicType) {
|
|
398
|
+
case GossipType.beacon_attestation:
|
|
399
|
+
case GossipType.beacon_aggregate_and_proof: {
|
|
400
|
+
if (root == null) break;
|
|
401
|
+
const attIndex =
|
|
402
|
+
topicType === GossipType.beacon_attestation
|
|
403
|
+
? getDataIndexFromSingleAttestationSerialized(fork, message.msg.data)
|
|
404
|
+
: getDataIndexFromSignedAggregateAndProofSerialized(message.msg.data);
|
|
405
|
+
if (attIndex === 1 && !this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
406
|
+
// attestation votes that the payload is available but it is not yet known
|
|
407
|
+
this.searchUnknownEnvelope(
|
|
408
|
+
{slot, root},
|
|
409
|
+
BlockInputSource.network_processor,
|
|
410
|
+
message.propagationSource.toString()
|
|
411
|
+
);
|
|
412
|
+
preprocessResult = {action: PreprocessAction.AwaitEnvelope, root};
|
|
413
|
+
}
|
|
414
|
+
break;
|
|
262
415
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
416
|
+
case GossipType.payload_attestation_message: {
|
|
417
|
+
if (root == null) break;
|
|
418
|
+
const payloadPresent = getPayloadPresentFromPayloadAttestationMessageSerialized(message.msg.data);
|
|
419
|
+
if (payloadPresent && !this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
420
|
+
// payload attestation votes that the payload is available but it is not yet known
|
|
421
|
+
this.searchUnknownEnvelope(
|
|
422
|
+
{slot, root},
|
|
423
|
+
BlockInputSource.network_processor,
|
|
424
|
+
message.propagationSource.toString()
|
|
425
|
+
);
|
|
426
|
+
// do not await the envelope, payload attestation processing only requires that the block is known
|
|
427
|
+
// also do not reset preprocessResult, we may already await for the block
|
|
428
|
+
}
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
case GossipType.data_column_sidecar: {
|
|
432
|
+
if (root == null) break;
|
|
433
|
+
if (!this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
434
|
+
this.searchUnknownEnvelope(
|
|
435
|
+
{slot, root},
|
|
436
|
+
BlockInputSource.network_processor,
|
|
437
|
+
message.propagationSource.toString()
|
|
438
|
+
);
|
|
439
|
+
// do not await the envelope, we can do gossip validation
|
|
440
|
+
// also do not reset preprocessResult, we may already await for the block
|
|
441
|
+
}
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
case GossipType.execution_payload: {
|
|
445
|
+
// extractBlockSlotRootFn does not return a root for this topic.
|
|
446
|
+
// Extract beacon_block_root directly and proactively trigger block sync if missing.
|
|
447
|
+
// Do NOT await the block — the handler runs immediately; BlockInputSync handles recovery.
|
|
448
|
+
const blockRoot = getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized(message.msg.data);
|
|
449
|
+
if (blockRoot && !this.chain.forkChoice.hasBlockHexUnsafe(blockRoot)) {
|
|
450
|
+
this.searchUnknownBlock(
|
|
451
|
+
{slot, root: blockRoot},
|
|
452
|
+
BlockInputSource.network_processor,
|
|
453
|
+
message.propagationSource.toString()
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
// do not await the block, we want UnknownBlockSync to handle it.
|
|
457
|
+
preprocessResult = {action: PreprocessAction.PushToQueue};
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
case GossipType.execution_payload_bid: {
|
|
461
|
+
// instead of searching for the message root, this searches for the parent root
|
|
462
|
+
const parentBlockRoot = getParentBlockRootFromSignedExecutionPayloadBidSerialized(message.msg.data);
|
|
463
|
+
const parentBlockHash = getParentBlockHashFromSignedExecutionPayloadBidSerialized(message.msg.data);
|
|
464
|
+
if (
|
|
465
|
+
parentBlockRoot &&
|
|
466
|
+
parentBlockHash &&
|
|
467
|
+
!this.chain.forkChoice.getBlockHexAndBlockHash(parentBlockRoot, parentBlockHash)
|
|
468
|
+
) {
|
|
469
|
+
const protoBlock = this.chain.forkChoice.getBlockHexDefaultStatus(parentBlockRoot);
|
|
470
|
+
if (protoBlock === null) {
|
|
471
|
+
this.searchUnknownBlock(
|
|
472
|
+
{slot, root: parentBlockRoot},
|
|
473
|
+
BlockInputSource.network_processor,
|
|
474
|
+
message.propagationSource.toString()
|
|
475
|
+
);
|
|
476
|
+
preprocessResult = {action: PreprocessAction.AwaitBlock, root: parentBlockRoot};
|
|
477
|
+
} else if (
|
|
478
|
+
protoBlock.executionPayloadBlockHash &&
|
|
479
|
+
protoBlock.executionPayloadBlockHash !== parentBlockHash
|
|
480
|
+
) {
|
|
481
|
+
this.searchUnknownEnvelope(
|
|
482
|
+
{slot, root: parentBlockRoot},
|
|
483
|
+
BlockInputSource.network_processor,
|
|
484
|
+
message.propagationSource.toString()
|
|
485
|
+
);
|
|
486
|
+
preprocessResult = {action: PreprocessAction.AwaitEnvelope, root: parentBlockRoot};
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
switch (preprocessResult.action) {
|
|
495
|
+
case PreprocessAction.PushToQueue:
|
|
496
|
+
this.pushPendingGossipsubMessageToQueue(message);
|
|
497
|
+
break;
|
|
498
|
+
case PreprocessAction.AwaitBlock: {
|
|
499
|
+
if (this.unknownBlockGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS) {
|
|
500
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
501
|
+
this.metrics?.awaitingBlockGossipMessages.reject.inc({
|
|
502
|
+
reason: ReprocessRejectReason.reached_limit,
|
|
266
503
|
topic: topicType,
|
|
267
|
-
error: GossipErrorCode.PAST_SLOT,
|
|
268
504
|
});
|
|
269
505
|
return;
|
|
270
506
|
}
|
|
271
|
-
message.msgSlot = slot;
|
|
272
|
-
// check if we processed a block with this root
|
|
273
|
-
// 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
|
|
274
|
-
if (root && !this.chain.forkChoice.hasBlockHexUnsafe(root)) {
|
|
275
|
-
this.searchUnknownSlotRoot({slot, root}, BlockInputSource.gossip, message.propagationSource.toString());
|
|
276
|
-
|
|
277
|
-
if (this.unknownBlockGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS) {
|
|
278
|
-
// TODO: Should report the dropped job to gossip? It will be eventually pruned from the mcache
|
|
279
|
-
this.metrics?.reprocessGossipAttestations.reject.inc({reason: ReprocessRejectReason.reached_limit});
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
507
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
508
|
+
this.metrics?.awaitingBlockGossipMessages.queue.inc({topic: topicType});
|
|
509
|
+
const awaitingGossipsubMessages = this.awaitingMessagesByBlockRoot.getOrDefault(preprocessResult.root);
|
|
510
|
+
awaitingGossipsubMessages.add(message);
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
case PreprocessAction.AwaitEnvelope: {
|
|
514
|
+
if (this.unknownPayloadGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_PAYLOAD_GOSSIP_OBJECTS) {
|
|
515
|
+
this.metrics?.awaitingPayloadGossipMessages.reject.inc({
|
|
516
|
+
reason: ReprocessRejectReason.reached_limit,
|
|
517
|
+
topic: topicType,
|
|
518
|
+
});
|
|
288
519
|
return;
|
|
289
520
|
}
|
|
521
|
+
|
|
522
|
+
this.metrics?.awaitingPayloadGossipMessages.queue.inc({topic: topicType});
|
|
523
|
+
const awaitingPayloadGossipsubMessages = this.awaitingMessagesByPayloadBlockRoot.getOrDefault(
|
|
524
|
+
preprocessResult.root
|
|
525
|
+
);
|
|
526
|
+
awaitingPayloadGossipsubMessages.add(message);
|
|
527
|
+
break;
|
|
290
528
|
}
|
|
291
529
|
}
|
|
292
|
-
|
|
293
|
-
// bypass the check for other messages
|
|
294
|
-
this.pushPendingGossipsubMessageToQueue(message);
|
|
295
|
-
}
|
|
530
|
+
};
|
|
296
531
|
|
|
297
532
|
private pushPendingGossipsubMessageToQueue(message: PendingGossipsubMessage): void {
|
|
298
533
|
const topicType = message.topic.type;
|
|
299
534
|
const droppedCount = this.gossipQueues[topicType].add(message);
|
|
300
535
|
if (droppedCount) {
|
|
301
|
-
//
|
|
536
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
302
537
|
this.metrics?.gossipValidationQueue.droppedJobs.inc({topic: message.topic.type}, droppedCount);
|
|
303
538
|
}
|
|
304
539
|
|
|
@@ -306,59 +541,111 @@ export class NetworkProcessor {
|
|
|
306
541
|
this.executeWork();
|
|
307
542
|
}
|
|
308
543
|
|
|
309
|
-
private async
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}: {
|
|
313
|
-
slot: Slot;
|
|
314
|
-
block: string;
|
|
315
|
-
executionOptimistic: boolean;
|
|
316
|
-
}): Promise<void> {
|
|
317
|
-
const byRootGossipsubMessages = this.awaitingGossipsubMessagesByRootBySlot.getOrDefault(slot);
|
|
318
|
-
const waitingGossipsubMessages = byRootGossipsubMessages.getOrDefault(rootHex);
|
|
319
|
-
if (waitingGossipsubMessages.size === 0) {
|
|
544
|
+
private onBlockProcessed = async ({block: rootHex}: {block: string; executionOptimistic: boolean}): Promise<void> => {
|
|
545
|
+
const waitingGossipsubMessages = this.awaitingMessagesByBlockRoot.get(rootHex);
|
|
546
|
+
if (!waitingGossipsubMessages || waitingGossipsubMessages.size === 0) {
|
|
320
547
|
return;
|
|
321
548
|
}
|
|
322
549
|
|
|
323
|
-
this.metrics?.reprocessGossipAttestations.resolve.inc(waitingGossipsubMessages.size);
|
|
324
550
|
const nowSec = Date.now() / 1000;
|
|
325
551
|
let count = 0;
|
|
326
552
|
// TODO: we can group attestations to process in batches but since we have the SeenAttestationDatas
|
|
327
553
|
// cache, it may not be necessary at this time
|
|
328
554
|
for (const message of waitingGossipsubMessages) {
|
|
329
|
-
|
|
555
|
+
const topicType = message.topic.type;
|
|
556
|
+
this.metrics?.awaitingBlockGossipMessages.waitSecBeforeResolve.set(
|
|
557
|
+
{topic: topicType},
|
|
558
|
+
nowSec - message.seenTimestampSec
|
|
559
|
+
);
|
|
560
|
+
this.metrics?.awaitingBlockGossipMessages.resolve.inc({topic: topicType});
|
|
330
561
|
this.pushPendingGossipsubMessageToQueue(message);
|
|
331
562
|
count++;
|
|
332
563
|
// 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
|
|
333
|
-
if (count ===
|
|
564
|
+
if (count === MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK) {
|
|
334
565
|
count = 0;
|
|
335
|
-
await sleep(
|
|
566
|
+
await sleep(AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS);
|
|
336
567
|
}
|
|
337
568
|
}
|
|
338
569
|
|
|
339
|
-
|
|
340
|
-
}
|
|
570
|
+
this.awaitingMessagesByBlockRoot.delete(rootHex);
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
private onPayloadEnvelopeProcessed = async ({blockRoot: rootHex}: {blockRoot: RootHex}): Promise<void> => {
|
|
574
|
+
const waitingGossipsubMessages = this.awaitingMessagesByPayloadBlockRoot.get(rootHex);
|
|
575
|
+
if (!waitingGossipsubMessages || waitingGossipsubMessages.size === 0) {
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
const nowSec = Date.now() / 1000;
|
|
580
|
+
let count = 0;
|
|
581
|
+
for (const message of waitingGossipsubMessages) {
|
|
582
|
+
const topicType = message.topic.type;
|
|
583
|
+
this.metrics?.awaitingPayloadGossipMessages.waitSecBeforeResolve.set(
|
|
584
|
+
{topic: topicType},
|
|
585
|
+
nowSec - message.seenTimestampSec
|
|
586
|
+
);
|
|
587
|
+
this.metrics?.awaitingPayloadGossipMessages.resolve.inc({topic: topicType});
|
|
588
|
+
this.pushPendingGossipsubMessageToQueue(message);
|
|
589
|
+
count++;
|
|
590
|
+
if (count === MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK) {
|
|
591
|
+
count = 0;
|
|
592
|
+
await sleep(AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
this.awaitingMessagesByPayloadBlockRoot.delete(rootHex);
|
|
597
|
+
};
|
|
341
598
|
|
|
342
|
-
private onClockSlot(clockSlot: Slot): void {
|
|
599
|
+
private onClockSlot = (clockSlot: Slot): void => {
|
|
343
600
|
const nowSec = Date.now() / 1000;
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
601
|
+
const minSlot = clockSlot - MAX_UNKNOWN_ROOTS_SLOT_CACHE_SIZE;
|
|
602
|
+
|
|
603
|
+
for (const [slot, roots] of this.unknownBlocksBySlot) {
|
|
604
|
+
if (slot > minSlot) continue;
|
|
605
|
+
for (const rootHex of roots) {
|
|
606
|
+
const gossipMessages = this.awaitingMessagesByBlockRoot.get(rootHex);
|
|
607
|
+
if (gossipMessages !== undefined) {
|
|
347
608
|
for (const message of gossipMessages) {
|
|
348
|
-
|
|
349
|
-
this.metrics?.
|
|
350
|
-
|
|
609
|
+
const topicType = message.topic.type;
|
|
610
|
+
this.metrics?.awaitingBlockGossipMessages.reject.inc({
|
|
611
|
+
topic: topicType,
|
|
612
|
+
reason: ReprocessRejectReason.expired,
|
|
613
|
+
});
|
|
614
|
+
this.metrics?.awaitingBlockGossipMessages.waitSecBeforeReject.set(
|
|
615
|
+
{topic: topicType, reason: ReprocessRejectReason.expired},
|
|
351
616
|
nowSec - message.seenTimestampSec
|
|
352
617
|
);
|
|
353
|
-
//
|
|
618
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
354
619
|
}
|
|
620
|
+
this.awaitingMessagesByBlockRoot.delete(rootHex);
|
|
355
621
|
}
|
|
356
|
-
this.awaitingGossipsubMessagesByRootBySlot.delete(slot);
|
|
357
622
|
}
|
|
623
|
+
this.unknownBlocksBySlot.delete(slot);
|
|
358
624
|
}
|
|
359
|
-
|
|
360
|
-
this.
|
|
361
|
-
|
|
625
|
+
|
|
626
|
+
for (const [slot, roots] of this.unknownEnvelopesBySlot) {
|
|
627
|
+
if (slot > minSlot) continue;
|
|
628
|
+
for (const rootHex of roots) {
|
|
629
|
+
const gossipMessages = this.awaitingMessagesByPayloadBlockRoot.get(rootHex);
|
|
630
|
+
if (gossipMessages !== undefined) {
|
|
631
|
+
for (const message of gossipMessages) {
|
|
632
|
+
const topicType = message.topic.type;
|
|
633
|
+
this.metrics?.awaitingPayloadGossipMessages.reject.inc({
|
|
634
|
+
topic: topicType,
|
|
635
|
+
reason: ReprocessRejectReason.expired,
|
|
636
|
+
});
|
|
637
|
+
this.metrics?.awaitingPayloadGossipMessages.waitSecBeforeReject.set(
|
|
638
|
+
{topic: topicType, reason: ReprocessRejectReason.expired},
|
|
639
|
+
nowSec - message.seenTimestampSec
|
|
640
|
+
);
|
|
641
|
+
// No need to report the dropped job to gossip. It will be eventually pruned from the mcache
|
|
642
|
+
}
|
|
643
|
+
this.awaitingMessagesByPayloadBlockRoot.delete(rootHex);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
this.unknownEnvelopesBySlot.delete(slot);
|
|
647
|
+
}
|
|
648
|
+
};
|
|
362
649
|
|
|
363
650
|
private executeWork(): void {
|
|
364
651
|
// TODO: Maybe de-bounce by timing the last time executeWork was run
|
|
@@ -496,4 +783,20 @@ export class NetworkProcessor {
|
|
|
496
783
|
|
|
497
784
|
return null;
|
|
498
785
|
}
|
|
786
|
+
|
|
787
|
+
private get unknownBlockGossipsubMessagesCount(): number {
|
|
788
|
+
let count = 0;
|
|
789
|
+
for (const messages of this.awaitingMessagesByBlockRoot.values()) {
|
|
790
|
+
count += messages.size;
|
|
791
|
+
}
|
|
792
|
+
return count;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
private get unknownPayloadGossipsubMessagesCount(): number {
|
|
796
|
+
let count = 0;
|
|
797
|
+
for (const messages of this.awaitingMessagesByPayloadBlockRoot.values()) {
|
|
798
|
+
count += messages.size;
|
|
799
|
+
}
|
|
800
|
+
return count;
|
|
801
|
+
}
|
|
499
802
|
}
|
|
@@ -297,6 +297,19 @@ export class ReqRespBeaconNode extends ReqResp {
|
|
|
297
297
|
);
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
+
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
301
|
+
protocolsAtFork.push(
|
|
302
|
+
[
|
|
303
|
+
protocols.ExecutionPayloadEnvelopesByRoot(fork, this.config),
|
|
304
|
+
this.getHandler(ReqRespMethod.ExecutionPayloadEnvelopesByRoot),
|
|
305
|
+
],
|
|
306
|
+
[
|
|
307
|
+
protocols.ExecutionPayloadEnvelopesByRange(fork, this.config),
|
|
308
|
+
this.getHandler(ReqRespMethod.ExecutionPayloadEnvelopesByRange),
|
|
309
|
+
]
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
300
313
|
return protocolsAtFork;
|
|
301
314
|
}
|
|
302
315
|
|