@lodestar/beacon-node 1.51.0-dev.c6e566f915 → 1.51.0-dev.cda05d18f1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/api.js +1 -1
- package/lib/api/impl/api.js.map +1 -1
- package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +48 -95
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/index.d.ts +2 -1
- package/lib/api/impl/beacon/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/index.js +2 -2
- package/lib/api/impl/beacon/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +22 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/validator/index.d.ts +6 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +49 -31
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/options.d.ts +2 -0
- package/lib/api/options.d.ts.map +1 -1
- package/lib/api/options.js +1 -0
- package/lib/api/options.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +13 -2
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +69 -35
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +5 -241
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/errors.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +2 -18
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/types.js +0 -1
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +40 -56
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +34 -19
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +4 -4
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -20
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +0 -24
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +18 -7
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/interface.d.ts +2 -0
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +1 -1
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +50 -22
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +1 -1
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/worker.js +1 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.js +1 -1
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.js +1 -1
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +25 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +124 -43
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +7 -7
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -5
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +1 -1
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +1 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
- package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/errors/index.d.ts +0 -1
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +0 -1
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +11 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +11 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
- package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
- package/lib/chain/forkChoiceExecutionEngine.js +117 -0
- package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
- package/lib/chain/interface.d.ts +9 -7
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +15 -4
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -1
- package/lib/chain/opPools/inclusionListStore.js +2 -2
- package/lib/chain/opPools/inclusionListStore.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +17 -7
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
- package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/singleAttestationPool.js +209 -0
- package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +5 -3
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +3 -3
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/proposerTracker.d.ts +31 -0
- package/lib/chain/proposerTracker.d.ts.map +1 -0
- package/lib/chain/proposerTracker.js +75 -0
- package/lib/chain/proposerTracker.js.map +1 -0
- package/lib/chain/regen/interface.d.ts +1 -2
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +0 -1
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/regen/queued.d.ts +1 -1
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +5 -3
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -166
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/inclusionList.d.ts.map +1 -1
- package/lib/chain/validation/inclusionList.js +11 -2
- package/lib/chain/validation/inclusionList.js.map +1 -1
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +16 -10
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -2
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +0 -3
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/beacon.d.ts +7 -0
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +34 -0
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/dataColumnStore.d.ts +1 -1
- package/lib/db/dataColumnStore.d.ts.map +1 -1
- package/lib/db/dataColumnStore.js +1 -4
- package/lib/db/dataColumnStore.js.map +1 -1
- package/lib/db/flatFileStore/flatFileStore.js +5 -5
- package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
- package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
- package/lib/db/flatFileStore/slotIndex.js +2 -2
- package/lib/db/flatFileStore/slotIndex.js.map +1 -1
- package/lib/db/interface.d.ts +1 -0
- package/lib/db/interface.d.ts.map +1 -1
- package/lib/db/repositories/blobSidecars.d.ts +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
- package/lib/db/repositories/blobSidecars.js +0 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/execution/builder/apiClient.d.ts +14 -8
- package/lib/execution/builder/apiClient.d.ts.map +1 -1
- package/lib/execution/builder/apiClient.js +12 -10
- package/lib/execution/builder/apiClient.js.map +1 -1
- package/lib/execution/builder/http.d.ts +2 -0
- package/lib/execution/builder/http.d.ts.map +1 -1
- package/lib/execution/builder/http.js +2 -0
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
- package/lib/execution/engine/http.d.ts +4 -6
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +8 -11
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +18 -6
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +2 -12
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +0 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +6 -8
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +1 -2
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/payloadIdCache.js +3 -3
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +2 -4
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +1 -15
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +38 -47
- package/lib/execution/engine/sszTypes.d.ts.map +1 -1
- package/lib/execution/engine/sszTypes.js +0 -5
- package/lib/execution/engine/sszTypes.js.map +1 -1
- package/lib/execution/engine/transport.d.ts +1 -14
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +1 -9
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +9 -16
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.d.ts.map +1 -1
- package/lib/execution/engine/utils.js +3 -2
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +0 -9
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +0 -30
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +33 -8
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +84 -18
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/server/http.js +5 -5
- package/lib/metrics/server/http.js.map +1 -1
- package/lib/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +4 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +7 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +6 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +6 -1
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +1 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +10 -0
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +1 -8
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +0 -1
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +6 -22
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +0 -23
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +4 -5
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +8 -7
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +53 -35
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +2 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js +28 -1
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.js +8 -16
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/peers/utils/subnetMap.d.ts +5 -2
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
- package/lib/network/peers/utils/subnetMap.js +6 -3
- package/lib/network/peers/utils/subnetMap.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +1 -8
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +79 -149
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +0 -6
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +1 -5
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +6 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +55 -29
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +1 -12
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +0 -2
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +0 -10
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +1 -17
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +2 -8
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +1 -7
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts +35 -5
- package/lib/network/subnets/attnetsService.d.ts.map +1 -1
- package/lib/network/subnets/attnetsService.js +84 -6
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +7 -0
- package/lib/network/subnets/interface.d.ts.map +1 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/node/nodejs.d.ts +3 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +47 -21
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/options.d.ts +3 -1
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +4 -2
- package/lib/node/options.js.map +1 -1
- package/lib/sync/interface.d.ts.map +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/range/batch.d.ts +2 -3
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +9 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +2 -15
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/sync.d.ts +15 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +103 -25
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +43 -25
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +6 -34
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +24 -128
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +2 -18
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +14 -99
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.d.ts +1 -7
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js +0 -19
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/execution.d.ts +3 -4
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +1 -73
- package/lib/util/execution.js.map +1 -1
- package/lib/util/file.d.ts.map +1 -1
- package/lib/util/file.js +8 -9
- package/lib/util/file.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +5 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +36 -19
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +0 -5
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -2
- package/lib/util/types.js.map +1 -1
- package/package.json +31 -32
- package/src/api/impl/api.ts +1 -1
- package/src/api/impl/beacon/blocks/index.ts +81 -126
- package/src/api/impl/beacon/index.ts +3 -1
- package/src/api/impl/beacon/pool/index.ts +31 -1
- package/src/api/impl/beacon/state/utils.ts +1 -1
- package/src/api/impl/validator/index.ts +54 -37
- package/src/api/options.ts +3 -0
- package/src/chain/GetBlobsTracker.ts +82 -52
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
- package/src/chain/blocks/blockInput/blockInput.ts +11 -343
- package/src/chain/blocks/blockInput/errors.ts +1 -2
- package/src/chain/blocks/blockInput/types.ts +2 -20
- package/src/chain/blocks/importBlock.ts +61 -76
- package/src/chain/blocks/importExecutionPayload.ts +57 -35
- package/src/chain/blocks/index.ts +11 -4
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
- package/src/chain/blocks/types.ts +5 -31
- package/src/chain/blocks/verifyBlock.ts +31 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +48 -24
- package/src/chain/bls/multithread/types.ts +1 -1
- package/src/chain/bls/multithread/worker.ts +1 -5
- package/src/chain/bls/singleThread.ts +1 -1
- package/src/chain/bls/utils.ts +1 -1
- package/src/chain/chain.ts +140 -42
- package/src/chain/emitter.ts +8 -8
- package/src/chain/errors/blockError.ts +1 -1
- package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
- package/src/chain/errors/index.ts +0 -1
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +183 -0
- package/src/chain/interface.ts +9 -6
- package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/inclusionListStore.ts +3 -3
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
- package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/options.ts +5 -4
- package/src/chain/produceBlock/produceBlockBody.ts +7 -4
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +1 -2
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
- package/src/chain/validation/executionPayloadBid.ts +14 -193
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validation/inclusionList.ts +11 -2
- package/src/chain/validation/syncCommittee.ts +31 -15
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
- package/src/chain/validatorMonitor.ts +0 -6
- package/src/db/beacon.ts +44 -0
- package/src/db/dataColumnStore.ts +2 -4
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/interface.ts +2 -0
- package/src/db/repositories/blobSidecars.ts +0 -1
- package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
- package/src/execution/builder/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/engine/blobVersionedHashes.ts +1 -1
- package/src/execution/engine/http.ts +19 -43
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +19 -10
- package/src/execution/engine/jsonRpcTransport.ts +10 -22
- package/src/execution/engine/mock.ts +6 -11
- package/src/execution/engine/payloadIdCache.ts +6 -7
- package/src/execution/engine/restTransport.ts +3 -22
- package/src/execution/engine/sszTypes.ts +0 -9
- package/src/execution/engine/transport.ts +8 -17
- package/src/execution/engine/types.ts +11 -26
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +2 -0
- package/src/metrics/metrics/beacon.ts +0 -30
- package/src/metrics/metrics/lodestar.ts +85 -18
- package/src/metrics/server/http.ts +5 -5
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +11 -1
- package/src/network/core/networkCoreWorker.ts +2 -0
- package/src/network/core/networkCoreWorkerHandler.ts +8 -1
- package/src/network/core/types.ts +6 -1
- package/src/network/gossip/gossipsub.ts +11 -0
- package/src/network/gossip/interface.ts +0 -5
- package/src/network/gossip/topic.ts +0 -25
- package/src/network/interface.ts +2 -5
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +55 -58
- package/src/network/options.ts +4 -0
- package/src/network/peers/peerManager.ts +28 -3
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/peers/utils/prioritizePeers.ts +14 -22
- package/src/network/peers/utils/subnetMap.ts +6 -3
- package/src/network/processor/extractSlotRootFns.ts +0 -9
- package/src/network/processor/gossipHandlers.ts +99 -183
- package/src/network/processor/gossipQueues/index.ts +0 -6
- package/src/network/processor/gossipValidatorFn.ts +0 -5
- package/src/network/processor/index.ts +47 -27
- package/src/network/processor/types.ts +1 -1
- package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
- package/src/network/reqresp/handlers/index.ts +0 -17
- package/src/network/reqresp/protocols.ts +0 -12
- package/src/network/reqresp/rateLimit.ts +1 -17
- package/src/network/reqresp/types.ts +0 -13
- package/src/network/subnets/attnetsService.ts +94 -6
- package/src/network/subnets/interface.ts +7 -0
- package/src/node/nodejs.ts +58 -22
- package/src/node/options.ts +9 -6
- package/src/sync/interface.ts +1 -0
- package/src/sync/range/batch.ts +9 -21
- package/src/sync/range/chain.ts +2 -14
- package/src/sync/sync.ts +108 -26
- package/src/sync/unknownBlock.ts +48 -36
- package/src/sync/utils/downloadByRange.ts +31 -230
- package/src/sync/utils/downloadByRoot.ts +15 -142
- package/src/util/blobs.ts +0 -34
- package/src/util/execution.ts +8 -102
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +42 -24
- package/src/util/types.ts +1 -8
- package/lib/chain/errors/blobSidecarError.d.ts +0 -108
- package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/blobSidecarError.js +0 -38
- package/lib/chain/errors/blobSidecarError.js.map +0 -1
- package/lib/chain/validation/blobSidecar.d.ts +0 -16
- package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
- package/lib/chain/validation/blobSidecar.js +0 -276
- package/lib/chain/validation/blobSidecar.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
- package/src/chain/errors/blobSidecarError.ts +0 -70
- package/src/chain/validation/blobSidecar.ts +0 -357
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {ForkName, isForkPostFulu} from "@lodestar/params";
|
|
2
|
-
import {
|
|
1
|
+
import {ForkName, GENESIS_EPOCH, isForkPostFulu} from "@lodestar/params";
|
|
2
|
+
import {computeEpochAtSlot} from "@lodestar/state-transition";
|
|
3
|
+
import {Epoch, ForkDigest, Root, Slot, Status, fulu, ssz} from "@lodestar/types";
|
|
3
4
|
import {toHex, toRootHex} from "@lodestar/utils";
|
|
4
5
|
|
|
5
6
|
// TODO: Why this value? (From Lighthouse)
|
|
@@ -9,6 +10,8 @@ export enum IrrelevantPeerCode {
|
|
|
9
10
|
INCOMPATIBLE_FORKS = "IRRELEVANT_PEER_INCOMPATIBLE_FORKS",
|
|
10
11
|
DIFFERENT_CLOCKS = "IRRELEVANT_PEER_DIFFERENT_CLOCKS",
|
|
11
12
|
DIFFERENT_FINALIZED = "IRRELEVANT_PEER_DIFFERENT_FINALIZED",
|
|
13
|
+
FINALIZED_EPOCH_TOO_HIGH = "IRRELEVANT_PEER_FINALIZED_EPOCH_TOO_HIGH",
|
|
14
|
+
INVALID_FINALIZED_ROOT = "IRRELEVANT_PEER_INVALID_FINALIZED_ROOT",
|
|
12
15
|
NO_EARLIEST_AVAILABLE_SLOT = "NO_EARLIEST_AVAILABLE_SLOT",
|
|
13
16
|
}
|
|
14
17
|
|
|
@@ -16,6 +19,8 @@ type IrrelevantPeerType =
|
|
|
16
19
|
| {code: IrrelevantPeerCode.INCOMPATIBLE_FORKS; ours: ForkDigest; theirs: ForkDigest}
|
|
17
20
|
| {code: IrrelevantPeerCode.DIFFERENT_CLOCKS; slotDiff: number}
|
|
18
21
|
| {code: IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT}
|
|
22
|
+
| {code: IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH; finalizedEpoch: Epoch; maxFinalizedEpoch: Epoch}
|
|
23
|
+
| {code: IrrelevantPeerCode.INVALID_FINALIZED_ROOT}
|
|
19
24
|
| {code: IrrelevantPeerCode.DIFFERENT_FINALIZED; expectedRoot: Root; remoteRoot: Root};
|
|
20
25
|
|
|
21
26
|
/**
|
|
@@ -45,29 +50,35 @@ export function assertPeerRelevance(
|
|
|
45
50
|
return {code: IrrelevantPeerCode.DIFFERENT_CLOCKS, slotDiff};
|
|
46
51
|
}
|
|
47
52
|
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
// A checkpoint can be finalized at the earliest at the start of epoch + 2
|
|
54
|
+
const maxFinalizedEpoch = Math.max(
|
|
55
|
+
GENESIS_EPOCH,
|
|
56
|
+
computeEpochAtSlot(Math.max(currentSlot, 0) + FUTURE_SLOT_TOLERANCE) - 2
|
|
57
|
+
);
|
|
58
|
+
if (remote.finalizedEpoch > maxFinalizedEpoch) {
|
|
59
|
+
return {
|
|
60
|
+
code: IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH,
|
|
61
|
+
finalizedEpoch: remote.finalizedEpoch,
|
|
62
|
+
maxFinalizedEpoch,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (remote.finalizedEpoch > GENESIS_EPOCH && isZeroRoot(remote.finalizedRoot)) {
|
|
67
|
+
return {code: IrrelevantPeerCode.INVALID_FINALIZED_ROOT};
|
|
68
|
+
}
|
|
51
69
|
|
|
70
|
+
// The remote's finalized epoch is equal to ours, but the block root is different to the one in our chain.
|
|
71
|
+
// Therefore, the node is on a different chain and we should not communicate with them.
|
|
52
72
|
if (
|
|
53
|
-
remote.finalizedEpoch
|
|
54
|
-
!isZeroRoot(
|
|
55
|
-
!
|
|
73
|
+
remote.finalizedEpoch === local.finalizedEpoch &&
|
|
74
|
+
!isZeroRoot(local.finalizedRoot) &&
|
|
75
|
+
!ssz.Root.equals(remote.finalizedRoot, local.finalizedRoot)
|
|
56
76
|
) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const expectedRoot = remote.finalizedEpoch === local.finalizedEpoch ? local.finalizedRoot : null;
|
|
63
|
-
|
|
64
|
-
if (expectedRoot !== null && !ssz.Root.equals(remoteRoot, expectedRoot)) {
|
|
65
|
-
return {
|
|
66
|
-
code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
|
|
67
|
-
expectedRoot: expectedRoot, // forkChoice returns Tree BranchNode which the logger prints as {}
|
|
68
|
-
remoteRoot: remoteRoot,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
77
|
+
return {
|
|
78
|
+
code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
|
|
79
|
+
expectedRoot: local.finalizedRoot,
|
|
80
|
+
remoteRoot: remote.finalizedRoot,
|
|
81
|
+
};
|
|
71
82
|
}
|
|
72
83
|
|
|
73
84
|
if (isForkPostFulu(forkName) && (remote as fulu.Status).earliestAvailableSlot === undefined) {
|
|
@@ -76,7 +87,8 @@ export function assertPeerRelevance(
|
|
|
76
87
|
};
|
|
77
88
|
}
|
|
78
89
|
|
|
79
|
-
// Note:
|
|
90
|
+
// Note: for a behind finalized checkpoint, we validate it more on the main thread against our history,
|
|
91
|
+
// see BeaconSync.verifyPastFinalizedCheckpoint
|
|
80
92
|
return null;
|
|
81
93
|
}
|
|
82
94
|
|
|
@@ -93,6 +105,10 @@ export function renderIrrelevantPeerType(type: IrrelevantPeerType): string {
|
|
|
93
105
|
return `DIFFERENT_CLOCKS slotDiff: ${type.slotDiff}`;
|
|
94
106
|
case IrrelevantPeerCode.DIFFERENT_FINALIZED:
|
|
95
107
|
return `DIFFERENT_FINALIZED root: ${toRootHex(type.remoteRoot)} expected: ${toRootHex(type.expectedRoot)}`;
|
|
108
|
+
case IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH:
|
|
109
|
+
return `FINALIZED_EPOCH_TOO_HIGH finalizedEpoch: ${type.finalizedEpoch} max: ${type.maxFinalizedEpoch}`;
|
|
110
|
+
case IrrelevantPeerCode.INVALID_FINALIZED_ROOT:
|
|
111
|
+
return "INVALID_FINALIZED_ROOT zero root for a non-genesis finalized epoch";
|
|
96
112
|
case IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT:
|
|
97
113
|
return "No earliestAvailableSlot announced via peer Status";
|
|
98
114
|
}
|
|
@@ -49,6 +49,8 @@ const syncnetsZero = BitArray.fromBitLen(SYNC_COMMITTEE_SUBNET_COUNT);
|
|
|
49
49
|
|
|
50
50
|
type SubnetDiscvQuery = {subnet: SubnetID; toSlot: number; maxPeersToDiscover: number};
|
|
51
51
|
|
|
52
|
+
export type RequestedSubnetWithPeerCount = RequestedSubnet & {peerCount: number};
|
|
53
|
+
|
|
52
54
|
/**
|
|
53
55
|
* A map of das custody group index to maxPeersToDiscover
|
|
54
56
|
*/
|
|
@@ -145,8 +147,8 @@ export function prioritizePeers(
|
|
|
145
147
|
samplingGroups: CustodyIndex[] | null;
|
|
146
148
|
score: number;
|
|
147
149
|
}[],
|
|
148
|
-
activeAttnets:
|
|
149
|
-
activeSyncnets:
|
|
150
|
+
activeAttnets: RequestedSubnetWithPeerCount[],
|
|
151
|
+
activeSyncnets: RequestedSubnetWithPeerCount[],
|
|
150
152
|
samplingGroups: CustodyIndex[] | undefined,
|
|
151
153
|
opts: PrioritizePeersOpts,
|
|
152
154
|
config: ChainConfig,
|
|
@@ -231,8 +233,8 @@ export function prioritizePeers(
|
|
|
231
233
|
*/
|
|
232
234
|
function requestSubnetPeers(
|
|
233
235
|
connectedPeers: PeerInfo[],
|
|
234
|
-
activeAttnets:
|
|
235
|
-
activeSyncnets:
|
|
236
|
+
activeAttnets: RequestedSubnetWithPeerCount[],
|
|
237
|
+
activeSyncnets: RequestedSubnetWithPeerCount[],
|
|
236
238
|
ourSamplingGroups: CustodyIndex[] | undefined,
|
|
237
239
|
opts: PrioritizePeersOpts,
|
|
238
240
|
config: ChainConfig,
|
|
@@ -252,54 +254,44 @@ function requestSubnetPeers(
|
|
|
252
254
|
|
|
253
255
|
// attnets, do we need queries for more peers
|
|
254
256
|
if (activeAttnets.length > 0) {
|
|
255
|
-
/** Map of peers per subnet, peer may be in multiple arrays */
|
|
256
|
-
const peersPerSubnet = new Map<number, number>();
|
|
257
|
-
|
|
258
257
|
for (const peer of connectedPeers) {
|
|
259
258
|
const trueBitIndices = peer.attnetsTrueBitIndices;
|
|
260
259
|
let dutyCount = 0;
|
|
261
260
|
for (const {subnet} of activeAttnets) {
|
|
262
261
|
if (trueBitIndices.includes(subnet)) {
|
|
263
262
|
dutyCount += 1;
|
|
264
|
-
peersPerSubnet.set(subnet, 1 + (peersPerSubnet.get(subnet) ?? 0));
|
|
265
263
|
}
|
|
266
264
|
}
|
|
267
265
|
dutiesByPeer.set(peer, dutyCount);
|
|
268
266
|
}
|
|
269
267
|
|
|
270
|
-
for (const {subnet, toSlot} of activeAttnets) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
if (peersInSubnet < targetSubnetPeers) {
|
|
268
|
+
for (const {subnet, toSlot, peerCount} of activeAttnets) {
|
|
269
|
+
metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.attnets}, peerCount);
|
|
270
|
+
if (peerCount < targetSubnetPeers) {
|
|
274
271
|
// We need more peers
|
|
275
|
-
attnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers -
|
|
272
|
+
attnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peerCount});
|
|
276
273
|
}
|
|
277
274
|
}
|
|
278
275
|
}
|
|
279
276
|
|
|
280
277
|
// syncnets, do we need queries for more peers
|
|
281
278
|
if (activeSyncnets.length > 0) {
|
|
282
|
-
/** Map of peers per subnet, peer may be in multiple arrays */
|
|
283
|
-
const peersPerSubnet = new Map<number, number>();
|
|
284
|
-
|
|
285
279
|
for (const peer of connectedPeers) {
|
|
286
280
|
const trueBitIndices = peer.syncnetsTrueBitIndices;
|
|
287
281
|
let dutyCount = dutiesByPeer.get(peer) ?? 0;
|
|
288
282
|
for (const {subnet} of activeSyncnets) {
|
|
289
283
|
if (trueBitIndices.includes(subnet)) {
|
|
290
284
|
dutyCount += 1;
|
|
291
|
-
peersPerSubnet.set(subnet, 1 + (peersPerSubnet.get(subnet) ?? 0));
|
|
292
285
|
}
|
|
293
286
|
}
|
|
294
287
|
dutiesByPeer.set(peer, dutyCount);
|
|
295
288
|
}
|
|
296
289
|
|
|
297
|
-
for (const {subnet, toSlot} of activeSyncnets) {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
if (peersInSubnet < targetSubnetPeers) {
|
|
290
|
+
for (const {subnet, toSlot, peerCount} of activeSyncnets) {
|
|
291
|
+
metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.syncnets}, peerCount);
|
|
292
|
+
if (peerCount < targetSubnetPeers) {
|
|
301
293
|
// We need more peers
|
|
302
|
-
syncnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers -
|
|
294
|
+
syncnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peerCount});
|
|
303
295
|
}
|
|
304
296
|
}
|
|
305
297
|
}
|
|
@@ -66,11 +66,14 @@ export class SubnetMap {
|
|
|
66
66
|
return subnets;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
/**
|
|
70
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Return subnetIds with a `toSlot` less than `currentSlot`. Also deletes expired entries
|
|
71
|
+
* @param keep expired subnets for which it returns true are neither returned nor deleted
|
|
72
|
+
*/
|
|
73
|
+
getExpired(currentSlot: Slot, keep?: (subnet: SubnetID) => boolean): SubnetID[] {
|
|
71
74
|
const subnetIds: SubnetID[] = [];
|
|
72
75
|
for (const [subnet, toSlot] of this.subnets.entries()) {
|
|
73
|
-
if (toSlot < currentSlot) {
|
|
76
|
+
if (toSlot < currentSlot && keep?.(subnet) !== true) {
|
|
74
77
|
subnetIds.push(subnet);
|
|
75
78
|
this.subnets.delete(subnet);
|
|
76
79
|
}
|
|
@@ -6,7 +6,6 @@ import {
|
|
|
6
6
|
getBlockRootFromPayloadAttestationMessageSerialized,
|
|
7
7
|
getBlockRootFromSignedAggregateAndProofSerialized,
|
|
8
8
|
getSlotFromBeaconAttestationSerialized,
|
|
9
|
-
getSlotFromBlobSidecarSerialized,
|
|
10
9
|
getSlotFromDataColumnSidecarSerialized,
|
|
11
10
|
getSlotFromExecutionPayloadEnvelopeSerialized,
|
|
12
11
|
getSlotFromPayloadAttestationMessageSerialized,
|
|
@@ -49,14 +48,6 @@ export function createExtractBlockSlotRootFns(): ExtractSlotRootFns {
|
|
|
49
48
|
}
|
|
50
49
|
return {slot};
|
|
51
50
|
},
|
|
52
|
-
[GossipType.blob_sidecar]: (data: Uint8Array): SlotOptionalRoot | null => {
|
|
53
|
-
const slot = getSlotFromBlobSidecarSerialized(data);
|
|
54
|
-
|
|
55
|
-
if (slot === null) {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
return {slot};
|
|
59
|
-
},
|
|
60
51
|
[GossipType.data_column_sidecar]: (data: Uint8Array, fork: ForkName): SlotOptionalRoot | null => {
|
|
61
52
|
const slot = getSlotFromDataColumnSidecarSerialized(data, fork);
|
|
62
53
|
|
|
@@ -21,9 +21,9 @@ import {
|
|
|
21
21
|
Slot,
|
|
22
22
|
SubnetID,
|
|
23
23
|
UintNum64,
|
|
24
|
-
deneb,
|
|
25
24
|
fulu,
|
|
26
25
|
gloas,
|
|
26
|
+
isGloasBeaconBlock,
|
|
27
27
|
isGloasDataColumnSidecar,
|
|
28
28
|
ssz,
|
|
29
29
|
sszTypesFor,
|
|
@@ -38,13 +38,11 @@ import {
|
|
|
38
38
|
} from "../../chain/blocks/blockInput/index.js";
|
|
39
39
|
import {PayloadError, PayloadErrorCode} from "../../chain/blocks/importExecutionPayload.js";
|
|
40
40
|
import {PayloadEnvelopeInput, PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
|
|
41
|
-
import {
|
|
41
|
+
import {InclusionListSource} from "../../chain/blocks/types.js";
|
|
42
42
|
import {ChainEvent} from "../../chain/emitter.js";
|
|
43
43
|
import {
|
|
44
44
|
AttestationError,
|
|
45
45
|
AttestationErrorCode,
|
|
46
|
-
BlobSidecarErrorCode,
|
|
47
|
-
BlobSidecarGossipError,
|
|
48
46
|
BlockError,
|
|
49
47
|
BlockErrorCode,
|
|
50
48
|
BlockGossipError,
|
|
@@ -59,13 +57,15 @@ import {
|
|
|
59
57
|
SyncCommitteeError,
|
|
60
58
|
} from "../../chain/errors/index.js";
|
|
61
59
|
import {IBeaconChain} from "../../chain/interface.js";
|
|
62
|
-
import {validateGossipBlobSidecar} from "../../chain/validation/blobSidecar.js";
|
|
63
60
|
import {
|
|
64
61
|
validateGossipFuluDataColumnSidecar,
|
|
65
62
|
validateGossipGloasDataColumnSidecar,
|
|
66
63
|
} from "../../chain/validation/dataColumnSidecar.js";
|
|
67
64
|
import {validateGossipExecutionPayloadBid} from "../../chain/validation/executionPayloadBid.js";
|
|
68
|
-
import {
|
|
65
|
+
import {
|
|
66
|
+
validateGossipExecutionPayloadEnvelope,
|
|
67
|
+
validateGossipExecutionPayloadEnvelopeSerialized,
|
|
68
|
+
} from "../../chain/validation/executionPayloadEnvelope.js";
|
|
69
69
|
import {InclusionListValidationResult, validateGossipInclusionList} from "../../chain/validation/inclusionList.js";
|
|
70
70
|
import {
|
|
71
71
|
AggregateAndProofValidationResult,
|
|
@@ -88,7 +88,6 @@ import {validateGossipPayloadAttestationMessage} from "../../chain/validation/pa
|
|
|
88
88
|
import {validateGossipProposerPreferences} from "../../chain/validation/proposerPreferences.js";
|
|
89
89
|
import {OpSource} from "../../chain/validatorMonitor.js";
|
|
90
90
|
import {Metrics} from "../../metrics/index.js";
|
|
91
|
-
import {kzgCommitmentToVersionedHash} from "../../util/blobs.js";
|
|
92
91
|
import {getBlobKzgCommitments, getDataColumnSidecarSlot} from "../../util/dataColumns.js";
|
|
93
92
|
import {callInNextEventLoop} from "../../util/eventLoop.js";
|
|
94
93
|
import {INetworkCore} from "../core/index.js";
|
|
@@ -150,6 +149,31 @@ export function getGossipHandlers(modules: ValidatorFnsModules, options: GossipH
|
|
|
150
149
|
*/
|
|
151
150
|
function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHandlerOpts): SequentialGossipHandlers {
|
|
152
151
|
const {chain, config, metrics, logger, core} = modules;
|
|
152
|
+
const incompletePayloadWaits = new WeakSet<PayloadEnvelopeInput>();
|
|
153
|
+
|
|
154
|
+
function scheduleIncompletePayloadEnvelope(payloadInput: PayloadEnvelopeInput, peer: string): void {
|
|
155
|
+
if (payloadInput.isComplete() || incompletePayloadWaits.has(payloadInput)) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
incompletePayloadWaits.add(payloadInput);
|
|
159
|
+
|
|
160
|
+
const fork = config.getForkName(payloadInput.slot);
|
|
161
|
+
const cutoffTimeMs = getCutoffTimeMs(chain, payloadInput.slot, config.getPayloadDueMs(fork));
|
|
162
|
+
payloadInput.waitForEnvelopeAndAllData(cutoffTimeMs).catch(() => {
|
|
163
|
+
if (
|
|
164
|
+
payloadInput.isComplete() ||
|
|
165
|
+
chain.seenPayloadEnvelopeInputCache.get(payloadInput.blockRootHex) !== payloadInput
|
|
166
|
+
) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
chain.logger.debug("Payload envelope incomplete at payload deadline", payloadInput.getLogMeta());
|
|
170
|
+
chain.emitter.emit(ChainEvent.incompletePayloadEnvelope, {
|
|
171
|
+
payloadInput,
|
|
172
|
+
peer,
|
|
173
|
+
source: BlockInputSource.gossip,
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
153
177
|
|
|
154
178
|
/**
|
|
155
179
|
* Add a gossip block to the seen caches. The proposer signature of the block MUST be verified.
|
|
@@ -296,90 +320,6 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
296
320
|
}
|
|
297
321
|
}
|
|
298
322
|
|
|
299
|
-
async function validateBeaconBlob(
|
|
300
|
-
blobSidecar: deneb.BlobSidecar,
|
|
301
|
-
subnet: SubnetID,
|
|
302
|
-
peerIdStr: string,
|
|
303
|
-
seenTimestampSec: number
|
|
304
|
-
): Promise<BlockInput> {
|
|
305
|
-
const blobBlockHeader = blobSidecar.signedBlockHeader.message;
|
|
306
|
-
const slot = blobBlockHeader.slot;
|
|
307
|
-
const fork = config.getForkName(slot);
|
|
308
|
-
const blockRootHex = toRootHex(ssz.phase0.BeaconBlockHeader.hashTreeRoot(blobBlockHeader));
|
|
309
|
-
|
|
310
|
-
const delaySec = chain.clock.secFromSlot(slot, seenTimestampSec);
|
|
311
|
-
const recvToValLatency = Date.now() / 1000 - seenTimestampSec;
|
|
312
|
-
|
|
313
|
-
try {
|
|
314
|
-
await validateGossipBlobSidecar(fork, chain, blobSidecar, subnet);
|
|
315
|
-
const blockInput = chain.seenBlockInputCache.getByBlob({
|
|
316
|
-
blockRootHex,
|
|
317
|
-
blobSidecar,
|
|
318
|
-
source: BlockInputSource.gossip,
|
|
319
|
-
seenTimestampSec,
|
|
320
|
-
peerIdStr,
|
|
321
|
-
});
|
|
322
|
-
const recvToValidation = Date.now() / 1000 - seenTimestampSec;
|
|
323
|
-
const validationTime = recvToValidation - recvToValLatency;
|
|
324
|
-
|
|
325
|
-
metrics?.gossipBlob.recvToValidation.observe(recvToValidation);
|
|
326
|
-
metrics?.gossipBlob.validationTime.observe(validationTime);
|
|
327
|
-
|
|
328
|
-
if (chain.emitter.listenerCount(routes.events.EventType.blobSidecar)) {
|
|
329
|
-
let versionedHash: Uint8Array;
|
|
330
|
-
if (blockInput.hasBlock()) {
|
|
331
|
-
// if block hasn't arrived yet then this will throw and need to calculate the versionedHash as a 1-off
|
|
332
|
-
versionedHash = blockInput.getVersionedHashes()[blobSidecar.index];
|
|
333
|
-
} else {
|
|
334
|
-
versionedHash = kzgCommitmentToVersionedHash(blobSidecar.kzgCommitment);
|
|
335
|
-
}
|
|
336
|
-
chain.emitter.emit(routes.events.EventType.blobSidecar, {
|
|
337
|
-
blockRoot: blockRootHex,
|
|
338
|
-
slot,
|
|
339
|
-
index: blobSidecar.index,
|
|
340
|
-
kzgCommitment: toHex(blobSidecar.kzgCommitment),
|
|
341
|
-
versionedHash: toHex(versionedHash),
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
logger.debug("Received gossip blob", {
|
|
346
|
-
...blockInput.getLogMeta(),
|
|
347
|
-
currentSlot: chain.clock.currentSlot,
|
|
348
|
-
peerId: peerIdStr,
|
|
349
|
-
delaySec,
|
|
350
|
-
subnet,
|
|
351
|
-
recvToValLatency,
|
|
352
|
-
recvToValidation,
|
|
353
|
-
validationTime,
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
return blockInput;
|
|
357
|
-
} catch (e) {
|
|
358
|
-
if (e instanceof BlobSidecarGossipError) {
|
|
359
|
-
// Don't trigger this yet if full block and blobs haven't arrived yet
|
|
360
|
-
if (e.type.code === BlobSidecarErrorCode.PARENT_UNKNOWN) {
|
|
361
|
-
logger.debug("Gossip blob has error", {slot, root: blockRootHex, code: e.type.code});
|
|
362
|
-
// no need to trigger `unknownBlockParent` event here, as we already did it in `validateBeaconBlock()`
|
|
363
|
-
//
|
|
364
|
-
// TODO(fulu): is this note above correct? Could have random blob that we see that could trigger
|
|
365
|
-
// unknownBlockSync. And duplicate addition of a block will be deduplicated by the
|
|
366
|
-
// BlockInputSync event handler. Check this!!
|
|
367
|
-
// events.emit(NetworkEvent.unknownBlockParent, {blockInput, peer: peerIdStr});
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
if (e.action === GossipAction.REJECT) {
|
|
371
|
-
chain.persistInvalidSszValue(
|
|
372
|
-
ssz.deneb.BlobSidecar,
|
|
373
|
-
blobSidecar,
|
|
374
|
-
`gossip_reject_slot_${slot}_index_${blobSidecar.index}`
|
|
375
|
-
);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
throw e;
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
|
|
383
323
|
async function validateBeaconDataColumn(
|
|
384
324
|
dataColumnSidecar: fulu.DataColumnSidecar,
|
|
385
325
|
_dataColumnBytes: Uint8Array,
|
|
@@ -650,8 +590,6 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
650
590
|
ignoreIfKnown: true,
|
|
651
591
|
// proposer signature already checked in validateBeaconBlock()
|
|
652
592
|
validProposerSignature: true,
|
|
653
|
-
// blobSidecars already checked in validateGossipBlobSidecars()
|
|
654
|
-
validBlobSidecars: BlobSidecarValidation.Individual,
|
|
655
593
|
// It's critical to keep a good number of mesh peers.
|
|
656
594
|
// To do that, the Gossip Job Wait Time should be consistently <3s to avoid the behavior penalties in gossip
|
|
657
595
|
// Gossip Job Wait Time depends on the BLS Job Wait Time
|
|
@@ -679,10 +617,8 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
679
617
|
|
|
680
618
|
// Immediately attempt fetch of data columns from execution engine as the bid contains kzg commitments
|
|
681
619
|
// which is all the information we need so there is no reason to delay until execution payload arrives
|
|
682
|
-
//
|
|
683
|
-
//
|
|
684
|
-
// Columns fetched here feed payloadInput.addColumn, which resolves waitForAllData for any
|
|
685
|
-
// in-flight importExecutionPayload. No processExecutionPayload trigger needed from this path.
|
|
620
|
+
// Columns fetched here feed payloadInput.addColumn, which resolves the waitForAllData of a
|
|
621
|
+
// pending payload import. No processExecutionPayload trigger needed from this path.
|
|
686
622
|
chain.getBlobsTracker.triggerGetBlobs(payloadInput);
|
|
687
623
|
}
|
|
688
624
|
})
|
|
@@ -692,11 +628,10 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
692
628
|
|
|
693
629
|
if (e instanceof BlockError) {
|
|
694
630
|
switch (e.type.code) {
|
|
695
|
-
case BlockErrorCode.DATA_UNAVAILABLE:
|
|
696
|
-
//
|
|
631
|
+
case BlockErrorCode.DATA_UNAVAILABLE:
|
|
632
|
+
// Data did not arrive in time, BlockInputSync keeps pulling it and retries the import
|
|
697
633
|
logLevel = LogLevel.debug;
|
|
698
634
|
break;
|
|
699
|
-
}
|
|
700
635
|
// ALREADY_KNOWN should not happen with ignoreIfKnown=true above
|
|
701
636
|
// PARENT_BLOCK_UNKNOWN should not happen, we handled this in validateBeaconBlock() function above
|
|
702
637
|
case BlockErrorCode.ALREADY_KNOWN:
|
|
@@ -764,7 +699,12 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
764
699
|
// roots per proposer and slot, which bounds full imports over gossip to one alternate
|
|
765
700
|
chain.seenBlockProposers.hasBlockRoot(signedBlock.message.slot, e.type.proposerIndex, e.type.root) &&
|
|
766
701
|
// A sibling with an unknown parent cannot be imported, sync fetches it if its branch becomes relevant
|
|
767
|
-
chain.forkChoice.getBlockHexDefaultStatus(toRootHex(signedBlock.message.parentRoot)) !== null
|
|
702
|
+
chain.forkChoice.getBlockHexDefaultStatus(toRootHex(signedBlock.message.parentRoot)) !== null &&
|
|
703
|
+
(!isGloasBeaconBlock(signedBlock.message) ||
|
|
704
|
+
chain.forkChoice.getBlockHexAndBlockHash(
|
|
705
|
+
toRootHex(signedBlock.message.parentRoot),
|
|
706
|
+
toRootHex(signedBlock.message.body.signedExecutionPayloadBid.message.parentBlockHash)
|
|
707
|
+
) !== null)
|
|
768
708
|
) {
|
|
769
709
|
const blockInput = cacheSignatureVerifiedBlock(
|
|
770
710
|
signedBlock,
|
|
@@ -785,57 +725,6 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
785
725
|
}
|
|
786
726
|
},
|
|
787
727
|
|
|
788
|
-
[GossipType.blob_sidecar]: async ({
|
|
789
|
-
gossipData,
|
|
790
|
-
topic,
|
|
791
|
-
peerIdStr,
|
|
792
|
-
seenTimestampSec,
|
|
793
|
-
}: GossipHandlerParamGeneric<GossipType.blob_sidecar>) => {
|
|
794
|
-
const {serializedData} = gossipData;
|
|
795
|
-
const blobSidecar = sszDeserialize(topic, serializedData);
|
|
796
|
-
const blobSlot = blobSidecar.signedBlockHeader.message.slot;
|
|
797
|
-
const index = blobSidecar.index;
|
|
798
|
-
|
|
799
|
-
if (config.getForkSeq(blobSlot) < ForkSeq.deneb) {
|
|
800
|
-
throw new GossipActionError(GossipAction.REJECT, {code: "PRE_DENEB_BLOCK"});
|
|
801
|
-
}
|
|
802
|
-
const blockInput = await validateBeaconBlob(blobSidecar, topic.subnet, peerIdStr, seenTimestampSec);
|
|
803
|
-
// Handler - deferred to next event loop so the validation result propagates first
|
|
804
|
-
callInNextEventLoop(() => {
|
|
805
|
-
try {
|
|
806
|
-
chain.serializedCache.set(blobSidecar, serializedData);
|
|
807
|
-
if (!blockInput.hasBlockAndAllData()) {
|
|
808
|
-
const cutoffTimeMs = getCutoffTimeMs(chain, blobSlot, BLOCK_AVAILABILITY_CUTOFF_MS);
|
|
809
|
-
chain.logger.debug("Received gossip blob, waiting for full data availability", {
|
|
810
|
-
msToWait: cutoffTimeMs,
|
|
811
|
-
blobIndex: index,
|
|
812
|
-
...blockInput.getLogMeta(),
|
|
813
|
-
});
|
|
814
|
-
blockInput.waitForAllData(cutoffTimeMs).catch((_e) => {
|
|
815
|
-
chain.logger.debug(
|
|
816
|
-
"Waited for data after receiving gossip blob. Cut-off reached so attempting to fetch remainder of BlockInput",
|
|
817
|
-
{
|
|
818
|
-
blobIndex: index,
|
|
819
|
-
...blockInput.getLogMeta(),
|
|
820
|
-
}
|
|
821
|
-
);
|
|
822
|
-
chain.emitter.emit(ChainEvent.incompleteBlockInput, {
|
|
823
|
-
blockInput,
|
|
824
|
-
peer: peerIdStr,
|
|
825
|
-
source: BlockInputSource.gossip,
|
|
826
|
-
});
|
|
827
|
-
});
|
|
828
|
-
}
|
|
829
|
-
} catch (e) {
|
|
830
|
-
logger.debug(
|
|
831
|
-
"Error handling gossip blob",
|
|
832
|
-
{slot: blobSlot, root: blockInput.blockRootHex, index},
|
|
833
|
-
e as Error
|
|
834
|
-
);
|
|
835
|
-
}
|
|
836
|
-
});
|
|
837
|
-
},
|
|
838
|
-
|
|
839
728
|
[GossipType.data_column_sidecar]: async ({
|
|
840
729
|
gossipData,
|
|
841
730
|
topic,
|
|
@@ -899,28 +788,10 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
899
788
|
}
|
|
900
789
|
|
|
901
790
|
// NOTE: we do NOT call chain.processExecutionPayload here. That is triggered only by
|
|
902
|
-
// envelope arrival (gossip or API).
|
|
791
|
+
// envelope arrival (gossip or API). A pending payload import is awaiting
|
|
903
792
|
// payloadInput.waitForAllData(); addColumn above will resolve it once hasAllData flips.
|
|
904
793
|
|
|
905
|
-
|
|
906
|
-
const cutoffTimeMs = getCutoffTimeMs(chain, dataColumnSlot, BLOCK_AVAILABILITY_CUTOFF_MS);
|
|
907
|
-
// do not await here to not delay gossip validation
|
|
908
|
-
payloadInput.waitForEnvelopeAndAllData(cutoffTimeMs).catch((_e) => {
|
|
909
|
-
chain.logger.debug(
|
|
910
|
-
"Waited for envelope and data after receiving gossip column. Cut-off reached so emitting incompletePayloadEnvelope",
|
|
911
|
-
{
|
|
912
|
-
dataColumnIndex: index,
|
|
913
|
-
...payloadInputMeta,
|
|
914
|
-
}
|
|
915
|
-
);
|
|
916
|
-
// TODO GLOAS: UnknownBlockSync to handle this event
|
|
917
|
-
chain.emitter.emit(ChainEvent.incompletePayloadEnvelope, {
|
|
918
|
-
payloadInput,
|
|
919
|
-
peer: peerIdStr,
|
|
920
|
-
source: BlockInputSource.gossip,
|
|
921
|
-
});
|
|
922
|
-
});
|
|
923
|
-
}
|
|
794
|
+
scheduleIncompletePayloadEnvelope(payloadInput, peerIdStr);
|
|
924
795
|
} catch (e) {
|
|
925
796
|
logger.debug(
|
|
926
797
|
"Error handling gossip data column",
|
|
@@ -1266,6 +1137,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
1266
1137
|
seenTimestampSec,
|
|
1267
1138
|
}: GossipHandlerParamGeneric<GossipType.execution_payload>) => {
|
|
1268
1139
|
const {serializedData} = gossipData;
|
|
1140
|
+
validateGossipExecutionPayloadEnvelopeSerialized(chain, serializedData);
|
|
1269
1141
|
const signedEnvelope = sszDeserialize(topic, serializedData);
|
|
1270
1142
|
const envelope = signedEnvelope.message;
|
|
1271
1143
|
|
|
@@ -1318,17 +1190,23 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
1318
1190
|
});
|
|
1319
1191
|
}
|
|
1320
1192
|
|
|
1193
|
+
// Add the envelope in the same tick as validation, otherwise a by-root download that completes
|
|
1194
|
+
// before the next event loop sees no envelope, validates it again and adds it first
|
|
1195
|
+
if (!payloadInput.hasPayloadEnvelope()) {
|
|
1196
|
+
chain.serializedCache.set(signedEnvelope, serializedData);
|
|
1197
|
+
|
|
1198
|
+
payloadInput.addPayloadEnvelope({
|
|
1199
|
+
envelope: signedEnvelope,
|
|
1200
|
+
source: PayloadEnvelopeInputSource.gossip,
|
|
1201
|
+
seenTimestampSec,
|
|
1202
|
+
peerIdStr,
|
|
1203
|
+
});
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1321
1206
|
// Handler - deferred to next event loop so the validation result propagates first
|
|
1322
1207
|
callInNextEventLoop(() => {
|
|
1323
1208
|
try {
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
payloadInput.addPayloadEnvelope({
|
|
1327
|
-
envelope: signedEnvelope,
|
|
1328
|
-
source: PayloadEnvelopeInputSource.gossip,
|
|
1329
|
-
seenTimestampSec,
|
|
1330
|
-
peerIdStr,
|
|
1331
|
-
});
|
|
1209
|
+
scheduleIncompletePayloadEnvelope(payloadInput, peerIdStr);
|
|
1332
1210
|
|
|
1333
1211
|
chain.emitter.emit(routes.events.EventType.executionPayloadGossip, {
|
|
1334
1212
|
slot,
|
|
@@ -1337,12 +1215,18 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
1337
1215
|
blockRoot: blockRootHex,
|
|
1338
1216
|
});
|
|
1339
1217
|
|
|
1340
|
-
|
|
1218
|
+
// Signature is verified above only for this envelope, one added by another source is verified at import
|
|
1219
|
+
const validSignature = payloadInput.getPayloadEnvelope() === signedEnvelope;
|
|
1220
|
+
chain.processExecutionPayload(payloadInput, {validSignature}).catch((e) => {
|
|
1341
1221
|
// Adjust verbosity based on error type
|
|
1342
1222
|
let logLevel: LogLevel;
|
|
1343
1223
|
|
|
1344
1224
|
if (e instanceof PayloadError) {
|
|
1345
1225
|
switch (e.type.code) {
|
|
1226
|
+
case PayloadErrorCode.DATA_UNAVAILABLE:
|
|
1227
|
+
// Columns did not arrive in time, BlockInputSync keeps pulling them and retries the import
|
|
1228
|
+
logLevel = LogLevel.debug;
|
|
1229
|
+
break;
|
|
1346
1230
|
// BLOCK_NOT_IN_FORK_CHOICE should not happen, validateGossipExecutionPayloadEnvelope above
|
|
1347
1231
|
// already verified the block is in fork choice
|
|
1348
1232
|
case PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE:
|
|
@@ -1351,11 +1235,17 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
1351
1235
|
// Errors might indicate an issue with our node or the connected EL client
|
|
1352
1236
|
logLevel = LogLevel.error;
|
|
1353
1237
|
break;
|
|
1354
|
-
|
|
1238
|
+
case PayloadErrorCode.BLOCK_EXECUTION_INVALID:
|
|
1239
|
+
logLevel = LogLevel.warn;
|
|
1240
|
+
break;
|
|
1241
|
+
// INVALID_SIGNATURE only happens for an envelope added by another source
|
|
1355
1242
|
case PayloadErrorCode.INVALID_SIGNATURE:
|
|
1356
1243
|
case PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR:
|
|
1357
1244
|
case PayloadErrorCode.EXECUTION_ENGINE_INVALID:
|
|
1358
|
-
|
|
1245
|
+
// Penalize only when the stored envelope is the one this peer sent, not one added by another source
|
|
1246
|
+
if (validSignature) {
|
|
1247
|
+
core.reportPeer(peerIdStr, PeerAction.LowToleranceError, "BadGossipPayload");
|
|
1248
|
+
}
|
|
1359
1249
|
// The builder may have signed another envelope that is valid, keeping this one would make
|
|
1360
1250
|
// by-root and range sync reuse it and never import the payload
|
|
1361
1251
|
chain.seenPayloadEnvelopeInputCache.removeInvalid(payloadInput);
|
|
@@ -1630,6 +1520,32 @@ function getBatchHandlers(modules: ValidatorFnsModules, options: GossipHandlerOp
|
|
|
1630
1520
|
logger.debug("Error adding gossip unaggregated attestation to pool", {subnet}, e as Error);
|
|
1631
1521
|
}
|
|
1632
1522
|
|
|
1523
|
+
// Collected only for vote slots that an upcoming block of a connected validator can include
|
|
1524
|
+
if (isForkPostElectra(fork) && chain.proposerTracker.shouldCollect(indexedAttestation.data.slot)) {
|
|
1525
|
+
try {
|
|
1526
|
+
const insertOutcome = chain.singleAttestationPool.add(
|
|
1527
|
+
attestation as SingleAttestation<ForkPostElectra>,
|
|
1528
|
+
attDataRootHex,
|
|
1529
|
+
validatorCommitteeIndex,
|
|
1530
|
+
committeeSize
|
|
1531
|
+
);
|
|
1532
|
+
metrics?.opPool.singleAttestationPool.gossipInsertOutcome.inc({insertOutcome});
|
|
1533
|
+
} catch (e) {
|
|
1534
|
+
logger.debug(
|
|
1535
|
+
"Error adding gossip single attestation to pool",
|
|
1536
|
+
{
|
|
1537
|
+
slot: indexedAttestation.data.slot,
|
|
1538
|
+
committeeIndex,
|
|
1539
|
+
validatorCommitteeIndex,
|
|
1540
|
+
validatorIndex: (attestation as SingleAttestation<ForkPostElectra>).attesterIndex,
|
|
1541
|
+
subnet,
|
|
1542
|
+
attDataRoot: attDataRootHex,
|
|
1543
|
+
},
|
|
1544
|
+
e as Error
|
|
1545
|
+
);
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1633
1549
|
// Separate boundary: a pool insertion error above must not skip the fork-choice vote
|
|
1634
1550
|
if (!options.dontSendGossipAttestationsToForkchoice) {
|
|
1635
1551
|
try {
|