@lodestar/beacon-node 1.51.0-dev.d422f387ac → 1.51.0-dev.d5620be4a1
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/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/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/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/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
package/src/chain/chain.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {Type} from "@chainsafe/ssz";
|
|
|
4
4
|
import {routes} from "@lodestar/api";
|
|
5
5
|
import {BeaconConfig} from "@lodestar/config";
|
|
6
6
|
import {
|
|
7
|
+
AncestorStatus,
|
|
7
8
|
CheckpointWithHex,
|
|
8
9
|
EpochDifference,
|
|
9
10
|
ForkChoiceStateGetter,
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
20
21
|
type ForkPostGloas,
|
|
21
22
|
GENESIS_SLOT,
|
|
22
23
|
SLOTS_PER_EPOCH,
|
|
24
|
+
isForkPostFulu,
|
|
23
25
|
isForkPostGloas,
|
|
24
26
|
} from "@lodestar/params";
|
|
25
27
|
import {
|
|
@@ -33,6 +35,7 @@ import {
|
|
|
33
35
|
isStatePostAltair,
|
|
34
36
|
isStatePostElectra,
|
|
35
37
|
isStatePostGloas,
|
|
38
|
+
proposerShufflingDecisionRoot,
|
|
36
39
|
} from "@lodestar/state-transition";
|
|
37
40
|
import {
|
|
38
41
|
BeaconBlock,
|
|
@@ -60,7 +63,6 @@ import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRoot
|
|
|
60
63
|
import {ProcessShutdownCallback} from "@lodestar/validator";
|
|
61
64
|
import {GENESIS_EPOCH, HALF_SLOT_BPS, ZERO_HASH} from "../constants/index.js";
|
|
62
65
|
import {IBeaconDb} from "../db/index.js";
|
|
63
|
-
import {BLOB_SIDECARS_IN_WRAPPER_INDEX} from "../db/repositories/blobSidecars.js";
|
|
64
66
|
import {decodeArchivedEnvelope} from "../db/repositories/index.js";
|
|
65
67
|
import {BuilderApiClient, BuilderApiClientOpts} from "../execution/builder/apiClient.js";
|
|
66
68
|
import {BuilderStatus} from "../execution/builder/http.js";
|
|
@@ -80,7 +82,7 @@ import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.js";
|
|
|
80
82
|
import {ArchiveStore} from "./archiveStore/archiveStore.js";
|
|
81
83
|
import {CheckpointBalancesCache} from "./balancesCache.js";
|
|
82
84
|
import {BeaconProposerCache} from "./beaconProposerCache.js";
|
|
83
|
-
import {IBlockInput,
|
|
85
|
+
import {IBlockInput, isBlockInputColumns} from "./blocks/blockInput/index.js";
|
|
84
86
|
import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
|
|
85
87
|
import {PayloadEnvelopeInputSource} from "./blocks/payloadEnvelopeInput/index.js";
|
|
86
88
|
import {PayloadEnvelopeProcessor} from "./blocks/payloadEnvelopeProcessor.js";
|
|
@@ -90,8 +92,9 @@ import {persistPayloadEnvelopeInput} from "./blocks/writePayloadEnvelopeInputToD
|
|
|
90
92
|
import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
|
|
91
93
|
import {BuilderCircuitBreaker} from "./builderCircuitBreaker.js";
|
|
92
94
|
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
93
|
-
import {ChainEvent, ChainEventEmitter} from "./emitter.js";
|
|
95
|
+
import {ChainEvent, ChainEventEmitter, ReorgEventData} from "./emitter.js";
|
|
94
96
|
import {ForkchoiceCaller, initializeForkChoice} from "./forkChoice/index.js";
|
|
97
|
+
import {ForkChoiceExecutionEngine} from "./forkChoiceExecutionEngine.js";
|
|
95
98
|
import {GetBlobsTracker} from "./GetBlobsTracker.js";
|
|
96
99
|
import {CommonBlockBody, FindHeadFnName, IBeaconChain, ProposerPreparationData, StateGetOpts} from "./interface.js";
|
|
97
100
|
import {LightClientServer} from "./lightClient/index.js";
|
|
@@ -104,6 +107,7 @@ import {
|
|
|
104
107
|
OpPool,
|
|
105
108
|
PayloadAttestationPool,
|
|
106
109
|
ProposerPreferencesPool,
|
|
110
|
+
SingleAttestationPool,
|
|
107
111
|
SyncCommitteeMessagePool,
|
|
108
112
|
SyncContributionAndProofPool,
|
|
109
113
|
} from "./opPools/index.js";
|
|
@@ -112,6 +116,7 @@ import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
|
|
|
112
116
|
import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
|
|
113
117
|
import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
|
|
114
118
|
import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
|
|
119
|
+
import {ProposerTracker} from "./proposerTracker.js";
|
|
115
120
|
import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
|
|
116
121
|
import {ReprocessController} from "./reprocess.js";
|
|
117
122
|
import {
|
|
@@ -166,7 +171,7 @@ const DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES = 16;
|
|
|
166
171
|
export class BeaconChain implements IBeaconChain {
|
|
167
172
|
readonly genesisTime: UintNum64;
|
|
168
173
|
readonly genesisValidatorsRoot: Root;
|
|
169
|
-
readonly executionEngine:
|
|
174
|
+
readonly executionEngine: ForkChoiceExecutionEngine;
|
|
170
175
|
readonly executionBuilder?: IExecutionBuilder;
|
|
171
176
|
readonly builderCircuitBreaker: BuilderCircuitBreaker;
|
|
172
177
|
readonly builderApiClient: BuilderApiClient;
|
|
@@ -194,6 +199,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
194
199
|
// Ops pool
|
|
195
200
|
readonly attestationPool: AttestationPool;
|
|
196
201
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
202
|
+
readonly singleAttestationPool: SingleAttestationPool;
|
|
203
|
+
readonly proposerTracker: ProposerTracker;
|
|
204
|
+
/**
|
|
205
|
+
* Head state epoch and decision root of its next epoch proposers when local proposals were last refreshed. The root
|
|
206
|
+
* alone is not enough: a reorg onto a branch without blocks in a whole epoch keeps the root but moves the epoch
|
|
207
|
+
*/
|
|
208
|
+
private localProposalsKey: string | null = null;
|
|
197
209
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
198
210
|
readonly syncContributionAndProofPool;
|
|
199
211
|
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
@@ -317,7 +329,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
317
329
|
this.genesisTime = anchorState.genesisTime;
|
|
318
330
|
this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
|
|
319
331
|
this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
|
|
320
|
-
this.executionEngine = executionEngine;
|
|
321
332
|
this.executionBuilder = executionBuilder;
|
|
322
333
|
const signal = this.abortController.signal;
|
|
323
334
|
const emitter = new ChainEventEmitter();
|
|
@@ -331,6 +342,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
331
342
|
this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
|
|
332
343
|
this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
|
|
333
344
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics, logger);
|
|
345
|
+
this.singleAttestationPool = new SingleAttestationPool(metrics);
|
|
346
|
+
this.proposerTracker = new ProposerTracker(this.opts.singleAttestationIgnoreProposalDuty ?? false, metrics);
|
|
334
347
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
335
348
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
336
349
|
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
@@ -457,6 +470,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
457
470
|
this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
|
|
458
471
|
|
|
459
472
|
this.forkChoice = forkChoice;
|
|
473
|
+
this.executionEngine = new ForkChoiceExecutionEngine(executionEngine, {
|
|
474
|
+
forkChoice,
|
|
475
|
+
recomputeHeadAfterELInvalidResponse: () => this.recomputeHeadAfterELInvalidResponse(),
|
|
476
|
+
logger,
|
|
477
|
+
metrics,
|
|
478
|
+
});
|
|
460
479
|
|
|
461
480
|
this.builderCircuitBreaker = new BuilderCircuitBreaker(
|
|
462
481
|
{faultInspectionWindow: opts.faultInspectionWindow, allowedFaults: opts.allowedFaults},
|
|
@@ -933,16 +952,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
933
952
|
}
|
|
934
953
|
|
|
935
954
|
async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
|
|
936
|
-
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
937
|
-
if (blockInput) {
|
|
938
|
-
if (!isBlockInputBlobs(blockInput)) {
|
|
939
|
-
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
940
|
-
}
|
|
941
|
-
if (!blockInput.hasAllData()) {
|
|
942
|
-
return null;
|
|
943
|
-
}
|
|
944
|
-
return blockInput.getBlobs();
|
|
945
|
-
}
|
|
946
955
|
const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
|
|
947
956
|
if (unfinalizedBlobSidecars) {
|
|
948
957
|
return unfinalizedBlobSidecars;
|
|
@@ -950,28 +959,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
950
959
|
return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
|
|
951
960
|
}
|
|
952
961
|
|
|
953
|
-
async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
954
|
-
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
955
|
-
if (blockInput) {
|
|
956
|
-
if (!isBlockInputBlobs(blockInput)) {
|
|
957
|
-
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
958
|
-
}
|
|
959
|
-
if (!blockInput.hasAllData()) {
|
|
960
|
-
return null;
|
|
961
|
-
}
|
|
962
|
-
return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
|
|
963
|
-
}
|
|
964
|
-
const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
|
|
965
|
-
if (unfinalizedBlobSidecarsWrapper) {
|
|
966
|
-
return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
967
|
-
}
|
|
968
|
-
const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
|
|
969
|
-
if (finalizedBlobSidecarsWrapper) {
|
|
970
|
-
return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
971
|
-
}
|
|
972
|
-
return null;
|
|
973
|
-
}
|
|
974
|
-
|
|
975
962
|
async getSerializedExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
976
963
|
const [bytes] = await this.getSerializedExecutionPayloadEnvelopes([{blockSlot, blockRootHex}]);
|
|
977
964
|
return bytes;
|
|
@@ -1430,6 +1417,58 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1430
1417
|
}
|
|
1431
1418
|
}
|
|
1432
1419
|
|
|
1420
|
+
/**
|
|
1421
|
+
* Apply chain side effects of a fork choice head change: head state, head metrics, and reorg detection
|
|
1422
|
+
*/
|
|
1423
|
+
onHeadChanged(oldHead: ProtoBlock, newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void {
|
|
1424
|
+
// Set head state as strong reference
|
|
1425
|
+
this.regen.updateHeadState(newHead, maybeHeadState);
|
|
1426
|
+
|
|
1427
|
+
const delaySec = this.clock.secFromSlot(newHead.slot);
|
|
1428
|
+
this.logger.verbose("New chain head", {
|
|
1429
|
+
slot: newHead.slot,
|
|
1430
|
+
root: newHead.blockRoot,
|
|
1431
|
+
payloadStatus: newHead.payloadStatus,
|
|
1432
|
+
delaySec,
|
|
1433
|
+
});
|
|
1434
|
+
this.metrics?.headSlot.set(newHead.slot);
|
|
1435
|
+
|
|
1436
|
+
this.onNewHead(newHead);
|
|
1437
|
+
this.metrics?.forkChoice.changedHead.inc();
|
|
1438
|
+
|
|
1439
|
+
const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
|
|
1440
|
+
if (ancestorResult.code === AncestorStatus.CommonAncestor) {
|
|
1441
|
+
// CommonAncestor = chain reorg, old head and new head not direct descendants
|
|
1442
|
+
|
|
1443
|
+
const forkChoiceReorgEventData: ReorgEventData = {
|
|
1444
|
+
depth: ancestorResult.depth,
|
|
1445
|
+
epoch: computeEpochAtSlot(newHead.slot),
|
|
1446
|
+
slot: newHead.slot,
|
|
1447
|
+
newHeadBlock: newHead.blockRoot,
|
|
1448
|
+
oldHeadBlock: oldHead.blockRoot,
|
|
1449
|
+
newHeadState: newHead.stateRoot,
|
|
1450
|
+
oldHeadState: oldHead.stateRoot,
|
|
1451
|
+
executionOptimistic: isOptimisticBlock(newHead),
|
|
1452
|
+
};
|
|
1453
|
+
|
|
1454
|
+
this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
|
|
1455
|
+
this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
|
|
1456
|
+
|
|
1457
|
+
this.metrics?.forkChoice.reorg.inc();
|
|
1458
|
+
this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
private recomputeHeadAfterELInvalidResponse(): void {
|
|
1463
|
+
// validateLatestHash only re-scores proto-array, the cached head is still the old one
|
|
1464
|
+
const oldHead = this.forkChoice.getHead();
|
|
1465
|
+
const newHead = this.recomputeForkChoiceHead(ForkchoiceCaller.executionInvalid);
|
|
1466
|
+
if (newHead.blockRoot === oldHead.blockRoot && newHead.payloadStatus === oldHead.payloadStatus) {
|
|
1467
|
+
return;
|
|
1468
|
+
}
|
|
1469
|
+
this.onHeadChanged(oldHead, newHead);
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1433
1472
|
/**
|
|
1434
1473
|
* Emit `head` and `head_v2` when the fork choice head differs between two observations. Every caller that
|
|
1435
1474
|
* can move the head, `updateAndGetHead()` and `updateTime()`, must capture the head before and pass both.
|
|
@@ -1829,6 +1868,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1829
1868
|
|
|
1830
1869
|
this.attestationPool.prune(slot);
|
|
1831
1870
|
this.aggregatedAttestationPool.prune(slot);
|
|
1871
|
+
this.proposerTracker.prune(slot);
|
|
1872
|
+
this.singleAttestationPool.prune(this.proposerTracker);
|
|
1832
1873
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1833
1874
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1834
1875
|
this.payloadAttestationPool.prune(slot);
|
|
@@ -1855,6 +1896,55 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1855
1896
|
}
|
|
1856
1897
|
}
|
|
1857
1898
|
|
|
1899
|
+
/**
|
|
1900
|
+
* Track upcoming proposals of validators connected to this node, so that SingleAttestationPool only collects and
|
|
1901
|
+
* the network only subscribes to all attestation subnets before them. Proposals only change when the decision block
|
|
1902
|
+
* of next epoch proposers changes (the head enters a new epoch or reorgs that block) or a new validator connects,
|
|
1903
|
+
* set localProposalsKey to null before calling for the latter.
|
|
1904
|
+
* Never throws, it runs during block import.
|
|
1905
|
+
*/
|
|
1906
|
+
private refreshLocalProposals(): void {
|
|
1907
|
+
const clockSlot = this.clock.currentSlot;
|
|
1908
|
+
try {
|
|
1909
|
+
const headState = this.getHeadState();
|
|
1910
|
+
const headFork = this.config.getForkName(headState.slot);
|
|
1911
|
+
// post-fulu, the head state knows proposers of its epoch and the next one thanks to the proposer lookahead,
|
|
1912
|
+
// a pre-fulu state only predicts next epoch proposers
|
|
1913
|
+
if (!isForkPostFulu(headFork) || headState.epoch < computeEpochAtSlot(clockSlot) - 1) {
|
|
1914
|
+
return;
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
const decisionRoot = proposerShufflingDecisionRoot(headFork, headState, headState.epoch + 1);
|
|
1918
|
+
if (decisionRoot === null) {
|
|
1919
|
+
return;
|
|
1920
|
+
}
|
|
1921
|
+
const localProposalsKey = `${headState.epoch}_${toRootHex(decisionRoot)}`;
|
|
1922
|
+
if (localProposalsKey === this.localProposalsKey) {
|
|
1923
|
+
return;
|
|
1924
|
+
}
|
|
1925
|
+
this.localProposalsKey = localProposalsKey;
|
|
1926
|
+
|
|
1927
|
+
const startSlot = computeStartSlotAtEpoch(headState.epoch);
|
|
1928
|
+
const newProposalSlots: Slot[] = [];
|
|
1929
|
+
for (const [i, proposerIndex] of [...headState.currentProposers, ...headState.nextProposers].entries()) {
|
|
1930
|
+
const proposalSlot = startSlot + i;
|
|
1931
|
+
if (
|
|
1932
|
+
proposalSlot >= clockSlot &&
|
|
1933
|
+
this.beaconProposerCache.has(proposerIndex) &&
|
|
1934
|
+
this.proposerTracker.addProposal(proposalSlot)
|
|
1935
|
+
) {
|
|
1936
|
+
newProposalSlots.push(proposalSlot);
|
|
1937
|
+
}
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
if (newProposalSlots.length > 0) {
|
|
1941
|
+
this.emitter.emit(ChainEvent.localProposalSlots, newProposalSlots);
|
|
1942
|
+
}
|
|
1943
|
+
} catch (e) {
|
|
1944
|
+
this.logger.debug("Error refreshing local proposals", {slot: clockSlot}, e as Error);
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1858
1948
|
private onClockEpoch(epoch: Epoch): void {
|
|
1859
1949
|
this.metrics?.clockEpoch.set(epoch);
|
|
1860
1950
|
|
|
@@ -1869,6 +1959,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1869
1959
|
protected onNewHead(head: ProtoBlock): void {
|
|
1870
1960
|
this.syncContributionAndProofPool.prune(head.slot);
|
|
1871
1961
|
this.seenContributionAndProof.prune(head.slot);
|
|
1962
|
+
|
|
1963
|
+
this.refreshLocalProposals();
|
|
1872
1964
|
}
|
|
1873
1965
|
|
|
1874
1966
|
private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
|
|
@@ -1937,6 +2029,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1937
2029
|
|
|
1938
2030
|
// Only update validator custody if we discovered new validators
|
|
1939
2031
|
if (newValidatorCount > previousValidatorCount) {
|
|
2032
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2033
|
+
this.localProposalsKey = null;
|
|
2034
|
+
this.refreshLocalProposals();
|
|
1940
2035
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1941
2036
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1942
2037
|
}
|
|
@@ -1952,6 +2047,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1952
2047
|
|
|
1953
2048
|
// Only update validator custody if we discovered new validators
|
|
1954
2049
|
if (hasNewValidators) {
|
|
2050
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2051
|
+
this.localProposalsKey = null;
|
|
2052
|
+
this.refreshLocalProposals();
|
|
1955
2053
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1956
2054
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1957
2055
|
}
|
package/src/chain/emitter.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {StrictEventEmitter} from "strict-event-emitter-types";
|
|
|
3
3
|
import {routes} from "@lodestar/api";
|
|
4
4
|
import {CheckpointWithHex, PtcQuorumEvent} from "@lodestar/fork-choice";
|
|
5
5
|
import {IBeaconStateView} from "@lodestar/state-transition";
|
|
6
|
-
import {DataColumnSidecar, RootHex, Slot,
|
|
6
|
+
import {DataColumnSidecar, RootHex, Slot, phase0} from "@lodestar/types";
|
|
7
7
|
import {PeerIdStr} from "../util/peerId.js";
|
|
8
8
|
import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
|
|
9
9
|
import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
|
|
@@ -50,16 +50,16 @@ export enum ChainEvent {
|
|
|
50
50
|
* and are ready to be published.
|
|
51
51
|
*/
|
|
52
52
|
publishDataColumns = "publishDataColumns",
|
|
53
|
-
/**
|
|
54
|
-
* This event signals that blobs have been fetched from the execution engine
|
|
55
|
-
* and are ready to be published.
|
|
56
|
-
*/
|
|
57
|
-
publishBlobSidecars = "publishBlobSidecars",
|
|
58
53
|
/**
|
|
59
54
|
* This event signals that a proposer slashing has been produced from an observed equivocation
|
|
60
55
|
* and is ready to be published.
|
|
61
56
|
*/
|
|
62
57
|
publishProposerSlashing = "publishProposerSlashing",
|
|
58
|
+
/**
|
|
59
|
+
* New block proposal slots of validators connected to this node, the network subscribes to all attestation
|
|
60
|
+
* subnets before them, see `slotsToSubscribeBeforeProposalDuty`
|
|
61
|
+
*/
|
|
62
|
+
localProposalSlots = "localProposalSlots",
|
|
63
63
|
/**
|
|
64
64
|
* Trigger an update of status so reqresp by peers have current earliestAvailableSlot
|
|
65
65
|
*/
|
|
@@ -123,10 +123,10 @@ export type IChainEvents = ApiEvents & {
|
|
|
123
123
|
|
|
124
124
|
[ChainEvent.publishDataColumns]: (sidecars: DataColumnSidecar[]) => void;
|
|
125
125
|
|
|
126
|
-
[ChainEvent.publishBlobSidecars]: (sidecars: deneb.BlobSidecar[]) => void;
|
|
127
|
-
|
|
128
126
|
[ChainEvent.publishProposerSlashing]: (proposerSlashing: phase0.ProposerSlashing) => void;
|
|
129
127
|
|
|
128
|
+
[ChainEvent.localProposalSlots]: (proposalSlots: Slot[]) => void;
|
|
129
|
+
|
|
130
130
|
[ChainEvent.updateStatus]: () => void;
|
|
131
131
|
|
|
132
132
|
// Sync events that are chain->chain. Initiated from network requests but do not cross the network
|
|
@@ -12,6 +12,7 @@ export enum ExecutionPayloadEnvelopeErrorCode {
|
|
|
12
12
|
BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
|
|
13
13
|
BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
|
|
14
14
|
EXECUTION_REQUESTS_ROOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_EXECUTION_REQUESTS_ROOT_MISMATCH",
|
|
15
|
+
TOO_MANY_TRANSACTIONS = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_TOO_MANY_TRANSACTIONS",
|
|
15
16
|
INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
|
|
16
17
|
PAYLOAD_ENVELOPE_INPUT_MISSING = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_PAYLOAD_ENVELOPE_INPUT_MISSING",
|
|
17
18
|
}
|
|
@@ -54,6 +55,13 @@ export type ExecutionPayloadEnvelopeErrorType =
|
|
|
54
55
|
envelopeRequestsRoot: RootHex;
|
|
55
56
|
bidRequestsRoot: RootHex;
|
|
56
57
|
}
|
|
58
|
+
| {
|
|
59
|
+
code: ExecutionPayloadEnvelopeErrorCode.TOO_MANY_TRANSACTIONS;
|
|
60
|
+
slot: Slot;
|
|
61
|
+
root: RootHex;
|
|
62
|
+
transactionCount: number;
|
|
63
|
+
maxTransactionCount: number;
|
|
64
|
+
}
|
|
57
65
|
| {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE; slot: Slot; root: RootHex}
|
|
58
66
|
| {code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING; blockRoot: RootHex};
|
|
59
67
|
|
|
@@ -34,6 +34,17 @@ export type ForkChoiceOpts = RawForkChoiceOpts & {
|
|
|
34
34
|
export enum ForkchoiceCaller {
|
|
35
35
|
prepareNextSlot = "prepare_next_slot",
|
|
36
36
|
importBlock = "import_block",
|
|
37
|
+
executionInvalid = "execution_invalid",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Where an execution engine INVALID verdict comes from. Only `blockSegment` verdicts are about the payload the engine
|
|
42
|
+
* just processed and keep the consensus failure semantics in fork choice, the others are applied leniently.
|
|
43
|
+
*/
|
|
44
|
+
export enum ExecutionInvalidSource {
|
|
45
|
+
forkchoiceUpdated = "forkchoice_updated",
|
|
46
|
+
newPayload = "new_payload",
|
|
47
|
+
blockSegment = "block_segment",
|
|
37
48
|
}
|
|
38
49
|
|
|
39
50
|
/**
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import {ExecutionStatus, IForkChoice, LVHInvalidResponse} from "@lodestar/fork-choice";
|
|
2
|
+
import {ForkName, ForkPostFulu} from "@lodestar/params";
|
|
3
|
+
import {RootHex, bellatrix} from "@lodestar/types";
|
|
4
|
+
import {BlobAndProofV2} from "@lodestar/types/fulu";
|
|
5
|
+
import {Logger} from "@lodestar/utils";
|
|
6
|
+
import {ExecutionPayloadBodyV2} from "../execution/engine/types.js";
|
|
7
|
+
import {DATA} from "../execution/engine/utils.js";
|
|
8
|
+
import {
|
|
9
|
+
ClientVersion,
|
|
10
|
+
ExecutionEngineState,
|
|
11
|
+
ExecutionPayloadStatus,
|
|
12
|
+
ForkchoiceUpdatedResult,
|
|
13
|
+
IExecutionEngine,
|
|
14
|
+
PayloadAttributes,
|
|
15
|
+
PayloadId,
|
|
16
|
+
PayloadIdCache,
|
|
17
|
+
VersionedHashes,
|
|
18
|
+
} from "../execution/index.js";
|
|
19
|
+
import {Metrics} from "../metrics/index.js";
|
|
20
|
+
import {ExecutionInvalidSource} from "./forkChoice/index.js";
|
|
21
|
+
|
|
22
|
+
export type ForkChoiceExecutionEngineModules = {
|
|
23
|
+
forkChoice: IForkChoice;
|
|
24
|
+
/** Recompute and switch the chain head, fork choice is already updated when this runs */
|
|
25
|
+
recomputeHeadAfterELInvalidResponse: () => void;
|
|
26
|
+
logger: Logger;
|
|
27
|
+
metrics: Metrics | null;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The only handle on the execution engine. Payloads are imported optimistically, so every engine verdict that can
|
|
32
|
+
* change fork choice is applied here.
|
|
33
|
+
*/
|
|
34
|
+
export class ForkChoiceExecutionEngine {
|
|
35
|
+
private readonly forkChoice: IForkChoice;
|
|
36
|
+
private readonly recomputeHeadAfterELInvalidResponse: () => void;
|
|
37
|
+
private readonly logger: Logger;
|
|
38
|
+
private readonly metrics: Metrics | null;
|
|
39
|
+
|
|
40
|
+
constructor(
|
|
41
|
+
private readonly engine: IExecutionEngine,
|
|
42
|
+
modules: ForkChoiceExecutionEngineModules
|
|
43
|
+
) {
|
|
44
|
+
this.forkChoice = modules.forkChoice;
|
|
45
|
+
this.recomputeHeadAfterELInvalidResponse = modules.recomputeHeadAfterELInvalidResponse;
|
|
46
|
+
this.logger = modules.logger;
|
|
47
|
+
this.metrics = modules.metrics;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
get state(): ExecutionEngineState {
|
|
51
|
+
return this.engine.state;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
get clientVersion(): ClientVersion | null | undefined {
|
|
55
|
+
return this.engine.clientVersion;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get payloadIdCache(): PayloadIdCache {
|
|
59
|
+
return this.engine.payloadIdCache;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
notifyNewPayload(
|
|
63
|
+
...args: Parameters<IExecutionEngine["notifyNewPayload"]>
|
|
64
|
+
): ReturnType<IExecutionEngine["notifyNewPayload"]> {
|
|
65
|
+
return this.engine.notifyNewPayload(...args);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* `headBlockRoot` is the root of the node whose payload hash is sent as `headBlockHash`, captured by the caller
|
|
70
|
+
* before the call: root and hash identify the exact fork choice node, gloas variant included.
|
|
71
|
+
*
|
|
72
|
+
* The verdict is applied to fork choice before returning. An INVALID verdict throws when preparing a payload so
|
|
73
|
+
* block production fails, otherwise it resolves to null.
|
|
74
|
+
*/
|
|
75
|
+
async notifyForkchoiceUpdate(
|
|
76
|
+
fork: ForkName,
|
|
77
|
+
headBlockRoot: RootHex,
|
|
78
|
+
headBlockHash: RootHex,
|
|
79
|
+
safeBlockHash: RootHex,
|
|
80
|
+
finalizedBlockHash: RootHex,
|
|
81
|
+
payloadAttributes?: PayloadAttributes
|
|
82
|
+
): Promise<PayloadId | null> {
|
|
83
|
+
const result = await this.engine.notifyForkchoiceUpdate(
|
|
84
|
+
fork,
|
|
85
|
+
headBlockHash,
|
|
86
|
+
safeBlockHash,
|
|
87
|
+
finalizedBlockHash,
|
|
88
|
+
payloadAttributes
|
|
89
|
+
);
|
|
90
|
+
this.applyForkchoiceUpdatedResult(headBlockRoot, headBlockHash, result);
|
|
91
|
+
|
|
92
|
+
if (result.payloadStatus.status === ExecutionPayloadStatus.INVALID) {
|
|
93
|
+
if (payloadAttributes) {
|
|
94
|
+
throw Error(`Invalid prepare payload, validationError=${result.payloadStatus.validationError ?? ""}`);
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return result.payloadId;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
getPayload(...args: Parameters<IExecutionEngine["getPayload"]>): ReturnType<IExecutionEngine["getPayload"]> {
|
|
102
|
+
return this.engine.getPayload(...args);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
getInclusionList(): Promise<bellatrix.Transactions> {
|
|
106
|
+
return this.engine.getInclusionList();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
getPayloadBodiesByHashV2(blockHashes: DATA[]): Promise<(ExecutionPayloadBodyV2 | null)[]> {
|
|
110
|
+
return this.engine.getPayloadBodiesByHashV2(blockHashes);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
getBlobs(
|
|
114
|
+
fork: ForkPostFulu,
|
|
115
|
+
versionedHashes: VersionedHashes,
|
|
116
|
+
buffers?: Uint8Array[]
|
|
117
|
+
): Promise<BlobAndProofV2[] | null> {
|
|
118
|
+
return this.engine.getBlobs(fork, versionedHashes, buffers);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Apply an execution engine INVALID verdict to fork choice and move the chain head off the invalid chain
|
|
123
|
+
*/
|
|
124
|
+
invalidateExecutionPayloads(lvh: LVHInvalidResponse, source: ExecutionInvalidSource): void {
|
|
125
|
+
const logCtx = {
|
|
126
|
+
source,
|
|
127
|
+
blockRoot: lvh.invalidateFromParentBlockRoot,
|
|
128
|
+
blockHash: lvh.invalidateFromParentBlockHash,
|
|
129
|
+
latestValidHash: lvh.latestValidExecHash ?? "null",
|
|
130
|
+
};
|
|
131
|
+
const applied = this.forkChoice.validateLatestHash(lvh, {strict: source === ExecutionInvalidSource.blockSegment});
|
|
132
|
+
if (!applied) {
|
|
133
|
+
this.logger.warn("Execution engine INVALID verdict not applied to fork choice", logCtx);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.metrics?.forkChoice.executionInvalidations.inc({source});
|
|
137
|
+
this.logger.warn("Invalidated execution payloads in fork choice", logCtx);
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
this.recomputeHeadAfterELInvalidResponse();
|
|
141
|
+
} catch (e) {
|
|
142
|
+
this.logger.error("Error recomputing head after execution payload invalidation", logCtx, e as Error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private applyForkchoiceUpdatedResult(
|
|
147
|
+
headBlockRoot: RootHex,
|
|
148
|
+
headBlockHash: RootHex,
|
|
149
|
+
result: ForkchoiceUpdatedResult
|
|
150
|
+
): void {
|
|
151
|
+
const {status, latestValidHash, validationError} = result.payloadStatus;
|
|
152
|
+
const executionStatus = this.forkChoice.getBlockHexAndBlockHash(headBlockRoot, headBlockHash)?.executionStatus;
|
|
153
|
+
try {
|
|
154
|
+
if (status === ExecutionPayloadStatus.INVALID) {
|
|
155
|
+
if (executionStatus === ExecutionStatus.Invalid) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
this.logger.error("Execution engine reported INVALID forkchoice head", {
|
|
159
|
+
headBlockRoot,
|
|
160
|
+
headBlockHash,
|
|
161
|
+
latestValidHash: latestValidHash ?? "null",
|
|
162
|
+
validationError: validationError ?? "",
|
|
163
|
+
});
|
|
164
|
+
this.invalidateExecutionPayloads(
|
|
165
|
+
{
|
|
166
|
+
executionStatus: ExecutionStatus.Invalid,
|
|
167
|
+
latestValidExecHash: latestValidHash,
|
|
168
|
+
invalidateFromParentBlockRoot: headBlockRoot,
|
|
169
|
+
invalidateFromParentBlockHash: headBlockHash,
|
|
170
|
+
},
|
|
171
|
+
ExecutionInvalidSource.forkchoiceUpdated
|
|
172
|
+
);
|
|
173
|
+
} else if (status === ExecutionPayloadStatus.VALID && executionStatus === ExecutionStatus.Syncing) {
|
|
174
|
+
this.forkChoice.validateLatestHash(
|
|
175
|
+
{executionStatus: ExecutionStatus.Valid, latestValidExecHash: headBlockHash, blockRoot: headBlockRoot},
|
|
176
|
+
{strict: false}
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
} catch (e) {
|
|
180
|
+
this.logger.error("Error applying forkchoice update result", {headBlockRoot, headBlockHash, status}, e as Error);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
package/src/chain/interface.ts
CHANGED
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
} from "@lodestar/types";
|
|
26
26
|
import {Logger} from "@lodestar/utils";
|
|
27
27
|
import {BuilderApiClient} from "../execution/builder/apiClient.js";
|
|
28
|
-
import {IExecutionBuilder
|
|
28
|
+
import {IExecutionBuilder} from "../execution/index.js";
|
|
29
29
|
import {Metrics} from "../metrics/metrics.js";
|
|
30
30
|
import {BufferPool} from "../util/bufferPool.js";
|
|
31
31
|
import {IClock} from "../util/clock.js";
|
|
@@ -42,6 +42,7 @@ import {BuilderCircuitBreaker} from "./builderCircuitBreaker.js";
|
|
|
42
42
|
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
43
43
|
import {ChainEventEmitter} from "./emitter.js";
|
|
44
44
|
import {ForkchoiceCaller} from "./forkChoice/index.js";
|
|
45
|
+
import {ForkChoiceExecutionEngine} from "./forkChoiceExecutionEngine.js";
|
|
45
46
|
import {GetBlobsTracker} from "./GetBlobsTracker.js";
|
|
46
47
|
import {LightClientServer} from "./lightClient/index.js";
|
|
47
48
|
import {AggregatedAttestationPool} from "./opPools/aggregatedAttestationPool.js";
|
|
@@ -53,11 +54,13 @@ import {
|
|
|
53
54
|
OpPool,
|
|
54
55
|
PayloadAttestationPool,
|
|
55
56
|
ProposerPreferencesPool,
|
|
57
|
+
SingleAttestationPool,
|
|
56
58
|
SyncCommitteeMessagePool,
|
|
57
59
|
SyncContributionAndProofPool,
|
|
58
60
|
} from "./opPools/index.js";
|
|
59
61
|
import {IChainOptions} from "./options.js";
|
|
60
62
|
import {AssembledBlockType, BlockAttributes, BlockType, ProduceResult} from "./produceBlock/produceBlockBody.js";
|
|
63
|
+
import {ProposerTracker} from "./proposerTracker.js";
|
|
61
64
|
import {IStateRegenerator, RegenCaller} from "./regen/index.js";
|
|
62
65
|
import {ReprocessController} from "./reprocess.js";
|
|
63
66
|
import {
|
|
@@ -98,7 +101,7 @@ export interface IBeaconChain {
|
|
|
98
101
|
readonly genesisTime: UintNum64;
|
|
99
102
|
readonly genesisValidatorsRoot: Root;
|
|
100
103
|
earliestAvailableSlot: Slot;
|
|
101
|
-
readonly executionEngine:
|
|
104
|
+
readonly executionEngine: ForkChoiceExecutionEngine;
|
|
102
105
|
readonly executionBuilder?: IExecutionBuilder;
|
|
103
106
|
readonly builderCircuitBreaker: BuilderCircuitBreaker;
|
|
104
107
|
readonly builderApiClient: BuilderApiClient;
|
|
@@ -126,6 +129,8 @@ export interface IBeaconChain {
|
|
|
126
129
|
// Ops pool
|
|
127
130
|
readonly attestationPool: AttestationPool;
|
|
128
131
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
132
|
+
readonly singleAttestationPool: SingleAttestationPool;
|
|
133
|
+
readonly proposerTracker: ProposerTracker;
|
|
129
134
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
130
135
|
readonly syncContributionAndProofPool: SyncContributionAndProofPool;
|
|
131
136
|
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
@@ -230,7 +235,6 @@ export interface IBeaconChain {
|
|
|
230
235
|
root: RootHex
|
|
231
236
|
): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null>;
|
|
232
237
|
getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null>;
|
|
233
|
-
getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null>;
|
|
234
238
|
getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]>;
|
|
235
239
|
getSerializedDataColumnSidecars(
|
|
236
240
|
blockSlot: Slot,
|