@lodestar/beacon-node 1.35.0-dev.47c570ab76 → 1.35.0-dev.56313c7299
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.js +46 -58
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/config/constants.d.ts +0 -5
- package/lib/api/impl/config/constants.js +1 -6
- package/lib/api/impl/config/constants.js.map +1 -1
- package/lib/api/impl/debug/index.js +1 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/errors.js +0 -2
- package/lib/api/impl/errors.js.map +1 -1
- package/lib/api/impl/index.d.ts +3 -3
- package/lib/api/impl/index.js +3 -3
- package/lib/api/impl/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.js +1 -1
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +1 -2
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/rest/activeSockets.js +2 -3
- package/lib/api/rest/activeSockets.js.map +1 -1
- package/lib/api/rest/base.d.ts +1 -1
- package/lib/api/rest/base.js +2 -6
- package/lib/api/rest/base.js.map +1 -1
- package/lib/api/rest/index.js +0 -2
- package/lib/api/rest/index.js.map +1 -1
- package/lib/api/rest/swaggerUI.js +2 -4
- package/lib/api/rest/swaggerUI.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +38 -49
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +0 -3
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/index.d.ts +1 -1
- package/lib/chain/archiveStore/index.js +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +0 -5
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
- package/lib/chain/balancesCache.js +3 -1
- package/lib/chain/balancesCache.js.map +1 -1
- package/lib/chain/beaconProposerCache.js +0 -1
- package/lib/chain/beaconProposerCache.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +7 -19
- package/lib/chain/blocks/blockInput/blockInput.js +88 -132
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/index.d.ts +1 -1
- package/lib/chain/blocks/blockInput/index.js +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +10 -19
- package/lib/chain/blocks/blockInput/types.js +0 -1
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/blockInput/utils.d.ts +4 -0
- package/lib/chain/blocks/blockInput/utils.js +29 -6
- package/lib/chain/blocks/blockInput/utils.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +12 -16
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/index.d.ts +5 -6
- package/lib/chain/blocks/index.js +4 -5
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +106 -3
- package/lib/chain/blocks/types.js +119 -0
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/utils/chainSegment.d.ts +2 -2
- package/lib/chain/blocks/utils/chainSegment.js +2 -2
- package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts +3 -3
- package/lib/chain/blocks/verifyBlock.js +14 -15
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts +22 -7
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +110 -18
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +3 -4
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +22 -24
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +3 -4
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +2 -2
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +2 -3
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +2 -2
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +3 -3
- package/lib/chain/blocks/writeBlockInputToDb.js +66 -61
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +163 -168
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/singleThread.js +0 -1
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/chain.d.ts +11 -13
- package/lib/chain/chain.js +20 -79
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +2 -43
- package/lib/chain/emitter.js +0 -18
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/blobSidecarError.d.ts +0 -24
- package/lib/chain/errors/blobSidecarError.js +0 -10
- package/lib/chain/errors/blobSidecarError.js.map +1 -1
- package/lib/chain/errors/blockError.js +0 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts +0 -42
- package/lib/chain/errors/dataColumnSidecarError.js +0 -14
- package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
- package/lib/chain/errors/gossipValidation.js +0 -1
- package/lib/chain/errors/gossipValidation.js.map +1 -1
- package/lib/chain/errors/index.d.ts +2 -2
- package/lib/chain/errors/index.js +2 -2
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/genesis/genesis.js +5 -16
- package/lib/chain/genesis/genesis.js.map +1 -1
- package/lib/chain/index.d.ts +2 -2
- package/lib/chain/index.js +2 -2
- package/lib/chain/index.js.map +1 -1
- package/lib/chain/interface.d.ts +9 -12
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/lightClient/index.js +9 -16
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/lightClient/proofs.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +9 -14
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.js +3 -8
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +1 -1
- package/lib/chain/opPools/index.js +1 -1
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/opPool.js +12 -10
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +6 -9
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +2 -5
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/options.js +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.js +136 -141
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +10 -3
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/errors.js +0 -1
- package/lib/chain/regen/errors.js.map +1 -1
- package/lib/chain/regen/index.d.ts +1 -1
- package/lib/chain/regen/index.js +1 -1
- package/lib/chain/regen/index.js.map +1 -1
- package/lib/chain/regen/queued.js +28 -35
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.js +0 -1
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/reprocess.js +1 -3
- package/lib/chain/reprocess.js.map +1 -1
- package/lib/chain/seenCache/index.d.ts +1 -1
- package/lib/chain/seenCache/index.js +1 -1
- package/lib/chain/seenCache/index.js.map +1 -1
- package/lib/chain/seenCache/seenAggregateAndProof.js +6 -7
- package/lib/chain/seenCache/seenAggregateAndProof.js.map +1 -1
- package/lib/chain/seenCache/seenAttestationData.js +2 -5
- package/lib/chain/seenCache/seenAttestationData.js.map +1 -1
- package/lib/chain/seenCache/seenAttesters.js +4 -2
- package/lib/chain/seenCache/seenAttesters.js.map +1 -1
- package/lib/chain/seenCache/seenBlockInput.d.ts +84 -0
- package/lib/chain/seenCache/seenBlockInput.js +225 -0
- package/lib/chain/seenCache/seenBlockInput.js.map +1 -0
- package/lib/chain/seenCache/seenBlockProposers.js +4 -2
- package/lib/chain/seenCache/seenBlockProposers.js.map +1 -1
- package/lib/chain/seenCache/seenCommittee.js +3 -1
- package/lib/chain/seenCache/seenCommittee.js.map +1 -1
- package/lib/chain/seenCache/seenCommitteeContribution.js +2 -3
- package/lib/chain/seenCache/seenCommitteeContribution.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +78 -74
- package/lib/chain/seenCache/seenGossipBlockInput.js +369 -235
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/shufflingCache.js +2 -5
- package/lib/chain/shufflingCache.js.map +1 -1
- package/lib/chain/stateCache/blockStateCacheImpl.js +7 -13
- package/lib/chain/stateCache/blockStateCacheImpl.js.map +1 -1
- package/lib/chain/stateCache/datastore/db.js +0 -1
- package/lib/chain/stateCache/datastore/db.js.map +1 -1
- package/lib/chain/stateCache/datastore/file.js +0 -1
- package/lib/chain/stateCache/datastore/file.js.map +1 -1
- package/lib/chain/stateCache/datastore/index.d.ts +1 -1
- package/lib/chain/stateCache/datastore/index.js +1 -1
- package/lib/chain/stateCache/datastore/index.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +0 -10
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js +4 -10
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/index.d.ts +1 -1
- package/lib/chain/stateCache/index.js +1 -1
- package/lib/chain/stateCache/index.js.map +1 -1
- package/lib/chain/stateCache/mapMetrics.js +4 -4
- package/lib/chain/stateCache/mapMetrics.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +6 -14
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/blobSidecar.d.ts +3 -8
- package/lib/chain/validation/blobSidecar.js +31 -73
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +9 -7
- package/lib/chain/validation/dataColumnSidecar.js +57 -95
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/index.d.ts +1 -1
- package/lib/chain/validation/index.js +1 -1
- package/lib/chain/validation/index.js.map +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +3 -1
- package/lib/chain/validatorMonitor.js +1 -2
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/beacon.js +0 -24
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/index.d.ts +1 -1
- package/lib/db/index.js.map +1 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/db/repositories/blockArchive.js +3 -2
- package/lib/db/repositories/blockArchive.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecar.js +1 -1
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/db/repositories/depositDataRoot.js +0 -1
- package/lib/db/repositories/depositDataRoot.js.map +1 -1
- package/lib/db/repositories/index.d.ts +10 -10
- package/lib/db/repositories/index.js +9 -9
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/db/single/preGenesisState.js +0 -6
- package/lib/db/single/preGenesisState.js.map +1 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.js +0 -5
- package/lib/db/single/preGenesisStateLastProcessedBlock.js.map +1 -1
- package/lib/eth1/eth1DataCache.js +0 -2
- package/lib/eth1/eth1DataCache.js.map +1 -1
- package/lib/eth1/eth1DepositDataTracker.js +5 -18
- package/lib/eth1/eth1DepositDataTracker.js.map +1 -1
- package/lib/eth1/eth1DepositsCache.js +0 -3
- package/lib/eth1/eth1DepositsCache.js.map +1 -1
- package/lib/eth1/eth1MergeBlockTracker.js +4 -10
- package/lib/eth1/eth1MergeBlockTracker.js.map +1 -1
- package/lib/eth1/index.js +0 -2
- package/lib/eth1/index.js.map +1 -1
- package/lib/eth1/provider/eth1Provider.d.ts +2 -1
- package/lib/eth1/provider/eth1Provider.js +2 -6
- package/lib/eth1/provider/eth1Provider.js.map +1 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts +1 -1
- package/lib/eth1/provider/jsonRpcHttpClient.js +2 -16
- package/lib/eth1/provider/jsonRpcHttpClient.js.map +1 -1
- package/lib/eth1/provider/jwt.js.map +1 -1
- package/lib/eth1/provider/utils.d.ts +0 -5
- package/lib/eth1/provider/utils.js +1 -9
- package/lib/eth1/provider/utils.js.map +1 -1
- package/lib/eth1/utils/deposits.js.map +1 -1
- package/lib/execution/builder/cache.js +0 -6
- package/lib/execution/builder/cache.js.map +1 -1
- package/lib/execution/builder/http.js +8 -14
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/index.js.map +1 -1
- package/lib/execution/engine/disabled.js +4 -2
- package/lib/execution/engine/disabled.js.map +1 -1
- package/lib/execution/engine/http.d.ts +2 -2
- package/lib/execution/engine/http.js +11 -43
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +2 -2
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +0 -1
- package/lib/execution/engine/mock.js +12 -16
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.js +3 -1
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/types.d.ts +1 -5
- package/lib/execution/engine/types.js +8 -37
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.js +3 -3
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/execution/index.d.ts +2 -2
- package/lib/execution/index.js +2 -2
- package/lib/execution/index.js.map +1 -1
- package/lib/index.d.ts +6 -6
- package/lib/index.js +5 -5
- package/lib/index.js.map +1 -1
- package/lib/metrics/index.d.ts +1 -1
- package/lib/metrics/index.js +1 -1
- package/lib/metrics/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +5 -11
- package/lib/metrics/metrics/beacon.js +20 -40
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +13 -55
- package/lib/metrics/metrics/lodestar.js +7 -84
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/metrics.d.ts +1 -1
- package/lib/metrics/metrics.js.map +1 -1
- package/lib/metrics/nodeJsMetrics.js +1 -1
- package/lib/metrics/nodeJsMetrics.js.map +1 -1
- package/lib/metrics/server/http.d.ts +1 -1
- package/lib/metrics/utils/avgMinMax.d.ts +1 -1
- package/lib/metrics/utils/avgMinMax.js +6 -10
- package/lib/metrics/utils/avgMinMax.js.map +1 -1
- package/lib/metrics/utils/gauge.d.ts +1 -1
- package/lib/metrics/utils/gauge.js +4 -1
- package/lib/metrics/utils/gauge.js.map +1 -1
- package/lib/metrics/utils/registryMetricCreator.d.ts +1 -1
- package/lib/metrics/utils/registryMetricCreator.js.map +1 -1
- package/lib/monitoring/properties.js +0 -4
- package/lib/monitoring/properties.js.map +1 -1
- package/lib/monitoring/service.js +1 -13
- package/lib/monitoring/service.js.map +1 -1
- package/lib/monitoring/system.js +27 -25
- package/lib/monitoring/system.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +2 -2
- package/lib/network/core/networkCore.js +50 -67
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +1 -1
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -2
- package/lib/network/core/networkCoreWorkerHandler.js +5 -14
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/discv5/index.d.ts +2 -2
- package/lib/network/discv5/index.js +3 -9
- package/lib/network/discv5/index.js.map +1 -1
- package/lib/network/discv5/worker.js +3 -3
- package/lib/network/discv5/worker.js.map +1 -1
- package/lib/network/events.d.ts +18 -2
- package/lib/network/events.js +7 -0
- package/lib/network/events.js.map +1 -1
- package/lib/network/gossip/encoding.d.ts +1 -1
- package/lib/network/gossip/encoding.js +2 -4
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/gossip/errors.js +0 -1
- package/lib/network/gossip/errors.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +1 -2
- package/lib/network/gossip/gossipsub.js +17 -43
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/index.d.ts +2 -2
- package/lib/network/gossip/index.js +2 -2
- package/lib/network/gossip/index.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +2 -2
- package/lib/network/gossip/metrics.d.ts +7 -15
- package/lib/network/gossip/metrics.js +6 -16
- package/lib/network/gossip/metrics.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +105 -125
- package/lib/network/gossip/topic.js +1 -2
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/index.d.ts +3 -3
- package/lib/network/index.js +3 -3
- package/lib/network/index.js.map +1 -1
- package/lib/network/interface.d.ts +2 -3
- package/lib/network/libp2p/index.js +3 -11
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/metadata.js +1 -6
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +2 -4
- package/lib/network/network.js +71 -89
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.js +1 -1
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/datastore.d.ts +2 -2
- package/lib/network/peers/datastore.js +4 -10
- package/lib/network/peers/datastore.js.map +1 -1
- package/lib/network/peers/discover.js +66 -75
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.js +130 -154
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +1 -1
- package/lib/network/peers/peersData.js +3 -1
- package/lib/network/peers/peersData.js.map +1 -1
- package/lib/network/peers/score/index.d.ts +1 -1
- package/lib/network/peers/score/index.js +1 -1
- package/lib/network/peers/score/index.js.map +1 -1
- package/lib/network/peers/score/score.js +0 -6
- package/lib/network/peers/score/score.js.map +1 -1
- package/lib/network/peers/score/store.js +0 -3
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/peers/utils/subnetMap.js +4 -2
- package/lib/network/peers/utils/subnetMap.js.map +1 -1
- package/lib/network/processor/aggregatorTracker.js +3 -1
- package/lib/network/processor/aggregatorTracker.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +164 -145
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/indexed.js +9 -11
- package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
- package/lib/network/processor/gossipQueues/linear.js +8 -9
- package/lib/network/processor/gossipQueues/linear.js.map +1 -1
- package/lib/network/processor/index.d.ts +1 -2
- package/lib/network/processor/index.js +8 -22
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +2 -11
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +28 -0
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +328 -0
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -0
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +49 -0
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +499 -0
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/index.d.ts +3 -1
- package/lib/network/reqresp/index.js +3 -1
- package/lib/network/reqresp/index.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +2 -2
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
- package/lib/network/statusCache.js +0 -1
- package/lib/network/statusCache.js.map +1 -1
- package/lib/network/subnets/attnetsService.js +65 -73
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/interface.js +1 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/network/subnets/syncnetsService.js +22 -29
- package/lib/network/subnets/syncnetsService.js.map +1 -1
- package/lib/network/subnets/util.js +2 -1
- package/lib/network/subnets/util.js.map +1 -1
- package/lib/node/nodejs.d.ts +1 -1
- package/lib/node/nodejs.js +0 -15
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.js +2 -1
- package/lib/node/notifier.js.map +1 -1
- package/lib/node/options.js.map +1 -1
- package/lib/node/utils/interop/state.js +2 -1
- package/lib/node/utils/interop/state.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts +1 -1
- package/lib/sync/backfill/backfill.js +16 -58
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/constants.d.ts +1 -2
- package/lib/sync/constants.js +1 -2
- package/lib/sync/constants.js.map +1 -1
- package/lib/sync/interface.d.ts +59 -1
- package/lib/sync/interface.js +20 -0
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/options.d.ts +1 -1
- package/lib/sync/range/batch.d.ts +32 -48
- package/lib/sync/range/batch.js +55 -201
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +10 -15
- package/lib/sync/range/chain.js +70 -141
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts +3 -3
- package/lib/sync/range/range.js +54 -86
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/hashBlocks.d.ts +2 -2
- package/lib/sync/range/utils/hashBlocks.js +4 -6
- package/lib/sync/range/utils/hashBlocks.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.js +13 -18
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/sync.d.ts +2 -1
- package/lib/sync/sync.js +87 -95
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +28 -42
- package/lib/sync/unknownBlock.js +458 -405
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/pendingBlocksTree.d.ts +6 -14
- package/lib/sync/utils/pendingBlocksTree.js +18 -24
- package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
- package/lib/util/array.js +3 -7
- package/lib/util/array.js.map +1 -1
- package/lib/util/asyncIterableToEvents.js +3 -6
- package/lib/util/asyncIterableToEvents.js.map +1 -1
- package/lib/util/binarySearch.js +0 -2
- package/lib/util/binarySearch.js.map +1 -1
- package/lib/util/blobs.d.ts +2 -2
- package/lib/util/blobs.js +4 -4
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/bufferPool.js +2 -7
- package/lib/util/bufferPool.js.map +1 -1
- package/lib/util/clock.d.ts +1 -1
- package/lib/util/clock.js +18 -23
- package/lib/util/clock.js.map +1 -1
- package/lib/util/dataColumns.d.ts +10 -13
- package/lib/util/dataColumns.js +132 -90
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/itTrigger.js +4 -4
- package/lib/util/itTrigger.js.map +1 -1
- package/lib/util/map.js +0 -2
- package/lib/util/map.js.map +1 -1
- package/lib/util/queue/index.d.ts +1 -1
- package/lib/util/queue/index.js +1 -1
- package/lib/util/queue/index.js.map +1 -1
- package/lib/util/queue/itemQueue.js +49 -52
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/serializedCache.js +3 -1
- package/lib/util/serializedCache.js.map +1 -1
- package/lib/util/set.js +0 -2
- package/lib/util/set.js.map +1 -1
- package/lib/util/sszBytes.d.ts +0 -1
- package/lib/util/sszBytes.js +1 -1
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/timeSeries.js +1 -3
- package/lib/util/timeSeries.js.map +1 -1
- package/lib/util/types.d.ts +1 -1
- package/lib/util/wrapError.d.ts +0 -7
- package/package.json +18 -36
- package/lib/bun-wrappers/prometheus-gc-stats.d.ts +0 -2
- package/lib/bun-wrappers/prometheus-gc-stats.js +0 -8
- package/lib/bun-wrappers/prometheus-gc-stats.js.map +0 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts +0 -32
- package/lib/chain/ColumnReconstructionTracker.js +0 -71
- package/lib/chain/ColumnReconstructionTracker.js.map +0 -1
- package/lib/chain/GetBlobsTracker.d.ts +0 -31
- package/lib/chain/GetBlobsTracker.js +0 -82
- package/lib/chain/GetBlobsTracker.js.map +0 -1
- package/lib/sync/types.d.ts +0 -44
- package/lib/sync/types.js +0 -34
- package/lib/sync/types.js.map +0 -1
- package/lib/sync/utils/downloadByRange.d.ts +0 -186
- package/lib/sync/utils/downloadByRange.js +0 -457
- package/lib/sync/utils/downloadByRange.js.map +0 -1
- package/lib/sync/utils/downloadByRoot.d.ts +0 -121
- package/lib/sync/utils/downloadByRoot.js +0 -346
- package/lib/sync/utils/downloadByRoot.js.map +0 -1
- package/lib/util/execution.d.ts +0 -20
- package/lib/util/execution.js +0 -165
- package/lib/util/execution.js.map +0 -1
|
@@ -2,8 +2,7 @@ import { ProtoBlock } from "@lodestar/fork-choice";
|
|
|
2
2
|
import { CachedBeaconStateAllForks, DataAvailabilityStatus } from "@lodestar/state-transition";
|
|
3
3
|
import type { BeaconChain } from "../chain.js";
|
|
4
4
|
import { BlockProcessOpts } from "../options.js";
|
|
5
|
-
import {
|
|
6
|
-
import { ImportBlockOpts } from "./types.js";
|
|
5
|
+
import { BlockInput, ImportBlockOpts } from "./types.js";
|
|
7
6
|
import { SegmentExecStatus } from "./verifyBlocksExecutionPayloads.js";
|
|
8
7
|
/**
|
|
9
8
|
* Verifies 1 or more blocks are fully valid; from a linear sequence of blocks.
|
|
@@ -16,10 +15,11 @@ import { SegmentExecStatus } from "./verifyBlocksExecutionPayloads.js";
|
|
|
16
15
|
*
|
|
17
16
|
* If there's an error during one of the steps, the rest are aborted with an AbortController.
|
|
18
17
|
*/
|
|
19
|
-
export declare function verifyBlocksInEpoch(this: BeaconChain, parentBlock: ProtoBlock,
|
|
18
|
+
export declare function verifyBlocksInEpoch(this: BeaconChain, parentBlock: ProtoBlock, blocksInput: BlockInput[], opts: BlockProcessOpts & ImportBlockOpts): Promise<{
|
|
20
19
|
postStates: CachedBeaconStateAllForks[];
|
|
21
20
|
proposerBalanceDeltas: number[];
|
|
22
21
|
segmentExecStatus: SegmentExecStatus;
|
|
23
22
|
dataAvailabilityStatuses: DataAvailabilityStatus[];
|
|
23
|
+
availableBlockInputs: BlockInput[];
|
|
24
24
|
}>;
|
|
25
25
|
//# sourceMappingURL=verifyBlock.d.ts.map
|
|
@@ -4,7 +4,7 @@ import { DataAvailabilityStatus, computeEpochAtSlot, isStateValidatorsNodesPopul
|
|
|
4
4
|
import { toRootHex } from "@lodestar/utils";
|
|
5
5
|
import { BlockError, BlockErrorCode } from "../errors/index.js";
|
|
6
6
|
import { RegenCaller } from "../regen/index.js";
|
|
7
|
-
import {
|
|
7
|
+
import { BlockInputType } from "./types.js";
|
|
8
8
|
import { DENEB_BLOWFISH_BANNER } from "./utils/blowfishBanner.js";
|
|
9
9
|
import { ELECTRA_GIRAFFE_BANNER } from "./utils/giraffeBanner.js";
|
|
10
10
|
import { CAPELLA_OWL_BANNER } from "./utils/ownBanner.js";
|
|
@@ -26,8 +26,8 @@ import { writeBlockInputToDb } from "./writeBlockInputToDb.js";
|
|
|
26
26
|
*
|
|
27
27
|
* If there's an error during one of the steps, the rest are aborted with an AbortController.
|
|
28
28
|
*/
|
|
29
|
-
export async function verifyBlocksInEpoch(parentBlock,
|
|
30
|
-
const blocks =
|
|
29
|
+
export async function verifyBlocksInEpoch(parentBlock, blocksInput, opts) {
|
|
30
|
+
const blocks = blocksInput.map(({ block }) => block);
|
|
31
31
|
const lastBlock = blocks.at(-1);
|
|
32
32
|
if (!lastBlock) {
|
|
33
33
|
throw Error("Empty partiallyVerifiedBlocks");
|
|
@@ -65,20 +65,20 @@ export async function verifyBlocksInEpoch(parentBlock, blockInputs, opts) {
|
|
|
65
65
|
const abortController = new AbortController();
|
|
66
66
|
try {
|
|
67
67
|
// batch all I/O operations to reduce overhead
|
|
68
|
-
const [segmentExecStatus, { dataAvailabilityStatuses, availableTime }, { postStates, proposerBalanceDeltas, verifyStateTime }, { verifySignaturesTime },] = await Promise.all([
|
|
68
|
+
const [segmentExecStatus, { dataAvailabilityStatuses, availableTime, availableBlockInputs }, { postStates, proposerBalanceDeltas, verifyStateTime }, { verifySignaturesTime },] = await Promise.all([
|
|
69
69
|
// Execution payloads
|
|
70
70
|
opts.skipVerifyExecutionPayload !== true
|
|
71
|
-
? verifyBlocksExecutionPayload(this, parentBlock,
|
|
71
|
+
? verifyBlocksExecutionPayload(this, parentBlock, blocks, preState0, abortController.signal, opts)
|
|
72
72
|
: Promise.resolve({
|
|
73
73
|
execAborted: null,
|
|
74
74
|
executionStatuses: blocks.map((_blk) => ExecutionStatus.Syncing),
|
|
75
75
|
mergeBlockFound: null,
|
|
76
76
|
}),
|
|
77
77
|
// data availability for the blobs
|
|
78
|
-
verifyBlocksDataAvailability(
|
|
78
|
+
verifyBlocksDataAvailability(this, blocksInput, abortController.signal, opts),
|
|
79
79
|
// Run state transition only
|
|
80
80
|
// TODO: Ensure it yields to allow flushing to workers and engine API
|
|
81
|
-
verifyBlocksStateTransitionOnly(preState0,
|
|
81
|
+
verifyBlocksStateTransitionOnly(preState0, blocksInput,
|
|
82
82
|
// hack availability for state transition eval as availability is separately determined
|
|
83
83
|
blocks.map(() => DataAvailabilityStatus.Available), this.logger, this.metrics, this.validatorMonitor, abortController.signal, opts),
|
|
84
84
|
// All signatures at once
|
|
@@ -89,7 +89,7 @@ export async function verifyBlocksInEpoch(parentBlock, blockInputs, opts) {
|
|
|
89
89
|
// rarely invalid blocks we'll batch all I/O operation here to reduce the overhead if there's
|
|
90
90
|
// an error, we'll remove blocks not in forkchoice
|
|
91
91
|
opts.verifyOnly !== true && opts.eagerPersistBlock
|
|
92
|
-
? writeBlockInputToDb.call(this,
|
|
92
|
+
? writeBlockInputToDb.call(this, blocksInput)
|
|
93
93
|
: Promise.resolve(),
|
|
94
94
|
]);
|
|
95
95
|
if (opts.verifyOnly !== true) {
|
|
@@ -133,24 +133,23 @@ export async function verifyBlocksInEpoch(parentBlock, blockInputs, opts) {
|
|
|
133
133
|
}
|
|
134
134
|
if (segmentExecStatus.execAborted === null) {
|
|
135
135
|
const { executionStatuses, executionTime } = segmentExecStatus;
|
|
136
|
-
if (
|
|
136
|
+
if (blocksInput.length === 1 &&
|
|
137
137
|
// gossip blocks have seenTimestampSec
|
|
138
138
|
opts.seenTimestampSec !== undefined &&
|
|
139
|
-
|
|
139
|
+
blocksInput[0].type !== BlockInputType.preData &&
|
|
140
140
|
executionStatuses[0] === ExecutionStatus.Valid) {
|
|
141
141
|
// Find the max time when the block was actually verified
|
|
142
142
|
const fullyVerifiedTime = Math.max(executionTime, verifyStateTime, verifySignaturesTime);
|
|
143
143
|
const recvTofullyVerifedTime = fullyVerifiedTime / 1000 - opts.seenTimestampSec;
|
|
144
144
|
this.metrics?.gossipBlock.receivedToFullyVerifiedTime.observe(recvTofullyVerifedTime);
|
|
145
145
|
const verifiedToBlobsAvailabiltyTime = Math.max(availableTime - fullyVerifiedTime, 0) / 1000;
|
|
146
|
-
const
|
|
147
|
-
const numBlobs = block.message.body.blobKzgCommitments.length;
|
|
146
|
+
const numBlobs = blocksInput[0].block.message.body.blobKzgCommitments.length;
|
|
148
147
|
this.metrics?.gossipBlock.verifiedToBlobsAvailabiltyTime.observe({ numBlobs }, verifiedToBlobsAvailabiltyTime);
|
|
149
148
|
this.logger.verbose("Verified blockInput fully with blobs availability", {
|
|
150
|
-
slot: block.message.slot,
|
|
149
|
+
slot: blocksInput[0].block.message.slot,
|
|
151
150
|
recvTofullyVerifedTime,
|
|
152
151
|
verifiedToBlobsAvailabiltyTime,
|
|
153
|
-
type:
|
|
152
|
+
type: blocksInput[0].type,
|
|
154
153
|
numBlobs,
|
|
155
154
|
});
|
|
156
155
|
}
|
|
@@ -158,7 +157,7 @@ export async function verifyBlocksInEpoch(parentBlock, blockInputs, opts) {
|
|
|
158
157
|
else {
|
|
159
158
|
this.logger.verbose("Block verification aborted due to execution payload", {}, segmentExecStatus.execAborted.execError);
|
|
160
159
|
}
|
|
161
|
-
return { postStates, dataAvailabilityStatuses, proposerBalanceDeltas, segmentExecStatus };
|
|
160
|
+
return { postStates, dataAvailabilityStatuses, proposerBalanceDeltas, segmentExecStatus, availableBlockInputs };
|
|
162
161
|
}
|
|
163
162
|
finally {
|
|
164
163
|
abortController.abort();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyBlock.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlock.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAa,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAEL,sBAAsB,EACtB,kBAAkB,EAClB,+BAA+B,GAChC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAS,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"verifyBlock.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,29 @@
|
|
|
1
|
+
import { ChainForkConfig } from "@lodestar/config";
|
|
1
2
|
import { DataAvailabilityStatus } from "@lodestar/state-transition";
|
|
2
|
-
import {
|
|
3
|
-
|
|
3
|
+
import { UintNum64 } from "@lodestar/types";
|
|
4
|
+
import { Logger } from "@lodestar/utils";
|
|
5
|
+
import { Metrics } from "../../metrics/metrics.js";
|
|
6
|
+
import { BlockInput, ImportBlockOpts } from "./types.js";
|
|
4
7
|
/**
|
|
5
|
-
* Verifies
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
8
|
+
* Verifies some early cheap sanity checks on the block before running the full state transition.
|
|
9
|
+
*
|
|
10
|
+
* - Parent is known to the fork-choice
|
|
11
|
+
* - Check skipped slots limit
|
|
12
|
+
* - check_block_relevancy()
|
|
13
|
+
* - Block not in the future
|
|
14
|
+
* - Not genesis block
|
|
15
|
+
* - Block's slot is < Infinity
|
|
16
|
+
* - Not finalized slot
|
|
17
|
+
* - Not already known
|
|
9
18
|
*/
|
|
10
|
-
export declare function verifyBlocksDataAvailability(
|
|
19
|
+
export declare function verifyBlocksDataAvailability(chain: {
|
|
20
|
+
config: ChainForkConfig;
|
|
21
|
+
genesisTime: UintNum64;
|
|
22
|
+
logger: Logger;
|
|
23
|
+
metrics: Metrics | null;
|
|
24
|
+
}, blocks: BlockInput[], signal: AbortSignal, opts: ImportBlockOpts): Promise<{
|
|
11
25
|
dataAvailabilityStatuses: DataAvailabilityStatus[];
|
|
12
26
|
availableTime: number;
|
|
27
|
+
availableBlockInputs: BlockInput[];
|
|
13
28
|
}>;
|
|
14
29
|
//# sourceMappingURL=verifyBlocksDataAvailability.d.ts.map
|
|
@@ -1,26 +1,118 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { isForkPostDeneb, isForkPostFulu } from "@lodestar/params";
|
|
2
|
+
import { DataAvailabilityStatus, computeTimeAtSlot } from "@lodestar/state-transition";
|
|
3
|
+
import { ErrorAborted } from "@lodestar/utils";
|
|
4
|
+
import { BlockError, BlockErrorCode } from "../errors/index.js";
|
|
5
|
+
import { validateBlobSidecars } from "../validation/blobSidecar.js";
|
|
6
|
+
import { validateDataColumnsSidecars } from "../validation/dataColumnSidecar.js";
|
|
7
|
+
import { BlobSidecarValidation, BlockInputType, getBlockInput, } from "./types.js";
|
|
3
8
|
// we can now wait for full 12 seconds because unavailable block sync will try pulling
|
|
4
9
|
// the blobs from the network anyway after 500ms of seeing the block
|
|
5
|
-
|
|
10
|
+
const BLOB_AVAILABILITY_TIMEOUT = 12_000;
|
|
6
11
|
/**
|
|
7
|
-
* Verifies
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
12
|
+
* Verifies some early cheap sanity checks on the block before running the full state transition.
|
|
13
|
+
*
|
|
14
|
+
* - Parent is known to the fork-choice
|
|
15
|
+
* - Check skipped slots limit
|
|
16
|
+
* - check_block_relevancy()
|
|
17
|
+
* - Block not in the future
|
|
18
|
+
* - Not genesis block
|
|
19
|
+
* - Block's slot is < Infinity
|
|
20
|
+
* - Not finalized slot
|
|
21
|
+
* - Not already known
|
|
11
22
|
*/
|
|
12
|
-
export async function verifyBlocksDataAvailability(blocks, signal) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
export async function verifyBlocksDataAvailability(chain, blocks, signal, opts) {
|
|
24
|
+
const lastBlock = blocks.at(-1);
|
|
25
|
+
if (!lastBlock) {
|
|
26
|
+
throw Error("Empty partiallyVerifiedBlocks");
|
|
27
|
+
}
|
|
28
|
+
const dataAvailabilityStatuses = [];
|
|
29
|
+
const seenTime = opts.seenTimestampSec !== undefined ? opts.seenTimestampSec * 1000 : Date.now();
|
|
30
|
+
const availableBlockInputs = [];
|
|
31
|
+
for (const blockInput of blocks) {
|
|
32
|
+
if (signal.aborted) {
|
|
33
|
+
throw new ErrorAborted("verifyBlocksDataAvailability");
|
|
18
34
|
}
|
|
19
|
-
|
|
20
|
-
|
|
35
|
+
// Validate status of only not yet finalized blocks, we don't need yet to propogate the status
|
|
36
|
+
// as it is not used upstream anywhere
|
|
37
|
+
const { dataAvailabilityStatus, availableBlockInput } = await maybeValidateBlobs(chain, blockInput, signal, opts);
|
|
38
|
+
dataAvailabilityStatuses.push(dataAvailabilityStatus);
|
|
39
|
+
availableBlockInputs.push(availableBlockInput);
|
|
40
|
+
}
|
|
41
|
+
const availableTime = lastBlock.type === BlockInputType.dataPromise ? Date.now() : seenTime;
|
|
42
|
+
if (blocks.length === 1 && opts.seenTimestampSec !== undefined && blocks[0].type !== BlockInputType.preData) {
|
|
43
|
+
const recvToAvailableTime = availableTime / 1000 - opts.seenTimestampSec;
|
|
44
|
+
const numBlobs = blocks[0].block.message.body.blobKzgCommitments.length;
|
|
45
|
+
chain.metrics?.gossipBlock.receivedToBlobsAvailabilityTime.observe({ numBlobs }, recvToAvailableTime);
|
|
46
|
+
chain.logger.verbose("Verified blobs availability", {
|
|
47
|
+
slot: blocks[0].block.message.slot,
|
|
48
|
+
recvToAvailableTime,
|
|
49
|
+
type: blocks[0].type,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return { dataAvailabilityStatuses, availableTime, availableBlockInputs };
|
|
53
|
+
}
|
|
54
|
+
async function maybeValidateBlobs(chain, blockInput, signal, opts) {
|
|
55
|
+
switch (blockInput.type) {
|
|
56
|
+
case BlockInputType.preData:
|
|
57
|
+
return { dataAvailabilityStatus: DataAvailabilityStatus.PreData, availableBlockInput: blockInput };
|
|
58
|
+
case BlockInputType.outOfRangeData:
|
|
59
|
+
return { dataAvailabilityStatus: DataAvailabilityStatus.OutOfRange, availableBlockInput: blockInput };
|
|
60
|
+
// biome-ignore lint/suspicious/noFallthroughSwitchClause: We need fall-through behavior here
|
|
61
|
+
case BlockInputType.availableData:
|
|
62
|
+
if (opts.validBlobSidecars === BlobSidecarValidation.Full) {
|
|
63
|
+
return { dataAvailabilityStatus: DataAvailabilityStatus.Available, availableBlockInput: blockInput };
|
|
64
|
+
}
|
|
65
|
+
case BlockInputType.dataPromise: {
|
|
66
|
+
// run full validation
|
|
67
|
+
const { block } = blockInput;
|
|
68
|
+
const blockSlot = block.message.slot;
|
|
69
|
+
const { blobKzgCommitments } = block.message.body;
|
|
70
|
+
const beaconBlockRoot = chain.config.getForkTypes(blockSlot).BeaconBlock.hashTreeRoot(block.message);
|
|
71
|
+
const blockData = blockInput.type === BlockInputType.availableData
|
|
72
|
+
? blockInput.blockData
|
|
73
|
+
: await raceWithCutoff(chain, blockInput, blockInput.cachedData.availabilityPromise, signal);
|
|
74
|
+
if (isForkPostFulu(blockData.fork)) {
|
|
75
|
+
const { dataColumns } = blockData;
|
|
76
|
+
const skipProofsCheck = opts.validBlobSidecars === BlobSidecarValidation.Individual;
|
|
77
|
+
await validateDataColumnsSidecars(blockSlot, beaconBlockRoot, blobKzgCommitments, dataColumns, chain.metrics, {
|
|
78
|
+
skipProofsCheck,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else if (isForkPostDeneb(blockData.fork)) {
|
|
82
|
+
const { blobs } = blockData;
|
|
83
|
+
// if the blob sidecars have been individually verified then we can skip kzg proof check
|
|
84
|
+
// but other checks to match blobs with block data still need to be performed
|
|
85
|
+
const skipProofsCheck = opts.validBlobSidecars === BlobSidecarValidation.Individual;
|
|
86
|
+
await validateBlobSidecars(blockSlot, beaconBlockRoot, blobKzgCommitments, blobs, { skipProofsCheck });
|
|
87
|
+
}
|
|
88
|
+
const availableBlockInput = getBlockInput.availableData(chain.config, blockInput.block, blockInput.source, blockData);
|
|
89
|
+
return { dataAvailabilityStatus: DataAvailabilityStatus.Available, availableBlockInput: availableBlockInput };
|
|
21
90
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Wait for blobs to become available with a cutoff time. If fails then throw DATA_UNAVAILABLE error
|
|
95
|
+
* which may try unknownblock/blobs fill (by root).
|
|
96
|
+
*/
|
|
97
|
+
async function raceWithCutoff(chain, blockInput, availabilityPromise, signal) {
|
|
98
|
+
const { block } = blockInput;
|
|
99
|
+
const blockSlot = block.message.slot;
|
|
100
|
+
const cutoffTime = computeTimeAtSlot(chain.config, blockSlot, chain.genesisTime) * 1000 + BLOB_AVAILABILITY_TIMEOUT - Date.now();
|
|
101
|
+
const cutoffTimeout = cutoffTime > 0
|
|
102
|
+
? new Promise((_resolve, reject) => {
|
|
103
|
+
setTimeout(() => reject(new Error("Timeout exceeded")), cutoffTime);
|
|
104
|
+
signal.addEventListener("abort", () => reject(signal.reason));
|
|
105
|
+
})
|
|
106
|
+
: Promise.reject(new Error("Cutoff time must be greater than 0"));
|
|
107
|
+
chain.logger.debug("Racing for blob availabilityPromise", { blockSlot, cutoffTime });
|
|
108
|
+
try {
|
|
109
|
+
await Promise.race([availabilityPromise, cutoffTimeout]);
|
|
110
|
+
}
|
|
111
|
+
catch (_e) {
|
|
112
|
+
// throw unavailable so that the unknownblock/blobs can be triggered to pull the block
|
|
113
|
+
throw new BlockError(block, { code: BlockErrorCode.DATA_UNAVAILABLE });
|
|
114
|
+
}
|
|
115
|
+
// we can only be here if availabilityPromise has resolved else an error will be thrown
|
|
116
|
+
return availabilityPromise;
|
|
25
117
|
}
|
|
26
118
|
//# sourceMappingURL=verifyBlocksDataAvailability.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyBlocksDataAvailability.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlocksDataAvailability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verifyBlocksDataAvailability.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlocksDataAvailability.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ChainForkConfig } from "@lodestar/config";
|
|
2
2
|
import { ExecutionStatus, IForkChoice, LVHInvalidResponse, LVHValidResponse, MaybeValidExecutionStatus, ProtoBlock } from "@lodestar/fork-choice";
|
|
3
3
|
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
4
|
-
import { Slot, bellatrix } from "@lodestar/types";
|
|
4
|
+
import { SignedBeaconBlock, Slot, bellatrix } from "@lodestar/types";
|
|
5
5
|
import { Logger } from "@lodestar/utils";
|
|
6
6
|
import { IEth1ForBlockProduction } from "../../eth1/index.js";
|
|
7
7
|
import { IExecutionEngine } from "../../execution/engine/interface.js";
|
|
@@ -9,7 +9,6 @@ import { Metrics } from "../../metrics/metrics.js";
|
|
|
9
9
|
import { IClock } from "../../util/clock.js";
|
|
10
10
|
import { BlockError } from "../errors/index.js";
|
|
11
11
|
import { BlockProcessOpts } from "../options.js";
|
|
12
|
-
import { IBlockInput } from "./blockInput/types.js";
|
|
13
12
|
import { ImportBlockOpts } from "./types.js";
|
|
14
13
|
export type VerifyBlockExecutionPayloadModules = {
|
|
15
14
|
eth1: IEth1ForBlockProduction;
|
|
@@ -61,10 +60,10 @@ type VerifyBlockExecutionResponse = VerifyExecutionErrorResponse | {
|
|
|
61
60
|
*
|
|
62
61
|
* Since the EL client must be aware of each parent, all payloads must be submitted in sequence.
|
|
63
62
|
*/
|
|
64
|
-
export declare function verifyBlocksExecutionPayload(chain: VerifyBlockExecutionPayloadModules, parentBlock: ProtoBlock,
|
|
63
|
+
export declare function verifyBlocksExecutionPayload(chain: VerifyBlockExecutionPayloadModules, parentBlock: ProtoBlock, blocks: SignedBeaconBlock[], preState0: CachedBeaconStateAllForks, signal: AbortSignal, opts: BlockProcessOpts & ImportBlockOpts): Promise<SegmentExecStatus>;
|
|
65
64
|
/**
|
|
66
65
|
* Verifies a single block execution payload by sending it to the EL client (via HTTP).
|
|
67
66
|
*/
|
|
68
|
-
export declare function verifyBlockExecutionPayload(chain: VerifyBlockExecutionPayloadModules,
|
|
67
|
+
export declare function verifyBlockExecutionPayload(chain: VerifyBlockExecutionPayloadModules, block: SignedBeaconBlock, preState0: CachedBeaconStateAllForks, opts: BlockProcessOpts, isOptimisticallySafe: boolean, currentSlot: Slot): Promise<VerifyBlockExecutionResponse>;
|
|
69
68
|
export {};
|
|
70
69
|
//# sourceMappingURL=verifyBlocksExecutionPayloads.d.ts.map
|
|
@@ -3,18 +3,18 @@ import { ForkSeq, SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY } from "@lodestar/params";
|
|
|
3
3
|
import { isExecutionBlockBodyType, isExecutionEnabled, isExecutionStateType, isMergeTransitionBlock as isMergeTransitionBlockFn, } from "@lodestar/state-transition";
|
|
4
4
|
import { ErrorAborted, toRootHex } from "@lodestar/utils";
|
|
5
5
|
import { ExecutionPayloadStatus } from "../../execution/engine/interface.js";
|
|
6
|
+
import { kzgCommitmentToVersionedHash } from "../../util/blobs.js";
|
|
6
7
|
import { BlockError, BlockErrorCode } from "../errors/index.js";
|
|
7
|
-
import { isBlockInputBlobs, isBlockInputColumns } from "./blockInput/blockInput.js";
|
|
8
8
|
/**
|
|
9
9
|
* Verifies 1 or more execution payloads from a linear sequence of blocks.
|
|
10
10
|
*
|
|
11
11
|
* Since the EL client must be aware of each parent, all payloads must be submitted in sequence.
|
|
12
12
|
*/
|
|
13
|
-
export async function verifyBlocksExecutionPayload(chain, parentBlock,
|
|
13
|
+
export async function verifyBlocksExecutionPayload(chain, parentBlock, blocks, preState0, signal, opts) {
|
|
14
14
|
const executionStatuses = [];
|
|
15
15
|
let mergeBlockFound = null;
|
|
16
16
|
const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
|
|
17
|
-
const lastBlock =
|
|
17
|
+
const lastBlock = blocks.at(-1);
|
|
18
18
|
// Error in the same way as verifyBlocksSanityChecks if empty blocks
|
|
19
19
|
if (!lastBlock) {
|
|
20
20
|
throw Error("Empty partiallyVerifiedBlocks");
|
|
@@ -82,18 +82,18 @@ export async function verifyBlocksExecutionPayload(chain, parentBlock, blockInpu
|
|
|
82
82
|
const currentSlot = chain.clock.currentSlot;
|
|
83
83
|
const safeSlotsToImportOptimistically = opts.safeSlotsToImportOptimistically ?? SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY;
|
|
84
84
|
let isOptimisticallySafe = parentBlock.executionStatus !== ExecutionStatus.PreMerge ||
|
|
85
|
-
lastBlock.slot + safeSlotsToImportOptimistically < currentSlot;
|
|
86
|
-
for (let blockIndex = 0; blockIndex <
|
|
87
|
-
const
|
|
85
|
+
lastBlock.message.slot + safeSlotsToImportOptimistically < currentSlot;
|
|
86
|
+
for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {
|
|
87
|
+
const block = blocks[blockIndex];
|
|
88
88
|
// If blocks are invalid in consensus the main promise could resolve before this loop ends.
|
|
89
89
|
// In that case stop sending blocks to execution engine
|
|
90
90
|
if (signal.aborted) {
|
|
91
91
|
throw new ErrorAborted("verifyBlockExecutionPayloads");
|
|
92
92
|
}
|
|
93
|
-
const verifyResponse = await verifyBlockExecutionPayload(chain,
|
|
93
|
+
const verifyResponse = await verifyBlockExecutionPayload(chain, block, preState0, opts, isOptimisticallySafe, currentSlot);
|
|
94
94
|
// If execError has happened, then we need to extract the segmentExecStatus and return
|
|
95
95
|
if (verifyResponse.execError !== null) {
|
|
96
|
-
return getSegmentErrorResponse({ verifyResponse, blockIndex }, parentBlock,
|
|
96
|
+
return getSegmentErrorResponse({ verifyResponse, blockIndex }, parentBlock, blocks);
|
|
97
97
|
}
|
|
98
98
|
// If we are here then its because executionStatus is one of MaybeValidExecutionStatus
|
|
99
99
|
const { executionStatus } = verifyResponse;
|
|
@@ -104,15 +104,14 @@ export async function verifyBlocksExecutionPayload(chain, parentBlock, blockInpu
|
|
|
104
104
|
isOptimisticallySafe = true;
|
|
105
105
|
}
|
|
106
106
|
executionStatuses.push(executionStatus);
|
|
107
|
-
const blockBody = blockInput.getBlock().message.body;
|
|
108
107
|
const isMergeTransitionBlock =
|
|
109
108
|
// If the merge block is found, stop the search as the isMergeTransitionBlockFn condition
|
|
110
109
|
// will still evaluate to true for the following blocks leading to errors (while syncing)
|
|
111
110
|
// as the preState0 still belongs to the pre state of the first block on segment
|
|
112
111
|
mergeBlockFound === null &&
|
|
113
112
|
isExecutionStateType(preState0) &&
|
|
114
|
-
isExecutionBlockBodyType(
|
|
115
|
-
isMergeTransitionBlockFn(preState0,
|
|
113
|
+
isExecutionBlockBodyType(block.message.body) &&
|
|
114
|
+
isMergeTransitionBlockFn(preState0, block.message.body);
|
|
116
115
|
// If this is a merge transition block, check to ensure if it references
|
|
117
116
|
// a valid terminal PoW block.
|
|
118
117
|
//
|
|
@@ -127,7 +126,7 @@ export async function verifyBlocksExecutionPayload(chain, parentBlock, blockInpu
|
|
|
127
126
|
// deal it with the external services like eth1 tracker here than
|
|
128
127
|
// in import block
|
|
129
128
|
if (isMergeTransitionBlock) {
|
|
130
|
-
const mergeBlock =
|
|
129
|
+
const mergeBlock = block.message;
|
|
131
130
|
const mergeBlockHash = toRootHex(chain.config.getForkTypes(mergeBlock.slot).BeaconBlock.hashTreeRoot(mergeBlock));
|
|
132
131
|
const powBlockRootHex = toRootHex(mergeBlock.body.executionPayload.parentHash);
|
|
133
132
|
const powBlock = await chain.eth1.getPowBlock(powBlockRootHex).catch((error) => {
|
|
@@ -154,15 +153,13 @@ export async function verifyBlocksExecutionPayload(chain, parentBlock, blockInpu
|
|
|
154
153
|
}
|
|
155
154
|
}
|
|
156
155
|
const executionTime = Date.now();
|
|
157
|
-
if (
|
|
158
|
-
opts.seenTimestampSec !== undefined &&
|
|
159
|
-
executionStatuses[0] === ExecutionStatus.Valid) {
|
|
156
|
+
if (blocks.length === 1 && opts.seenTimestampSec !== undefined && executionStatuses[0] === ExecutionStatus.Valid) {
|
|
160
157
|
const recvToValidation = executionTime / 1000 - opts.seenTimestampSec;
|
|
161
158
|
const validationTime = recvToValidation - recvToValLatency;
|
|
162
159
|
chain.metrics?.gossipBlock.executionPayload.recvToValidation.observe(recvToValidation);
|
|
163
160
|
chain.metrics?.gossipBlock.executionPayload.validationTime.observe(validationTime);
|
|
164
161
|
chain.logger.debug("Verified execution payload", {
|
|
165
|
-
slot:
|
|
162
|
+
slot: blocks[0].message.slot,
|
|
166
163
|
recvToValLatency,
|
|
167
164
|
recvToValidation,
|
|
168
165
|
validationTime,
|
|
@@ -178,8 +175,7 @@ export async function verifyBlocksExecutionPayload(chain, parentBlock, blockInpu
|
|
|
178
175
|
/**
|
|
179
176
|
* Verifies a single block execution payload by sending it to the EL client (via HTTP).
|
|
180
177
|
*/
|
|
181
|
-
export async function verifyBlockExecutionPayload(chain,
|
|
182
|
-
const block = blockInput.getBlock();
|
|
178
|
+
export async function verifyBlockExecutionPayload(chain, block, preState0, opts, isOptimisticallySafe, currentSlot) {
|
|
183
179
|
/** Not null if execution is enabled */
|
|
184
180
|
const executionPayloadEnabled = isExecutionStateType(preState0) &&
|
|
185
181
|
isExecutionBlockBodyType(block.message.body) &&
|
|
@@ -196,11 +192,13 @@ export async function verifyBlockExecutionPayload(chain, blockInput, preState0,
|
|
|
196
192
|
return { executionStatus: ExecutionStatus.PreMerge, execError: null };
|
|
197
193
|
}
|
|
198
194
|
// TODO: Handle better notifyNewPayload() returning error is syncing
|
|
199
|
-
const fork =
|
|
200
|
-
const versionedHashes =
|
|
195
|
+
const fork = chain.config.getForkName(block.message.slot);
|
|
196
|
+
const versionedHashes = ForkSeq[fork] >= ForkSeq.deneb
|
|
197
|
+
? block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash)
|
|
198
|
+
: undefined;
|
|
201
199
|
const parentBlockRoot = ForkSeq[fork] >= ForkSeq.deneb ? block.message.parentRoot : undefined;
|
|
202
200
|
const executionRequests = ForkSeq[fork] >= ForkSeq.electra ? block.message.body.executionRequests : undefined;
|
|
203
|
-
const logCtx = { slot:
|
|
201
|
+
const logCtx = { slot: block.message.slot, executionBlock: executionPayloadEnabled.blockNumber };
|
|
204
202
|
chain.logger.debug("Call engine api newPayload", logCtx);
|
|
205
203
|
const execResult = await chain.executionEngine.notifyNewPayload(fork, executionPayloadEnabled, versionedHashes, parentBlockRoot, executionRequests);
|
|
206
204
|
chain.logger.debug("Receive engine api newPayload result", { ...logCtx, status: execResult.status });
|
|
@@ -216,7 +214,7 @@ export async function verifyBlockExecutionPayload(chain, blockInput, preState0,
|
|
|
216
214
|
const lvhResponse = {
|
|
217
215
|
executionStatus,
|
|
218
216
|
latestValidExecHash: execResult.latestValidHash,
|
|
219
|
-
invalidateFromParentBlockRoot:
|
|
217
|
+
invalidateFromParentBlockRoot: toRootHex(block.message.parentRoot),
|
|
220
218
|
};
|
|
221
219
|
const execError = new BlockError(block, {
|
|
222
220
|
code: BlockErrorCode.EXECUTION_ENGINE_ERROR,
|
|
@@ -232,7 +230,7 @@ export async function verifyBlockExecutionPayload(chain, blockInput, preState0,
|
|
|
232
230
|
// the safeSlotsToImportOptimistically window of current slot, then we can import else
|
|
233
231
|
// we need to throw and not import his block
|
|
234
232
|
const safeSlotsToImportOptimistically = opts.safeSlotsToImportOptimistically ?? SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY;
|
|
235
|
-
if (!isOptimisticallySafe &&
|
|
233
|
+
if (!isOptimisticallySafe && block.message.slot + safeSlotsToImportOptimistically >= currentSlot) {
|
|
236
234
|
const execError = new BlockError(block, {
|
|
237
235
|
code: BlockErrorCode.EXECUTION_ENGINE_ERROR,
|
|
238
236
|
execStatus: ExecutionPayloadStatus.UNSAFE_OPTIMISTIC_STATUS,
|
|
@@ -278,7 +276,7 @@ function getSegmentErrorResponse({ verifyResponse, blockIndex }, parentBlock, bl
|
|
|
278
276
|
lvhResponse.latestValidExecHash !== null) {
|
|
279
277
|
let lvhFound = false;
|
|
280
278
|
for (let mayBeLVHIndex = blockIndex - 1; mayBeLVHIndex >= 0; mayBeLVHIndex--) {
|
|
281
|
-
const block = blocks[mayBeLVHIndex]
|
|
279
|
+
const block = blocks[mayBeLVHIndex];
|
|
282
280
|
if (toRootHex(block.message.body.executionPayload.blockHash) ===
|
|
283
281
|
lvhResponse.latestValidExecHash) {
|
|
284
282
|
lvhFound = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyBlocksExecutionPayloads.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlocksExecutionPayloads.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAMf,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,OAAO,EAAE,mCAAmC,EAAC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAEL,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,IAAI,wBAAwB,GACnD,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAU,SAAS,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"verifyBlocksExecutionPayloads.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlocksExecutionPayloads.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAMf,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,OAAO,EAAE,mCAAmC,EAAC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAEL,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,IAAI,wBAAwB,GACnD,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAU,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAC,4BAA4B,EAAC,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAkC9D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAyC,EACzC,WAAuB,EACvB,MAA2B,EAC3B,SAAoC,EACpC,MAAmB,EACnB,IAAwC;IAExC,MAAM,iBAAiB,GAAgC,EAAE,CAAC;IAC1D,IAAI,eAAe,GAAiC,IAAI,CAAC;IACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhC,oEAAoE;IACpE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,sFAAsF;IACtF,iDAAiD;IACjD,EAAE;IACF,gCAAgC;IAChC,0EAA0E;IAC1E,2BAA2B;IAC3B,oFAAoF;IACpF,qFAAqF;IACrF,0EAA0E;IAC1E,6EAA6E;IAC7E,EAAE;IACF,oFAAoF;IACpF,+CAA+C;IAC/C,EAAE;IACF,wFAAwF;IACxF,6DAA6D;IAC7D,EAAE;IACF,wFAAwF;IACxF,wFAAwF;IACxF,0FAA0F;IAC1F,YAAY;IACZ,EAAE;IACF,EAAE;IACF,8BAA8B;IAC9B,8DAA8D;IAC9D,8EAA8E;IAC9E,sBAAsB;IACtB,EAAE;IACF,uCAAuC;IACvC,EAAE;IACF,uFAAuF;IACvF,wFAAwF;IACxF,EAAE;IACF,wFAAwF;IACxF,mCAAmC;IACnC,EAAE;IACF,2BAA2B;IAC3B,kCAAkC;IAClC,wFAAwF;IACxF,qEAAqE;IACrE,4CAA4C;IAC5C,EAAE;IACF,wBAAwB;IACxB,EAAE;IACF,EAAE;IACF,8EAA8E;IAC9E,6FAA6F;IAC7F,EAAE;IACF,EAAE;IACF,4DAA4D;IAC5D,8EAA8E;IAC9E,eAAe;IACf,0FAA0F;IAC1F,wFAAwF;IACxF,EAAE;IACF,EAAE;IACF,8BAA8B;IAC9B,6EAA6E;IAC7E,sDAAsD;IACtD,kGAAkG;IAClG,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;IAC5C,MAAM,+BAA+B,GAAG,IAAI,CAAC,+BAA+B,IAAI,mCAAmC,CAAC;IACpH,IAAI,oBAAoB,GACtB,WAAW,CAAC,eAAe,KAAK,eAAe,CAAC,QAAQ;QACxD,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG,+BAA+B,GAAG,WAAW,CAAC;IAEzE,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,2FAA2F;QAC3F,uDAAuD;QACvD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,YAAY,CAAC,8BAA8B,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,2BAA2B,CACtD,KAAK,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,oBAAoB,EACpB,WAAW,CACZ,CAAC;QAEF,sFAAsF;QACtF,IAAI,cAAc,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO,uBAAuB,CAAC,EAAC,cAAc,EAAE,UAAU,EAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACpF,CAAC;QAED,sFAAsF;QACtF,MAAM,EAAC,eAAe,EAAC,GAAG,cAAc,CAAC;QACzC,2FAA2F;QAC3F,oFAAoF;QACpF,sDAAsD;QACtD,IAAI,eAAe,KAAK,eAAe,CAAC,QAAQ,EAAE,CAAC;YACjD,oBAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAExC,MAAM,sBAAsB;QAC1B,yFAAyF;QACzF,yFAAyF;QACzF,gFAAgF;QAChF,eAAe,KAAK,IAAI;YACxB,oBAAoB,CAAC,SAAS,CAAC;YAC/B,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAC5C,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE1D,wEAAwE;QACxE,8BAA8B;QAC9B,EAAE;QACF,wEAAwE;QACxE,iGAAiG;QACjG,uEAAuE;QACvE,EAAE;QACF,WAAW;QACX,wEAAwE;QACxE,yBAAyB;QACzB,uEAAuE;QACvE,qEAAqE;QACrE,sBAAsB;QACtB,IAAI,sBAAsB,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAgC,CAAC;YAC1D,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;YAClH,MAAM,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC7E,kEAAkE;gBAClE,uCAAuC;gBACvC,KAAK,CAAC,MAAM,CAAC,IAAI,CACf,0EAA0E,EAC1E,EAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAC,EAC/C,KAAK,CACN,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,cAAc,GAClB,QAAQ;gBACR,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACjE,kEAAkE;oBAClE,uCAAuC;oBACvC,KAAK,CAAC,MAAM,CAAC,IAAI,CACf,wFAAwF,EACxF,EAAC,kBAAkB,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAC,EACpF,KAAK,CACN,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC,CAAC;YAEN,4GAA4G;YAC5G,IAAI,eAAe,KAAK,eAAe,CAAC,QAAQ,EAAE,CAAC;gBACjD,MAAM,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACvE,CAAC;YAED,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,EAAC,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAC,CAAC,CAAC;YACnG,iHAAiH;YACjH,yFAAyF;YACzF,eAAe,GAAG,UAAU,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC;QACjH,MAAM,gBAAgB,GAAG,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACtE,MAAM,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;QAE3D,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvF,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEnF,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;YAC/C,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;YAC5B,gBAAgB;YAChB,gBAAgB;YAChB,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,iBAAiB;QACjB,aAAa;QACb,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAyC,EACzC,KAAwB,EACxB,SAAoC,EACpC,IAAsB,EACtB,oBAA6B,EAC7B,WAAiB;IAEjB,uCAAuC;IACvC,MAAM,uBAAuB,GAC3B,oBAAoB,CAAC,SAAS,CAAC;QAC/B,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAC5C,iHAAiH;QACjH,kFAAkF;QAClF,gHAAgH;QAChH,6GAA6G;QAC7G,gHAAgH;QAChH,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB;QACrC,CAAC,CAAC,IAAI,CAAC;IAEX,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,gCAAgC;QAChC,OAAO,EAAC,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAiC,CAAC;IACtG,CAAC;IAED,oEAAoE;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,eAAe,GACnB,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK;QAC5B,CAAC,CAAE,KAAK,CAAC,OAAO,CAAC,IAA8B,CAAC,kBAAkB,CAAC,GAAG,CAAC,4BAA4B,CAAC;QACpG,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,MAAM,iBAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAE,KAAK,CAAC,OAAO,CAAC,IAAgC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnH,MAAM,MAAM,GAAG,EAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,uBAAuB,CAAC,WAAW,EAAC,CAAC;IAC/F,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAC7D,IAAI,EACJ,uBAAuB,EACvB,eAAe,EACf,eAAe,EACf,iBAAiB,CAClB,CAAC;IACF,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAC,GAAG,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAC,CAAC,CAAC;IAEnG,KAAK,CAAC,OAAO,EAAE,4BAA4B,CAAC,GAAG,CAAC,EAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAC,CAAC,CAAC;IAE7E,QAAQ,UAAU,CAAC,MAAM,EAAE,CAAC;QAC1B,KAAK,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,MAAM,eAAe,GAA0B,eAAe,CAAC,KAAK,CAAC;YACrE,MAAM,WAAW,GAAG,EAAC,eAAe,EAAE,mBAAmB,EAAE,UAAU,CAAC,eAAe,EAAC,CAAC;YACvF,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC;QACzD,CAAC;QAED,KAAK,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,MAAM,eAAe,GAA4B,eAAe,CAAC,OAAO,CAAC;YACzE,MAAM,WAAW,GAAG;gBAClB,eAAe;gBACf,mBAAmB,EAAE,UAAU,CAAC,eAAe;gBAC/C,6BAA6B,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;aACnE,CAAC;YACF,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE;gBACtC,IAAI,EAAE,cAAc,CAAC,sBAAsB;gBAC3C,UAAU,EAAE,UAAU,CAAC,MAAM;gBAC7B,YAAY,EAAE,UAAU,CAAC,eAAe,IAAI,EAAE;aAC/C,CAAC,CAAC;YACH,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC;QACnD,CAAC;QAED,wFAAwF;QACxF,KAAK,sBAAsB,CAAC,QAAQ,CAAC;QACrC,KAAK,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,2FAA2F;YAC3F,sFAAsF;YACtF,4CAA4C;YAC5C,MAAM,+BAA+B,GACnC,IAAI,CAAC,+BAA+B,IAAI,mCAAmC,CAAC;YAC9E,IAAI,CAAC,oBAAoB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,+BAA+B,IAAI,WAAW,EAAE,CAAC;gBACjG,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE;oBACtC,IAAI,EAAE,cAAc,CAAC,sBAAsB;oBAC3C,UAAU,EAAE,sBAAsB,CAAC,wBAAwB;oBAC3D,YAAY,EAAE,sBAAsB,UAAU,CAAC,MAAM,mBAAmB,IAAI,CAAC,+BAA+B,iBAAiB;iBAC9H,CAAC,CAAC;gBACH,OAAO,EAAC,eAAe,EAAE,IAAI,EAAE,SAAS,EAAiC,CAAC;YAC5E,CAAC;YAED,OAAO,EAAC,eAAe,EAAE,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC;QACrE,CAAC;QAED,qFAAqF;QACrF,wEAAwE;QACxE,EAAE;QACF,+EAA+E;QAC/E,mDAAmD;QACnD,uBAAuB;QACvB,wEAAwE;QACxE,gFAAgF;QAChF,8EAA8E;QAC9E,kEAAkE;QAClE,sFAAsF;QACtF,uFAAuF;QACvF,aAAa;QACb,sFAAsF;QACtF,wFAAwF;QACxF,sCAAsC;QAEtC,KAAK,sBAAsB,CAAC,kBAAkB,CAAC;QAC/C,KAAK,sBAAsB,CAAC,OAAO,CAAC;QACpC,KAAK,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE;gBACtC,IAAI,EAAE,cAAc,CAAC,sBAAsB;gBAC3C,UAAU,EAAE,UAAU,CAAC,MAAM;gBAC7B,YAAY,EAAE,UAAU,CAAC,eAAe;aACzC,CAAC,CAAC;YACH,OAAO,EAAC,eAAe,EAAE,IAAI,EAAE,SAAS,EAAiC,CAAC;QAC5E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,EAAC,cAAc,EAAE,UAAU,EAAqE,EAChG,WAAuB,EACvB,MAA2B;IAE3B,MAAM,EAAC,eAAe,EAAE,WAAW,EAAE,SAAS,EAAC,GAAG,cAAc,CAAC;IACjE,IAAI,iBAAiB,GAAmC,SAAS,CAAC;IAElE,IACE,eAAe,KAAK,eAAe,CAAC,OAAO;QAC3C,WAAW,KAAK,SAAS;QACzB,WAAW,CAAC,mBAAmB,KAAK,IAAI,EACxC,CAAC;QACD,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,IAAI,aAAa,GAAG,UAAU,GAAG,CAAC,EAAE,aAAa,IAAI,CAAC,EAAE,aAAa,EAAE,EAAE,CAAC;YAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;YACpC,IACE,SAAS,CAAE,KAAK,CAAC,OAAO,CAAC,IAAkC,CAAC,gBAAgB,CAAC,SAAS,CAAC;gBACvF,WAAW,CAAC,mBAAmB,EAC/B,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;QAED,iFAAiF;QACjF,2BAA2B;QAC3B,4CAA4C;QAC5C,sCAAsC;QACtC,IACE,CAAC,QAAQ;YACT,WAAW,CAAC,eAAe,KAAK,eAAe,CAAC,QAAQ;YACxD,WAAW,CAAC,yBAAyB,KAAK,WAAW,CAAC,mBAAmB,EACzE,CAAC;YACD,iBAAiB,GAAG;gBAClB,eAAe,EAAE,eAAe,CAAC,OAAO;gBACxC,mBAAmB,EAAE,WAAW,CAAC,mBAAmB;gBACpD,6BAA6B,EAAE,WAAW,CAAC,SAAS;aACrD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,EAAC,UAAU,EAAE,SAAS,EAAC,CAAC;IAC5C,OAAO,EAAC,WAAW,EAAE,iBAAiB,EAAsB,CAAC;AAC/D,CAAC"}
|
|
@@ -3,8 +3,7 @@ import { IForkChoice, ProtoBlock } from "@lodestar/fork-choice";
|
|
|
3
3
|
import { RootHex, Slot } from "@lodestar/types";
|
|
4
4
|
import { IClock } from "../../util/clock.js";
|
|
5
5
|
import { IChainOptions } from "../options.js";
|
|
6
|
-
import {
|
|
7
|
-
import { ImportBlockOpts } from "./types.js";
|
|
6
|
+
import { BlockInput, ImportBlockOpts } from "./types.js";
|
|
8
7
|
/**
|
|
9
8
|
* Verifies some early cheap sanity checks on the block before running the full state transition.
|
|
10
9
|
*
|
|
@@ -23,8 +22,8 @@ export declare function verifyBlocksSanityChecks(chain: {
|
|
|
23
22
|
config: ChainForkConfig;
|
|
24
23
|
opts: IChainOptions;
|
|
25
24
|
blacklistedBlocks: Map<RootHex, Slot | null>;
|
|
26
|
-
}, blocks:
|
|
27
|
-
relevantBlocks:
|
|
25
|
+
}, blocks: BlockInput[], opts: ImportBlockOpts): {
|
|
26
|
+
relevantBlocks: BlockInput[];
|
|
28
27
|
parentSlots: Slot[];
|
|
29
28
|
parentBlock: ProtoBlock | null;
|
|
30
29
|
};
|
|
@@ -21,7 +21,7 @@ export function verifyBlocksSanityChecks(chain, blocks, opts) {
|
|
|
21
21
|
const parentSlots = [];
|
|
22
22
|
let parentBlock = null;
|
|
23
23
|
for (const blockInput of blocks) {
|
|
24
|
-
const block = blockInput
|
|
24
|
+
const { block } = blockInput;
|
|
25
25
|
const blockSlot = block.message.slot;
|
|
26
26
|
const blockHash = toRootHex(chain.config.getForkTypes(block.message.slot).BeaconBlock.hashTreeRoot(block.message));
|
|
27
27
|
if (chain.blacklistedBlocks.has(blockHash)) {
|
|
@@ -56,7 +56,7 @@ export function verifyBlocksSanityChecks(chain, blocks, opts) {
|
|
|
56
56
|
const relevantLastBlock = relevantBlocks.at(-1);
|
|
57
57
|
let parentBlockSlot;
|
|
58
58
|
if (relevantLastBlock) {
|
|
59
|
-
parentBlockSlot = relevantLastBlock.
|
|
59
|
+
parentBlockSlot = relevantLastBlock.block.message.slot;
|
|
60
60
|
}
|
|
61
61
|
else {
|
|
62
62
|
// When importing a block segment, only the first NON-IGNORED block must be known to the fork-choice.
|