@lodestar/beacon-node 1.51.0-dev.fa491bf50f → 1.51.0-dev.fb216e169a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +36 -88
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +22 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/validator/index.d.ts +6 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +38 -25
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +13 -2
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +69 -35
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +5 -241
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/errors.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +2 -18
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/types.js +0 -1
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +36 -53
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +32 -18
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +3 -3
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -20
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +0 -24
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +18 -7
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/interface.d.ts +2 -0
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +1 -1
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +50 -22
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +1 -1
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/worker.js +1 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.js +1 -1
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.js +1 -1
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +25 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +120 -39
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +7 -7
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -5
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +1 -1
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +1 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
- package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/errors/index.d.ts +0 -1
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +0 -1
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +11 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +11 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
- package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
- package/lib/chain/forkChoiceExecutionEngine.js +117 -0
- package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
- package/lib/chain/interface.d.ts +9 -7
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +15 -4
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +17 -7
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
- package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/singleAttestationPool.js +209 -0
- package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +5 -3
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +3 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/proposerTracker.d.ts +31 -0
- package/lib/chain/proposerTracker.d.ts.map +1 -0
- package/lib/chain/proposerTracker.js +75 -0
- package/lib/chain/proposerTracker.js.map +1 -0
- package/lib/chain/regen/interface.d.ts +1 -1
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +1 -1
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +5 -3
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -13
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -2
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +0 -3
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/flatFileStore/flatFileStore.js +5 -5
- package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
- package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
- package/lib/db/flatFileStore/slotIndex.js +2 -2
- package/lib/db/flatFileStore/slotIndex.js.map +1 -1
- package/lib/db/repositories/blobSidecars.d.ts +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
- package/lib/db/repositories/blobSidecars.js +0 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/execution/builder/apiClient.d.ts +14 -8
- package/lib/execution/builder/apiClient.d.ts.map +1 -1
- package/lib/execution/builder/apiClient.js +12 -10
- package/lib/execution/builder/apiClient.js.map +1 -1
- package/lib/execution/builder/http.d.ts +2 -0
- package/lib/execution/builder/http.d.ts.map +1 -1
- package/lib/execution/builder/http.js +2 -0
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/engine/http.d.ts +4 -6
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +8 -10
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +18 -6
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +2 -12
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +0 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +0 -4
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +2 -4
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +1 -15
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +0 -9
- package/lib/execution/engine/sszTypes.d.ts.map +1 -1
- package/lib/execution/engine/sszTypes.js +0 -5
- package/lib/execution/engine/sszTypes.js.map +1 -1
- package/lib/execution/engine/transport.d.ts +1 -14
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +0 -8
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +2 -10
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.d.ts.map +1 -1
- package/lib/execution/engine/utils.js +3 -2
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +0 -9
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +0 -30
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +30 -8
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +79 -18
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/server/http.js +5 -5
- package/lib/metrics/server/http.js.map +1 -1
- package/lib/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +4 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +7 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +6 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +6 -1
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +1 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +10 -0
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +1 -8
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +0 -1
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +0 -16
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +0 -23
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +4 -5
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +8 -7
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +53 -35
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +2 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js +28 -1
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.js +8 -16
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/peers/utils/subnetMap.d.ts +5 -2
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
- package/lib/network/peers/utils/subnetMap.js +6 -3
- package/lib/network/peers/utils/subnetMap.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +1 -8
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +52 -131
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +0 -6
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +1 -5
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +6 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +29 -4
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +1 -12
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +0 -2
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +0 -10
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +1 -17
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +2 -8
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +1 -7
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts +35 -5
- package/lib/network/subnets/attnetsService.d.ts.map +1 -1
- package/lib/network/subnets/attnetsService.js +84 -6
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +7 -0
- package/lib/network/subnets/interface.d.ts.map +1 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/node/nodejs.d.ts +3 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +38 -20
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/options.d.ts +3 -1
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +4 -2
- package/lib/node/options.js.map +1 -1
- package/lib/sync/interface.d.ts.map +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/range/batch.d.ts +2 -3
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +9 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +2 -15
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/sync.d.ts +15 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +103 -25
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +1 -7
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +6 -34
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +24 -128
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +2 -18
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +14 -99
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.d.ts +1 -7
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js +0 -19
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/execution.d.ts +3 -4
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +1 -73
- package/lib/util/execution.js.map +1 -1
- package/lib/util/file.d.ts.map +1 -1
- package/lib/util/file.js +8 -9
- package/lib/util/file.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +5 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +36 -19
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +0 -5
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -2
- package/lib/util/types.js.map +1 -1
- package/package.json +16 -17
- package/src/api/impl/beacon/blocks/index.ts +59 -109
- package/src/api/impl/beacon/pool/index.ts +31 -1
- package/src/api/impl/beacon/state/utils.ts +1 -1
- package/src/api/impl/validator/index.ts +43 -29
- package/src/chain/GetBlobsTracker.ts +82 -52
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/blocks/blockInput/blockInput.ts +11 -343
- package/src/chain/blocks/blockInput/errors.ts +1 -2
- package/src/chain/blocks/blockInput/types.ts +2 -20
- package/src/chain/blocks/importBlock.ts +56 -72
- package/src/chain/blocks/importExecutionPayload.ts +55 -34
- package/src/chain/blocks/index.ts +10 -3
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
- package/src/chain/blocks/types.ts +5 -31
- package/src/chain/blocks/verifyBlock.ts +31 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +48 -24
- package/src/chain/bls/multithread/types.ts +1 -1
- package/src/chain/bls/multithread/worker.ts +1 -5
- package/src/chain/bls/singleThread.ts +1 -1
- package/src/chain/bls/utils.ts +1 -1
- package/src/chain/chain.ts +136 -38
- package/src/chain/emitter.ts +8 -8
- package/src/chain/errors/blockError.ts +1 -1
- package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
- package/src/chain/errors/index.ts +0 -1
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +183 -0
- package/src/chain/interface.ts +9 -6
- package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
- package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/options.ts +5 -4
- package/src/chain/produceBlock/produceBlockBody.ts +7 -3
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +1 -1
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
- package/src/chain/validation/executionPayloadBid.ts +14 -13
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validatorMonitor.ts +0 -6
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/repositories/blobSidecars.ts +0 -1
- package/src/execution/builder/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/engine/http.ts +19 -42
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +19 -10
- package/src/execution/engine/jsonRpcTransport.ts +10 -22
- package/src/execution/engine/mock.ts +0 -7
- package/src/execution/engine/restTransport.ts +3 -22
- package/src/execution/engine/sszTypes.ts +0 -9
- package/src/execution/engine/transport.ts +8 -17
- package/src/execution/engine/types.ts +3 -18
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +1 -1
- package/src/metrics/metrics/beacon.ts +0 -30
- package/src/metrics/metrics/lodestar.ts +80 -18
- package/src/metrics/server/http.ts +5 -5
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +11 -1
- package/src/network/core/networkCoreWorker.ts +2 -0
- package/src/network/core/networkCoreWorkerHandler.ts +8 -1
- package/src/network/core/types.ts +6 -1
- package/src/network/gossip/gossipsub.ts +11 -0
- package/src/network/gossip/interface.ts +0 -5
- package/src/network/gossip/topic.ts +0 -25
- package/src/network/interface.ts +2 -5
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +55 -58
- package/src/network/options.ts +4 -0
- package/src/network/peers/peerManager.ts +28 -3
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/peers/utils/prioritizePeers.ts +14 -22
- package/src/network/peers/utils/subnetMap.ts +6 -3
- package/src/network/processor/extractSlotRootFns.ts +0 -9
- package/src/network/processor/gossipHandlers.ts +65 -164
- package/src/network/processor/gossipQueues/index.ts +0 -6
- package/src/network/processor/gossipValidatorFn.ts +0 -5
- package/src/network/processor/index.ts +25 -4
- package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
- package/src/network/reqresp/handlers/index.ts +0 -17
- package/src/network/reqresp/protocols.ts +0 -12
- package/src/network/reqresp/rateLimit.ts +1 -17
- package/src/network/reqresp/types.ts +0 -13
- package/src/network/subnets/attnetsService.ts +94 -6
- package/src/network/subnets/interface.ts +7 -0
- package/src/node/nodejs.ts +40 -21
- package/src/node/options.ts +9 -6
- package/src/sync/interface.ts +1 -0
- package/src/sync/range/batch.ts +9 -21
- package/src/sync/range/chain.ts +2 -14
- package/src/sync/sync.ts +108 -26
- package/src/sync/unknownBlock.ts +1 -8
- package/src/sync/utils/downloadByRange.ts +31 -230
- package/src/sync/utils/downloadByRoot.ts +15 -142
- package/src/util/blobs.ts +0 -34
- package/src/util/execution.ts +8 -102
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +42 -24
- package/src/util/types.ts +1 -8
- package/lib/chain/errors/blobSidecarError.d.ts +0 -108
- package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/blobSidecarError.js +0 -38
- package/lib/chain/errors/blobSidecarError.js.map +0 -1
- package/lib/chain/validation/blobSidecar.d.ts +0 -16
- package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
- package/lib/chain/validation/blobSidecar.js +0 -276
- package/lib/chain/validation/blobSidecar.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
- package/src/chain/errors/blobSidecarError.ts +0 -70
- package/src/chain/validation/blobSidecar.ts +0 -357
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
|
@@ -3,7 +3,7 @@ import {SignedBeaconBlock} from "@lodestar/types";
|
|
|
3
3
|
import {toRootHex} from "@lodestar/utils";
|
|
4
4
|
import {getBlobKzgCommitments} from "../../util/dataColumns.js";
|
|
5
5
|
import {BeaconChain} from "../chain.js";
|
|
6
|
-
import {IBlockInput, IDataColumnsInput,
|
|
6
|
+
import {IBlockInput, IDataColumnsInput, isBlockInputColumns} from "./blockInput/index.js";
|
|
7
7
|
import {BLOB_AVAILABILITY_TIMEOUT} from "./verifyBlocksDataAvailability.js";
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -12,11 +12,9 @@ import {BLOB_AVAILABILITY_TIMEOUT} from "./verifyBlocksDataAvailability.js";
|
|
|
12
12
|
*
|
|
13
13
|
* This operation may be performed before, during or after importing to the fork-choice. As long as errors
|
|
14
14
|
* are handled properly for eventual consistency.
|
|
15
|
-
*
|
|
16
|
-
* Block+blobs (pre-fulu) and data columns (fulu+) are written in parallel.
|
|
17
15
|
*/
|
|
18
16
|
export async function writeBlockInputToDb(this: BeaconChain, blockInput: IBlockInput): Promise<void> {
|
|
19
|
-
const promises: Promise<void>[] = [
|
|
17
|
+
const promises: Promise<void>[] = [writeBlockToDb.call(this, blockInput)];
|
|
20
18
|
|
|
21
19
|
if (isBlockInputColumns(blockInput)) {
|
|
22
20
|
promises.push(writeDataColumnsToDb.call(this, blockInput));
|
|
@@ -26,7 +24,7 @@ export async function writeBlockInputToDb(this: BeaconChain, blockInput: IBlockI
|
|
|
26
24
|
this.logger.debug("Persisted blockInput to db", {slot: blockInput.slot, root: blockInput.blockRootHex});
|
|
27
25
|
}
|
|
28
26
|
|
|
29
|
-
async function
|
|
27
|
+
async function writeBlockToDb(this: BeaconChain, blockInput: IBlockInput): Promise<void> {
|
|
30
28
|
const block = blockInput.getBlock();
|
|
31
29
|
const slot = block.message.slot;
|
|
32
30
|
const blockRoot = this.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block.message);
|
|
@@ -34,38 +32,17 @@ async function writeBlockAndBlobsToDb(this: BeaconChain, blockInput: IBlockInput
|
|
|
34
32
|
const numBlobs = isForkPostDeneb(blockInput.forkName)
|
|
35
33
|
? getBlobKzgCommitments(blockInput.forkName, block as SignedBeaconBlock<ForkPostDeneb>).length
|
|
36
34
|
: undefined;
|
|
37
|
-
|
|
35
|
+
this.logger.debug("Persist block to hot DB", {slot, root: blockRootHex, inputType: blockInput.type, numBlobs});
|
|
38
36
|
|
|
39
37
|
const blockBytes = this.serializedCache.get(block);
|
|
40
38
|
if (blockBytes) {
|
|
41
39
|
// skip serializing data if we already have it
|
|
42
40
|
this.metrics?.importBlock.persistBlockWithSerializedDataCount.inc();
|
|
43
|
-
|
|
41
|
+
await this.db.block.putBinary(this.db.block.getId(block), blockBytes);
|
|
44
42
|
} else {
|
|
45
43
|
this.metrics?.importBlock.persistBlockNoSerializedDataCount.inc();
|
|
46
|
-
|
|
44
|
+
await this.db.block.add(block);
|
|
47
45
|
}
|
|
48
|
-
|
|
49
|
-
this.logger.debug("Persist block to hot DB", {slot, root: blockRootHex, inputType: blockInput.type, numBlobs});
|
|
50
|
-
|
|
51
|
-
if (isBlockInputBlobs(blockInput)) {
|
|
52
|
-
fnPromises.push(
|
|
53
|
-
(async () => {
|
|
54
|
-
if (!blockInput.hasAllData()) {
|
|
55
|
-
await blockInput.waitForAllData(BLOB_AVAILABILITY_TIMEOUT);
|
|
56
|
-
}
|
|
57
|
-
const blobSidecars = blockInput.getBlobs();
|
|
58
|
-
await this.db.blobSidecars.add({blockRoot, slot, blobSidecars});
|
|
59
|
-
this.logger.debug("Persisted blobSidecars to hot DB", {
|
|
60
|
-
slot,
|
|
61
|
-
root: blockRootHex,
|
|
62
|
-
numBlobs: blobSidecars.length,
|
|
63
|
-
});
|
|
64
|
-
})()
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
await Promise.all(fnPromises);
|
|
69
46
|
}
|
|
70
47
|
|
|
71
48
|
/**
|
|
@@ -22,6 +22,8 @@ export type VerifySignatureOpts = {
|
|
|
22
22
|
verifyOnMainThread?: boolean;
|
|
23
23
|
/**
|
|
24
24
|
* Some signature sets are more important than others, and should be verified first.
|
|
25
|
+
* Non-batchable priority jobs are posted to an idle worker before this call returns, so the caller
|
|
26
|
+
* can run synchronous work right after without delaying the verification.
|
|
25
27
|
*/
|
|
26
28
|
priority?: boolean;
|
|
27
29
|
};
|
|
@@ -7,7 +7,7 @@ import {Worker, spawn} from "@chainsafe/threads";
|
|
|
7
7
|
self = undefined;
|
|
8
8
|
|
|
9
9
|
import {ISignatureSet} from "@lodestar/state-transition";
|
|
10
|
-
import {Logger} from "@lodestar/utils";
|
|
10
|
+
import {Logger, defer} from "@lodestar/utils";
|
|
11
11
|
import {Metrics} from "../../../metrics/index.js";
|
|
12
12
|
import {LinkedList} from "../../../util/array.js";
|
|
13
13
|
import {callInNextEventLoop} from "../../../util/eventLoop.js";
|
|
@@ -94,7 +94,7 @@ type WorkerStatus =
|
|
|
94
94
|
| {code: WorkerStatusCode.initializing; initPromise: Promise<WorkerApi>}
|
|
95
95
|
| {code: WorkerStatusCode.initializationError; error: Error}
|
|
96
96
|
| {code: WorkerStatusCode.idle; workerApi: WorkerApi}
|
|
97
|
-
| {code: WorkerStatusCode.running; workerApi: WorkerApi};
|
|
97
|
+
| {code: WorkerStatusCode.running; workerApi: WorkerApi; abort: () => void};
|
|
98
98
|
|
|
99
99
|
type WorkerDescriptor = {
|
|
100
100
|
worker: Worker;
|
|
@@ -126,7 +126,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
126
126
|
timeout: NodeJS.Timeout;
|
|
127
127
|
} | null = null;
|
|
128
128
|
private blsVerifyAllMultiThread: boolean;
|
|
129
|
-
private
|
|
129
|
+
private closePromise: Promise<void> | undefined;
|
|
130
130
|
private workersBusy = 0;
|
|
131
131
|
|
|
132
132
|
constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules) {
|
|
@@ -149,6 +149,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
149
149
|
|
|
150
150
|
canAcceptWork(): boolean {
|
|
151
151
|
return (
|
|
152
|
+
this.closePromise === undefined &&
|
|
152
153
|
this.workersBusy < blsPoolSize &&
|
|
153
154
|
// TODO: Should also bound the jobs queue?
|
|
154
155
|
this.jobs.length < MAX_JOBS_CAN_ACCEPT_WORK
|
|
@@ -156,6 +157,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
async verifySignatureSets(sets: ISignatureSet[], opts: VerifySignatureOpts = {}): Promise<boolean> {
|
|
160
|
+
if (this.closePromise !== undefined) throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
|
|
159
161
|
this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
|
|
160
162
|
this.metrics?.blsThreadPool.totalSigSets.inc(sets.length);
|
|
161
163
|
if (opts.priority) {
|
|
@@ -208,6 +210,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
208
210
|
message: Uint8Array,
|
|
209
211
|
opts: Omit<VerifySignatureOpts, "verifyOnMainThread"> = {}
|
|
210
212
|
): Promise<boolean[]> {
|
|
213
|
+
if (this.closePromise !== undefined) throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
|
|
211
214
|
const promises: Promise<boolean[]>[] = [];
|
|
212
215
|
for (const setsChunk of chunkSameMessageSignatureSets(sets)) {
|
|
213
216
|
promises.push(
|
|
@@ -229,9 +232,14 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
229
232
|
return results.flat();
|
|
230
233
|
}
|
|
231
234
|
|
|
232
|
-
|
|
235
|
+
close(): Promise<void> {
|
|
236
|
+
if (this.closePromise !== undefined) return this.closePromise;
|
|
233
237
|
if (this.bufferedJobs) {
|
|
234
238
|
clearTimeout(this.bufferedJobs.timeout);
|
|
239
|
+
for (const jobs of [this.bufferedJobs.jobs, this.bufferedJobs.prioritizedJobs]) {
|
|
240
|
+
for (const job of jobs) job.reject(new QueueError({code: QueueErrorCode.QUEUE_ABORTED}));
|
|
241
|
+
}
|
|
242
|
+
this.bufferedJobs = null;
|
|
235
243
|
}
|
|
236
244
|
|
|
237
245
|
// Abort all jobs
|
|
@@ -241,15 +249,21 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
241
249
|
this.jobs.clear();
|
|
242
250
|
|
|
243
251
|
// Terminate all workers. await to ensure no workers are left hanging
|
|
244
|
-
|
|
252
|
+
this.closePromise = Promise.all(
|
|
245
253
|
Array.from(this.workers.entries()).map(([id, worker]) =>
|
|
246
254
|
// NOTE: 'threads' has not yet updated types, and NodeJS complains with
|
|
247
255
|
// [DEP0132] DeprecationWarning: Passing a callback to worker.terminate() is deprecated. It returns a Promise instead.
|
|
248
|
-
(worker.worker.terminate() as unknown as Promise<void>)
|
|
249
|
-
|
|
250
|
-
|
|
256
|
+
(worker.worker.terminate() as unknown as Promise<void>)
|
|
257
|
+
.catch((e: Error) => {
|
|
258
|
+
this.logger.error("Error terminating worker", {id}, e);
|
|
259
|
+
})
|
|
260
|
+
.finally(() => {
|
|
261
|
+
// threads does not settle outstanding RPC calls when its worker exits.
|
|
262
|
+
if (worker.status.code === WorkerStatusCode.running) worker.status.abort();
|
|
263
|
+
})
|
|
251
264
|
)
|
|
252
|
-
);
|
|
265
|
+
).then(() => {});
|
|
266
|
+
return this.closePromise;
|
|
253
267
|
}
|
|
254
268
|
|
|
255
269
|
private createWorkers(poolSize: number): WorkerDescriptor[] {
|
|
@@ -295,7 +309,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
295
309
|
* Register BLS work to be done eventually in a worker
|
|
296
310
|
*/
|
|
297
311
|
private queueBlsWork(job: JobQueueItem): void {
|
|
298
|
-
if (this.
|
|
312
|
+
if (this.closePromise !== undefined) {
|
|
299
313
|
throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
|
|
300
314
|
}
|
|
301
315
|
|
|
@@ -333,16 +347,20 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
333
347
|
}
|
|
334
348
|
}
|
|
335
349
|
|
|
350
|
+
// First hand work to an idle worker before returning to the caller.
|
|
351
|
+
// Deferring the post to the next macrotask would make the worker
|
|
352
|
+
// sit idle while waiting for the next synchronous work
|
|
353
|
+
else if (job.opts.priority) {
|
|
354
|
+
this.jobs.unshift(job);
|
|
355
|
+
void this.runJob();
|
|
356
|
+
}
|
|
357
|
+
|
|
336
358
|
// Push job and schedule to call `runJob` in the next macro event loop cycle.
|
|
337
359
|
// This is useful to allow batching job submitted from a synchronous for loop,
|
|
338
360
|
// and to prevent large stacks since runJob may be called recursively.
|
|
339
361
|
else {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
} else {
|
|
343
|
-
this.jobs.push(job);
|
|
344
|
-
}
|
|
345
|
-
callInNextEventLoop(this.runJob);
|
|
362
|
+
this.jobs.push(job);
|
|
363
|
+
callInNextEventLoop(() => void this.runJob());
|
|
346
364
|
}
|
|
347
365
|
}
|
|
348
366
|
|
|
@@ -350,7 +368,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
350
368
|
* Potentially submit jobs to an idle worker, only if there's a worker and jobs
|
|
351
369
|
*/
|
|
352
370
|
private runJob = async (): Promise<void> => {
|
|
353
|
-
if (this.
|
|
371
|
+
if (this.closePromise !== undefined) {
|
|
354
372
|
return;
|
|
355
373
|
}
|
|
356
374
|
|
|
@@ -371,13 +389,18 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
371
389
|
// Maybe it's not useful since all data referenced in jobs is likely referenced by others
|
|
372
390
|
|
|
373
391
|
const workerApi = worker.status.workerApi;
|
|
374
|
-
|
|
392
|
+
const completion = defer<BlsWorkResult>();
|
|
393
|
+
worker.status = {
|
|
394
|
+
code: WorkerStatusCode.running,
|
|
395
|
+
workerApi,
|
|
396
|
+
abort: () => completion.reject(new QueueError({code: QueueErrorCode.QUEUE_ABORTED})),
|
|
397
|
+
};
|
|
375
398
|
this.workersBusy++;
|
|
376
399
|
const jobsStarted: JobQueueItem[] = [];
|
|
377
400
|
let completedJobsCount = 0;
|
|
378
401
|
|
|
379
402
|
if (this.jobs.length > 0) {
|
|
380
|
-
callInNextEventLoop(this.runJob);
|
|
403
|
+
callInNextEventLoop(() => void this.runJob());
|
|
381
404
|
}
|
|
382
405
|
|
|
383
406
|
try {
|
|
@@ -423,7 +446,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
423
446
|
if (workReqs.length === 0) {
|
|
424
447
|
worker.status = {code: WorkerStatusCode.idle, workerApi};
|
|
425
448
|
this.workersBusy--;
|
|
426
|
-
callInNextEventLoop(this.runJob);
|
|
449
|
+
callInNextEventLoop(() => void this.runJob());
|
|
427
450
|
return;
|
|
428
451
|
}
|
|
429
452
|
|
|
@@ -437,7 +460,8 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
437
460
|
// If worker communication or result processing throws, all unresolved jobs are rejected.
|
|
438
461
|
|
|
439
462
|
const [jobStartSec, jobStartNs] = process.hrtime();
|
|
440
|
-
|
|
463
|
+
void workerApi.verifyManySignatureSets(workReqs).then(completion.resolve, completion.reject);
|
|
464
|
+
const workResult = await completion.promise;
|
|
441
465
|
const [jobEndSec, jobEndNs] = process.hrtime();
|
|
442
466
|
const {workerId, batchRetries, batchSigsSuccess, verificationCalls, workerStartTime, workerEndTime, results} =
|
|
443
467
|
workResult;
|
|
@@ -481,7 +505,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
481
505
|
}
|
|
482
506
|
} catch (e) {
|
|
483
507
|
// Worker communications should never reject
|
|
484
|
-
if (
|
|
508
|
+
if (this.closePromise === undefined) {
|
|
485
509
|
this.logger.error("BlsMultiThreadWorkerPool error", {}, e as Error);
|
|
486
510
|
}
|
|
487
511
|
// Reject jobs that were not already completed
|
|
@@ -499,7 +523,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
499
523
|
this.workersBusy--;
|
|
500
524
|
|
|
501
525
|
// Potentially run a new job
|
|
502
|
-
callInNextEventLoop(this.runJob);
|
|
526
|
+
callInNextEventLoop(() => void this.runJob());
|
|
503
527
|
};
|
|
504
528
|
|
|
505
529
|
/**
|
|
@@ -542,7 +566,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
542
566
|
this.jobs.unshift(job);
|
|
543
567
|
}
|
|
544
568
|
this.bufferedJobs = null;
|
|
545
|
-
callInNextEventLoop(this.runJob);
|
|
569
|
+
callInNextEventLoop(() => void this.runJob());
|
|
546
570
|
}
|
|
547
571
|
};
|
|
548
572
|
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import worker from "node:worker_threads";
|
|
2
|
-
import {
|
|
3
|
-
type BlsSignatureSet,
|
|
4
|
-
verifySignatureSets,
|
|
5
|
-
verifySignatureSetsSameMessage,
|
|
6
|
-
} from "@chainsafe/lodestar-z/bls-verifier";
|
|
7
2
|
import {expose} from "@chainsafe/threads/worker";
|
|
3
|
+
import {type BlsSignatureSet, verifySignatureSets, verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
8
4
|
import {
|
|
9
5
|
BlsWorkReq,
|
|
10
6
|
BlsWorkResult,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {verifySignatureSetsSameMessage} from "@
|
|
1
|
+
import {verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
2
2
|
import {ISignatureSet} from "@lodestar/state-transition";
|
|
3
3
|
import {Metrics} from "../../metrics/index.js";
|
|
4
4
|
import {IBlsVerifier, SameMessageSignatureSet} from "./interface.js";
|
package/src/chain/bls/utils.ts
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
BLS_VERIFIER_MAX_BATCH_SIZE,
|
|
3
3
|
BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE,
|
|
4
4
|
verifySignatureSets,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@lodestar/native/bls-verifier";
|
|
6
6
|
import {ISignatureSet, SignatureSetType, toBlsSignatureSet} from "@lodestar/state-transition";
|
|
7
7
|
import {SameMessageSignatureSet} from "./interface.js";
|
|
8
8
|
|
package/src/chain/chain.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import {PrivateKey} from "@libp2p/interface";
|
|
3
|
-
import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
4
3
|
import {Type} from "@chainsafe/ssz";
|
|
5
4
|
import {routes} from "@lodestar/api";
|
|
6
5
|
import {BeaconConfig} from "@lodestar/config";
|
|
7
6
|
import {
|
|
7
|
+
AncestorStatus,
|
|
8
8
|
CheckpointWithHex,
|
|
9
9
|
EpochDifference,
|
|
10
10
|
ForkChoiceStateGetter,
|
|
@@ -14,12 +14,14 @@ import {
|
|
|
14
14
|
UpdateHeadOpt,
|
|
15
15
|
} from "@lodestar/fork-choice";
|
|
16
16
|
import {LoggerNode} from "@lodestar/logger/node";
|
|
17
|
+
import {type PubkeyCache} from "@lodestar/native/pubkeys";
|
|
17
18
|
import {
|
|
18
19
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
19
20
|
type ForkPostFulu,
|
|
20
21
|
type ForkPostGloas,
|
|
21
22
|
GENESIS_SLOT,
|
|
22
23
|
SLOTS_PER_EPOCH,
|
|
24
|
+
isForkPostFulu,
|
|
23
25
|
isForkPostGloas,
|
|
24
26
|
} from "@lodestar/params";
|
|
25
27
|
import {
|
|
@@ -33,6 +35,7 @@ import {
|
|
|
33
35
|
isStatePostAltair,
|
|
34
36
|
isStatePostElectra,
|
|
35
37
|
isStatePostGloas,
|
|
38
|
+
proposerShufflingDecisionRoot,
|
|
36
39
|
} from "@lodestar/state-transition";
|
|
37
40
|
import {
|
|
38
41
|
BeaconBlock,
|
|
@@ -60,7 +63,6 @@ import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRoot
|
|
|
60
63
|
import {ProcessShutdownCallback} from "@lodestar/validator";
|
|
61
64
|
import {GENESIS_EPOCH, HALF_SLOT_BPS, ZERO_HASH} from "../constants/index.js";
|
|
62
65
|
import {IBeaconDb} from "../db/index.js";
|
|
63
|
-
import {BLOB_SIDECARS_IN_WRAPPER_INDEX} from "../db/repositories/blobSidecars.js";
|
|
64
66
|
import {decodeArchivedEnvelope} from "../db/repositories/index.js";
|
|
65
67
|
import {BuilderApiClient, BuilderApiClientOpts} from "../execution/builder/apiClient.js";
|
|
66
68
|
import {BuilderStatus} from "../execution/builder/http.js";
|
|
@@ -80,7 +82,7 @@ import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.js";
|
|
|
80
82
|
import {ArchiveStore} from "./archiveStore/archiveStore.js";
|
|
81
83
|
import {CheckpointBalancesCache} from "./balancesCache.js";
|
|
82
84
|
import {BeaconProposerCache} from "./beaconProposerCache.js";
|
|
83
|
-
import {IBlockInput,
|
|
85
|
+
import {IBlockInput, isBlockInputColumns} from "./blocks/blockInput/index.js";
|
|
84
86
|
import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
|
|
85
87
|
import {PayloadEnvelopeInputSource} from "./blocks/payloadEnvelopeInput/index.js";
|
|
86
88
|
import {PayloadEnvelopeProcessor} from "./blocks/payloadEnvelopeProcessor.js";
|
|
@@ -90,8 +92,9 @@ import {persistPayloadEnvelopeInput} from "./blocks/writePayloadEnvelopeInputToD
|
|
|
90
92
|
import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
|
|
91
93
|
import {BuilderCircuitBreaker} from "./builderCircuitBreaker.js";
|
|
92
94
|
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
93
|
-
import {ChainEvent, ChainEventEmitter} from "./emitter.js";
|
|
95
|
+
import {ChainEvent, ChainEventEmitter, ReorgEventData} from "./emitter.js";
|
|
94
96
|
import {ForkchoiceCaller, initializeForkChoice} from "./forkChoice/index.js";
|
|
97
|
+
import {ForkChoiceExecutionEngine} from "./forkChoiceExecutionEngine.js";
|
|
95
98
|
import {GetBlobsTracker} from "./GetBlobsTracker.js";
|
|
96
99
|
import {CommonBlockBody, FindHeadFnName, IBeaconChain, ProposerPreparationData, StateGetOpts} from "./interface.js";
|
|
97
100
|
import {LightClientServer} from "./lightClient/index.js";
|
|
@@ -104,6 +107,7 @@ import {
|
|
|
104
107
|
OpPool,
|
|
105
108
|
PayloadAttestationPool,
|
|
106
109
|
ProposerPreferencesPool,
|
|
110
|
+
SingleAttestationPool,
|
|
107
111
|
SyncCommitteeMessagePool,
|
|
108
112
|
SyncContributionAndProofPool,
|
|
109
113
|
} from "./opPools/index.js";
|
|
@@ -112,6 +116,7 @@ import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
|
|
|
112
116
|
import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
|
|
113
117
|
import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
|
|
114
118
|
import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
|
|
119
|
+
import {ProposerTracker} from "./proposerTracker.js";
|
|
115
120
|
import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
|
|
116
121
|
import {ReprocessController} from "./reprocess.js";
|
|
117
122
|
import {
|
|
@@ -166,7 +171,7 @@ const DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES = 16;
|
|
|
166
171
|
export class BeaconChain implements IBeaconChain {
|
|
167
172
|
readonly genesisTime: UintNum64;
|
|
168
173
|
readonly genesisValidatorsRoot: Root;
|
|
169
|
-
readonly executionEngine:
|
|
174
|
+
readonly executionEngine: ForkChoiceExecutionEngine;
|
|
170
175
|
readonly executionBuilder?: IExecutionBuilder;
|
|
171
176
|
readonly builderCircuitBreaker: BuilderCircuitBreaker;
|
|
172
177
|
readonly builderApiClient: BuilderApiClient;
|
|
@@ -194,6 +199,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
194
199
|
// Ops pool
|
|
195
200
|
readonly attestationPool: AttestationPool;
|
|
196
201
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
202
|
+
readonly singleAttestationPool: SingleAttestationPool;
|
|
203
|
+
readonly proposerTracker: ProposerTracker;
|
|
204
|
+
/**
|
|
205
|
+
* Head state epoch and decision root of its next epoch proposers when local proposals were last refreshed. The root
|
|
206
|
+
* alone is not enough: a reorg onto a branch without blocks in a whole epoch keeps the root but moves the epoch
|
|
207
|
+
*/
|
|
208
|
+
private localProposalsKey: string | null = null;
|
|
197
209
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
198
210
|
readonly syncContributionAndProofPool;
|
|
199
211
|
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
@@ -317,7 +329,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
317
329
|
this.genesisTime = anchorState.genesisTime;
|
|
318
330
|
this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
|
|
319
331
|
this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
|
|
320
|
-
this.executionEngine = executionEngine;
|
|
321
332
|
this.executionBuilder = executionBuilder;
|
|
322
333
|
const signal = this.abortController.signal;
|
|
323
334
|
const emitter = new ChainEventEmitter();
|
|
@@ -331,6 +342,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
331
342
|
this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
|
|
332
343
|
this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
|
|
333
344
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics, logger);
|
|
345
|
+
this.singleAttestationPool = new SingleAttestationPool(metrics);
|
|
346
|
+
this.proposerTracker = new ProposerTracker(this.opts.singleAttestationIgnoreProposalDuty ?? false, metrics);
|
|
334
347
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
335
348
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
336
349
|
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
@@ -457,6 +470,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
457
470
|
this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
|
|
458
471
|
|
|
459
472
|
this.forkChoice = forkChoice;
|
|
473
|
+
this.executionEngine = new ForkChoiceExecutionEngine(executionEngine, {
|
|
474
|
+
forkChoice,
|
|
475
|
+
recomputeHeadAfterELInvalidResponse: () => this.recomputeHeadAfterELInvalidResponse(),
|
|
476
|
+
logger,
|
|
477
|
+
metrics,
|
|
478
|
+
});
|
|
460
479
|
|
|
461
480
|
this.builderCircuitBreaker = new BuilderCircuitBreaker(
|
|
462
481
|
{faultInspectionWindow: opts.faultInspectionWindow, allowedFaults: opts.allowedFaults},
|
|
@@ -933,16 +952,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
933
952
|
}
|
|
934
953
|
|
|
935
954
|
async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
|
|
936
|
-
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
937
|
-
if (blockInput) {
|
|
938
|
-
if (!isBlockInputBlobs(blockInput)) {
|
|
939
|
-
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
940
|
-
}
|
|
941
|
-
if (!blockInput.hasAllData()) {
|
|
942
|
-
return null;
|
|
943
|
-
}
|
|
944
|
-
return blockInput.getBlobs();
|
|
945
|
-
}
|
|
946
955
|
const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
|
|
947
956
|
if (unfinalizedBlobSidecars) {
|
|
948
957
|
return unfinalizedBlobSidecars;
|
|
@@ -950,28 +959,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
950
959
|
return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
|
|
951
960
|
}
|
|
952
961
|
|
|
953
|
-
async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
954
|
-
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
955
|
-
if (blockInput) {
|
|
956
|
-
if (!isBlockInputBlobs(blockInput)) {
|
|
957
|
-
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
958
|
-
}
|
|
959
|
-
if (!blockInput.hasAllData()) {
|
|
960
|
-
return null;
|
|
961
|
-
}
|
|
962
|
-
return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
|
|
963
|
-
}
|
|
964
|
-
const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
|
|
965
|
-
if (unfinalizedBlobSidecarsWrapper) {
|
|
966
|
-
return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
967
|
-
}
|
|
968
|
-
const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
|
|
969
|
-
if (finalizedBlobSidecarsWrapper) {
|
|
970
|
-
return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
971
|
-
}
|
|
972
|
-
return null;
|
|
973
|
-
}
|
|
974
|
-
|
|
975
962
|
async getSerializedExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
976
963
|
const [bytes] = await this.getSerializedExecutionPayloadEnvelopes([{blockSlot, blockRootHex}]);
|
|
977
964
|
return bytes;
|
|
@@ -1430,6 +1417,58 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1430
1417
|
}
|
|
1431
1418
|
}
|
|
1432
1419
|
|
|
1420
|
+
/**
|
|
1421
|
+
* Apply chain side effects of a fork choice head change: head state, head metrics, and reorg detection
|
|
1422
|
+
*/
|
|
1423
|
+
onHeadChanged(oldHead: ProtoBlock, newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void {
|
|
1424
|
+
// Set head state as strong reference
|
|
1425
|
+
this.regen.updateHeadState(newHead, maybeHeadState);
|
|
1426
|
+
|
|
1427
|
+
const delaySec = this.clock.secFromSlot(newHead.slot);
|
|
1428
|
+
this.logger.verbose("New chain head", {
|
|
1429
|
+
slot: newHead.slot,
|
|
1430
|
+
root: newHead.blockRoot,
|
|
1431
|
+
payloadStatus: newHead.payloadStatus,
|
|
1432
|
+
delaySec,
|
|
1433
|
+
});
|
|
1434
|
+
this.metrics?.headSlot.set(newHead.slot);
|
|
1435
|
+
|
|
1436
|
+
this.onNewHead(newHead);
|
|
1437
|
+
this.metrics?.forkChoice.changedHead.inc();
|
|
1438
|
+
|
|
1439
|
+
const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
|
|
1440
|
+
if (ancestorResult.code === AncestorStatus.CommonAncestor) {
|
|
1441
|
+
// CommonAncestor = chain reorg, old head and new head not direct descendants
|
|
1442
|
+
|
|
1443
|
+
const forkChoiceReorgEventData: ReorgEventData = {
|
|
1444
|
+
depth: ancestorResult.depth,
|
|
1445
|
+
epoch: computeEpochAtSlot(newHead.slot),
|
|
1446
|
+
slot: newHead.slot,
|
|
1447
|
+
newHeadBlock: newHead.blockRoot,
|
|
1448
|
+
oldHeadBlock: oldHead.blockRoot,
|
|
1449
|
+
newHeadState: newHead.stateRoot,
|
|
1450
|
+
oldHeadState: oldHead.stateRoot,
|
|
1451
|
+
executionOptimistic: isOptimisticBlock(newHead),
|
|
1452
|
+
};
|
|
1453
|
+
|
|
1454
|
+
this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
|
|
1455
|
+
this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
|
|
1456
|
+
|
|
1457
|
+
this.metrics?.forkChoice.reorg.inc();
|
|
1458
|
+
this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
private recomputeHeadAfterELInvalidResponse(): void {
|
|
1463
|
+
// validateLatestHash only re-scores proto-array, the cached head is still the old one
|
|
1464
|
+
const oldHead = this.forkChoice.getHead();
|
|
1465
|
+
const newHead = this.recomputeForkChoiceHead(ForkchoiceCaller.executionInvalid);
|
|
1466
|
+
if (newHead.blockRoot === oldHead.blockRoot && newHead.payloadStatus === oldHead.payloadStatus) {
|
|
1467
|
+
return;
|
|
1468
|
+
}
|
|
1469
|
+
this.onHeadChanged(oldHead, newHead);
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1433
1472
|
/**
|
|
1434
1473
|
* Emit `head` and `head_v2` when the fork choice head differs between two observations. Every caller that
|
|
1435
1474
|
* can move the head, `updateAndGetHead()` and `updateTime()`, must capture the head before and pass both.
|
|
@@ -1829,6 +1868,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1829
1868
|
|
|
1830
1869
|
this.attestationPool.prune(slot);
|
|
1831
1870
|
this.aggregatedAttestationPool.prune(slot);
|
|
1871
|
+
this.proposerTracker.prune(slot);
|
|
1872
|
+
this.singleAttestationPool.prune(this.proposerTracker);
|
|
1832
1873
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1833
1874
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1834
1875
|
this.payloadAttestationPool.prune(slot);
|
|
@@ -1855,6 +1896,55 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1855
1896
|
}
|
|
1856
1897
|
}
|
|
1857
1898
|
|
|
1899
|
+
/**
|
|
1900
|
+
* Track upcoming proposals of validators connected to this node, so that SingleAttestationPool only collects and
|
|
1901
|
+
* the network only subscribes to all attestation subnets before them. Proposals only change when the decision block
|
|
1902
|
+
* of next epoch proposers changes (the head enters a new epoch or reorgs that block) or a new validator connects,
|
|
1903
|
+
* set localProposalsKey to null before calling for the latter.
|
|
1904
|
+
* Never throws, it runs during block import.
|
|
1905
|
+
*/
|
|
1906
|
+
private refreshLocalProposals(): void {
|
|
1907
|
+
const clockSlot = this.clock.currentSlot;
|
|
1908
|
+
try {
|
|
1909
|
+
const headState = this.getHeadState();
|
|
1910
|
+
const headFork = this.config.getForkName(headState.slot);
|
|
1911
|
+
// post-fulu, the head state knows proposers of its epoch and the next one thanks to the proposer lookahead,
|
|
1912
|
+
// a pre-fulu state only predicts next epoch proposers
|
|
1913
|
+
if (!isForkPostFulu(headFork) || headState.epoch < computeEpochAtSlot(clockSlot) - 1) {
|
|
1914
|
+
return;
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
const decisionRoot = proposerShufflingDecisionRoot(headFork, headState, headState.epoch + 1);
|
|
1918
|
+
if (decisionRoot === null) {
|
|
1919
|
+
return;
|
|
1920
|
+
}
|
|
1921
|
+
const localProposalsKey = `${headState.epoch}_${toRootHex(decisionRoot)}`;
|
|
1922
|
+
if (localProposalsKey === this.localProposalsKey) {
|
|
1923
|
+
return;
|
|
1924
|
+
}
|
|
1925
|
+
this.localProposalsKey = localProposalsKey;
|
|
1926
|
+
|
|
1927
|
+
const startSlot = computeStartSlotAtEpoch(headState.epoch);
|
|
1928
|
+
const newProposalSlots: Slot[] = [];
|
|
1929
|
+
for (const [i, proposerIndex] of [...headState.currentProposers, ...headState.nextProposers].entries()) {
|
|
1930
|
+
const proposalSlot = startSlot + i;
|
|
1931
|
+
if (
|
|
1932
|
+
proposalSlot >= clockSlot &&
|
|
1933
|
+
this.beaconProposerCache.has(proposerIndex) &&
|
|
1934
|
+
this.proposerTracker.addProposal(proposalSlot)
|
|
1935
|
+
) {
|
|
1936
|
+
newProposalSlots.push(proposalSlot);
|
|
1937
|
+
}
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
if (newProposalSlots.length > 0) {
|
|
1941
|
+
this.emitter.emit(ChainEvent.localProposalSlots, newProposalSlots);
|
|
1942
|
+
}
|
|
1943
|
+
} catch (e) {
|
|
1944
|
+
this.logger.debug("Error refreshing local proposals", {slot: clockSlot}, e as Error);
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1858
1948
|
private onClockEpoch(epoch: Epoch): void {
|
|
1859
1949
|
this.metrics?.clockEpoch.set(epoch);
|
|
1860
1950
|
|
|
@@ -1869,6 +1959,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1869
1959
|
protected onNewHead(head: ProtoBlock): void {
|
|
1870
1960
|
this.syncContributionAndProofPool.prune(head.slot);
|
|
1871
1961
|
this.seenContributionAndProof.prune(head.slot);
|
|
1962
|
+
|
|
1963
|
+
this.refreshLocalProposals();
|
|
1872
1964
|
}
|
|
1873
1965
|
|
|
1874
1966
|
private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
|
|
@@ -1937,6 +2029,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1937
2029
|
|
|
1938
2030
|
// Only update validator custody if we discovered new validators
|
|
1939
2031
|
if (newValidatorCount > previousValidatorCount) {
|
|
2032
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2033
|
+
this.localProposalsKey = null;
|
|
2034
|
+
this.refreshLocalProposals();
|
|
1940
2035
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1941
2036
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1942
2037
|
}
|
|
@@ -1952,6 +2047,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1952
2047
|
|
|
1953
2048
|
// Only update validator custody if we discovered new validators
|
|
1954
2049
|
if (hasNewValidators) {
|
|
2050
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2051
|
+
this.localProposalsKey = null;
|
|
2052
|
+
this.refreshLocalProposals();
|
|
1955
2053
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1956
2054
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1957
2055
|
}
|