@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
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import {ATTESTATION_SUBNET_COUNT, ForkPostElectra} from "@lodestar/params";
|
|
2
|
+
import {EffectiveBalanceIncrements} from "@lodestar/state-transition";
|
|
3
|
+
import {BLSSignature, CommitteeIndex, RootHex, SingleAttestation, Slot, ValidatorIndex, phase0} from "@lodestar/types";
|
|
4
|
+
import {Metrics} from "../../metrics/metrics.js";
|
|
5
|
+
import {ProposerTracker} from "../proposerTracker.js";
|
|
6
|
+
import {InsertOutcome} from "./types.js";
|
|
7
|
+
|
|
8
|
+
type DataRootHex = string;
|
|
9
|
+
|
|
10
|
+
/** Position of a validator in its committee, i.e. its bit in `aggregationBits` */
|
|
11
|
+
type ValidatorCommitteeIndex = number;
|
|
12
|
+
|
|
13
|
+
/** `data` and `committeeIndex` are shared per data root and committee, only keep what packing reads */
|
|
14
|
+
type StoredSingle = {attesterIndex: ValidatorIndex; signature: BLSSignature};
|
|
15
|
+
|
|
16
|
+
type CommitteeSingles = {
|
|
17
|
+
/** Bit length of this committee's `aggregationBits` */
|
|
18
|
+
committeeSize: number;
|
|
19
|
+
singles: Map<ValidatorCommitteeIndex, StoredSingle>;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type DataRootSingles = {
|
|
23
|
+
/** Same for every single attestation under this data root */
|
|
24
|
+
data: phase0.AttestationData;
|
|
25
|
+
byCommittee: Map<CommitteeIndex, CommitteeSingles>;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** Single attestations of not yet included committee members, signatures are not aggregated yet */
|
|
29
|
+
export type SinglesForCommittee = {
|
|
30
|
+
committeeSize: number;
|
|
31
|
+
singles: {validatorCommitteeIndex: ValidatorCommitteeIndex; single: StoredSingle}[];
|
|
32
|
+
newSeenEffectiveBalance: number;
|
|
33
|
+
newSeenAttesters: number;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/** Attesters of an attestation included in a block, `attestingIndices` is not sorted */
|
|
37
|
+
export type IncludedAttesters = {slot: Slot; attDataRootHex: DataRootHex; attestingIndices: ValidatorIndex[]};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Backstop only, single attestations included in a canonical block are deleted (see `onHead`) so the real retention is
|
|
41
|
+
* far lower. Sized for all subnets during the default 8 slots before a proposal (`slotsToSubscribeBeforeProposalDuty`)
|
|
42
|
+
* with no block at all and up to 1024 attesters per committee, i.e. ~2M active validators. Earlier slots of the
|
|
43
|
+
* collected window only add the few subnets the node subscribes to anyway. Beyond it, newer singles are dropped
|
|
44
|
+
*/
|
|
45
|
+
const MAX_SINGLE_ATTESTATIONS_RETAINED = 8 * ATTESTATION_SUBNET_COUNT * 1024;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Single attestations to be packed into a block produced by this node, for votes that no aggregate covers.
|
|
49
|
+
* Callers only add to it for vote slots of an upcoming local proposal, see `ProposerTracker.shouldCollect()`.
|
|
50
|
+
* They are kept even if an aggregate covers them since proposers may not include that aggregate, until a canonical
|
|
51
|
+
* block includes them.
|
|
52
|
+
*/
|
|
53
|
+
export class SingleAttestationPool {
|
|
54
|
+
private readonly singlesByCommitteeByDataRootBySlot = new Map<Slot, Map<DataRootHex, DataRootSingles>>();
|
|
55
|
+
private size = 0;
|
|
56
|
+
/** Attesters included by the head block, deleted once a child of it becomes head */
|
|
57
|
+
private pendingPrune: {blockRoot: RootHex; included: IncludedAttesters[]} | null = null;
|
|
58
|
+
|
|
59
|
+
constructor(metrics: Metrics | null = null) {
|
|
60
|
+
metrics?.opPool.singleAttestationPool.size.addCollect(() =>
|
|
61
|
+
metrics.opPool.singleAttestationPool.size.set(this.size)
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @param validatorCommitteeIndex position of the attester in its committee, computed by gossip validation
|
|
67
|
+
*/
|
|
68
|
+
add(
|
|
69
|
+
attestation: SingleAttestation<ForkPostElectra>,
|
|
70
|
+
attDataRootHex: DataRootHex,
|
|
71
|
+
validatorCommitteeIndex: ValidatorCommitteeIndex,
|
|
72
|
+
committeeSize: number
|
|
73
|
+
): InsertOutcome {
|
|
74
|
+
if (this.size >= MAX_SINGLE_ATTESTATIONS_RETAINED) {
|
|
75
|
+
return InsertOutcome.ReachLimit;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const {data, committeeIndex, attesterIndex, signature} = attestation;
|
|
79
|
+
let singlesByCommitteeByDataRoot = this.singlesByCommitteeByDataRootBySlot.get(data.slot);
|
|
80
|
+
if (singlesByCommitteeByDataRoot === undefined) {
|
|
81
|
+
singlesByCommitteeByDataRoot = new Map();
|
|
82
|
+
this.singlesByCommitteeByDataRootBySlot.set(data.slot, singlesByCommitteeByDataRoot);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
let dataRootSingles = singlesByCommitteeByDataRoot.get(attDataRootHex);
|
|
86
|
+
if (dataRootSingles === undefined) {
|
|
87
|
+
dataRootSingles = {data, byCommittee: new Map()};
|
|
88
|
+
singlesByCommitteeByDataRoot.set(attDataRootHex, dataRootSingles);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let committee = dataRootSingles.byCommittee.get(committeeIndex);
|
|
92
|
+
if (committee === undefined) {
|
|
93
|
+
committee = {committeeSize, singles: new Map()};
|
|
94
|
+
dataRootSingles.byCommittee.set(committeeIndex, committee);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (committee.singles.has(validatorCommitteeIndex)) {
|
|
98
|
+
return InsertOutcome.AlreadyKnown;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
committee.singles.set(validatorCommitteeIndex, {attesterIndex, signature});
|
|
102
|
+
this.size++;
|
|
103
|
+
return InsertOutcome.NewData;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Delete single attestations included by the parent of the new head. Not the ones of the head itself: a proposer
|
|
108
|
+
* boost reorg of a weak head must keep them, once a child of it is the head that reorg can no longer happen.
|
|
109
|
+
* @param included attesters of the attestations included in the new head block
|
|
110
|
+
* @returns number of deleted single attestations
|
|
111
|
+
*/
|
|
112
|
+
onHead(blockRoot: RootHex, parentRoot: RootHex, included: IncludedAttesters[]): number {
|
|
113
|
+
if (this.singlesByCommitteeByDataRootBySlot.size === 0) {
|
|
114
|
+
this.pendingPrune = null;
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// a reorg or a parent imported while the pool was empty drops the pending block without deleting
|
|
119
|
+
const deleted = this.pendingPrune?.blockRoot === parentRoot ? this.deleteIncluded(this.pendingPrune.included) : 0;
|
|
120
|
+
this.pendingPrune = {blockRoot, included};
|
|
121
|
+
return deleted;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Drop vote slots that no upcoming local proposal can include */
|
|
125
|
+
prune(proposerTracker: ProposerTracker): void {
|
|
126
|
+
for (const [slot, singlesByCommitteeByDataRoot] of this.singlesByCommitteeByDataRootBySlot) {
|
|
127
|
+
if (proposerTracker.shouldCollect(slot)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
for (const dataRootSingles of singlesByCommitteeByDataRoot.values()) {
|
|
132
|
+
for (const committee of dataRootSingles.byCommittee.values()) {
|
|
133
|
+
this.size -= committee.singles.size;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
this.singlesByCommitteeByDataRootBySlot.delete(slot);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (this.singlesByCommitteeByDataRootBySlot.size === 0) {
|
|
140
|
+
this.pendingPrune = null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
isEmpty(): boolean {
|
|
145
|
+
return this.singlesByCommitteeByDataRootBySlot.size === 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
getStoredSlots(): Slot[] {
|
|
149
|
+
return Array.from(this.singlesByCommitteeByDataRootBySlot.keys());
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
getDataRoots(slot: Slot): Map<DataRootHex, phase0.AttestationData> {
|
|
153
|
+
const dataRoots = new Map<DataRootHex, phase0.AttestationData>();
|
|
154
|
+
for (const [attDataRootHex, dataRootSingles] of this.singlesByCommitteeByDataRootBySlot.get(slot) ?? []) {
|
|
155
|
+
dataRoots.set(attDataRootHex, dataRootSingles.data);
|
|
156
|
+
}
|
|
157
|
+
return dataRoots;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
getCommitteeIndices(slot: Slot, attDataRootHex: DataRootHex): CommitteeIndex[] {
|
|
161
|
+
return Array.from(this.singlesByCommitteeByDataRootBySlot.get(slot)?.get(attDataRootHex)?.byCommittee.keys() ?? []);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Single attestations of a committee whose attesters are in `notSeenCommitteeMembers`, i.e. not on chain and not
|
|
166
|
+
* covered by the aggregates picked for the block. `notSeenCommitteeMembers` is only read.
|
|
167
|
+
* Returns at most `maxCount` single attestations with the highest effective balances, without removing them from the
|
|
168
|
+
* pool.
|
|
169
|
+
*/
|
|
170
|
+
getUncovered(
|
|
171
|
+
slot: Slot,
|
|
172
|
+
attDataRootHex: DataRootHex,
|
|
173
|
+
committeeIndex: CommitteeIndex,
|
|
174
|
+
notSeenCommitteeMembers: ReadonlySet<ValidatorCommitteeIndex>,
|
|
175
|
+
effectiveBalanceIncrements: EffectiveBalanceIncrements,
|
|
176
|
+
maxCount: number
|
|
177
|
+
): SinglesForCommittee | null {
|
|
178
|
+
const committee = this.singlesByCommitteeByDataRootBySlot
|
|
179
|
+
.get(slot)
|
|
180
|
+
?.get(attDataRootHex)
|
|
181
|
+
?.byCommittee.get(committeeIndex);
|
|
182
|
+
if (committee === undefined) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const singles: SinglesForCommittee["singles"] = [];
|
|
187
|
+
// walk the smaller side, notSeenCommitteeMembers is usually tiny but close to the committee size if no aggregate
|
|
188
|
+
if (notSeenCommitteeMembers.size <= committee.singles.size) {
|
|
189
|
+
for (const validatorCommitteeIndex of notSeenCommitteeMembers) {
|
|
190
|
+
const single = committee.singles.get(validatorCommitteeIndex);
|
|
191
|
+
if (single !== undefined) {
|
|
192
|
+
singles.push({validatorCommitteeIndex, single});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} else {
|
|
196
|
+
for (const [validatorCommitteeIndex, single] of committee.singles) {
|
|
197
|
+
if (notSeenCommitteeMembers.has(validatorCommitteeIndex)) {
|
|
198
|
+
singles.push({validatorCommitteeIndex, single});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (singles.length > maxCount) {
|
|
203
|
+
singles.sort(
|
|
204
|
+
(a, b) =>
|
|
205
|
+
effectiveBalanceIncrements[b.single.attesterIndex] - effectiveBalanceIncrements[a.single.attesterIndex]
|
|
206
|
+
);
|
|
207
|
+
singles.length = maxCount;
|
|
208
|
+
}
|
|
209
|
+
if (singles.length === 0) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
let newSeenEffectiveBalance = 0;
|
|
214
|
+
for (const {single} of singles) {
|
|
215
|
+
newSeenEffectiveBalance += effectiveBalanceIncrements[single.attesterIndex];
|
|
216
|
+
}
|
|
217
|
+
return {committeeSize: committee.committeeSize, singles, newSeenEffectiveBalance, newSeenAttesters: singles.length};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Delete single attestations whose votes are already on chain, they add nothing to a block built on top of it.
|
|
222
|
+
* @param includedAttestations one entry per attestation in the body of a canonical block (the parent of the new
|
|
223
|
+
* head): the attestation slot and data root, and the validators it covers. A single attestation is included if its
|
|
224
|
+
* attester is in `attestingIndices` of an entry with the same slot and data root.
|
|
225
|
+
* @returns number of deleted single attestations
|
|
226
|
+
*/
|
|
227
|
+
private deleteIncluded(includedAttestations: IncludedAttesters[]): number {
|
|
228
|
+
// a block may include several attestations of the same data, merge their attesters per data root
|
|
229
|
+
const includedAttestersByDataRootBySlot = new Map<Slot, Map<DataRootHex, Set<ValidatorIndex>>>();
|
|
230
|
+
for (const {slot, attDataRootHex, attestingIndices} of includedAttestations) {
|
|
231
|
+
if (this.singlesByCommitteeByDataRootBySlot.get(slot)?.has(attDataRootHex) !== true) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
let includedAttestersByDataRoot = includedAttestersByDataRootBySlot.get(slot);
|
|
235
|
+
if (includedAttestersByDataRoot === undefined) {
|
|
236
|
+
includedAttestersByDataRoot = new Map();
|
|
237
|
+
includedAttestersByDataRootBySlot.set(slot, includedAttestersByDataRoot);
|
|
238
|
+
}
|
|
239
|
+
let includedAttesters = includedAttestersByDataRoot.get(attDataRootHex);
|
|
240
|
+
if (includedAttesters === undefined) {
|
|
241
|
+
includedAttesters = new Set();
|
|
242
|
+
includedAttestersByDataRoot.set(attDataRootHex, includedAttesters);
|
|
243
|
+
}
|
|
244
|
+
for (const attesterIndex of attestingIndices) {
|
|
245
|
+
includedAttesters.add(attesterIndex);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
let deleted = 0;
|
|
250
|
+
for (const [slot, includedAttestersByDataRoot] of includedAttestersByDataRootBySlot) {
|
|
251
|
+
const singlesByCommitteeByDataRoot = this.singlesByCommitteeByDataRootBySlot.get(slot);
|
|
252
|
+
if (singlesByCommitteeByDataRoot === undefined) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
for (const [attDataRootHex, includedAttesters] of includedAttestersByDataRoot) {
|
|
257
|
+
const dataRootSingles = singlesByCommitteeByDataRoot.get(attDataRootHex);
|
|
258
|
+
if (dataRootSingles === undefined) {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
for (const [committeeIndex, committee] of dataRootSingles.byCommittee) {
|
|
263
|
+
for (const [validatorCommitteeIndex, {attesterIndex}] of committee.singles) {
|
|
264
|
+
if (includedAttesters.has(attesterIndex)) {
|
|
265
|
+
committee.singles.delete(validatorCommitteeIndex);
|
|
266
|
+
deleted++;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (committee.singles.size === 0) {
|
|
270
|
+
dataRootSingles.byCommittee.delete(committeeIndex);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (dataRootSingles.byCommittee.size === 0) {
|
|
275
|
+
singlesByCommitteeByDataRoot.delete(attDataRootHex);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (singlesByCommitteeByDataRoot.size === 0) {
|
|
280
|
+
this.singlesByCommitteeByDataRootBySlot.delete(slot);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
this.size -= deleted;
|
|
285
|
+
return deleted;
|
|
286
|
+
}
|
|
287
|
+
}
|
package/src/chain/options.ts
CHANGED
|
@@ -43,8 +43,6 @@ export type IChainOptions = BlockProcessOpts &
|
|
|
43
43
|
disableProposerSlashings?: boolean;
|
|
44
44
|
/** Ensure blobs returned by the execution engine are valid */
|
|
45
45
|
sanityCheckExecutionEngineBlobs?: boolean;
|
|
46
|
-
/** Max number of produced blobs by local validators to cache */
|
|
47
|
-
maxCachedBlobSidecars?: number;
|
|
48
46
|
/** Max number of produced block roots (blinded or full) cached for broadcast validations */
|
|
49
47
|
maxCachedProducedRoots?: number;
|
|
50
48
|
initialCustodyGroupCount?: number;
|
|
@@ -90,6 +88,11 @@ export type PoolOpts = {
|
|
|
90
88
|
* Only preaggregate attestation/sync committee message since clockSlot - preaggregateSlotDistance
|
|
91
89
|
*/
|
|
92
90
|
preaggregateSlotDistance?: number;
|
|
91
|
+
/**
|
|
92
|
+
* Dev only: collect single attestations of every vote slot a block at the clock slot can include regardless of
|
|
93
|
+
* proposal duties, so that any produced block can pack them. Combine with `subscribeAllSubnets`
|
|
94
|
+
*/
|
|
95
|
+
singleAttestationIgnoreProposalDuty?: boolean;
|
|
93
96
|
};
|
|
94
97
|
|
|
95
98
|
export type SeenCacheOpts = {
|
|
@@ -72,12 +72,13 @@ import {
|
|
|
72
72
|
} from "@lodestar/utils";
|
|
73
73
|
import {ZERO_HASH_HEX} from "../../constants/index.js";
|
|
74
74
|
import {numToQuantity} from "../../execution/engine/utils.js";
|
|
75
|
-
import {IExecutionBuilder,
|
|
75
|
+
import {IExecutionBuilder, PayloadAttributes, PayloadId} from "../../execution/index.js";
|
|
76
76
|
import {getShufflingDependentRoot} from "../../util/dependentRoot.js";
|
|
77
77
|
import {fromGraffitiBytes} from "../../util/graffiti.js";
|
|
78
78
|
import {kzg} from "../../util/kzg.js";
|
|
79
79
|
import {BeaconProposerCache} from "../beaconProposerCache.js";
|
|
80
80
|
import type {BeaconChain} from "../chain.js";
|
|
81
|
+
import {ForkChoiceExecutionEngine} from "../forkChoiceExecutionEngine.js";
|
|
81
82
|
import {CommonBlockBody} from "../interface.js";
|
|
82
83
|
import {InclusionListStore, ProposerPreferencesPool} from "../opPools/index.js";
|
|
83
84
|
import {validateBlobsAndKzgCommitments, validateCellsAndKzgCommitments} from "./validateBlobsAndKzgCommitments.js";
|
|
@@ -742,7 +743,7 @@ export async function produceBlockBody<T extends BlockType>(
|
|
|
742
743
|
*/
|
|
743
744
|
export async function prepareExecutionPayload(
|
|
744
745
|
chain: {
|
|
745
|
-
executionEngine:
|
|
746
|
+
executionEngine: ForkChoiceExecutionEngine;
|
|
746
747
|
config: ChainForkConfig;
|
|
747
748
|
forkChoice: IForkChoice;
|
|
748
749
|
proposerPreferencesPool: ProposerPreferencesPool;
|
|
@@ -807,6 +808,7 @@ export async function prepareExecutionPayload(
|
|
|
807
808
|
|
|
808
809
|
payloadId = await chain.executionEngine.notifyForkchoiceUpdate(
|
|
809
810
|
fork,
|
|
811
|
+
toRootHex(parentBlockRoot),
|
|
810
812
|
toRootHex(parentBlockHash),
|
|
811
813
|
safeBlockHash,
|
|
812
814
|
finalizedBlockHash,
|
|
@@ -1125,11 +1127,13 @@ export async function produceCommonBlockBody<T extends BlockType>(
|
|
|
1125
1127
|
this.opPool.getSlashingsAndExits(currentState, blockType, this.metrics);
|
|
1126
1128
|
|
|
1127
1129
|
const endAttestations = stepsMetrics?.startTimer();
|
|
1130
|
+
// TODO: extract to a separate BeaconChain method to coordinate the 2 op-pools
|
|
1128
1131
|
const attestations = this.aggregatedAttestationPool.getAttestationsForBlock(
|
|
1129
1132
|
fork,
|
|
1130
1133
|
this.forkChoice,
|
|
1131
1134
|
this.shufflingCache,
|
|
1132
|
-
currentState
|
|
1135
|
+
currentState,
|
|
1136
|
+
this.singleAttestationPool
|
|
1133
1137
|
);
|
|
1134
1138
|
endAttestations?.({
|
|
1135
1139
|
step: BlockProductionStep.attestations,
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import {MIN_ATTESTATION_INCLUSION_DELAY} from "@lodestar/params";
|
|
2
|
+
import {computeEpochAtSlot, computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
3
|
+
import {Slot} from "@lodestar/types";
|
|
4
|
+
import {Metrics} from "../metrics/metrics.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Track upcoming block proposals of validators connected to this node, and the vote slots those blocks can include,
|
|
8
|
+
* to only then insert single attestations into the SingleAttestationPool
|
|
9
|
+
*/
|
|
10
|
+
export class ProposerTracker {
|
|
11
|
+
/** Local proposal slots that have not passed yet */
|
|
12
|
+
private readonly proposalSlots = new Set<Slot>();
|
|
13
|
+
/** Vote slots of tracked proposals, see `getFirstIncludableVoteSlot` */
|
|
14
|
+
private readonly collectableSlots = new Set<Slot>();
|
|
15
|
+
private clockSlot = 0;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @param ignoreProposalDuty dev only, collect every vote slot a block at the clock slot can include regardless of
|
|
19
|
+
* local proposals
|
|
20
|
+
*/
|
|
21
|
+
constructor(
|
|
22
|
+
private readonly ignoreProposalDuty = false,
|
|
23
|
+
metrics: Metrics | null = null
|
|
24
|
+
) {
|
|
25
|
+
metrics?.proposerTracker.proposalSlots.addCollect(() =>
|
|
26
|
+
metrics.proposerTracker.proposalSlots.set(this.proposalSlots.size)
|
|
27
|
+
);
|
|
28
|
+
metrics?.proposerTracker.collectableSlot.addCollect(() =>
|
|
29
|
+
metrics.proposerTracker.collectableSlot.set(this.shouldCollect(this.clockSlot) ? 1 : 0)
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Idempotent, a known proposal is ignored
|
|
35
|
+
* @returns true if the proposal was not tracked before
|
|
36
|
+
*/
|
|
37
|
+
addProposal(proposalSlot: Slot): boolean {
|
|
38
|
+
if (this.proposalSlots.has(proposalSlot)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
this.proposalSlots.add(proposalSlot);
|
|
43
|
+
for (
|
|
44
|
+
let voteSlot = getFirstIncludableVoteSlot(proposalSlot);
|
|
45
|
+
voteSlot <= proposalSlot - MIN_ATTESTATION_INCLUSION_DELAY;
|
|
46
|
+
voteSlot++
|
|
47
|
+
) {
|
|
48
|
+
this.collectableSlots.add(voteSlot);
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
shouldCollect(attestationSlot: Slot): boolean {
|
|
54
|
+
if (this.ignoreProposalDuty) {
|
|
55
|
+
// to test block production without proposal duties
|
|
56
|
+
return attestationSlot >= getFirstIncludableVoteSlot(this.clockSlot);
|
|
57
|
+
}
|
|
58
|
+
return this.collectableSlots.has(attestationSlot);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Drop proposals that have passed. A proposal is kept during its own slot so that its single attestations stay
|
|
63
|
+
* available until the block is produced. Vote slots are dropped once no remaining proposal can include them.
|
|
64
|
+
*/
|
|
65
|
+
prune(clockSlot: Slot): void {
|
|
66
|
+
this.clockSlot = clockSlot;
|
|
67
|
+
for (const proposalSlot of this.proposalSlots) {
|
|
68
|
+
if (proposalSlot < clockSlot) {
|
|
69
|
+
this.proposalSlots.delete(proposalSlot);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (this.proposalSlots.size === 0) {
|
|
74
|
+
this.collectableSlots.clear();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Each remaining proposal covers its own vote slots, so a vote slot below the lowest one is covered by none
|
|
79
|
+
const lowestCollectableVoteSlot = getFirstIncludableVoteSlot(Math.min(...this.proposalSlots));
|
|
80
|
+
for (const voteSlot of this.collectableSlots) {
|
|
81
|
+
if (voteSlot < lowestCollectableVoteSlot) {
|
|
82
|
+
this.collectableSlots.delete(voteSlot);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Since deneb (EIP-7045) a block includes attestations of its current and previous epoch, so the first vote slot it can
|
|
90
|
+
* include is the start of the previous epoch, 32 to 63 slots before it on mainnet
|
|
91
|
+
*/
|
|
92
|
+
function getFirstIncludableVoteSlot(blockSlot: Slot): Slot {
|
|
93
|
+
return computeStartSlotAtEpoch(Math.max(computeEpochAtSlot(blockSlot) - 1, 0));
|
|
94
|
+
}
|
|
@@ -52,7 +52,7 @@ export interface IStateRegenerator extends IStateRegeneratorInternal {
|
|
|
52
52
|
onCheckpoint(finalizedEpoch: Epoch, justifiedEpoch: Epoch, headStateRoot: RootHex): void;
|
|
53
53
|
processState(blockRootHex: RootHex, postState: IBeaconStateView): void;
|
|
54
54
|
addCheckpointState(cp: phase0.Checkpoint, item: IBeaconStateView): void;
|
|
55
|
-
updateHeadState(newHead: ProtoBlock, maybeHeadState
|
|
55
|
+
updateHeadState(newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void;
|
|
56
56
|
updatePreComputedCheckpoint(rootHex: RootHex, epoch: Epoch): number | null;
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -154,18 +154,20 @@ export class QueuedStateRegenerator implements IStateRegenerator {
|
|
|
154
154
|
this.checkpointStateCache.add(cp, item);
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
updateHeadState(newHead: ProtoBlock, maybeHeadState
|
|
157
|
+
updateHeadState(newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void {
|
|
158
158
|
const {stateRoot: newHeadStateRoot, blockRoot: newHeadBlockRoot, slot: newHeadSlot} = newHead;
|
|
159
|
-
const maybeHeadStateRoot = toRootHex(maybeHeadState.hashTreeRoot());
|
|
159
|
+
const maybeHeadStateRoot = maybeHeadState ? toRootHex(maybeHeadState.hashTreeRoot()) : undefined;
|
|
160
160
|
const logCtx = {
|
|
161
161
|
newHeadSlot,
|
|
162
162
|
newHeadBlockRoot,
|
|
163
163
|
newHeadStateRoot,
|
|
164
|
-
maybeHeadSlot: maybeHeadState
|
|
164
|
+
maybeHeadSlot: maybeHeadState?.slot,
|
|
165
165
|
maybeHeadStateRoot,
|
|
166
166
|
};
|
|
167
167
|
const headState =
|
|
168
|
-
newHeadStateRoot === maybeHeadStateRoot
|
|
168
|
+
maybeHeadState && newHeadStateRoot === maybeHeadStateRoot
|
|
169
|
+
? maybeHeadState
|
|
170
|
+
: this.blockStateCache.get(newHeadStateRoot);
|
|
169
171
|
|
|
170
172
|
if (headState) {
|
|
171
173
|
this.blockStateCache.setHeadState(headState);
|
|
@@ -4,15 +4,14 @@ import {
|
|
|
4
4
|
ForkName,
|
|
5
5
|
ForkPostFulu,
|
|
6
6
|
ForkPostGloas,
|
|
7
|
-
|
|
7
|
+
ForkPreFulu,
|
|
8
8
|
ForkPreGloas,
|
|
9
9
|
SLOTS_PER_EPOCH,
|
|
10
|
-
isForkPostDeneb,
|
|
11
10
|
isForkPostFulu,
|
|
12
11
|
isForkPostGloas,
|
|
13
12
|
} from "@lodestar/params";
|
|
14
13
|
import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
15
|
-
import {BLSSignature, RootHex, SignedBeaconBlock, Slot,
|
|
14
|
+
import {BLSSignature, RootHex, SignedBeaconBlock, Slot, fulu} from "@lodestar/types";
|
|
16
15
|
import {LodestarError, Logger, byteArrayEquals, pruneSetToMax} from "@lodestar/utils";
|
|
17
16
|
import {Metrics} from "../../metrics/metrics.js";
|
|
18
17
|
import {MAX_LOOK_AHEAD_EPOCHS} from "../../sync/constants.js";
|
|
@@ -21,19 +20,15 @@ import {CustodyConfig} from "../../util/dataColumns.js";
|
|
|
21
20
|
import {SerializedCache} from "../../util/serializedCache.js";
|
|
22
21
|
import {
|
|
23
22
|
BlockInput,
|
|
24
|
-
BlockInputBlobs,
|
|
25
23
|
BlockInputColumns,
|
|
26
24
|
BlockInputNoData,
|
|
27
25
|
BlockInputPreData,
|
|
28
26
|
BlockWithSource,
|
|
29
27
|
DAType,
|
|
30
|
-
ForkBlobsDA,
|
|
31
28
|
IBlockInput,
|
|
32
29
|
LogMetaBasic,
|
|
33
|
-
LogMetaBlobs,
|
|
34
30
|
LogMetaColumns,
|
|
35
31
|
SourceMeta,
|
|
36
|
-
isBlockInputBlobs,
|
|
37
32
|
isBlockInputColumns,
|
|
38
33
|
isDaOutOfRange,
|
|
39
34
|
} from "../blocks/blockInput/index.js";
|
|
@@ -62,20 +57,17 @@ export type SeenBlockInputCacheModules = {
|
|
|
62
57
|
logger?: Logger;
|
|
63
58
|
};
|
|
64
59
|
|
|
65
|
-
export type
|
|
60
|
+
export type GetByColumnOptions = {
|
|
66
61
|
throwErrorIfAlreadyKnown?: boolean;
|
|
67
62
|
};
|
|
68
63
|
|
|
69
64
|
/**
|
|
70
65
|
* Consumers that create BlockInputs or change types of old BlockInputs
|
|
71
66
|
*
|
|
72
|
-
* - gossipHandlers (block and
|
|
73
|
-
* -
|
|
74
|
-
* -
|
|
67
|
+
* - gossipHandlers (block and data column)
|
|
68
|
+
* - cacheByRangeResponses in sync/utils/downloadByRange.ts
|
|
69
|
+
* - downloadByRoot in sync/utils/downloadByRoot.ts
|
|
75
70
|
* - publishBlock in the beacon/blocks/index.ts API
|
|
76
|
-
* https://github.com/ChainSafe/lodestar/blob/unstable/packages/beacon-node/src/api/impl/beacon/blocks/index.ts#L62
|
|
77
|
-
* - maybeValidateBlobs in verifyBlocksDataAvailability (is_data_available spec function)
|
|
78
|
-
* https://github.com/ChainSafe/lodestar/blob/unstable/packages/beacon-node/src/chain/blocks/verifyBlocksDataAvailability.ts#L111
|
|
79
71
|
*
|
|
80
72
|
*
|
|
81
73
|
* Pruning management for SeenBlockInputCache
|
|
@@ -238,17 +230,6 @@ export class SeenBlockInput {
|
|
|
238
230
|
seenTimestampSec,
|
|
239
231
|
peerIdStr,
|
|
240
232
|
});
|
|
241
|
-
} else if (!isForkPostDeneb(forkName)) {
|
|
242
|
-
// Pre-deneb
|
|
243
|
-
blockInput = BlockInputPreData.createFromBlock({
|
|
244
|
-
block: block as SignedBeaconBlock<ForkPreDeneb>,
|
|
245
|
-
blockRootHex,
|
|
246
|
-
daOutOfRange,
|
|
247
|
-
forkName,
|
|
248
|
-
source,
|
|
249
|
-
seenTimestampSec,
|
|
250
|
-
peerIdStr,
|
|
251
|
-
});
|
|
252
233
|
} else if (isForkPostFulu(forkName)) {
|
|
253
234
|
// Fulu Only
|
|
254
235
|
blockInput = BlockInputColumns.createFromBlock({
|
|
@@ -263,9 +244,8 @@ export class SeenBlockInput {
|
|
|
263
244
|
peerIdStr,
|
|
264
245
|
});
|
|
265
246
|
} else {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
block: block as SignedBeaconBlock<ForkBlobsDA>,
|
|
247
|
+
blockInput = BlockInputPreData.createFromBlock({
|
|
248
|
+
block: block as SignedBeaconBlock<ForkPreFulu>,
|
|
269
249
|
blockRootHex,
|
|
270
250
|
daOutOfRange,
|
|
271
251
|
forkName,
|
|
@@ -288,66 +268,6 @@ export class SeenBlockInput {
|
|
|
288
268
|
return blockInput as BlockInput;
|
|
289
269
|
}
|
|
290
270
|
|
|
291
|
-
getByBlob(
|
|
292
|
-
{
|
|
293
|
-
blockRootHex,
|
|
294
|
-
blobSidecar,
|
|
295
|
-
source,
|
|
296
|
-
seenTimestampSec,
|
|
297
|
-
peerIdStr,
|
|
298
|
-
}: SourceMeta & {blockRootHex: RootHex; blobSidecar: deneb.BlobSidecar},
|
|
299
|
-
opts: GetByBlobOptions = {}
|
|
300
|
-
): BlockInputBlobs {
|
|
301
|
-
// TODO(peerDAS): Why is it necessary to static cast this here. All conditional paths result in a valid value so should be defined correctly below
|
|
302
|
-
let blockInput = this.blockInputs.get(blockRootHex) as IBlockInput;
|
|
303
|
-
let created = false;
|
|
304
|
-
if (!blockInput) {
|
|
305
|
-
created = true;
|
|
306
|
-
const {forkName, daOutOfRange} = this.buildCommonProps(blobSidecar.signedBlockHeader.message.slot);
|
|
307
|
-
blockInput = BlockInputBlobs.createFromBlob({
|
|
308
|
-
blobSidecar,
|
|
309
|
-
blockRootHex,
|
|
310
|
-
daOutOfRange,
|
|
311
|
-
forkName,
|
|
312
|
-
source,
|
|
313
|
-
seenTimestampSec,
|
|
314
|
-
peerIdStr,
|
|
315
|
-
});
|
|
316
|
-
this.metrics?.seenCache.blockInput.createdByBlob.inc();
|
|
317
|
-
this.blockInputs.set(blockRootHex, blockInput);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
if (!isBlockInputBlobs(blockInput)) {
|
|
321
|
-
throw new SeenBlockInputCacheError(
|
|
322
|
-
{
|
|
323
|
-
code: SeenBlockInputCacheErrorCode.WRONG_BLOCK_INPUT_TYPE,
|
|
324
|
-
cachedType: blockInput.type,
|
|
325
|
-
requestedType: DAType.Blobs,
|
|
326
|
-
...blockInput.getLogMeta(),
|
|
327
|
-
},
|
|
328
|
-
`BlockInputType mismatch adding blobIndex=${blobSidecar.index}`
|
|
329
|
-
);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
if (!blockInput.hasBlob(blobSidecar.index)) {
|
|
333
|
-
blockInput.addBlob({blobSidecar, blockRootHex, source, seenTimestampSec, peerIdStr});
|
|
334
|
-
} else if (!created) {
|
|
335
|
-
this.logger?.debug(
|
|
336
|
-
`Attempt to cache blob index #${blobSidecar.index} but is already cached on BlockInput`,
|
|
337
|
-
blockInput.getLogMeta()
|
|
338
|
-
);
|
|
339
|
-
this.metrics?.seenCache.blockInput.duplicateBlobCount.inc({source});
|
|
340
|
-
if (opts.throwErrorIfAlreadyKnown) {
|
|
341
|
-
throw new SeenBlockInputCacheError({
|
|
342
|
-
code: SeenBlockInputCacheErrorCode.GOSSIP_BLOB_ALREADY_KNOWN,
|
|
343
|
-
...blockInput.getLogMeta(),
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
return blockInput;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
271
|
getByColumn(
|
|
352
272
|
{
|
|
353
273
|
blockRootHex,
|
|
@@ -356,7 +276,7 @@ export class SeenBlockInput {
|
|
|
356
276
|
source,
|
|
357
277
|
peerIdStr,
|
|
358
278
|
}: SourceMeta & {blockRootHex: RootHex; columnSidecar: fulu.DataColumnSidecar},
|
|
359
|
-
opts:
|
|
279
|
+
opts: GetByColumnOptions = {}
|
|
360
280
|
): BlockInputColumns {
|
|
361
281
|
let blockInput = this.blockInputs.get(blockRootHex);
|
|
362
282
|
let created = false;
|
|
@@ -473,7 +393,6 @@ export class SeenBlockInput {
|
|
|
473
393
|
|
|
474
394
|
enum SeenBlockInputCacheErrorCode {
|
|
475
395
|
WRONG_BLOCK_INPUT_TYPE = "BLOCK_INPUT_CACHE_ERROR_WRONG_BLOCK_INPUT_TYPE",
|
|
476
|
-
GOSSIP_BLOB_ALREADY_KNOWN = "BLOCK_INPUT_CACHE_ERROR_GOSSIP_BLOB_ALREADY_KNOWN",
|
|
477
396
|
GOSSIP_COLUMN_ALREADY_KNOWN = "BLOCK_INPUT_CACHE_ERROR_GOSSIP_COLUMN_ALREADY_KNOWN",
|
|
478
397
|
}
|
|
479
398
|
|
|
@@ -483,9 +402,6 @@ type SeenBlockInputCacheErrorType =
|
|
|
483
402
|
cachedType: DAType;
|
|
484
403
|
requestedType: DAType;
|
|
485
404
|
})
|
|
486
|
-
| (LogMetaBlobs & {
|
|
487
|
-
code: SeenBlockInputCacheErrorCode.GOSSIP_BLOB_ALREADY_KNOWN;
|
|
488
|
-
})
|
|
489
405
|
| (LogMetaColumns & {
|
|
490
406
|
code: SeenBlockInputCacheErrorCode.GOSSIP_COLUMN_ALREADY_KNOWN;
|
|
491
407
|
});
|