@lodestar/beacon-node 1.51.0-dev.d422f387ac → 1.51.0-dev.dc21d14c20
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 +19 -61
- 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 +17 -0
- package/lib/api/impl/beacon/pool/index.js.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 +7 -31
- package/lib/chain/GetBlobsTracker.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 +4 -0
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +24 -3
- 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/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 +10 -5
- package/lib/chain/blocks/verifyBlocksSignatures.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 +45 -17
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/chain.d.ts +24 -3
- 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 +7 -4
- 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 +177 -37
- package/lib/chain/opPools/aggregatedAttestationPool.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/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/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/executionPayloadEnvelope.d.ts +6 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +16 -10
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -2
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +0 -3
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/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/interface.d.ts +17 -5
- 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 +0 -8
- 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 +27 -8
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +74 -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/network/core/networkCore.d.ts +2 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +4 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +1 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +3 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +4 -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 +2 -5
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/network.d.ts +6 -7
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +50 -37
- package/lib/network/network.js.map +1 -1
- 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.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/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 +43 -123
- 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 +2 -0
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +37 -19
- 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/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 +8 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +42 -22
- 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/sszBytes.d.ts +5 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +34 -17
- 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 -16
- package/src/api/impl/beacon/blocks/index.ts +24 -64
- package/src/api/impl/beacon/pool/index.ts +26 -0
- package/src/api/impl/validator/index.ts +43 -29
- package/src/chain/GetBlobsTracker.ts +10 -39
- 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 +42 -13
- package/src/chain/blocks/index.ts +5 -2
- 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 +10 -5
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +43 -19
- package/src/chain/chain.ts +135 -37
- 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 +7 -3
- package/src/chain/opPools/aggregatedAttestationPool.ts +222 -35
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- 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/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validation/syncCommittee.ts +31 -15
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
- package/src/chain/validatorMonitor.ts +0 -6
- package/src/db/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/interface.ts +18 -9
- 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 +0 -17
- 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 +75 -18
- package/src/metrics/server/http.ts +5 -5
- package/src/network/core/networkCore.ts +6 -1
- package/src/network/core/networkCoreWorker.ts +1 -0
- package/src/network/core/networkCoreWorkerHandler.ts +4 -1
- package/src/network/core/types.ts +4 -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 +0 -5
- package/src/network/network.ts +50 -60
- package/src/network/options.ts +2 -0
- package/src/network/peers/peerManager.ts +27 -2
- 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 +56 -156
- 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 +34 -15
- package/src/node/options.ts +5 -1
- package/src/sync/range/batch.ts +9 -21
- package/src/sync/range/chain.ts +2 -14
- package/src/sync/sync.ts +43 -22
- 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/sszBytes.ts +40 -22
- 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
|
@@ -20,6 +20,7 @@ const gossipType = GossipType.beacon_attestation;
|
|
|
20
20
|
export enum SubnetSource {
|
|
21
21
|
committee = "committee",
|
|
22
22
|
longLived = "long_lived",
|
|
23
|
+
beforeProposal = "before_proposal",
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
// map of subnet to time to form stable mesh as seconds, null if not yet formed
|
|
@@ -40,7 +41,7 @@ export class AttnetsService implements IAttnetsService {
|
|
|
40
41
|
/** Committee subnets - PeerManager must find peers for those */
|
|
41
42
|
private committeeSubnets = new SubnetMap();
|
|
42
43
|
/**
|
|
43
|
-
* All currently subscribed short-lived subnets, for attestation aggregation
|
|
44
|
+
* All currently subscribed short-lived subnets, for attestation aggregation and before local block proposals
|
|
44
45
|
* This class will tell gossip to subscribe and un-subscribe
|
|
45
46
|
* If a value exists for `SubscriptionId` it means that gossip subscription is active in network.gossip
|
|
46
47
|
*/
|
|
@@ -52,6 +53,11 @@ export class AttnetsService implements IAttnetsService {
|
|
|
52
53
|
* Used to determine if we should process an attestation.
|
|
53
54
|
*/
|
|
54
55
|
private aggregatorSlotSubnet = new MapDef<Slot, AggregatorDutyInfo>(() => new Map());
|
|
56
|
+
/**
|
|
57
|
+
* Block proposal slots of validators connected to this node.
|
|
58
|
+
* Used to subscribe to all subnets `slotsToSubscribeBeforeProposalDuty` slots before, see onSlot
|
|
59
|
+
*/
|
|
60
|
+
private localProposalSlots = new Set<Slot>();
|
|
55
61
|
|
|
56
62
|
constructor(
|
|
57
63
|
private readonly config: BeaconConfig,
|
|
@@ -119,6 +125,22 @@ export class AttnetsService implements IAttnetsService {
|
|
|
119
125
|
}
|
|
120
126
|
}
|
|
121
127
|
|
|
128
|
+
/**
|
|
129
|
+
* Called from the main thread with upcoming block proposal slots of connected validators.
|
|
130
|
+
* Tracked here, the subscription happens in onSlot like aggregator duties, or right away for a proposal learned
|
|
131
|
+
* after its subscription slot (node restart, newly connected validator)
|
|
132
|
+
*/
|
|
133
|
+
addLocalProposalSlots(slots: Slot[]): void {
|
|
134
|
+
const clockSlot = this.clock.currentSlot;
|
|
135
|
+
for (const proposalSlot of slots) {
|
|
136
|
+
this.localProposalSlots.add(proposalSlot);
|
|
137
|
+
// not from the slot before the proposal, its votes are published before a mesh could form
|
|
138
|
+
if (proposalSlot - this.opts.slotsToSubscribeBeforeProposalDuty <= clockSlot && clockSlot < proposalSlot - 1) {
|
|
139
|
+
this.subscribeAllSubnetsUntilProposal(proposalSlot);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
122
144
|
/**
|
|
123
145
|
* Check if a subscription is still active before handling a gossip object
|
|
124
146
|
*/
|
|
@@ -158,7 +180,8 @@ export class AttnetsService implements IAttnetsService {
|
|
|
158
180
|
|
|
159
181
|
/**
|
|
160
182
|
* Run per slot.
|
|
161
|
-
* - Subscribe to gossip subnets 2 slots in advance
|
|
183
|
+
* - Subscribe to gossip subnets 2 slots in advance of aggregator duties
|
|
184
|
+
* - Subscribe to all subnets `slotsToSubscribeBeforeProposalDuty` slots in advance of local block proposals
|
|
162
185
|
* - Unsubscribe from expired subnets
|
|
163
186
|
* - Track time to stable mesh if not yet formed
|
|
164
187
|
*/
|
|
@@ -186,19 +209,76 @@ export class AttnetsService implements IAttnetsService {
|
|
|
186
209
|
this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
|
|
187
210
|
}
|
|
188
211
|
|
|
212
|
+
// Must run before unsubscribeExpiredCommitteeSubnets so that a subnet whose subscription expires in this slot
|
|
213
|
+
// gets its ttl extended instead of being unsubscribed and subscribed again
|
|
214
|
+
this.subscribeAllSubnetsBeforeProposal(clockSlot);
|
|
215
|
+
|
|
189
216
|
this.unsubscribeExpiredCommitteeSubnets(clockSlot);
|
|
190
217
|
this.pruneExpiredAggregator(clockSlot);
|
|
218
|
+
this.pruneExpiredLocalProposals(clockSlot);
|
|
191
219
|
} catch (e) {
|
|
192
220
|
this.logger.error("Error on AttnetsService.onSlot", {slot: clockSlot}, e as Error);
|
|
193
221
|
}
|
|
194
222
|
};
|
|
195
223
|
|
|
196
224
|
private onHalfSlot = (clockSlot: Slot): void => {
|
|
197
|
-
|
|
198
|
-
|
|
225
|
+
try {
|
|
226
|
+
for (const [dutiedSlot, dutiedInfo] of this.aggregatorSlotSubnet.entries()) {
|
|
227
|
+
this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
this.unsubscribeAllSubnetsBeforeProposal(clockSlot);
|
|
231
|
+
} catch (e) {
|
|
232
|
+
this.logger.error("Error on AttnetsService.onHalfSlot", {slot: clockSlot}, e as Error);
|
|
199
233
|
}
|
|
200
234
|
};
|
|
201
235
|
|
|
236
|
+
/**
|
|
237
|
+
* Subscribe to all subnets `slotsToSubscribeBeforeProposalDuty` slots before a block proposal of a connected
|
|
238
|
+
* validator, so that single attestations of those slots can be packed into the block. The subscription expires in
|
|
239
|
+
* the slot before the proposal, see unsubscribeAllSubnetsBeforeProposal
|
|
240
|
+
*/
|
|
241
|
+
private subscribeAllSubnetsBeforeProposal(clockSlot: Slot): void {
|
|
242
|
+
for (const proposalSlot of this.localProposalSlots) {
|
|
243
|
+
if (proposalSlot === clockSlot + this.opts.slotsToSubscribeBeforeProposalDuty) {
|
|
244
|
+
this.subscribeAllSubnetsUntilProposal(proposalSlot);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private subscribeAllSubnetsUntilProposal(proposalSlot: Slot): void {
|
|
250
|
+
if (this.opts.slotsToSubscribeBeforeProposalDuty === 0 || this.opts.subscribeAllSubnets) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const subnets = Array.from({length: ATTESTATION_SUBNET_COUNT}, (_, subnet) => subnet);
|
|
255
|
+
// Same as aggregator duties: trigger gossip subscription first, then register the subscriptions.
|
|
256
|
+
// Do not add to committeeSubnets: it drives peer discovery, we only use the peers we already have
|
|
257
|
+
this.subscribeToSubnets(subnets, SubnetSource.beforeProposal);
|
|
258
|
+
for (const subnet of subnets) {
|
|
259
|
+
this.shortLivedSubscriptions.request({subnet, toSlot: proposalSlot - 1});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Unsubscribe from subnets of subscribeAllSubnetsBeforeProposal at half of the slot before the proposal instead of
|
|
265
|
+
* the proposal slot start, so the proposal slot does not carry their traffic. Single attestations are published at
|
|
266
|
+
* 1/3 of the slot so they have arrived by then.
|
|
267
|
+
* Short-lived subscriptions are either aggregator duties or these, an aggregator duty ends in its dutied slot and is
|
|
268
|
+
* kept here (aggregates are due later), it expires at the next slot start in onSlot as before. So only subnets of
|
|
269
|
+
* subscribeAllSubnetsBeforeProposal are unsubscribed here.
|
|
270
|
+
*/
|
|
271
|
+
private unsubscribeAllSubnetsBeforeProposal(clockSlot: Slot): void {
|
|
272
|
+
const aggregatorSubnets = this.aggregatorSlotSubnet.get(clockSlot);
|
|
273
|
+
const expiring = this.shortLivedSubscriptions.getExpired(
|
|
274
|
+
clockSlot + 1,
|
|
275
|
+
(subnet) => aggregatorSubnets?.has(subnet) === true
|
|
276
|
+
);
|
|
277
|
+
if (expiring.length > 0) {
|
|
278
|
+
this.unsubscribeSubnets(expiring, clockSlot + 1, SubnetSource.beforeProposal);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
202
282
|
/**
|
|
203
283
|
* Track time to form stable mesh if not yet formed
|
|
204
284
|
*/
|
|
@@ -291,8 +371,8 @@ export class AttnetsService implements IAttnetsService {
|
|
|
291
371
|
}
|
|
292
372
|
|
|
293
373
|
/**
|
|
294
|
-
* Unsubscribe
|
|
295
|
-
* If a
|
|
374
|
+
* Unsubscribe from short-lived subnets whose subscription expired.
|
|
375
|
+
* If a long-lived subnet is present, we do not unsubscribe from it.
|
|
296
376
|
*/
|
|
297
377
|
private unsubscribeExpiredCommitteeSubnets(slot: Slot): void {
|
|
298
378
|
const expired = this.shortLivedSubscriptions.getExpired(slot);
|
|
@@ -313,6 +393,14 @@ export class AttnetsService implements IAttnetsService {
|
|
|
313
393
|
}
|
|
314
394
|
}
|
|
315
395
|
|
|
396
|
+
private pruneExpiredLocalProposals(currentSlot: Slot): void {
|
|
397
|
+
for (const proposalSlot of this.localProposalSlots) {
|
|
398
|
+
if (currentSlot > proposalSlot) {
|
|
399
|
+
this.localProposalSlots.delete(proposalSlot);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
316
404
|
/** Update ENR */
|
|
317
405
|
private updateMetadata(): void {
|
|
318
406
|
const subnets = ssz.phase0.AttestationSubnets.defaultValue();
|
|
@@ -25,6 +25,8 @@ export type SubnetsService = {
|
|
|
25
25
|
|
|
26
26
|
export interface IAttnetsService extends SubnetsService {
|
|
27
27
|
shouldProcess(subnet: SubnetID, slot: Slot): boolean;
|
|
28
|
+
/** Block proposal slots of validators connected to this node, see `slotsToSubscribeBeforeProposalDuty` */
|
|
29
|
+
addLocalProposalSlots(slots: Slot[]): void;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export type RandBetweenFn = (min: number, max: number) => number;
|
|
@@ -33,6 +35,11 @@ export type ShuffleFn = <T>(arr: T[]) => T[];
|
|
|
33
35
|
export type SubnetsServiceOpts = {
|
|
34
36
|
subscribeAllSubnets?: boolean;
|
|
35
37
|
slotsToSubscribeBeforeAggregatorDuty: number;
|
|
38
|
+
/**
|
|
39
|
+
* Subscribe to all attestation subnets this many slots before a block proposal of a connected validator, so that
|
|
40
|
+
* its single attestations can be packed into the block. In `[0, SLOTS_PER_EPOCH]`, 0 disables
|
|
41
|
+
*/
|
|
42
|
+
slotsToSubscribeBeforeProposalDuty: number;
|
|
36
43
|
};
|
|
37
44
|
|
|
38
45
|
export type SubnetsServiceTestOpts = {
|
package/src/node/nodejs.ts
CHANGED
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
isStatePostGloas,
|
|
21
21
|
} from "@lodestar/state-transition";
|
|
22
22
|
import {Slot} from "@lodestar/types";
|
|
23
|
-
import {sleep, toRootHex} from "@lodestar/utils";
|
|
23
|
+
import {defer, sleep, toRootHex} from "@lodestar/utils";
|
|
24
24
|
import {ProcessShutdownCallback} from "@lodestar/validator";
|
|
25
25
|
import {BeaconRestApiServer, getApi} from "../api/index.js";
|
|
26
26
|
import {getDataColumnSidecarsMinEpoch} from "../chain/archiveStore/utils/archiveBlocks.js";
|
|
@@ -117,6 +117,7 @@ export class BeaconNode {
|
|
|
117
117
|
|
|
118
118
|
status: BeaconNodeStatus;
|
|
119
119
|
private controller?: AbortController;
|
|
120
|
+
private closePromise: Promise<void> | undefined;
|
|
120
121
|
|
|
121
122
|
constructor({
|
|
122
123
|
opts,
|
|
@@ -297,6 +298,7 @@ export class BeaconNode {
|
|
|
297
298
|
: undefined,
|
|
298
299
|
builderApiClientOpts: {
|
|
299
300
|
timeout: opts.executionBuilder.timeout,
|
|
301
|
+
bidDeadline: opts.executionBuilder.bidDeadline,
|
|
300
302
|
// Sent with all builder api requests, unless the node runs in private mode
|
|
301
303
|
userAgent: opts.executionBuilder.userAgent,
|
|
302
304
|
},
|
|
@@ -392,23 +394,40 @@ export class BeaconNode {
|
|
|
392
394
|
/**
|
|
393
395
|
* Stop beacon node and its sub-components.
|
|
394
396
|
*/
|
|
395
|
-
|
|
396
|
-
if (this.
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
397
|
+
close(): Promise<void> {
|
|
398
|
+
if (this.closePromise !== undefined) return this.closePromise;
|
|
399
|
+
const completion = defer<void>();
|
|
400
|
+
this.closePromise = completion.promise;
|
|
401
|
+
this.status = BeaconNodeStatus.closing;
|
|
402
|
+
void this.closeInternal().then(completion.resolve, completion.reject);
|
|
403
|
+
return this.closePromise;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
private async closeInternal(): Promise<void> {
|
|
407
|
+
const errors: unknown[] = [];
|
|
408
|
+
for (const cleanup of [
|
|
409
|
+
() => this.sync.close(),
|
|
410
|
+
() => this.restApi?.close(),
|
|
411
|
+
() => this.network.close(),
|
|
412
|
+
() => this.metricsServer?.close(),
|
|
413
|
+
() => this.monitoring?.close(),
|
|
414
|
+
() => this.chain.persistToDisk(),
|
|
415
|
+
() => this.chain.close(),
|
|
405
416
|
// Abort signal last: close() calls above clear intervals/timeouts so no new
|
|
406
417
|
// operations get scheduled. If we aborted first, a still-pending interval could
|
|
407
418
|
// fire and schedule a new operation after abort, leaving it stuck and delaying shutdown.
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
419
|
+
() => this.controller?.abort(),
|
|
420
|
+
() => sleep(DELAY_BEFORE_CLOSING_DB_MS),
|
|
421
|
+
() => this.db.close(),
|
|
422
|
+
]) {
|
|
423
|
+
try {
|
|
424
|
+
await cleanup();
|
|
425
|
+
} catch (error) {
|
|
426
|
+
errors.push(error);
|
|
427
|
+
}
|
|
412
428
|
}
|
|
429
|
+
this.status = BeaconNodeStatus.closed;
|
|
430
|
+
if (errors.length === 1) throw errors[0];
|
|
431
|
+
if (errors.length > 1) throw new AggregateError(errors, "Beacon node cleanup failed");
|
|
413
432
|
}
|
|
414
433
|
}
|
package/src/node/options.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import {BLOCK_PRODUCTION_RACE_CUTOFF_GLOAS_BPS} from "../api/impl/validator/index.js";
|
|
1
2
|
import {ApiOptions, defaultApiOptions} from "../api/options.js";
|
|
2
3
|
import {ArchiveMode, DEFAULT_ARCHIVE_MODE, IChainOptions, defaultChainOptions} from "../chain/options.js";
|
|
3
4
|
import {ValidatorMonitorOpts, defaultValidatorMonitorOpts} from "../chain/validatorMonitor.js";
|
|
4
5
|
import {DatabaseOptions, defaultDbOptions} from "../db/options.js";
|
|
6
|
+
import {BUILDER_BID_LAG_BUFFER_MS} from "../execution/builder/apiClient.js";
|
|
5
7
|
import {
|
|
6
8
|
EngineApiMode,
|
|
7
9
|
ExecutionBuilderOpts,
|
|
@@ -20,9 +22,11 @@ import {SyncOptions, defaultSyncOptions} from "../sync/options.js";
|
|
|
20
22
|
// Re-export so the CLI doesn't need to depend on lodestar-api
|
|
21
23
|
export {allNamespaces} from "../api/rest/index.js";
|
|
22
24
|
export type {EngineApiMode};
|
|
23
|
-
// Re-export to use as default values in CLI args
|
|
25
|
+
// Re-export to use as default values and for validation in CLI args
|
|
24
26
|
export {
|
|
25
27
|
ArchiveMode,
|
|
28
|
+
BLOCK_PRODUCTION_RACE_CUTOFF_GLOAS_BPS,
|
|
29
|
+
BUILDER_BID_LAG_BUFFER_MS,
|
|
26
30
|
DEFAULT_ARCHIVE_MODE,
|
|
27
31
|
defaultExecutionBuilderHttpOpts,
|
|
28
32
|
defaultExecutionEngineHttpOpts,
|
package/src/sync/range/batch.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {ForkName,
|
|
2
|
+
import {ForkName, isForkPostFulu, isForkPostGloas} from "@lodestar/params";
|
|
3
3
|
import {Epoch, RootHex, SignedBeaconBlock, Slot, gloas, phase0} from "@lodestar/types";
|
|
4
4
|
import {LodestarError, byteArrayEquals, prettyPrintIndices, toRootHex} from "@lodestar/utils";
|
|
5
5
|
import {isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
|
|
@@ -112,7 +112,6 @@ export type BatchMetadata = {
|
|
|
112
112
|
// Per-type outstanding request shapes; only present when that sub-request exists.
|
|
113
113
|
// Format: "startSlot=<n>,count=<n>" (plus ",cols=<indices>" for columns).
|
|
114
114
|
blocksReq?: string;
|
|
115
|
-
blobsReq?: string;
|
|
116
115
|
columnsReq?: string;
|
|
117
116
|
envelopesReq?: string;
|
|
118
117
|
|
|
@@ -159,7 +158,7 @@ export class Batch {
|
|
|
159
158
|
readonly startSlot: Slot;
|
|
160
159
|
readonly count: number;
|
|
161
160
|
|
|
162
|
-
/** Block,
|
|
161
|
+
/** Block, column and envelope requests that are used to determine the best peer and are used in downloadByRange */
|
|
163
162
|
requests: DownloadByRangeRequests;
|
|
164
163
|
/** State of the batch. */
|
|
165
164
|
state: BatchState = {status: BatchStatus.AwaitingDownload, blocks: [], payloadEnvelopes: null};
|
|
@@ -224,7 +223,7 @@ export class Batch {
|
|
|
224
223
|
}
|
|
225
224
|
|
|
226
225
|
/**
|
|
227
|
-
* Builds ByRange requests for block,
|
|
226
|
+
* Builds ByRange requests for block, columns and envelopes
|
|
228
227
|
*/
|
|
229
228
|
private getRequests(blocks: IBlockInput[]): DownloadByRangeRequests {
|
|
230
229
|
const withinValidRequestWindow = !isDaOutOfRange(
|
|
@@ -254,8 +253,6 @@ export class Batch {
|
|
|
254
253
|
count: this.count,
|
|
255
254
|
columns: this.custodyConfig.sampledColumns,
|
|
256
255
|
};
|
|
257
|
-
} else if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
|
|
258
|
-
requests.blobsRequest = {startSlot: this.startSlot, count: this.count};
|
|
259
256
|
}
|
|
260
257
|
|
|
261
258
|
return requests;
|
|
@@ -334,23 +331,15 @@ export class Batch {
|
|
|
334
331
|
if (dataStartSlot <= endSlot) {
|
|
335
332
|
// range of 40 - 63, startSlot will be inclusive but subtraction will exclusive so need to + 1
|
|
336
333
|
const count = endSlot - dataStartSlot + 1;
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
if (neededColumns.size > 0) {
|
|
341
|
-
requests.columnsRequest = {
|
|
342
|
-
count,
|
|
343
|
-
startSlot: dataStartSlot,
|
|
344
|
-
columns: Array.from(neededColumns),
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
} else if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
|
|
348
|
-
requests.blobsRequest = {
|
|
334
|
+
// Peer rejects an empty `columns` list
|
|
335
|
+
if (isForkPostFulu(this.forkName) && withinValidRequestWindow && neededColumns.size > 0) {
|
|
336
|
+
requests.columnsRequest = {
|
|
349
337
|
count,
|
|
350
338
|
startSlot: dataStartSlot,
|
|
339
|
+
columns: Array.from(neededColumns),
|
|
351
340
|
};
|
|
352
341
|
}
|
|
353
|
-
// dataSlot will still have a value but do not create a request for
|
|
342
|
+
// dataSlot will still have a value but do not create a request for pre-fulu forks
|
|
354
343
|
}
|
|
355
344
|
|
|
356
345
|
if (isForkPostGloas(this.forkName) && envelopeStartSlot <= endSlot) {
|
|
@@ -471,7 +460,7 @@ export class Batch {
|
|
|
471
460
|
}
|
|
472
461
|
|
|
473
462
|
getMetadata(): BatchMetadata {
|
|
474
|
-
const {blocksRequest,
|
|
463
|
+
const {blocksRequest, columnsRequest, envelopesRequest} = this.requests;
|
|
475
464
|
const failedProcessingPeerList = this.failedProcessingAttempts.flatMap((a) => a.peers);
|
|
476
465
|
const executionErrorPeerList = this.executionErrorAttempts.flatMap((a) => a.peers);
|
|
477
466
|
return {
|
|
@@ -480,7 +469,6 @@ export class Batch {
|
|
|
480
469
|
count: this.count,
|
|
481
470
|
status: this.state.status,
|
|
482
471
|
...(blocksRequest && {blocksReq: formatRangeReq(blocksRequest)}),
|
|
483
|
-
...(blobsRequest && {blobsReq: formatRangeReq(blobsRequest)}),
|
|
484
472
|
...(columnsRequest && {columnsReq: formatColumnsReq(columnsRequest)}),
|
|
485
473
|
...(envelopesRequest && {envelopesReq: formatRangeReq(envelopesRequest)}),
|
|
486
474
|
downloadAttempts: this.failedDownloadAttempts.length,
|
package/src/sync/range/chain.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
2
|
import {Epoch, Root, Slot} from "@lodestar/types";
|
|
3
3
|
import {ErrorAborted, LodestarError, Logger, prettyPrintIndices, toRootHex} from "@lodestar/utils";
|
|
4
|
-
import {
|
|
4
|
+
import {isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
|
|
5
5
|
import {BlockInputErrorCode} from "../../chain/blocks/blockInput/errors.js";
|
|
6
6
|
import {IBlockInput} from "../../chain/blocks/blockInput/types.js";
|
|
7
7
|
import {PayloadEnvelopeInput} from "../../chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
|
|
8
|
-
import {BlobSidecarErrorCode} from "../../chain/errors/blobSidecarError.js";
|
|
9
8
|
import {DataColumnSidecarErrorCode} from "../../chain/errors/dataColumnSidecarError.js";
|
|
10
9
|
import {Metrics} from "../../metrics/metrics.js";
|
|
11
10
|
import {PeerAction, prettyPrintPeerIdStr} from "../../network/index.js";
|
|
@@ -569,12 +568,8 @@ export class SyncChain {
|
|
|
569
568
|
// The below cases indicate the peer may be on a different chain, so are not penalized during head sync.
|
|
570
569
|
switch (errCode) {
|
|
571
570
|
case BlockInputErrorCode.MISMATCHED_ROOT_HEX:
|
|
572
|
-
case DownloadByRangeErrorCode.MISSING_BLOBS:
|
|
573
|
-
case DownloadByRangeErrorCode.EXTRA_BLOBS:
|
|
574
571
|
case DownloadByRangeErrorCode.MISSING_COLUMNS:
|
|
575
572
|
case DownloadByRangeErrorCode.EXTRA_COLUMNS:
|
|
576
|
-
case BlobSidecarErrorCode.INCORRECT_SIDECAR_COUNT:
|
|
577
|
-
case BlobSidecarErrorCode.INCORRECT_BLOCK:
|
|
578
573
|
case DataColumnSidecarErrorCode.INCORRECT_SIDECAR_COUNT:
|
|
579
574
|
case DataColumnSidecarErrorCode.INCORRECT_BLOCK:
|
|
580
575
|
this.reportPeer(peer.peerId, PeerAction.LowToleranceError, res.err.message);
|
|
@@ -589,8 +584,6 @@ export class SyncChain {
|
|
|
589
584
|
case DownloadByRangeErrorCode.INVALID_ENVELOPE_BLOCK_HASH:
|
|
590
585
|
case DownloadByRangeErrorCode.INVALID_ENVELOPE_SLOT:
|
|
591
586
|
case DownloadByRangeErrorCode.INVALID_CHAIN_SEGMENT:
|
|
592
|
-
case BlobSidecarErrorCode.INCLUSION_PROOF_INVALID:
|
|
593
|
-
case BlobSidecarErrorCode.INVALID_KZG_PROOF_BATCH:
|
|
594
587
|
case DataColumnSidecarErrorCode.INCORRECT_KZG_COMMITMENTS_COUNT:
|
|
595
588
|
case DataColumnSidecarErrorCode.INCORRECT_KZG_PROOF_COUNT:
|
|
596
589
|
case DataColumnSidecarErrorCode.INVALID_KZG_PROOF_BATCH:
|
|
@@ -638,12 +631,7 @@ export class SyncChain {
|
|
|
638
631
|
}
|
|
639
632
|
|
|
640
633
|
for (const block of downloadSuccessOutput.blocks) {
|
|
641
|
-
if (
|
|
642
|
-
const blockLogMeta = block.getLogMeta();
|
|
643
|
-
const expectedBlobs = typeof blockLogMeta.expectedBlobs === "number" ? blockLogMeta.expectedBlobs : 0;
|
|
644
|
-
logMeta.expectedBlobCount = (logMeta.expectedBlobCount ?? 0) + expectedBlobs;
|
|
645
|
-
logMeta.receivedBlobCount = (logMeta.receivedBlobCount ?? 0) + blockLogMeta.receivedBlobs;
|
|
646
|
-
} else if (isBlockInputColumns(block)) {
|
|
634
|
+
if (isBlockInputColumns(block)) {
|
|
647
635
|
logMeta.columnCount = (logMeta.columnCount ?? 0) + block.getLogMeta().receivedColumns;
|
|
648
636
|
}
|
|
649
637
|
}
|
package/src/sync/sync.ts
CHANGED
|
@@ -33,6 +33,8 @@ export class BeaconSync implements IBeaconSync {
|
|
|
33
33
|
/** For metrics only */
|
|
34
34
|
private readonly peerSyncType = new Map<string, PeerSyncType>();
|
|
35
35
|
private readonly slotImportTolerance: Slot;
|
|
36
|
+
/** The requested subscription state, set while a change is being applied */
|
|
37
|
+
private pendingGossipSubscribed: boolean | undefined;
|
|
36
38
|
|
|
37
39
|
constructor(opts: SyncOptions, modules: SyncModules) {
|
|
38
40
|
const {config, chain, db, metrics, network, logger} = modules;
|
|
@@ -89,6 +91,7 @@ export class BeaconSync implements IBeaconSync {
|
|
|
89
91
|
}
|
|
90
92
|
|
|
91
93
|
close(): void {
|
|
94
|
+
this.pendingGossipSubscribed = undefined;
|
|
92
95
|
this.network.events.off(NetworkEvent.peerConnected, this.addPeer);
|
|
93
96
|
this.network.events.off(NetworkEvent.peerDisconnected, this.removePeer);
|
|
94
97
|
this.chain.clock.off(ClockEvent.epoch, this.onClockEpoch);
|
|
@@ -296,17 +299,7 @@ export class BeaconSync implements IBeaconSync {
|
|
|
296
299
|
if (state === SyncState.Synced && this.chain.clock.currentEpoch >= MIN_EPOCH_TO_START_GOSSIP) {
|
|
297
300
|
this.chain.forkChoice.resumeFastConfirmation();
|
|
298
301
|
|
|
299
|
-
|
|
300
|
-
this.network
|
|
301
|
-
.subscribeGossipCoreTopics()
|
|
302
|
-
.then(() => {
|
|
303
|
-
this.metrics?.syncSwitchGossipSubscriptions.inc({action: "subscribed"});
|
|
304
|
-
this.logger.info("Subscribed gossip core topics");
|
|
305
|
-
})
|
|
306
|
-
.catch((e) => {
|
|
307
|
-
this.logger.error("Error subscribing to gossip core topics", {}, e);
|
|
308
|
-
});
|
|
309
|
-
}
|
|
302
|
+
this.setGossipSubscription(true);
|
|
310
303
|
|
|
311
304
|
// also start searching for unknown blocks
|
|
312
305
|
if (!this.unknownBlockSync.isSubscribedToNetwork()) {
|
|
@@ -322,17 +315,8 @@ export class BeaconSync implements IBeaconSync {
|
|
|
322
315
|
// Same debounce as gossip: transient blips keep the rule running, only a real gap pauses it
|
|
323
316
|
this.chain.forkChoice.pauseFastConfirmation();
|
|
324
317
|
|
|
325
|
-
if (this.
|
|
326
|
-
this.logger.warn(
|
|
327
|
-
this.network
|
|
328
|
-
.unsubscribeGossipCoreTopics()
|
|
329
|
-
.then(() => {
|
|
330
|
-
this.metrics?.syncSwitchGossipSubscriptions.inc({action: "unsubscribed"});
|
|
331
|
-
this.logger.info("Un-subscribed gossip core topics");
|
|
332
|
-
})
|
|
333
|
-
.catch((e) => {
|
|
334
|
-
this.logger.error("Error unsubscribing to gossip core topics", {}, e);
|
|
335
|
-
});
|
|
318
|
+
if (this.setGossipSubscription(false)) {
|
|
319
|
+
this.logger.warn("Node sync has fallen behind", {slots: syncDiff});
|
|
336
320
|
}
|
|
337
321
|
|
|
338
322
|
// also stop searching for unknown blocks
|
|
@@ -344,6 +328,43 @@ export class BeaconSync implements IBeaconSync {
|
|
|
344
328
|
}
|
|
345
329
|
};
|
|
346
330
|
|
|
331
|
+
private setGossipSubscription(subscribe: boolean): boolean {
|
|
332
|
+
if ((this.pendingGossipSubscribed ?? this.network.isSubscribedToGossipCoreTopics()) === subscribe) return false;
|
|
333
|
+
const applying = this.pendingGossipSubscribed !== undefined;
|
|
334
|
+
this.pendingGossipSubscribed = subscribe;
|
|
335
|
+
if (!applying) void this.applyGossipSubscription();
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Applies the latest requested state one request at a time. Network skips a subscribe issued while an unsubscribe is
|
|
341
|
+
* in flight, so opposite requests must not overlap.
|
|
342
|
+
*/
|
|
343
|
+
private async applyGossipSubscription(): Promise<void> {
|
|
344
|
+
for (;;) {
|
|
345
|
+
const subscribe = this.pendingGossipSubscribed;
|
|
346
|
+
if (subscribe === undefined || subscribe === this.network.isSubscribedToGossipCoreTopics()) break;
|
|
347
|
+
try {
|
|
348
|
+
await (subscribe ? this.network.subscribeGossipCoreTopics() : this.network.unsubscribeGossipCoreTopics());
|
|
349
|
+
} catch (e) {
|
|
350
|
+
this.logger.error(
|
|
351
|
+
subscribe ? "Error subscribing to gossip core topics" : "Error unsubscribing to gossip core topics",
|
|
352
|
+
{},
|
|
353
|
+
e as Error
|
|
354
|
+
);
|
|
355
|
+
// Leave a retry of the same request to the next sync state update
|
|
356
|
+
if (this.pendingGossipSubscribed === subscribe) break;
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
if (this.pendingGossipSubscribed === undefined || this.network.isSubscribedToGossipCoreTopics() !== subscribe) {
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
this.metrics?.syncSwitchGossipSubscriptions.inc({action: subscribe ? "subscribed" : "unsubscribed"});
|
|
363
|
+
this.logger.info(subscribe ? "Subscribed gossip core topics" : "Un-subscribed gossip core topics");
|
|
364
|
+
}
|
|
365
|
+
this.pendingGossipSubscribed = undefined;
|
|
366
|
+
}
|
|
367
|
+
|
|
347
368
|
private onClockEpoch = (): void => {
|
|
348
369
|
// If a node witness the genesis event consider starting gossip
|
|
349
370
|
// Also, ensure that updateSyncState is run at least once per epoch.
|
package/src/sync/unknownBlock.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {RequestError, RequestErrorCode} from "@lodestar/reqresp";
|
|
|
6
6
|
import {computeTimeAtSlot} from "@lodestar/state-transition";
|
|
7
7
|
import {RootHex, Slot, gloas} from "@lodestar/types";
|
|
8
8
|
import {Logger, fromHex, isErrorAborted, prettyPrintIndices, pruneSetToMax, sleep, toRootHex} from "@lodestar/utils";
|
|
9
|
-
import {
|
|
9
|
+
import {isBlockInputColumns} from "../chain/blocks/blockInput/blockInput.js";
|
|
10
10
|
import {BlockInputSource, IBlockInput} from "../chain/blocks/blockInput/types.js";
|
|
11
11
|
import {PayloadError, PayloadErrorCode} from "../chain/blocks/importExecutionPayload.js";
|
|
12
12
|
import {PayloadEnvelopeInput, PayloadEnvelopeInputSource} from "../chain/blocks/payloadEnvelopeInput/index.js";
|
|
@@ -1910,13 +1910,6 @@ export class BlockInputSync {
|
|
|
1910
1910
|
throw new Error(`${message} Block was not found.`);
|
|
1911
1911
|
}
|
|
1912
1912
|
|
|
1913
|
-
if (isBlockInputBlobs(cacheItem.blockInput)) {
|
|
1914
|
-
const missing = cacheItem.blockInput.getMissingBlobMeta().map((b) => b.index);
|
|
1915
|
-
if (missing.length) {
|
|
1916
|
-
throw new Error(`${message} Missing blob indices=${prettyPrintIndices(missing)}.`);
|
|
1917
|
-
}
|
|
1918
|
-
}
|
|
1919
|
-
|
|
1920
1913
|
if (isBlockInputColumns(cacheItem.blockInput)) {
|
|
1921
1914
|
const missing = cacheItem.blockInput.getMissingSampledColumnMeta().missing;
|
|
1922
1915
|
if (missing.length) {
|