@lodestar/beacon-node 1.51.0-dev.32db66b396 → 1.51.0-dev.36022cc5cb
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/api.js +1 -1
- package/lib/api/impl/api.js.map +1 -1
- package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +29 -34
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/index.d.ts +2 -1
- package/lib/api/impl/beacon/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/index.js +2 -2
- package/lib/api/impl/beacon/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 +5 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/index.js +8 -2
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +3 -2
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +17 -9
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +3 -0
- package/lib/api/impl/debug/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 +143 -35
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/options.d.ts +2 -0
- package/lib/api/options.d.ts.map +1 -1
- package/lib/api/options.js +1 -0
- package/lib/api/options.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +13 -2
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +85 -27
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +23 -51
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +82 -20
- 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 +4 -4
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +8 -1
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +5 -0
- 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 +18 -7
- 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 +8 -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/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 +7 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
- package/lib/chain/blocks/verifyPayloadsDataAvailability.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.map +1 -1
- package/lib/chain/bls/multithread/index.js +13 -11
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +1 -1
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/worker.js +1 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.js +1 -1
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.js +1 -1
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +10 -3
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +61 -8
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +1 -1
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +1 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadBid.js +2 -0
- package/lib/chain/errors/executionPayloadBid.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/inclusionList.d.ts +60 -0
- package/lib/chain/errors/inclusionList.d.ts.map +1 -0
- package/lib/chain/errors/inclusionList.js +19 -0
- package/lib/chain/errors/inclusionList.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +1 -0
- 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 +53 -0
- package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
- package/lib/chain/forkChoiceExecutionEngine.js +121 -0
- package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
- package/lib/chain/interface.d.ts +7 -6
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +23 -10
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +15 -4
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
- package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
- package/lib/chain/opPools/inclusionListStore.js +171 -0
- package/lib/chain/opPools/inclusionListStore.js.map +1 -0
- 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 +17 -7
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
- 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 +11 -3
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +0 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +6 -3
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +30 -10
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +2 -2
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +1 -1
- package/lib/chain/regen/interface.js.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/validation/executionPayloadBid.d.ts +0 -15
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +37 -158
- 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/validation/inclusionList.d.ts +14 -0
- package/lib/chain/validation/inclusionList.d.ts.map +1 -0
- package/lib/chain/validation/inclusionList.js +150 -0
- package/lib/chain/validation/inclusionList.js.map +1 -0
- package/lib/chain/validation/index.d.ts +1 -0
- package/lib/chain/validation/index.d.ts.map +1 -1
- package/lib/chain/validation/index.js +1 -0
- package/lib/chain/validation/index.js.map +1 -1
- package/lib/db/beacon.d.ts +7 -0
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +34 -0
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/dataColumnStore.d.ts +1 -1
- package/lib/db/dataColumnStore.d.ts.map +1 -1
- package/lib/db/dataColumnStore.js +1 -4
- package/lib/db/dataColumnStore.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/interface.d.ts +1 -0
- package/lib/db/interface.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
- package/lib/db/repositories/dataColumnSidecarArchive.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/builder/validateBid.d.ts.map +1 -1
- package/lib/execution/builder/validateBid.js +14 -1
- package/lib/execution/builder/validateBid.js.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
- package/lib/execution/engine/disabled.d.ts +1 -0
- package/lib/execution/engine/disabled.d.ts.map +1 -1
- package/lib/execution/engine/disabled.js +3 -0
- package/lib/execution/engine/disabled.js.map +1 -1
- package/lib/execution/engine/http.d.ts +10 -4
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +32 -8
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +28 -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 +5 -4
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +34 -10
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +31 -7
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +5 -3
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/payloadIdCache.js +15 -4
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +4 -3
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +3 -0
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +38 -38
- package/lib/execution/engine/transport.d.ts +4 -12
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +25 -1
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +19 -6
- 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 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +16 -0
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +35 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +16 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +35 -0
- 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/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +2 -0
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +3 -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 -0
- 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 +2 -0
- 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 +8 -2
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +1 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -5
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +13 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +4 -1
- 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 -2
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +50 -15
- 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.map +1 -1
- package/lib/network/peers/peerManager.d.ts +2 -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/assertPeerRelevance.d.ts +9 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
- package/lib/network/peers/utils/assertPeerRelevance.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/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +100 -38
- 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 +6 -0
- 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 +5 -1
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +11 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +66 -29
- 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 +6 -0
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +5 -0
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +1 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +5 -0
- 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 +4 -0
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +5 -2
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +3 -0
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/node/nodejs.d.ts +3 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +47 -21
- 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/interface.d.ts.map +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/sync.d.ts +7 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +61 -3
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +42 -18
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/execution.d.ts +4 -4
- package/lib/util/execution.d.ts.map +1 -1
- 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/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +5 -0
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +35 -2
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +31 -32
- package/src/api/impl/api.ts +1 -1
- package/src/api/impl/beacon/blocks/index.ts +57 -62
- package/src/api/impl/beacon/index.ts +3 -1
- package/src/api/impl/beacon/pool/index.ts +5 -1
- package/src/api/impl/beacon/state/index.ts +10 -1
- package/src/api/impl/beacon/state/utils.ts +20 -10
- package/src/api/impl/debug/index.ts +4 -0
- package/src/api/impl/validator/index.ts +178 -39
- package/src/api/options.ts +3 -0
- package/src/chain/GetBlobsTracker.ts +99 -40
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
- package/src/chain/blocks/importBlock.ts +37 -72
- package/src/chain/blocks/importExecutionPayload.ts +123 -36
- package/src/chain/blocks/index.ts +11 -4
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
- package/src/chain/blocks/types.ts +9 -1
- package/src/chain/blocks/verifyBlock.ts +31 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +10 -1
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +1 -1
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +14 -10
- package/src/chain/bls/multithread/types.ts +1 -1
- package/src/chain/bls/multithread/worker.ts +1 -5
- package/src/chain/bls/singleThread.ts +1 -1
- package/src/chain/bls/utils.ts +1 -1
- package/src/chain/chain.ts +71 -8
- package/src/chain/errors/blockError.ts +1 -1
- package/src/chain/errors/executionPayloadBid.ts +12 -0
- package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
- package/src/chain/errors/inclusionList.ts +38 -0
- package/src/chain/errors/index.ts +1 -0
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +197 -0
- package/src/chain/interface.ts +7 -5
- package/src/chain/opPools/aggregatedAttestationPool.ts +25 -9
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/inclusionListStore.ts +208 -0
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
- package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/options.ts +0 -2
- package/src/chain/produceBlock/produceBlockBody.ts +64 -21
- package/src/chain/regen/interface.ts +2 -2
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/validation/executionPayloadBid.ts +54 -183
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validation/inclusionList.ts +192 -0
- package/src/chain/validation/index.ts +1 -0
- package/src/db/beacon.ts +44 -0
- package/src/db/dataColumnStore.ts +2 -4
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/interface.ts +2 -0
- package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
- package/src/execution/builder/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/builder/validateBid.ts +23 -2
- package/src/execution/engine/blobVersionedHashes.ts +1 -1
- package/src/execution/engine/disabled.ts +4 -0
- package/src/execution/engine/http.ts +52 -18
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +46 -6
- package/src/execution/engine/jsonRpcTransport.ts +56 -11
- package/src/execution/engine/mock.ts +32 -7
- package/src/execution/engine/payloadIdCache.ts +24 -6
- package/src/execution/engine/restTransport.ts +18 -2
- package/src/execution/engine/transport.ts +13 -14
- package/src/execution/engine/types.ts +44 -7
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +2 -0
- package/src/metrics/metrics/beacon.ts +37 -0
- package/src/metrics/metrics/lodestar.ts +36 -0
- package/src/metrics/server/http.ts +5 -5
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +5 -0
- package/src/network/core/networkCoreWorker.ts +1 -0
- package/src/network/core/networkCoreWorkerHandler.ts +4 -0
- package/src/network/core/types.ts +2 -0
- package/src/network/gossip/gossipsub.ts +11 -0
- package/src/network/gossip/interface.ts +5 -0
- package/src/network/gossip/topic.ts +14 -0
- package/src/network/interface.ts +4 -0
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +56 -19
- package/src/network/options.ts +2 -0
- package/src/network/peers/peerManager.ts +28 -3
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/peers/utils/prioritizePeers.ts +14 -22
- package/src/network/processor/gossipHandlers.ts +124 -41
- package/src/network/processor/gossipQueues/index.ts +6 -0
- package/src/network/processor/gossipValidatorFn.ts +5 -0
- package/src/network/processor/index.ts +58 -27
- package/src/network/processor/types.ts +1 -1
- package/src/network/reqresp/ReqRespBeaconNode.ts +7 -0
- package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
- package/src/network/reqresp/handlers/index.ts +5 -0
- package/src/network/reqresp/protocols.ts +6 -0
- package/src/network/reqresp/rateLimit.ts +4 -0
- package/src/network/reqresp/types.ts +6 -0
- package/src/node/nodejs.ts +58 -22
- package/src/node/options.ts +9 -6
- package/src/sync/interface.ts +1 -0
- package/src/sync/sync.ts +65 -4
- package/src/sync/unknownBlock.ts +47 -28
- package/src/util/execution.ts +6 -6
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +42 -2
|
@@ -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";
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
IBeaconStateView,
|
|
22
22
|
RootCache,
|
|
23
23
|
computeEpochAtSlot,
|
|
24
|
-
|
|
24
|
+
computeTimeAtSlotMs,
|
|
25
25
|
getBeaconCommittees,
|
|
26
26
|
isStatePostAltair,
|
|
27
27
|
isStatePostBellatrix,
|
|
@@ -43,7 +43,8 @@ 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";
|
|
48
49
|
import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_BPS} from "../reprocess.js";
|
|
49
50
|
import {toCheckpointHex} from "../stateCache/persistentCheckpointsCache.js";
|
|
@@ -94,8 +95,8 @@ export async function importBlock(
|
|
|
94
95
|
fullyVerifiedBlock: FullyVerifiedBlock,
|
|
95
96
|
opts: ImportBlockOpts
|
|
96
97
|
): Promise<void> {
|
|
97
|
-
const {blockInput, postState, parentBlockSlot, dataAvailabilityStatus, indexedAttestations} =
|
|
98
|
-
|
|
98
|
+
const {blockInput, postState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
|
|
99
|
+
fullyVerifiedBlock;
|
|
99
100
|
const block = blockInput.getBlock();
|
|
100
101
|
const source = blockInput.getBlockSource();
|
|
101
102
|
const {slot: blockSlot} = block.message;
|
|
@@ -105,8 +106,9 @@ export async function importBlock(
|
|
|
105
106
|
const currentEpoch = computeEpochAtSlot(currentSlot);
|
|
106
107
|
const blockEpoch = computeEpochAtSlot(blockSlot);
|
|
107
108
|
const prevFinalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
108
|
-
const
|
|
109
|
-
fullyVerifiedBlock.seenTimestampSec
|
|
109
|
+
const receiveDelayMs =
|
|
110
|
+
Math.round(fullyVerifiedBlock.seenTimestampSec * 1000) -
|
|
111
|
+
computeTimeAtSlotMs(this.config, blockSlot, postState.genesisTime * 1000);
|
|
110
112
|
const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
|
|
111
113
|
const fork = this.config.getForkSeq(blockSlot);
|
|
112
114
|
|
|
@@ -130,35 +132,30 @@ export async function importBlock(
|
|
|
130
132
|
|
|
131
133
|
// Should compute checkpoint balances before forkchoice.onBlock
|
|
132
134
|
this.checkpointBalancesCache.processState(blockRootHex, postState);
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
135
|
+
const importDelayMs = this.clock.msFromSlot(blockSlot);
|
|
136
|
+
let blockSummary: ProtoBlock;
|
|
137
|
+
try {
|
|
138
|
+
blockSummary = this.forkChoice.onBlock(
|
|
139
|
+
block.message,
|
|
140
|
+
postState,
|
|
141
|
+
receiveDelayMs,
|
|
142
|
+
importDelayMs,
|
|
143
|
+
currentSlot,
|
|
144
|
+
executionStatus,
|
|
145
|
+
dataAvailabilityStatus
|
|
146
|
+
);
|
|
147
|
+
} catch (e) {
|
|
148
|
+
// The parent can be invalidated by a forkchoiceUpdated verdict after verifyBlocksSanityChecks passed
|
|
149
|
+
if (
|
|
150
|
+
e instanceof ForkChoiceError &&
|
|
151
|
+
e.type.code === ForkChoiceErrorCode.INVALID_BLOCK &&
|
|
152
|
+
e.type.err.code === InvalidBlockCode.PARENT_EXECUTION_INVALID
|
|
153
|
+
) {
|
|
154
|
+
throw new BlockError(block, {code: BlockErrorCode.PARENT_EXECUTION_INVALID, parentRoot: e.type.err.root});
|
|
147
155
|
}
|
|
148
|
-
|
|
156
|
+
throw e;
|
|
149
157
|
}
|
|
150
158
|
|
|
151
|
-
const importDelaySec = this.clock.secFromSlot(blockSlot);
|
|
152
|
-
const blockSummary = this.forkChoice.onBlock(
|
|
153
|
-
block.message,
|
|
154
|
-
postState,
|
|
155
|
-
receiveDelaySec,
|
|
156
|
-
importDelaySec,
|
|
157
|
-
currentSlot,
|
|
158
|
-
executionStatus,
|
|
159
|
-
dataAvailabilityStatus
|
|
160
|
-
);
|
|
161
|
-
|
|
162
159
|
// This adds the state necessary to process the next block
|
|
163
160
|
// Some block event handlers require state being in state cache so need to do this before emitting EventType.block
|
|
164
161
|
this.regen.processState(blockRootHex, postState);
|
|
@@ -321,18 +318,10 @@ export async function importBlock(
|
|
|
321
318
|
}
|
|
322
319
|
|
|
323
320
|
if (newHead.blockRoot !== oldHead.blockRoot) {
|
|
324
|
-
|
|
325
|
-
this.regen.updateHeadState(newHead, postState);
|
|
321
|
+
this.onHeadChanged(oldHead, newHead, postState);
|
|
326
322
|
|
|
327
323
|
const delaySec = this.clock.secFromSlot(newHead.slot);
|
|
328
|
-
this.logger.verbose("New chain head", {
|
|
329
|
-
slot: newHead.slot,
|
|
330
|
-
root: newHead.blockRoot,
|
|
331
|
-
delaySec,
|
|
332
|
-
});
|
|
333
|
-
|
|
334
324
|
if (this.metrics) {
|
|
335
|
-
this.metrics.headSlot.set(newHead.slot);
|
|
336
325
|
// Only track "recent" blocks. Otherwise sync can distort this metrics heavily.
|
|
337
326
|
// We want to track recent blocks coming from gossip, unknown block sync, and API.
|
|
338
327
|
const headFork = this.config.getForkName(newHead.slot);
|
|
@@ -345,32 +334,6 @@ export async function importBlock(
|
|
|
345
334
|
}
|
|
346
335
|
}
|
|
347
336
|
|
|
348
|
-
this.onNewHead(newHead);
|
|
349
|
-
|
|
350
|
-
this.metrics?.forkChoice.changedHead.inc();
|
|
351
|
-
|
|
352
|
-
const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
|
|
353
|
-
if (ancestorResult.code === AncestorStatus.CommonAncestor) {
|
|
354
|
-
// CommonAncestor = chain reorg, old head and new head not direct descendants
|
|
355
|
-
|
|
356
|
-
const forkChoiceReorgEventData: ReorgEventData = {
|
|
357
|
-
depth: ancestorResult.depth,
|
|
358
|
-
epoch: computeEpochAtSlot(newHead.slot),
|
|
359
|
-
slot: newHead.slot,
|
|
360
|
-
newHeadBlock: newHead.blockRoot,
|
|
361
|
-
oldHeadBlock: oldHead.blockRoot,
|
|
362
|
-
newHeadState: newHead.stateRoot,
|
|
363
|
-
oldHeadState: oldHead.stateRoot,
|
|
364
|
-
executionOptimistic: isOptimisticBlock(newHead),
|
|
365
|
-
};
|
|
366
|
-
|
|
367
|
-
this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
|
|
368
|
-
this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
|
|
369
|
-
|
|
370
|
-
this.metrics?.forkChoice.reorg.inc();
|
|
371
|
-
this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
|
|
372
|
-
}
|
|
373
|
-
|
|
374
337
|
// Lightclient server support (only after altair)
|
|
375
338
|
// - Persist state witness
|
|
376
339
|
// - Use block's syncAggregate
|
|
@@ -417,7 +380,7 @@ export async function importBlock(
|
|
|
417
380
|
// 4) Block meets the criteria of being re-orged out (this is also checked inside the function)
|
|
418
381
|
const result = this.forkChoice.shouldOverrideForkChoiceUpdate(
|
|
419
382
|
blockSummary,
|
|
420
|
-
this.clock.
|
|
383
|
+
this.clock.msFromSlot(currentSlot),
|
|
421
384
|
currentSlot
|
|
422
385
|
);
|
|
423
386
|
shouldOverrideFcu = result.shouldOverrideFcu;
|
|
@@ -458,7 +421,8 @@ export async function importBlock(
|
|
|
458
421
|
* - `headBlockHash !== null` -> Pre BELLATRIX_EPOCH
|
|
459
422
|
* - `headBlockHash !== ZERO_HASH` -> Pre TTD
|
|
460
423
|
*/
|
|
461
|
-
const
|
|
424
|
+
const fcuHead = this.forkChoice.getHead();
|
|
425
|
+
const headBlockHash = fcuHead.executionPayloadBlockHash ?? ZERO_HASH_HEX;
|
|
462
426
|
/**
|
|
463
427
|
* After BELLATRIX_EPOCH and TTD it's okay to send a zero hash block hash for the finalized block. This will happen if
|
|
464
428
|
* the current finalized block does not contain any execution payload at all (pre MERGE_EPOCH) or if it contains a
|
|
@@ -469,7 +433,8 @@ export async function importBlock(
|
|
|
469
433
|
if (headBlockHash !== ZERO_HASH_HEX) {
|
|
470
434
|
this.executionEngine
|
|
471
435
|
.notifyForkchoiceUpdate(
|
|
472
|
-
this.config.getForkName(
|
|
436
|
+
this.config.getForkName(fcuHead.slot),
|
|
437
|
+
fcuHead.blockRoot,
|
|
473
438
|
headBlockHash,
|
|
474
439
|
safeBlockHash,
|
|
475
440
|
finalizedBlockHash
|
|
@@ -1,13 +1,24 @@
|
|
|
1
|
+
import {SerializedList} from "@chainsafe/ssz";
|
|
1
2
|
import {routes} from "@lodestar/api";
|
|
2
3
|
import {
|
|
3
4
|
ExecutionStatus,
|
|
5
|
+
ForkChoiceError,
|
|
6
|
+
ForkChoiceErrorCode,
|
|
7
|
+
InvalidBlockCode,
|
|
4
8
|
PayloadExecutionStatus,
|
|
5
9
|
getFinalizedExecutionBlockHash,
|
|
6
10
|
getSafeExecutionBlockHash,
|
|
7
11
|
} from "@lodestar/fork-choice";
|
|
8
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
DataAvailabilityStatus,
|
|
14
|
+
computeEpochAtSlot,
|
|
15
|
+
isStatePostGloas,
|
|
16
|
+
isStatePostHeze,
|
|
17
|
+
} from "@lodestar/state-transition";
|
|
18
|
+
import {RootHex, bellatrix} from "@lodestar/types";
|
|
9
19
|
import {isErrorAborted} from "@lodestar/utils";
|
|
10
20
|
import {ExecutionPayloadStatus} from "../../execution/index.js";
|
|
21
|
+
import {getShufflingDependentRoot} from "../../util/dependentRoot.js";
|
|
11
22
|
import {isQueueErrorAborted} from "../../util/queue/index.js";
|
|
12
23
|
import {BeaconChain} from "../chain.js";
|
|
13
24
|
import {RegenCaller} from "../regen/interface.js";
|
|
@@ -18,7 +29,6 @@ import {
|
|
|
18
29
|
verifyExecutionPayloadEnvelope,
|
|
19
30
|
verifyExecutionPayloadEnvelopeSignature,
|
|
20
31
|
} from "./verifyExecutionPayloadEnvelope.js";
|
|
21
|
-
import {verifyPayloadsDataAvailability} from "./verifyPayloadsDataAvailability.js";
|
|
22
32
|
|
|
23
33
|
const EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS = 64;
|
|
24
34
|
|
|
@@ -26,9 +36,11 @@ export enum PayloadErrorCode {
|
|
|
26
36
|
EXECUTION_ENGINE_INVALID = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID",
|
|
27
37
|
EXECUTION_ENGINE_ERROR = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR",
|
|
28
38
|
BLOCK_NOT_IN_FORK_CHOICE = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE",
|
|
39
|
+
BLOCK_EXECUTION_INVALID = "PAYLOAD_ERROR_BLOCK_EXECUTION_INVALID",
|
|
29
40
|
MISS_BLOCK_STATE = "PAYLOAD_ERROR_MISS_BLOCK_STATE",
|
|
30
41
|
ENVELOPE_VERIFICATION_ERROR = "PAYLOAD_ERROR_ENVELOPE_VERIFICATION_ERROR",
|
|
31
42
|
INVALID_SIGNATURE = "PAYLOAD_ERROR_INVALID_SIGNATURE",
|
|
43
|
+
DATA_UNAVAILABLE = "PAYLOAD_ERROR_DATA_UNAVAILABLE",
|
|
32
44
|
}
|
|
33
45
|
|
|
34
46
|
export type PayloadErrorType =
|
|
@@ -46,6 +58,10 @@ export type PayloadErrorType =
|
|
|
46
58
|
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE;
|
|
47
59
|
blockRootHex: string;
|
|
48
60
|
}
|
|
61
|
+
| {
|
|
62
|
+
code: PayloadErrorCode.BLOCK_EXECUTION_INVALID;
|
|
63
|
+
blockRootHex: string;
|
|
64
|
+
}
|
|
49
65
|
| {
|
|
50
66
|
code: PayloadErrorCode.MISS_BLOCK_STATE;
|
|
51
67
|
blockRootHex: string;
|
|
@@ -56,6 +72,9 @@ export type PayloadErrorType =
|
|
|
56
72
|
}
|
|
57
73
|
| {
|
|
58
74
|
code: PayloadErrorCode.INVALID_SIGNATURE;
|
|
75
|
+
}
|
|
76
|
+
| {
|
|
77
|
+
code: PayloadErrorCode.DATA_UNAVAILABLE;
|
|
59
78
|
};
|
|
60
79
|
|
|
61
80
|
export class PayloadError extends Error {
|
|
@@ -87,7 +106,8 @@ function toForkChoiceExecutionStatus(status: ExecutionPayloadStatus): PayloadExe
|
|
|
87
106
|
* are applied on the next block via processParentExecutionPayload.
|
|
88
107
|
*
|
|
89
108
|
* The DA wait must have run upstream (range sync awaits DA in `verifyBlocksInEpoch` for the
|
|
90
|
-
* whole segment; gossip / API path
|
|
109
|
+
* whole segment; the gossip / API / unknown-payload sync path waits in `PayloadEnvelopeProcessor`
|
|
110
|
+
* before the import is queued).
|
|
91
111
|
*
|
|
92
112
|
* Steps:
|
|
93
113
|
* 1. Emit `execution_payload_available` event for payload attestation
|
|
@@ -132,6 +152,13 @@ export async function importExecutionPayload(
|
|
|
132
152
|
blockRootHex,
|
|
133
153
|
});
|
|
134
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
|
+
}
|
|
135
162
|
|
|
136
163
|
// 3. Regenerate state for envelope verification
|
|
137
164
|
const blockState = await this.regen
|
|
@@ -172,6 +199,37 @@ export async function importExecutionPayload(
|
|
|
172
199
|
);
|
|
173
200
|
}
|
|
174
201
|
|
|
202
|
+
// Timely inclusion lists of the preceding slot, keyed by that slot's dependent root on the block's branch and
|
|
203
|
+
// resolved from the parent, which is at or before that slot. Gossip validation only accepts lists whose dependent
|
|
204
|
+
// block is in fork choice, so a dependent root fork choice cannot resolve (below the anchor after checkpoint sync)
|
|
205
|
+
// keys no stored list
|
|
206
|
+
let inclusionListTransactions: bellatrix.Transactions | undefined;
|
|
207
|
+
if (isStatePostHeze(blockState)) {
|
|
208
|
+
const inclusionListSlot = protoBlock.slot - 1;
|
|
209
|
+
let dependentRoot: RootHex | null = null;
|
|
210
|
+
const parentBlock = this.forkChoice.getBlockHexDefaultStatus(protoBlock.parentRoot);
|
|
211
|
+
if (parentBlock !== null) {
|
|
212
|
+
try {
|
|
213
|
+
dependentRoot = getShufflingDependentRoot(
|
|
214
|
+
this.forkChoice,
|
|
215
|
+
computeEpochAtSlot(inclusionListSlot),
|
|
216
|
+
computeEpochAtSlot(parentBlock.slot),
|
|
217
|
+
parentBlock
|
|
218
|
+
);
|
|
219
|
+
} catch (e) {
|
|
220
|
+
this.logger.debug(
|
|
221
|
+
"Inclusion list dependent root not in fork choice, importing payload without lists",
|
|
222
|
+
{slot, root: blockRootHex},
|
|
223
|
+
e as Error
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
inclusionListTransactions =
|
|
228
|
+
dependentRoot === null
|
|
229
|
+
? SerializedList.empty()
|
|
230
|
+
: this.inclusionListStore.getInclusionListTransactions(inclusionListSlot, dependentRoot, true);
|
|
231
|
+
}
|
|
232
|
+
|
|
175
233
|
// 4a. Run EL and signature verification in parallel
|
|
176
234
|
const logCtx = {slot, root: blockRootHex, executionBlock: envelope.payload.blockNumber};
|
|
177
235
|
this.logger.debug("Call engine api newPayload", logCtx);
|
|
@@ -182,7 +240,8 @@ export async function importExecutionPayload(
|
|
|
182
240
|
envelope.payload,
|
|
183
241
|
payloadInput.getVersionedHashes(),
|
|
184
242
|
envelope.parentBeaconBlockRoot,
|
|
185
|
-
envelope.executionRequests
|
|
243
|
+
envelope.executionRequests,
|
|
244
|
+
inclusionListTransactions
|
|
186
245
|
),
|
|
187
246
|
|
|
188
247
|
opts.validSignature === true
|
|
@@ -250,27 +309,73 @@ export async function importExecutionPayload(
|
|
|
250
309
|
}
|
|
251
310
|
});
|
|
252
311
|
|
|
312
|
+
// A VALID payload that does not satisfy the inclusion list constraints is still imported, fork choice
|
|
313
|
+
// only records the verdict so should_extend_payload moves the head to the EMPTY variant, which the next
|
|
314
|
+
// proposer builds on.
|
|
315
|
+
// Recorded before the payload enters fork choice. A VALID response must carry a verdict, an
|
|
316
|
+
// optimistically imported payload counts as satisfied until the engine validates it, anything else as
|
|
317
|
+
// unsatisfied. A VALID response without a verdict violates the engine API, it is logged and treated as
|
|
318
|
+
// satisfied so a non-compliant engine does not orphan every payload
|
|
319
|
+
if (inclusionListTransactions !== undefined) {
|
|
320
|
+
if (execResult.status === ExecutionPayloadStatus.VALID && execResult.inclusionListSatisfied == null) {
|
|
321
|
+
this.logger.warn("Execution engine reported no inclusion list verdict, not enforcing inclusion lists", logCtx);
|
|
322
|
+
}
|
|
323
|
+
const satisfied =
|
|
324
|
+
execResult.status === ExecutionPayloadStatus.VALID
|
|
325
|
+
? (execResult.inclusionListSatisfied ?? true)
|
|
326
|
+
: execResult.status === ExecutionPayloadStatus.SYNCING || execResult.status === ExecutionPayloadStatus.ACCEPTED;
|
|
327
|
+
this.forkChoice.recordPayloadInclusionListSatisfaction(blockRootHex, satisfied);
|
|
328
|
+
if (!satisfied) {
|
|
329
|
+
this.logger.verbose("Payload did not satisfy inclusion list constraints", {
|
|
330
|
+
...logCtx,
|
|
331
|
+
blockHash: blockHashHex,
|
|
332
|
+
status: execResult.status,
|
|
333
|
+
inclusionListTransactions: inclusionListTransactions.length,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
253
338
|
// 6. Update fork choice, transitions the block's PENDING variant to FULL
|
|
254
339
|
const execStatus = toForkChoiceExecutionStatus(execResult.status);
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
+
}
|
|
263
360
|
|
|
264
361
|
// 7. Queue notifyForkchoiceUpdate to engine api
|
|
265
362
|
const head = this.forkChoice.getHead();
|
|
266
|
-
if (
|
|
363
|
+
if (
|
|
364
|
+
!this.opts.disableImportExecutionFcU &&
|
|
365
|
+
blockRootHex === head.blockRoot &&
|
|
366
|
+
// Skip a payload that does not satisfy the inclusion list constraints, fork choice keeps the EMPTY
|
|
367
|
+
// variant as head and the next prepare fcU keeps the engine on the parent payload
|
|
368
|
+
this.forkChoice.isPayloadInclusionListSatisfied(blockRootHex)
|
|
369
|
+
) {
|
|
267
370
|
const safeBlockHash = getSafeExecutionBlockHash(this.forkChoice, this.logger);
|
|
268
371
|
const finalizedBlockHash = getFinalizedExecutionBlockHash(this.forkChoice);
|
|
269
|
-
this.executionEngine
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
+
});
|
|
274
379
|
}
|
|
275
380
|
|
|
276
381
|
// 8. Record metrics for payload envelope and column sources
|
|
@@ -302,21 +407,3 @@ export async function importExecutionPayload(
|
|
|
302
407
|
delaySec,
|
|
303
408
|
});
|
|
304
409
|
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Process an execution payload envelope end-to-end: wait for DA, then import.
|
|
308
|
-
*
|
|
309
|
-
* Used by the PayloadEnvelopeProcessor queue (gossip / API / unknown-payload sync) — i.e.
|
|
310
|
-
* callers that have NOT already awaited DA themselves. Range sync's inline dispatch in
|
|
311
|
-
* processBlocks skips this wrapper and calls `importExecutionPayload` directly, since
|
|
312
|
-
* `verifyBlocksInEpoch` already awaited DA for the segment.
|
|
313
|
-
*/
|
|
314
|
-
export async function processExecutionPayload(
|
|
315
|
-
this: BeaconChain,
|
|
316
|
-
payloadInput: PayloadEnvelopeInput,
|
|
317
|
-
signal: AbortSignal,
|
|
318
|
-
opts: ImportPayloadOpts = {}
|
|
319
|
-
): Promise<void> {
|
|
320
|
-
const {dataAvailabilityStatuses} = await verifyPayloadsDataAvailability([payloadInput], signal);
|
|
321
|
-
await importExecutionPayload.call(this, payloadInput, dataAvailabilityStatuses[0], opts);
|
|
322
|
-
}
|
|
@@ -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
|
}
|
|
@@ -147,7 +150,7 @@ export async function processBlocks(
|
|
|
147
150
|
proposerBalanceDelta: proposerBalanceDeltas[i],
|
|
148
151
|
indexedAttestations: indexedAttestationsByBlock[i],
|
|
149
152
|
// TODO: Make this param mandatory and capture in gossip
|
|
150
|
-
seenTimestampSec: opts.seenTimestampSec ??
|
|
153
|
+
seenTimestampSec: opts.seenTimestampSec ?? Date.now() / 1000,
|
|
151
154
|
});
|
|
152
155
|
}
|
|
153
156
|
|
|
@@ -292,7 +295,11 @@ async function importPayloadEnvelopesOfKnownBlocks(
|
|
|
292
295
|
return result;
|
|
293
296
|
}
|
|
294
297
|
|
|
295
|
-
const {dataAvailabilityStatuses} = await verifyPayloadsDataAvailability(
|
|
298
|
+
const {dataAvailabilityStatuses} = await verifyPayloadsDataAvailability(
|
|
299
|
+
this.config,
|
|
300
|
+
payloadInputs,
|
|
301
|
+
new AbortController().signal
|
|
302
|
+
);
|
|
296
303
|
for (let i = 0; i < payloadInputs.length; i++) {
|
|
297
304
|
this.logger.debug("Importing payload envelope of known block", {
|
|
298
305
|
slot: payloadInputs[i].slot,
|
|
@@ -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
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* and spin re-processing the same root until OOM while the import is blocked (e.g. EL syncing).
|
|
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
|
|
20
|
+
* BlockInputSync mark a still-pending payload as processed, re-queue it, and spin re-processing
|
|
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
|
|
@@ -35,19 +40,11 @@ export class PayloadEnvelopeProcessor {
|
|
|
35
40
|
|
|
36
41
|
async processPayloadEnvelopeJob(payloadInput: PayloadEnvelopeInput, opts: ImportPayloadOpts = {}): Promise<void> {
|
|
37
42
|
const existing = this.imports.get(payloadInput);
|
|
38
|
-
if (existing) {
|
|
43
|
+
if (existing !== undefined) {
|
|
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) {
|
|
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
|
}
|
|
@@ -12,6 +12,11 @@ export enum GossipedInputType {
|
|
|
12
12
|
dataColumn = "data_column",
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
export enum InclusionListSource {
|
|
16
|
+
gossip = "gossip",
|
|
17
|
+
api = "api",
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
type DataColumnData = {
|
|
16
21
|
dataColumn: fulu.DataColumnSidecar;
|
|
17
22
|
dataColumnBytes: Uint8Array | null;
|
|
@@ -104,7 +109,10 @@ export type FullyVerifiedBlock = {
|
|
|
104
109
|
parentBlockSlot: Slot;
|
|
105
110
|
proposerBalanceDelta: number;
|
|
106
111
|
dataAvailabilityStatus: DataAvailabilityStatus;
|
|
107
|
-
/**
|
|
112
|
+
/**
|
|
113
|
+
* Pre-computed indexed attestations from signature verification to avoid duplicate work.
|
|
114
|
+
* Their `attestingIndices` are in committee order, not sorted, so they are not spec-valid `IndexedAttestation`s.
|
|
115
|
+
*/
|
|
108
116
|
indexedAttestations: IndexedAttestation[];
|
|
109
117
|
/** Seen timestamp seconds */
|
|
110
118
|
seenTimestampSec: number;
|