@lodestar/beacon-node 1.51.0-dev.fac22802f6 → 1.51.0-dev.fb216e169a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +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 +6 -10
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +26 -17
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +2 -2
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +10 -7
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +21 -16
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -20
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +0 -24
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +17 -6
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +6 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +1 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/interface.d.ts +2 -0
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +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 +198 -45
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +14 -3
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +16 -6
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
- package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/singleAttestationPool.js +209 -0
- package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +8 -2
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +10 -2
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/options.d.ts +5 -2
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +3 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/proposerTracker.d.ts +31 -0
- package/lib/chain/proposerTracker.d.ts.map +1 -0
- package/lib/chain/proposerTracker.js +75 -0
- package/lib/chain/proposerTracker.js.map +1 -0
- package/lib/chain/regen/interface.d.ts +1 -1
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +1 -1
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +5 -3
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -13
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -2
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +0 -3
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/flatFileStore/flatFileStore.js +5 -5
- package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
- package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
- package/lib/db/flatFileStore/slotIndex.js +2 -2
- package/lib/db/flatFileStore/slotIndex.js.map +1 -1
- package/lib/db/repositories/blobSidecars.d.ts +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
- package/lib/db/repositories/blobSidecars.js +0 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/execution/builder/apiClient.d.ts +14 -8
- package/lib/execution/builder/apiClient.d.ts.map +1 -1
- package/lib/execution/builder/apiClient.js +12 -10
- package/lib/execution/builder/apiClient.js.map +1 -1
- package/lib/execution/builder/http.d.ts +2 -0
- package/lib/execution/builder/http.d.ts.map +1 -1
- package/lib/execution/builder/http.js +2 -0
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/engine/http.d.ts +4 -6
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +8 -10
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/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/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +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 +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts.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 +46 -126
- 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/file.d.ts.map +1 -1
- package/lib/util/file.js +8 -9
- package/lib/util/file.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 -17
- 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 +44 -33
- package/src/chain/blocks/index.ts +5 -2
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +32 -21
- 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/verifyPayloadsDataAvailability.ts +1 -3
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +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 +245 -42
- package/src/chain/opPools/attestationPool.ts +15 -3
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +17 -6
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +9 -2
- package/src/chain/opPools/syncContributionAndProofPool.ts +12 -2
- package/src/chain/options.ts +5 -2
- package/src/chain/produceBlock/produceBlockBody.ts +7 -3
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +1 -1
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
- package/src/chain/validation/executionPayloadBid.ts +14 -13
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validatorMonitor.ts +0 -6
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/repositories/blobSidecars.ts +0 -1
- package/src/execution/builder/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/engine/http.ts +19 -42
- package/src/execution/engine/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/libp2p/index.ts +5 -1
- package/src/network/network.ts +50 -60
- package/src/network/options.ts +4 -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 +59 -159
- 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/file.ts +8 -9
- 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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
2
2
|
import {routes} from "@lodestar/api";
|
|
3
3
|
import {
|
|
4
|
-
AncestorStatus,
|
|
5
|
-
ExecutionStatus,
|
|
6
4
|
ForkChoiceError,
|
|
7
5
|
ForkChoiceErrorCode,
|
|
6
|
+
InvalidBlockCode,
|
|
8
7
|
NotReorgedReason,
|
|
8
|
+
ProtoBlock,
|
|
9
9
|
getFinalizedExecutionBlockHash,
|
|
10
10
|
getSafeExecutionBlockHash,
|
|
11
11
|
} from "@lodestar/fork-choice";
|
|
@@ -43,11 +43,13 @@ import {callInNextEventLoop} from "../../util/eventLoop.js";
|
|
|
43
43
|
import {isOptimisticBlock} from "../../util/forkChoice.js";
|
|
44
44
|
import {isQueueErrorAborted} from "../../util/queue/index.js";
|
|
45
45
|
import type {BeaconChain} from "../chain.js";
|
|
46
|
-
import {ChainEvent
|
|
46
|
+
import {ChainEvent} from "../emitter.js";
|
|
47
|
+
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
47
48
|
import {ForkchoiceCaller} from "../forkChoice/index.js";
|
|
49
|
+
import {IncludedAttesters} from "../opPools/singleAttestationPool.js";
|
|
48
50
|
import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_BPS} from "../reprocess.js";
|
|
49
51
|
import {toCheckpointHex} from "../stateCache/persistentCheckpointsCache.js";
|
|
50
|
-
import {
|
|
52
|
+
import {isBlockInputColumns} from "./blockInput/blockInput.js";
|
|
51
53
|
import {AttestationImportOpt, FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
|
|
52
54
|
import {getCheckpointFromState} from "./utils/checkpoint.js";
|
|
53
55
|
|
|
@@ -94,8 +96,8 @@ export async function importBlock(
|
|
|
94
96
|
fullyVerifiedBlock: FullyVerifiedBlock,
|
|
95
97
|
opts: ImportBlockOpts
|
|
96
98
|
): Promise<void> {
|
|
97
|
-
const {blockInput, postState, parentBlockSlot, dataAvailabilityStatus, indexedAttestations} =
|
|
98
|
-
|
|
99
|
+
const {blockInput, postState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
|
|
100
|
+
fullyVerifiedBlock;
|
|
99
101
|
const block = blockInput.getBlock();
|
|
100
102
|
const source = blockInput.getBlockSource();
|
|
101
103
|
const {slot: blockSlot} = block.message;
|
|
@@ -131,35 +133,30 @@ export async function importBlock(
|
|
|
131
133
|
|
|
132
134
|
// Should compute checkpoint balances before forkchoice.onBlock
|
|
133
135
|
this.checkpointBalancesCache.processState(blockRootHex, postState);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
136
|
+
const importDelayMs = this.clock.msFromSlot(blockSlot);
|
|
137
|
+
let blockSummary: ProtoBlock;
|
|
138
|
+
try {
|
|
139
|
+
blockSummary = this.forkChoice.onBlock(
|
|
140
|
+
block.message,
|
|
141
|
+
postState,
|
|
142
|
+
receiveDelayMs,
|
|
143
|
+
importDelayMs,
|
|
144
|
+
currentSlot,
|
|
145
|
+
executionStatus,
|
|
146
|
+
dataAvailabilityStatus
|
|
147
|
+
);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
// The parent can be invalidated by a forkchoiceUpdated verdict after verifyBlocksSanityChecks passed
|
|
150
|
+
if (
|
|
151
|
+
e instanceof ForkChoiceError &&
|
|
152
|
+
e.type.code === ForkChoiceErrorCode.INVALID_BLOCK &&
|
|
153
|
+
e.type.err.code === InvalidBlockCode.PARENT_EXECUTION_INVALID
|
|
154
|
+
) {
|
|
155
|
+
throw new BlockError(block, {code: BlockErrorCode.PARENT_EXECUTION_INVALID, parentRoot: e.type.err.root});
|
|
148
156
|
}
|
|
149
|
-
|
|
157
|
+
throw e;
|
|
150
158
|
}
|
|
151
159
|
|
|
152
|
-
const importDelayMs = this.clock.msFromSlot(blockSlot);
|
|
153
|
-
const blockSummary = this.forkChoice.onBlock(
|
|
154
|
-
block.message,
|
|
155
|
-
postState,
|
|
156
|
-
receiveDelayMs,
|
|
157
|
-
importDelayMs,
|
|
158
|
-
currentSlot,
|
|
159
|
-
executionStatus,
|
|
160
|
-
dataAvailabilityStatus
|
|
161
|
-
);
|
|
162
|
-
|
|
163
160
|
// This adds the state necessary to process the next block
|
|
164
161
|
// Some block event handlers require state being in state cache so need to do this before emitting EventType.block
|
|
165
162
|
this.regen.processState(blockRootHex, postState);
|
|
@@ -176,6 +173,9 @@ export async function importBlock(
|
|
|
176
173
|
// Only process attestations of blocks with relevant attestations for the fork-choice:
|
|
177
174
|
// If current epoch is N, and block is epoch X, block may include attestations for epoch X or X - 1.
|
|
178
175
|
// The latest block that is useful is at epoch N - 1 which may include attestations for epoch N - 1 or N - 2.
|
|
176
|
+
// the pool is empty outside the slots before a local block proposal, nothing to prune then
|
|
177
|
+
const pruneSingleAttestations = fork >= ForkSeq.electra && !this.singleAttestationPool.isEmpty();
|
|
178
|
+
const includedAttesters: IncludedAttesters[] = [];
|
|
179
179
|
if (importsBlockAttestations(opts, blockEpoch, currentEpoch)) {
|
|
180
180
|
const attestations = block.message.body.attestations;
|
|
181
181
|
const rootCache = new RootCache(postState);
|
|
@@ -190,6 +190,14 @@ export async function importBlock(
|
|
|
190
190
|
const {target, beaconBlockRoot} = attestation.data;
|
|
191
191
|
|
|
192
192
|
const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
|
|
193
|
+
// the block includes these attesters even if fork choice below rejects the vote
|
|
194
|
+
if (pruneSingleAttestations) {
|
|
195
|
+
includedAttesters.push({
|
|
196
|
+
slot: attestation.data.slot,
|
|
197
|
+
attDataRootHex: attDataRoot,
|
|
198
|
+
attestingIndices: indexedAttestation.attestingIndices,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
193
201
|
addAttestation.call(
|
|
194
202
|
this,
|
|
195
203
|
postState,
|
|
@@ -321,19 +329,19 @@ export async function importBlock(
|
|
|
321
329
|
});
|
|
322
330
|
}
|
|
323
331
|
|
|
332
|
+
// only a block that becomes head prunes, not a side-branch import
|
|
333
|
+
if (pruneSingleAttestations && newHead.blockRoot === blockRootHex) {
|
|
334
|
+
callInNextEventLoop(() => {
|
|
335
|
+
const deleted = this.singleAttestationPool.onHead(blockRootHex, newHead.parentRoot, includedAttesters);
|
|
336
|
+
this.metrics?.opPool.singleAttestationPool.deletedByBlock.inc(deleted);
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
324
340
|
if (newHead.blockRoot !== oldHead.blockRoot) {
|
|
325
|
-
|
|
326
|
-
this.regen.updateHeadState(newHead, postState);
|
|
341
|
+
this.onHeadChanged(oldHead, newHead, postState);
|
|
327
342
|
|
|
328
343
|
const delaySec = this.clock.secFromSlot(newHead.slot);
|
|
329
|
-
this.logger.verbose("New chain head", {
|
|
330
|
-
slot: newHead.slot,
|
|
331
|
-
root: newHead.blockRoot,
|
|
332
|
-
delaySec,
|
|
333
|
-
});
|
|
334
|
-
|
|
335
344
|
if (this.metrics) {
|
|
336
|
-
this.metrics.headSlot.set(newHead.slot);
|
|
337
345
|
// Only track "recent" blocks. Otherwise sync can distort this metrics heavily.
|
|
338
346
|
// We want to track recent blocks coming from gossip, unknown block sync, and API.
|
|
339
347
|
const headFork = this.config.getForkName(newHead.slot);
|
|
@@ -346,32 +354,6 @@ export async function importBlock(
|
|
|
346
354
|
}
|
|
347
355
|
}
|
|
348
356
|
|
|
349
|
-
this.onNewHead(newHead);
|
|
350
|
-
|
|
351
|
-
this.metrics?.forkChoice.changedHead.inc();
|
|
352
|
-
|
|
353
|
-
const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
|
|
354
|
-
if (ancestorResult.code === AncestorStatus.CommonAncestor) {
|
|
355
|
-
// CommonAncestor = chain reorg, old head and new head not direct descendants
|
|
356
|
-
|
|
357
|
-
const forkChoiceReorgEventData: ReorgEventData = {
|
|
358
|
-
depth: ancestorResult.depth,
|
|
359
|
-
epoch: computeEpochAtSlot(newHead.slot),
|
|
360
|
-
slot: newHead.slot,
|
|
361
|
-
newHeadBlock: newHead.blockRoot,
|
|
362
|
-
oldHeadBlock: oldHead.blockRoot,
|
|
363
|
-
newHeadState: newHead.stateRoot,
|
|
364
|
-
oldHeadState: oldHead.stateRoot,
|
|
365
|
-
executionOptimistic: isOptimisticBlock(newHead),
|
|
366
|
-
};
|
|
367
|
-
|
|
368
|
-
this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
|
|
369
|
-
this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
|
|
370
|
-
|
|
371
|
-
this.metrics?.forkChoice.reorg.inc();
|
|
372
|
-
this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
357
|
// Lightclient server support (only after altair)
|
|
376
358
|
// - Persist state witness
|
|
377
359
|
// - Use block's syncAggregate
|
|
@@ -470,7 +452,13 @@ export async function importBlock(
|
|
|
470
452
|
const finalizedBlockHash = getFinalizedExecutionBlockHash(this.forkChoice);
|
|
471
453
|
if (headBlockHash !== ZERO_HASH_HEX) {
|
|
472
454
|
this.executionEngine
|
|
473
|
-
.notifyForkchoiceUpdate(
|
|
455
|
+
.notifyForkchoiceUpdate(
|
|
456
|
+
this.config.getForkName(fcuHead.slot),
|
|
457
|
+
fcuHead.blockRoot,
|
|
458
|
+
headBlockHash,
|
|
459
|
+
safeBlockHash,
|
|
460
|
+
finalizedBlockHash
|
|
461
|
+
)
|
|
474
462
|
.catch((e) => {
|
|
475
463
|
if (!isErrorAborted(e) && !isQueueErrorAborted(e)) {
|
|
476
464
|
this.logger.error("Error pushing notifyForkchoiceUpdate()", {headBlockHash, finalizedBlockHash}, e);
|
|
@@ -592,10 +580,6 @@ export async function importBlock(
|
|
|
592
580
|
for (const {source} of blockInput.getSampledColumnsWithSource()) {
|
|
593
581
|
this.metrics?.dataColumns.bySource.inc({source});
|
|
594
582
|
}
|
|
595
|
-
} else if (isBlockInputBlobs(blockInput)) {
|
|
596
|
-
for (const {source} of blockInput.getAllBlobsWithSource()) {
|
|
597
|
-
this.metrics?.importBlock.blobsBySource.inc({blobsSource: source});
|
|
598
|
-
}
|
|
599
583
|
}
|
|
600
584
|
|
|
601
585
|
const reprocessGuardSec =
|
|
@@ -2,6 +2,9 @@ import {SerializedList} from "@chainsafe/ssz";
|
|
|
2
2
|
import {routes} from "@lodestar/api";
|
|
3
3
|
import {
|
|
4
4
|
ExecutionStatus,
|
|
5
|
+
ForkChoiceError,
|
|
6
|
+
ForkChoiceErrorCode,
|
|
7
|
+
InvalidBlockCode,
|
|
5
8
|
PayloadExecutionStatus,
|
|
6
9
|
getFinalizedExecutionBlockHash,
|
|
7
10
|
getSafeExecutionBlockHash,
|
|
@@ -26,7 +29,6 @@ import {
|
|
|
26
29
|
verifyExecutionPayloadEnvelope,
|
|
27
30
|
verifyExecutionPayloadEnvelopeSignature,
|
|
28
31
|
} from "./verifyExecutionPayloadEnvelope.js";
|
|
29
|
-
import {verifyPayloadsDataAvailability} from "./verifyPayloadsDataAvailability.js";
|
|
30
32
|
|
|
31
33
|
const EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS = 64;
|
|
32
34
|
|
|
@@ -34,6 +36,7 @@ export enum PayloadErrorCode {
|
|
|
34
36
|
EXECUTION_ENGINE_INVALID = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID",
|
|
35
37
|
EXECUTION_ENGINE_ERROR = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR",
|
|
36
38
|
BLOCK_NOT_IN_FORK_CHOICE = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE",
|
|
39
|
+
BLOCK_EXECUTION_INVALID = "PAYLOAD_ERROR_BLOCK_EXECUTION_INVALID",
|
|
37
40
|
MISS_BLOCK_STATE = "PAYLOAD_ERROR_MISS_BLOCK_STATE",
|
|
38
41
|
ENVELOPE_VERIFICATION_ERROR = "PAYLOAD_ERROR_ENVELOPE_VERIFICATION_ERROR",
|
|
39
42
|
INVALID_SIGNATURE = "PAYLOAD_ERROR_INVALID_SIGNATURE",
|
|
@@ -55,6 +58,10 @@ export type PayloadErrorType =
|
|
|
55
58
|
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE;
|
|
56
59
|
blockRootHex: string;
|
|
57
60
|
}
|
|
61
|
+
| {
|
|
62
|
+
code: PayloadErrorCode.BLOCK_EXECUTION_INVALID;
|
|
63
|
+
blockRootHex: string;
|
|
64
|
+
}
|
|
58
65
|
| {
|
|
59
66
|
code: PayloadErrorCode.MISS_BLOCK_STATE;
|
|
60
67
|
blockRootHex: string;
|
|
@@ -99,7 +106,8 @@ function toForkChoiceExecutionStatus(status: ExecutionPayloadStatus): PayloadExe
|
|
|
99
106
|
* are applied on the next block via processParentExecutionPayload.
|
|
100
107
|
*
|
|
101
108
|
* The DA wait must have run upstream (range sync awaits DA in `verifyBlocksInEpoch` for the
|
|
102
|
-
* whole segment; gossip / API path
|
|
109
|
+
* whole segment; the gossip / API / unknown-payload sync path waits in `PayloadEnvelopeProcessor`
|
|
110
|
+
* before the import is queued).
|
|
103
111
|
*
|
|
104
112
|
* Steps:
|
|
105
113
|
* 1. Emit `execution_payload_available` event for payload attestation
|
|
@@ -144,6 +152,13 @@ export async function importExecutionPayload(
|
|
|
144
152
|
blockRootHex,
|
|
145
153
|
});
|
|
146
154
|
}
|
|
155
|
+
// The payload chain this block builds on was invalidated, a VALID verdict here would contradict it
|
|
156
|
+
if (protoBlock.executionStatus === ExecutionStatus.Invalid) {
|
|
157
|
+
throw new PayloadError(payloadInput, {
|
|
158
|
+
code: PayloadErrorCode.BLOCK_EXECUTION_INVALID,
|
|
159
|
+
blockRootHex,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
147
162
|
|
|
148
163
|
// 3. Regenerate state for envelope verification
|
|
149
164
|
const blockState = await this.regen
|
|
@@ -322,14 +337,26 @@ export async function importExecutionPayload(
|
|
|
322
337
|
|
|
323
338
|
// 6. Update fork choice, transitions the block's PENDING variant to FULL
|
|
324
339
|
const execStatus = toForkChoiceExecutionStatus(execResult.status);
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
340
|
+
try {
|
|
341
|
+
this.forkChoice.onExecutionPayload(
|
|
342
|
+
blockRootHex,
|
|
343
|
+
blockHashHex,
|
|
344
|
+
envelope.payload.blockNumber,
|
|
345
|
+
envelope.payload.gasLimit,
|
|
346
|
+
execStatus,
|
|
347
|
+
dataAvailabilityStatus
|
|
348
|
+
);
|
|
349
|
+
} catch (e) {
|
|
350
|
+
// The payload chain can be invalidated by a forkchoiceUpdated verdict while the engine was awaited
|
|
351
|
+
if (
|
|
352
|
+
e instanceof ForkChoiceError &&
|
|
353
|
+
e.type.code === ForkChoiceErrorCode.INVALID_BLOCK &&
|
|
354
|
+
e.type.err.code === InvalidBlockCode.PARENT_EXECUTION_INVALID
|
|
355
|
+
) {
|
|
356
|
+
throw new PayloadError(payloadInput, {code: PayloadErrorCode.BLOCK_EXECUTION_INVALID, blockRootHex});
|
|
357
|
+
}
|
|
358
|
+
throw e;
|
|
359
|
+
}
|
|
333
360
|
|
|
334
361
|
// 7. Queue notifyForkchoiceUpdate to engine api
|
|
335
362
|
const head = this.forkChoice.getHead();
|
|
@@ -342,11 +369,13 @@ export async function importExecutionPayload(
|
|
|
342
369
|
) {
|
|
343
370
|
const safeBlockHash = getSafeExecutionBlockHash(this.forkChoice, this.logger);
|
|
344
371
|
const finalizedBlockHash = getFinalizedExecutionBlockHash(this.forkChoice);
|
|
345
|
-
this.executionEngine
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
372
|
+
this.executionEngine
|
|
373
|
+
.notifyForkchoiceUpdate(fork, blockRootHex, blockHashHex, safeBlockHash, finalizedBlockHash)
|
|
374
|
+
.catch((e) => {
|
|
375
|
+
if (!isErrorAborted(e) && !isQueueErrorAborted(e)) {
|
|
376
|
+
this.logger.error("Error pushing notifyForkchoiceUpdate()", {blockHashHex, finalizedBlockHash}, e);
|
|
377
|
+
}
|
|
378
|
+
});
|
|
350
379
|
}
|
|
351
380
|
|
|
352
381
|
// 8. Record metrics for payload envelope and column sources
|
|
@@ -378,21 +407,3 @@ export async function importExecutionPayload(
|
|
|
378
407
|
delaySec,
|
|
379
408
|
});
|
|
380
409
|
}
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Process an execution payload envelope end-to-end: wait for DA, then import.
|
|
384
|
-
*
|
|
385
|
-
* Used by the PayloadEnvelopeProcessor queue (gossip / API / unknown-payload sync) — i.e.
|
|
386
|
-
* callers that have NOT already awaited DA themselves. Range sync's inline dispatch in
|
|
387
|
-
* processBlocks skips this wrapper and calls `importExecutionPayload` directly, since
|
|
388
|
-
* `verifyBlocksInEpoch` already awaited DA for the segment.
|
|
389
|
-
*/
|
|
390
|
-
export async function processExecutionPayload(
|
|
391
|
-
this: BeaconChain,
|
|
392
|
-
payloadInput: PayloadEnvelopeInput,
|
|
393
|
-
signal: AbortSignal,
|
|
394
|
-
opts: ImportPayloadOpts = {}
|
|
395
|
-
): Promise<void> {
|
|
396
|
-
const {dataAvailabilityStatuses} = await verifyPayloadsDataAvailability(this.config, [payloadInput], signal);
|
|
397
|
-
await importExecutionPayload.call(this, payloadInput, dataAvailabilityStatuses[0], opts);
|
|
398
|
-
}
|
|
@@ -7,7 +7,7 @@ import {nextEventLoop} from "../../util/eventLoop.js";
|
|
|
7
7
|
import {JobItemQueue, isQueueErrorAborted} from "../../util/queue/index.js";
|
|
8
8
|
import type {BeaconChain} from "../chain.js";
|
|
9
9
|
import {BlockError, BlockErrorCode, isBlockErrorAborted} from "../errors/index.js";
|
|
10
|
-
import {ForkchoiceCaller} from "../forkChoice/index.js";
|
|
10
|
+
import {ExecutionInvalidSource, ForkchoiceCaller} from "../forkChoice/index.js";
|
|
11
11
|
import {BlockProcessOpts} from "../options.js";
|
|
12
12
|
import {IBlockInput} from "./blockInput/types.js";
|
|
13
13
|
import {importBlock, importsBlockAttestations} from "./importBlock.js";
|
|
@@ -123,7 +123,10 @@ export async function processBlocks(
|
|
|
123
123
|
// and we need to further propagate
|
|
124
124
|
if (segmentExecStatus.execAborted !== null) {
|
|
125
125
|
if (segmentExecStatus.invalidSegmentLVH !== undefined) {
|
|
126
|
-
this.
|
|
126
|
+
this.executionEngine.invalidateExecutionPayloads(
|
|
127
|
+
segmentExecStatus.invalidSegmentLVH,
|
|
128
|
+
ExecutionInvalidSource.blockSegment
|
|
129
|
+
);
|
|
127
130
|
}
|
|
128
131
|
throw segmentExecStatus.execAborted.execError;
|
|
129
132
|
}
|
|
@@ -1,32 +1,37 @@
|
|
|
1
|
+
import {DataAvailabilityStatus} from "@lodestar/state-transition";
|
|
1
2
|
import {Metrics} from "../../metrics/metrics.js";
|
|
2
3
|
import {JobItemQueue} from "../../util/queue/index.js";
|
|
3
4
|
import type {BeaconChain} from "../chain.js";
|
|
4
5
|
import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
|
|
5
|
-
import {
|
|
6
|
+
import {importExecutionPayload} from "./importExecutionPayload.js";
|
|
6
7
|
import {ImportPayloadOpts} from "./types.js";
|
|
8
|
+
import {verifyPayloadsDataAvailability} from "./verifyPayloadsDataAvailability.js";
|
|
7
9
|
|
|
8
10
|
// TODO GLOAS: Set to be equal to DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES for now
|
|
9
11
|
const QUEUE_MAX_LENGTH = 16;
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
|
-
* PayloadEnvelopeProcessor
|
|
14
|
+
* PayloadEnvelopeProcessor imports payload envelopes in a queued fashion, one after the other.
|
|
13
15
|
*
|
|
14
|
-
* Jobs are
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* caller observes the real import outcome. Resolving duplicates early instead would let
|
|
16
|
+
* Jobs are triggered only on envelope arrival (gossip or API). The envelope may reach us before the
|
|
17
|
+
* sampled data columns, the data availability wait runs before the job is queued. Duplicate
|
|
18
|
+
* triggers for the same payloadInput are deduped by sharing the in-flight promise: every caller
|
|
19
|
+
* observes the real import outcome. Resolving duplicates early instead would let
|
|
19
20
|
* BlockInputSync mark a still-pending payload as processed, re-queue it, and spin re-processing
|
|
20
21
|
* the same root until OOM while the import is blocked (e.g. EL syncing).
|
|
21
22
|
*/
|
|
22
23
|
export class PayloadEnvelopeProcessor {
|
|
23
|
-
readonly jobQueue: JobItemQueue<[PayloadEnvelopeInput, ImportPayloadOpts], void>;
|
|
24
|
+
readonly jobQueue: JobItemQueue<[PayloadEnvelopeInput, DataAvailabilityStatus, ImportPayloadOpts], void>;
|
|
24
25
|
private readonly imports = new WeakMap<PayloadEnvelopeInput, Promise<void>>();
|
|
25
26
|
|
|
26
|
-
constructor(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
constructor(
|
|
28
|
+
private readonly chain: BeaconChain,
|
|
29
|
+
metrics: Metrics | null,
|
|
30
|
+
private readonly signal: AbortSignal
|
|
31
|
+
) {
|
|
32
|
+
this.jobQueue = new JobItemQueue<[PayloadEnvelopeInput, DataAvailabilityStatus, ImportPayloadOpts], void>(
|
|
33
|
+
(payloadInput, dataAvailabilityStatus, opts) => {
|
|
34
|
+
return importExecutionPayload.call(chain, payloadInput, dataAvailabilityStatus, opts);
|
|
30
35
|
},
|
|
31
36
|
{maxLength: QUEUE_MAX_LENGTH, noYieldIfOneItem: true, signal},
|
|
32
37
|
metrics?.payloadEnvelopeProcessorQueue ?? undefined
|
|
@@ -39,15 +44,7 @@ export class PayloadEnvelopeProcessor {
|
|
|
39
44
|
return existing;
|
|
40
45
|
}
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
// Re-check after await, as another call may have queued this payload.
|
|
45
|
-
const queued = this.imports.get(payloadInput);
|
|
46
|
-
if (queued !== undefined) {
|
|
47
|
-
return queued;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const importPromise = this.jobQueue.push(payloadInput, opts);
|
|
47
|
+
const importPromise = this.waitForDataAndImport(payloadInput, opts);
|
|
51
48
|
this.imports.set(payloadInput, importPromise);
|
|
52
49
|
|
|
53
50
|
try {
|
|
@@ -59,4 +56,18 @@ export class PayloadEnvelopeProcessor {
|
|
|
59
56
|
throw e;
|
|
60
57
|
}
|
|
61
58
|
}
|
|
59
|
+
|
|
60
|
+
private async waitForDataAndImport(payloadInput: PayloadEnvelopeInput, opts: ImportPayloadOpts): Promise<void> {
|
|
61
|
+
const {dataAvailabilityStatuses} = await verifyPayloadsDataAvailability(
|
|
62
|
+
this.chain.config,
|
|
63
|
+
[payloadInput],
|
|
64
|
+
this.signal
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
while (this.jobQueue.jobLen >= QUEUE_MAX_LENGTH) {
|
|
68
|
+
await this.jobQueue.waitForSpace();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return this.jobQueue.push(payloadInput, dataAvailabilityStatuses[0], opts);
|
|
72
|
+
}
|
|
62
73
|
}
|
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
import type {ChainForkConfig} from "@lodestar/config";
|
|
2
1
|
import type {BlockExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
|
|
3
|
-
import {
|
|
4
|
-
import {DataAvailabilityStatus, IBeaconStateView, computeEpochAtSlot} from "@lodestar/state-transition";
|
|
2
|
+
import {DataAvailabilityStatus, IBeaconStateView} from "@lodestar/state-transition";
|
|
5
3
|
import type {IndexedAttestation, Slot, fulu} from "@lodestar/types";
|
|
6
4
|
import {IBlockInput} from "./blockInput/types.js";
|
|
7
5
|
import {OrphanedPayloadEnvelope} from "./utils/chainSegment.js";
|
|
8
6
|
|
|
9
|
-
export enum GossipedInputType {
|
|
10
|
-
block = "block",
|
|
11
|
-
blob = "blob",
|
|
12
|
-
dataColumn = "data_column",
|
|
13
|
-
}
|
|
14
|
-
|
|
15
7
|
export enum InclusionListSource {
|
|
16
8
|
gossip = "gossip",
|
|
17
9
|
api = "api",
|
|
@@ -23,30 +15,11 @@ type DataColumnData = {
|
|
|
23
15
|
};
|
|
24
16
|
export type DataColumnsCacheMap = Map<number, DataColumnData>;
|
|
25
17
|
|
|
26
|
-
export function blockRequiresBlobs(config: ChainForkConfig, blockSlot: Slot, clockSlot: Slot): boolean {
|
|
27
|
-
return (
|
|
28
|
-
config.getForkSeq(blockSlot) >= ForkSeq.deneb &&
|
|
29
|
-
// Only request blobs if they are recent enough
|
|
30
|
-
computeEpochAtSlot(blockSlot) >= computeEpochAtSlot(clockSlot) - config.MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
18
|
export enum AttestationImportOpt {
|
|
35
19
|
Skip,
|
|
36
20
|
Force,
|
|
37
21
|
}
|
|
38
22
|
|
|
39
|
-
export enum BlobSidecarValidation {
|
|
40
|
-
/** When recieved in gossip the blobs are individually verified before import */
|
|
41
|
-
Individual,
|
|
42
|
-
/**
|
|
43
|
-
* Blobs when recieved in req/resp can be fully verified before import
|
|
44
|
-
* but currently used in spec tests where blobs come without proofs and assumed
|
|
45
|
-
* to be valid
|
|
46
|
-
*/
|
|
47
|
-
Full,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
23
|
export type ImportPayloadOpts = {
|
|
51
24
|
/**
|
|
52
25
|
* Set to true when the envelope was already validated upstream (e.g., gossip/API validation):
|
|
@@ -89,8 +62,6 @@ export type ImportBlockOpts = {
|
|
|
89
62
|
* Metadata: `true` if all the signatures including the proposer signature have been verified
|
|
90
63
|
*/
|
|
91
64
|
validSignatures?: boolean;
|
|
92
|
-
/** Set to true if already run `validateBlobSidecars()` sucessfully on the blobs */
|
|
93
|
-
validBlobSidecars?: BlobSidecarValidation;
|
|
94
65
|
/** Seen timestamp seconds */
|
|
95
66
|
seenTimestampSec?: number;
|
|
96
67
|
};
|
|
@@ -109,7 +80,10 @@ export type FullyVerifiedBlock = {
|
|
|
109
80
|
parentBlockSlot: Slot;
|
|
110
81
|
proposerBalanceDelta: number;
|
|
111
82
|
dataAvailabilityStatus: DataAvailabilityStatus;
|
|
112
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* Pre-computed indexed attestations from signature verification to avoid duplicate work.
|
|
85
|
+
* Their `attestingIndices` are in committee order, not sorted, so they are not spec-valid `IndexedAttestation`s.
|
|
86
|
+
*/
|
|
113
87
|
indexedAttestations: IndexedAttestation[];
|
|
114
88
|
/** Seen timestamp seconds */
|
|
115
89
|
seenTimestampSec: number;
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
DataAvailabilityStatus,
|
|
5
5
|
IBeaconStateView,
|
|
6
6
|
computeEpochAtSlot,
|
|
7
|
-
|
|
7
|
+
getAttestingIndices,
|
|
8
8
|
signedBlockToSignedHeader,
|
|
9
9
|
} from "@lodestar/state-transition";
|
|
10
10
|
import {IndexedAttestation, Slot, deneb} from "@lodestar/types";
|
|
@@ -119,7 +119,13 @@ export async function verifyBlocksInEpoch(
|
|
|
119
119
|
const shuffling =
|
|
120
120
|
this.shufflingCache.getSync(attEpoch, preState0.getShufflingDecisionRoot(attEpoch)) ??
|
|
121
121
|
preState0.getShufflingAtEpoch(attEpoch);
|
|
122
|
-
|
|
122
|
+
// Unlike getIndexedAttestation, keep attestingIndices in committee order: sorting them dominates building
|
|
123
|
+
// these on mainnet blocks. See FullyVerifiedBlock.indexedAttestations.
|
|
124
|
+
return {
|
|
125
|
+
attestingIndices: getAttestingIndices(shuffling, fork, attestation),
|
|
126
|
+
data: attestation.data,
|
|
127
|
+
signature: attestation.signature,
|
|
128
|
+
};
|
|
123
129
|
});
|
|
124
130
|
}
|
|
125
131
|
|
|
@@ -175,16 +181,29 @@ export async function verifyBlocksInEpoch(
|
|
|
175
181
|
const [
|
|
176
182
|
segmentExecStatus,
|
|
177
183
|
{blockDAStatuses, payloadDAStatuses, availableTime},
|
|
178
|
-
{postStates, proposerBalanceDeltas, verifyStateTime},
|
|
179
184
|
{verifySignaturesTime},
|
|
185
|
+
{postStates, proposerBalanceDeltas, verifyStateTime},
|
|
180
186
|
] = await Promise.all([
|
|
181
187
|
verifyExecutionPayloadsPromise,
|
|
182
188
|
|
|
183
189
|
// data availability (fork-specific; see daAvailabilityPromise above)
|
|
184
190
|
daAvailabilityPromise,
|
|
185
191
|
|
|
192
|
+
// All signatures at once. Must be called before verifyBlocksStateTransitionOnly()
|
|
193
|
+
// so we hand the BLS job to the worker pool before the main thread
|
|
194
|
+
// is busy with the state transition.
|
|
195
|
+
verifyBlocksSignatures(
|
|
196
|
+
this.config,
|
|
197
|
+
this.bls,
|
|
198
|
+
this.logger,
|
|
199
|
+
this.metrics,
|
|
200
|
+
preState0,
|
|
201
|
+
blocks,
|
|
202
|
+
indexedAttestationsByBlock,
|
|
203
|
+
opts
|
|
204
|
+
),
|
|
205
|
+
|
|
186
206
|
// Run state transition only
|
|
187
|
-
// TODO: Ensure it yields to allow flushing to workers and engine API
|
|
188
207
|
verifyBlocksStateTransitionOnly(
|
|
189
208
|
preState0,
|
|
190
209
|
blockInputs,
|
|
@@ -198,22 +217,17 @@ export async function verifyBlocksInEpoch(
|
|
|
198
217
|
opts
|
|
199
218
|
),
|
|
200
219
|
|
|
201
|
-
// All signatures at once
|
|
202
|
-
verifyBlocksSignatures(
|
|
203
|
-
this.config,
|
|
204
|
-
this.bls,
|
|
205
|
-
this.logger,
|
|
206
|
-
this.metrics,
|
|
207
|
-
preState0,
|
|
208
|
-
blocks,
|
|
209
|
-
indexedAttestationsByBlock,
|
|
210
|
-
opts
|
|
211
|
-
),
|
|
212
|
-
|
|
213
220
|
// TODO GLOAS: can verify payload signatures in batch too
|
|
214
221
|
// maybe chain with the above verifyBlocksSignatures()
|
|
215
222
|
]);
|
|
216
223
|
|
|
224
|
+
if (blockInputs.length === 1 && opts.seenTimestampSec !== undefined) {
|
|
225
|
+
const consensusVerifiedTime = Math.max(verifyStateTime, verifySignaturesTime);
|
|
226
|
+
this.metrics?.gossipBlock.receivedToConsensusVerifiedTime.observe(
|
|
227
|
+
consensusVerifiedTime / 1000 - opts.seenTimestampSec
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
217
231
|
for (const blockInput of blockInputs) {
|
|
218
232
|
const block = blockInput.getBlock();
|
|
219
233
|
const {slot, proposerIndex} = block.message;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import {ForkSeq} from "@lodestar/params";
|
|
1
2
|
import {DataAvailabilityStatus} from "@lodestar/state-transition";
|
|
2
3
|
import {TimeoutError} from "@lodestar/utils";
|
|
3
4
|
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
@@ -42,7 +43,11 @@ export async function verifyBlocksDataAvailability(
|
|
|
42
43
|
return DataAvailabilityStatus.NotRequired;
|
|
43
44
|
}
|
|
44
45
|
if (blockInput.type === DAType.PreData) {
|
|
45
|
-
|
|
46
|
+
// Legacy deneb..electra blob sidecars are not tracked, so these blocks are imported without a DA check.
|
|
47
|
+
// PreData cannot represent them because the state transition rejects it for post-deneb forks.
|
|
48
|
+
return ForkSeq[blockInput.forkName] >= ForkSeq.deneb
|
|
49
|
+
? DataAvailabilityStatus.NotRequired
|
|
50
|
+
: DataAvailabilityStatus.PreData;
|
|
46
51
|
}
|
|
47
52
|
if (blockInput.daOutOfRange) {
|
|
48
53
|
return DataAvailabilityStatus.OutOfRange;
|
|
@@ -7,21 +7,23 @@ import {
|
|
|
7
7
|
LVHValidResponse,
|
|
8
8
|
ProtoBlock,
|
|
9
9
|
} from "@lodestar/fork-choice";
|
|
10
|
-
import {ForkSeq} from "@lodestar/params";
|
|
10
|
+
import {ForkPostDeneb, ForkSeq, isForkPostDeneb} from "@lodestar/params";
|
|
11
11
|
import {IBeaconStateView, isExecutionBlockBodyType, isStatePostBellatrix} from "@lodestar/state-transition";
|
|
12
|
-
import {bellatrix, electra} from "@lodestar/types";
|
|
12
|
+
import {SignedBeaconBlock, bellatrix, electra} from "@lodestar/types";
|
|
13
13
|
import {ErrorAborted, Logger, toRootHex} from "@lodestar/utils";
|
|
14
14
|
import {ExecutionPayloadStatus, IExecutionEngine} from "../../execution/engine/interface.js";
|
|
15
15
|
import {Metrics} from "../../metrics/metrics.js";
|
|
16
|
+
import {kzgCommitmentToVersionedHash} from "../../util/blobs.js";
|
|
16
17
|
import {IClock} from "../../util/clock.js";
|
|
18
|
+
import {getBlobKzgCommitments} from "../../util/dataColumns.js";
|
|
17
19
|
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
18
20
|
import {BlockProcessOpts} from "../options.js";
|
|
19
|
-
import {
|
|
21
|
+
import {isBlockInputNoData} from "./blockInput/blockInput.js";
|
|
20
22
|
import {IBlockInput} from "./blockInput/types.js";
|
|
21
23
|
import {ImportBlockOpts} from "./types.js";
|
|
22
24
|
|
|
23
25
|
export type VerifyBlockExecutionPayloadModules = {
|
|
24
|
-
executionEngine: IExecutionEngine
|
|
26
|
+
executionEngine: Pick<IExecutionEngine, "notifyNewPayload">;
|
|
25
27
|
clock: IClock;
|
|
26
28
|
logger: Logger;
|
|
27
29
|
metrics: Metrics | null;
|
|
@@ -166,8 +168,9 @@ export async function verifyBlockExecutionPayload(
|
|
|
166
168
|
|
|
167
169
|
// TODO: Handle better notifyNewPayload() returning error is syncing
|
|
168
170
|
const fork = blockInput.forkName;
|
|
169
|
-
const versionedHashes =
|
|
170
|
-
|
|
171
|
+
const versionedHashes = isForkPostDeneb(fork)
|
|
172
|
+
? getBlobKzgCommitments(fork, block as SignedBeaconBlock<ForkPostDeneb>).map(kzgCommitmentToVersionedHash)
|
|
173
|
+
: undefined;
|
|
171
174
|
const parentBlockRoot = ForkSeq[fork] >= ForkSeq.deneb ? block.message.parentRoot : undefined;
|
|
172
175
|
const executionRequests =
|
|
173
176
|
ForkSeq[fork] >= ForkSeq.electra ? (block.message.body as electra.BeaconBlockBody).executionRequests : undefined;
|