@lodestar/beacon-node 1.51.0-dev.b41e3a7363 → 1.51.0-dev.b74e8e576d
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 +26 -67
- 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 +2 -2
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +11 -33
- 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 +6 -10
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +26 -17
- 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 +2 -2
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +10 -7
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +22 -17
- 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 +17 -6
- 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 +6 -1
- 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 +7 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +1 -3
- 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.map +1 -1
- package/lib/chain/bls/multithread/index.js +13 -11
- 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/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 -2
- package/lib/chain/options.d.ts.map +1 -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 +46 -128
- 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 +7 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +61 -3
- 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 +48 -86
- 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 +14 -41
- 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 +44 -33
- package/src/chain/blocks/index.ts +5 -2
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +33 -22
- package/src/chain/blocks/types.ts +5 -31
- package/src/chain/blocks/verifyBlock.ts +30 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +6 -1
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +1 -3
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +14 -10
- 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/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 -2
- 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 +59 -161
- 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 +65 -4
- 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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import {ForkSeq} from "@lodestar/params";
|
|
1
2
|
import {DataAvailabilityStatus} from "@lodestar/state-transition";
|
|
2
3
|
import {TimeoutError} from "@lodestar/utils";
|
|
3
4
|
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
@@ -42,7 +43,11 @@ export async function verifyBlocksDataAvailability(
|
|
|
42
43
|
return DataAvailabilityStatus.NotRequired;
|
|
43
44
|
}
|
|
44
45
|
if (blockInput.type === DAType.PreData) {
|
|
45
|
-
|
|
46
|
+
// Legacy deneb..electra blob sidecars are not tracked, so these blocks are imported without a DA check.
|
|
47
|
+
// PreData cannot represent them because the state transition rejects it for post-deneb forks.
|
|
48
|
+
return ForkSeq[blockInput.forkName] >= ForkSeq.deneb
|
|
49
|
+
? DataAvailabilityStatus.NotRequired
|
|
50
|
+
: DataAvailabilityStatus.PreData;
|
|
46
51
|
}
|
|
47
52
|
if (blockInput.daOutOfRange) {
|
|
48
53
|
return DataAvailabilityStatus.OutOfRange;
|
|
@@ -7,21 +7,23 @@ import {
|
|
|
7
7
|
LVHValidResponse,
|
|
8
8
|
ProtoBlock,
|
|
9
9
|
} from "@lodestar/fork-choice";
|
|
10
|
-
import {ForkSeq} from "@lodestar/params";
|
|
10
|
+
import {ForkPostDeneb, ForkSeq, isForkPostDeneb} from "@lodestar/params";
|
|
11
11
|
import {IBeaconStateView, isExecutionBlockBodyType, isStatePostBellatrix} from "@lodestar/state-transition";
|
|
12
|
-
import {bellatrix, electra} from "@lodestar/types";
|
|
12
|
+
import {SignedBeaconBlock, bellatrix, electra} from "@lodestar/types";
|
|
13
13
|
import {ErrorAborted, Logger, toRootHex} from "@lodestar/utils";
|
|
14
14
|
import {ExecutionPayloadStatus, IExecutionEngine} from "../../execution/engine/interface.js";
|
|
15
15
|
import {Metrics} from "../../metrics/metrics.js";
|
|
16
|
+
import {kzgCommitmentToVersionedHash} from "../../util/blobs.js";
|
|
16
17
|
import {IClock} from "../../util/clock.js";
|
|
18
|
+
import {getBlobKzgCommitments} from "../../util/dataColumns.js";
|
|
17
19
|
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
18
20
|
import {BlockProcessOpts} from "../options.js";
|
|
19
|
-
import {
|
|
21
|
+
import {isBlockInputNoData} from "./blockInput/blockInput.js";
|
|
20
22
|
import {IBlockInput} from "./blockInput/types.js";
|
|
21
23
|
import {ImportBlockOpts} from "./types.js";
|
|
22
24
|
|
|
23
25
|
export type VerifyBlockExecutionPayloadModules = {
|
|
24
|
-
executionEngine: IExecutionEngine
|
|
26
|
+
executionEngine: Pick<IExecutionEngine, "notifyNewPayload">;
|
|
25
27
|
clock: IClock;
|
|
26
28
|
logger: Logger;
|
|
27
29
|
metrics: Metrics | null;
|
|
@@ -166,8 +168,9 @@ export async function verifyBlockExecutionPayload(
|
|
|
166
168
|
|
|
167
169
|
// TODO: Handle better notifyNewPayload() returning error is syncing
|
|
168
170
|
const fork = blockInput.forkName;
|
|
169
|
-
const versionedHashes =
|
|
170
|
-
|
|
171
|
+
const versionedHashes = isForkPostDeneb(fork)
|
|
172
|
+
? getBlobKzgCommitments(fork, block as SignedBeaconBlock<ForkPostDeneb>).map(kzgCommitmentToVersionedHash)
|
|
173
|
+
: undefined;
|
|
171
174
|
const parentBlockRoot = ForkSeq[fork] >= ForkSeq.deneb ? block.message.parentRoot : undefined;
|
|
172
175
|
const executionRequests =
|
|
173
176
|
ForkSeq[fork] >= ForkSeq.electra ? (block.message.body as electra.BeaconBlockBody).executionRequests : undefined;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
|
|
2
|
+
import {ExecutionStatus, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
|
|
3
3
|
import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
4
4
|
import {RootHex, Slot, isGloasBeaconBlock} from "@lodestar/types";
|
|
5
5
|
import {toRootHex} from "@lodestar/utils";
|
|
@@ -118,6 +118,9 @@ export function verifyBlocksSanityChecks(
|
|
|
118
118
|
parentBlock = parentBlockWithPayload;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
+
if (parentBlock.executionStatus === ExecutionStatus.Invalid) {
|
|
122
|
+
throw new BlockError(block, {code: BlockErrorCode.PARENT_EXECUTION_INVALID, parentRoot});
|
|
123
|
+
}
|
|
121
124
|
// Parent is known to the fork-choice
|
|
122
125
|
parentBlockSlot = parentBlock.slot;
|
|
123
126
|
}
|
|
@@ -36,10 +36,9 @@ export async function verifyBlocksSignatures(
|
|
|
36
36
|
? preState0.currentSyncCommitteeIndexed
|
|
37
37
|
: new SyncCommitteeCacheEmpty();
|
|
38
38
|
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
// so the attester and proposer shufflings are correct.
|
|
39
|
+
// Runs concurrently with the state transition. Signature sets are built from preState0, which
|
|
40
|
+
// verifyBlocksInEpoch() guarantees is in the same epoch as every block, so the proposer and attester shufflings
|
|
41
|
+
// and the sync committee are the ones the blocks were signed under.
|
|
43
42
|
for (const [i, block] of blocks.entries()) {
|
|
44
43
|
// Use [i] to make clear that the index has to be correct to blame the right block below on BlockError()
|
|
45
44
|
isValidPromises[i] = opts.validSignatures
|
|
@@ -50,7 +49,10 @@ export async function verifyBlocksSignatures(
|
|
|
50
49
|
bls.verifySignatureSets(
|
|
51
50
|
getBlockSignatureSets(config, currentSyncCommitteeIndexed, preState0, block, indexedAttestationsByBlock[i], {
|
|
52
51
|
skipProposerSignature: opts.validProposerSignature,
|
|
53
|
-
})
|
|
52
|
+
}),
|
|
53
|
+
// Prioritize block verification over attestations, since
|
|
54
|
+
// attestations already buffer up to `MAX_BUFFER_WAIT_MS`
|
|
55
|
+
{priority: true}
|
|
54
56
|
);
|
|
55
57
|
|
|
56
58
|
// getBlockSignatureSets() takes 45ms in benchmarks for 2022Q2 mainnet blocks (100 sigs). When syncing a 32 blocks
|
|
@@ -22,9 +22,7 @@ export async function verifyPayloadsDataAvailability(
|
|
|
22
22
|
const promises: Promise<gloas.DataColumnSidecar[]>[] = [];
|
|
23
23
|
for (const payloadInput of payloadInputs) {
|
|
24
24
|
if (!payloadInput.hasAllData()) {
|
|
25
|
-
// Sync and reconstruction keep pulling the data columns from the network while we wait
|
|
26
|
-
// capped at one slot because the payload queue is serial: a longer wait lets consecutive unavailable
|
|
27
|
-
// payloads push every later payload import further behind with each slot.
|
|
25
|
+
// Sync and reconstruction keep pulling the data columns from the network while we wait
|
|
28
26
|
promises.push(
|
|
29
27
|
payloadInput.waitForAllData(config.getSlotDurationMs(payloadInput.forkName), signal).catch((e) => {
|
|
30
28
|
if (e instanceof TimeoutError) {
|
|
@@ -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
|
};
|
|
@@ -333,16 +333,20 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
+
// First hand work to an idle worker before returning to the caller.
|
|
337
|
+
// Deferring the post to the next macrotask would make the worker
|
|
338
|
+
// sit idle while waiting for the next synchronous work
|
|
339
|
+
else if (job.opts.priority) {
|
|
340
|
+
this.jobs.unshift(job);
|
|
341
|
+
void this.runJob();
|
|
342
|
+
}
|
|
343
|
+
|
|
336
344
|
// Push job and schedule to call `runJob` in the next macro event loop cycle.
|
|
337
345
|
// This is useful to allow batching job submitted from a synchronous for loop,
|
|
338
346
|
// and to prevent large stacks since runJob may be called recursively.
|
|
339
347
|
else {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
} else {
|
|
343
|
-
this.jobs.push(job);
|
|
344
|
-
}
|
|
345
|
-
callInNextEventLoop(this.runJob);
|
|
348
|
+
this.jobs.push(job);
|
|
349
|
+
callInNextEventLoop(() => void this.runJob());
|
|
346
350
|
}
|
|
347
351
|
}
|
|
348
352
|
|
|
@@ -377,7 +381,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
377
381
|
let completedJobsCount = 0;
|
|
378
382
|
|
|
379
383
|
if (this.jobs.length > 0) {
|
|
380
|
-
callInNextEventLoop(this.runJob);
|
|
384
|
+
callInNextEventLoop(() => void this.runJob());
|
|
381
385
|
}
|
|
382
386
|
|
|
383
387
|
try {
|
|
@@ -423,7 +427,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
423
427
|
if (workReqs.length === 0) {
|
|
424
428
|
worker.status = {code: WorkerStatusCode.idle, workerApi};
|
|
425
429
|
this.workersBusy--;
|
|
426
|
-
callInNextEventLoop(this.runJob);
|
|
430
|
+
callInNextEventLoop(() => void this.runJob());
|
|
427
431
|
return;
|
|
428
432
|
}
|
|
429
433
|
|
|
@@ -499,7 +503,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
499
503
|
this.workersBusy--;
|
|
500
504
|
|
|
501
505
|
// Potentially run a new job
|
|
502
|
-
callInNextEventLoop(this.runJob);
|
|
506
|
+
callInNextEventLoop(() => void this.runJob());
|
|
503
507
|
};
|
|
504
508
|
|
|
505
509
|
/**
|
|
@@ -542,7 +546,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
542
546
|
this.jobs.unshift(job);
|
|
543
547
|
}
|
|
544
548
|
this.bufferedJobs = null;
|
|
545
|
-
callInNextEventLoop(this.runJob);
|
|
549
|
+
callInNextEventLoop(() => void this.runJob());
|
|
546
550
|
}
|
|
547
551
|
};
|
|
548
552
|
|
|
@@ -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
|
}
|