@lodestar/beacon-node 1.51.0-dev.c99cf49add → 1.51.0-dev.cda05d18f1
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 +48 -95
- 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 +22 -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/ColumnReconstructionTracker.d.ts +11 -11
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.js +46 -40
- package/lib/chain/ColumnReconstructionTracker.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 +69 -35
- 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/blockInput/blockInput.d.ts +11 -56
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +5 -241
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/errors.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +2 -18
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/types.js +0 -1
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +42 -57
- 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 +7 -19
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +5 -24
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +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 +14 -2
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +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/blocks/writeBlockInputToDb.d.ts +0 -2
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/interface.d.ts +2 -0
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +1 -1
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +50 -22
- 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 +26 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +128 -43
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +7 -7
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -5
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/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 -1
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +1 -1
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +11 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +11 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
- package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
- package/lib/chain/forkChoiceExecutionEngine.js +117 -0
- package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
- package/lib/chain/interface.d.ts +10 -7
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
- 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 +2 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +2 -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/singleAttestationPool.d.ts +77 -0
- package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/singleAttestationPool.js +209 -0
- package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +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 +5 -3
- 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 +32 -11
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/proposerTracker.d.ts +31 -0
- package/lib/chain/proposerTracker.d.ts.map +1 -0
- package/lib/chain/proposerTracker.js +75 -0
- package/lib/chain/proposerTracker.js.map +1 -0
- package/lib/chain/regen/interface.d.ts +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/seenCache/seenGossipBlockInput.d.ts +7 -14
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.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/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +16 -10
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -2
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +0 -3
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/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/blobSidecars.d.ts +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
- package/lib/db/repositories/blobSidecars.js +0 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/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 +12 -8
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +35 -14
- 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 +29 -8
- 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 -6
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +34 -20
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +31 -11
- 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 -5
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +4 -15
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +38 -47
- package/lib/execution/engine/sszTypes.d.ts.map +1 -1
- package/lib/execution/engine/sszTypes.js +0 -5
- package/lib/execution/engine/sszTypes.js.map +1 -1
- package/lib/execution/engine/transport.d.ts +4 -14
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +25 -9
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +19 -14
- 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 -9
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +35 -30
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +49 -8
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +128 -18
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/server/http.js +5 -5
- package/lib/metrics/server/http.js.map +1 -1
- package/lib/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +4 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +7 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +6 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +6 -1
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +1 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +10 -0
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -9
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +1 -1
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -21
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +13 -24
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +5 -5
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +9 -7
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +58 -35
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +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/enrSubnetsDeserialize.d.ts.map +1 -1
- package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
- package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.js +8 -16
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/peers/utils/subnetMap.d.ts +5 -2
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
- package/lib/network/peers/utils/subnetMap.js +6 -3
- package/lib/network/peers/utils/subnetMap.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +1 -8
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +118 -149
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +6 -6
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +5 -5
- 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 -30
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +6 -3
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/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 +6 -12
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +1 -2
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +5 -10
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +5 -17
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +6 -9
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +4 -7
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts +35 -5
- package/lib/network/subnets/attnetsService.d.ts.map +1 -1
- package/lib/network/subnets/attnetsService.js +84 -6
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +7 -0
- package/lib/network/subnets/interface.d.ts.map +1 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/node/nodejs.d.ts +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/range/batch.d.ts +2 -3
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +9 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +2 -15
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/sync.d.ts +15 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +103 -25
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +43 -25
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +6 -34
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +24 -128
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +2 -18
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +14 -99
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.d.ts +1 -7
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js +0 -19
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/execution.d.ts +3 -4
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +1 -73
- package/lib/util/execution.js.map +1 -1
- package/lib/util/file.d.ts.map +1 -1
- package/lib/util/file.js +8 -9
- package/lib/util/file.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +5 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +36 -19
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +0 -5
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -2
- package/lib/util/types.js.map +1 -1
- package/package.json +31 -32
- package/src/api/impl/api.ts +1 -1
- package/src/api/impl/beacon/blocks/index.ts +81 -126
- package/src/api/impl/beacon/index.ts +3 -1
- package/src/api/impl/beacon/pool/index.ts +31 -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/ColumnReconstructionTracker.ts +60 -41
- package/src/chain/GetBlobsTracker.ts +82 -52
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
- package/src/chain/blocks/blockInput/blockInput.ts +11 -343
- package/src/chain/blocks/blockInput/errors.ts +1 -2
- package/src/chain/blocks/blockInput/types.ts +2 -20
- package/src/chain/blocks/importBlock.ts +58 -77
- 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 +8 -29
- package/src/chain/blocks/verifyBlock.ts +31 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +48 -24
- 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 +145 -42
- package/src/chain/emitter.ts +8 -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 -1
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +183 -0
- package/src/chain/interface.ts +11 -6
- package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/inclusionListStore.ts +208 -0
- package/src/chain/opPools/index.ts +2 -0
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- 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 +5 -4
- package/src/chain/produceBlock/produceBlockBody.ts +67 -22
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +2 -2
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
- 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/chain/validation/syncCommittee.ts +31 -15
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
- package/src/chain/validatorMonitor.ts +0 -6
- 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/blobSidecars.ts +0 -1
- 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 +59 -47
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +46 -13
- package/src/execution/engine/jsonRpcTransport.ts +56 -31
- package/src/execution/engine/mock.ts +32 -14
- package/src/execution/engine/payloadIdCache.ts +24 -6
- package/src/execution/engine/restTransport.ts +18 -23
- package/src/execution/engine/sszTypes.ts +0 -9
- package/src/execution/engine/transport.ts +13 -17
- package/src/execution/engine/types.ts +44 -24
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +2 -0
- package/src/metrics/metrics/beacon.ts +37 -30
- package/src/metrics/metrics/lodestar.ts +131 -18
- package/src/metrics/server/http.ts +5 -5
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +11 -1
- package/src/network/core/networkCoreWorker.ts +2 -0
- package/src/network/core/networkCoreWorkerHandler.ts +8 -1
- package/src/network/core/types.ts +6 -1
- package/src/network/gossip/gossipsub.ts +11 -0
- package/src/network/gossip/interface.ts +5 -5
- package/src/network/gossip/topic.ts +14 -25
- package/src/network/interface.ts +4 -5
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +66 -58
- package/src/network/options.ts +4 -0
- package/src/network/peers/peerManager.ts +28 -3
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
- package/src/network/peers/utils/prioritizePeers.ts +14 -22
- package/src/network/peers/utils/subnetMap.ts +6 -3
- package/src/network/processor/extractSlotRootFns.ts +0 -9
- package/src/network/processor/gossipHandlers.ts +150 -183
- package/src/network/processor/gossipQueues/index.ts +6 -6
- package/src/network/processor/gossipValidatorFn.ts +5 -5
- package/src/network/processor/index.ts +58 -28
- package/src/network/processor/types.ts +1 -1
- package/src/network/reqresp/ReqRespBeaconNode.ts +7 -7
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
- package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
- package/src/network/reqresp/handlers/index.ts +5 -17
- package/src/network/reqresp/protocols.ts +6 -12
- package/src/network/reqresp/rateLimit.ts +5 -17
- package/src/network/reqresp/types.ts +6 -13
- package/src/network/subnets/attnetsService.ts +94 -6
- package/src/network/subnets/interface.ts +7 -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/range/batch.ts +9 -21
- package/src/sync/range/chain.ts +2 -14
- package/src/sync/sync.ts +108 -26
- package/src/sync/unknownBlock.ts +48 -36
- package/src/sync/utils/downloadByRange.ts +31 -230
- package/src/sync/utils/downloadByRoot.ts +15 -142
- package/src/util/blobs.ts +0 -34
- package/src/util/execution.ts +8 -102
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +42 -24
- package/src/util/types.ts +1 -8
- package/lib/chain/errors/blobSidecarError.d.ts +0 -108
- package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/blobSidecarError.js +0 -38
- package/lib/chain/errors/blobSidecarError.js.map +0 -1
- package/lib/chain/validation/blobSidecar.d.ts +0 -16
- package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
- package/lib/chain/validation/blobSidecar.js +0 -276
- package/lib/chain/validation/blobSidecar.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
- package/src/chain/errors/blobSidecarError.ts +0 -70
- package/src/chain/validation/blobSidecar.ts +0 -357
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
|
@@ -7,7 +7,7 @@ import {Worker, spawn} from "@chainsafe/threads";
|
|
|
7
7
|
self = undefined;
|
|
8
8
|
|
|
9
9
|
import {ISignatureSet} from "@lodestar/state-transition";
|
|
10
|
-
import {Logger} from "@lodestar/utils";
|
|
10
|
+
import {Logger, defer} from "@lodestar/utils";
|
|
11
11
|
import {Metrics} from "../../../metrics/index.js";
|
|
12
12
|
import {LinkedList} from "../../../util/array.js";
|
|
13
13
|
import {callInNextEventLoop} from "../../../util/eventLoop.js";
|
|
@@ -94,7 +94,7 @@ type WorkerStatus =
|
|
|
94
94
|
| {code: WorkerStatusCode.initializing; initPromise: Promise<WorkerApi>}
|
|
95
95
|
| {code: WorkerStatusCode.initializationError; error: Error}
|
|
96
96
|
| {code: WorkerStatusCode.idle; workerApi: WorkerApi}
|
|
97
|
-
| {code: WorkerStatusCode.running; workerApi: WorkerApi};
|
|
97
|
+
| {code: WorkerStatusCode.running; workerApi: WorkerApi; abort: () => void};
|
|
98
98
|
|
|
99
99
|
type WorkerDescriptor = {
|
|
100
100
|
worker: Worker;
|
|
@@ -126,7 +126,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
126
126
|
timeout: NodeJS.Timeout;
|
|
127
127
|
} | null = null;
|
|
128
128
|
private blsVerifyAllMultiThread: boolean;
|
|
129
|
-
private
|
|
129
|
+
private closePromise: Promise<void> | undefined;
|
|
130
130
|
private workersBusy = 0;
|
|
131
131
|
|
|
132
132
|
constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules) {
|
|
@@ -149,6 +149,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
149
149
|
|
|
150
150
|
canAcceptWork(): boolean {
|
|
151
151
|
return (
|
|
152
|
+
this.closePromise === undefined &&
|
|
152
153
|
this.workersBusy < blsPoolSize &&
|
|
153
154
|
// TODO: Should also bound the jobs queue?
|
|
154
155
|
this.jobs.length < MAX_JOBS_CAN_ACCEPT_WORK
|
|
@@ -156,6 +157,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
async verifySignatureSets(sets: ISignatureSet[], opts: VerifySignatureOpts = {}): Promise<boolean> {
|
|
160
|
+
if (this.closePromise !== undefined) throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
|
|
159
161
|
this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
|
|
160
162
|
this.metrics?.blsThreadPool.totalSigSets.inc(sets.length);
|
|
161
163
|
if (opts.priority) {
|
|
@@ -208,6 +210,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
208
210
|
message: Uint8Array,
|
|
209
211
|
opts: Omit<VerifySignatureOpts, "verifyOnMainThread"> = {}
|
|
210
212
|
): Promise<boolean[]> {
|
|
213
|
+
if (this.closePromise !== undefined) throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
|
|
211
214
|
const promises: Promise<boolean[]>[] = [];
|
|
212
215
|
for (const setsChunk of chunkSameMessageSignatureSets(sets)) {
|
|
213
216
|
promises.push(
|
|
@@ -229,9 +232,14 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
229
232
|
return results.flat();
|
|
230
233
|
}
|
|
231
234
|
|
|
232
|
-
|
|
235
|
+
close(): Promise<void> {
|
|
236
|
+
if (this.closePromise !== undefined) return this.closePromise;
|
|
233
237
|
if (this.bufferedJobs) {
|
|
234
238
|
clearTimeout(this.bufferedJobs.timeout);
|
|
239
|
+
for (const jobs of [this.bufferedJobs.jobs, this.bufferedJobs.prioritizedJobs]) {
|
|
240
|
+
for (const job of jobs) job.reject(new QueueError({code: QueueErrorCode.QUEUE_ABORTED}));
|
|
241
|
+
}
|
|
242
|
+
this.bufferedJobs = null;
|
|
235
243
|
}
|
|
236
244
|
|
|
237
245
|
// Abort all jobs
|
|
@@ -241,15 +249,21 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
241
249
|
this.jobs.clear();
|
|
242
250
|
|
|
243
251
|
// Terminate all workers. await to ensure no workers are left hanging
|
|
244
|
-
|
|
252
|
+
this.closePromise = Promise.all(
|
|
245
253
|
Array.from(this.workers.entries()).map(([id, worker]) =>
|
|
246
254
|
// NOTE: 'threads' has not yet updated types, and NodeJS complains with
|
|
247
255
|
// [DEP0132] DeprecationWarning: Passing a callback to worker.terminate() is deprecated. It returns a Promise instead.
|
|
248
|
-
(worker.worker.terminate() as unknown as Promise<void>)
|
|
249
|
-
|
|
250
|
-
|
|
256
|
+
(worker.worker.terminate() as unknown as Promise<void>)
|
|
257
|
+
.catch((e: Error) => {
|
|
258
|
+
this.logger.error("Error terminating worker", {id}, e);
|
|
259
|
+
})
|
|
260
|
+
.finally(() => {
|
|
261
|
+
// threads does not settle outstanding RPC calls when its worker exits.
|
|
262
|
+
if (worker.status.code === WorkerStatusCode.running) worker.status.abort();
|
|
263
|
+
})
|
|
251
264
|
)
|
|
252
|
-
);
|
|
265
|
+
).then(() => {});
|
|
266
|
+
return this.closePromise;
|
|
253
267
|
}
|
|
254
268
|
|
|
255
269
|
private createWorkers(poolSize: number): WorkerDescriptor[] {
|
|
@@ -295,7 +309,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
295
309
|
* Register BLS work to be done eventually in a worker
|
|
296
310
|
*/
|
|
297
311
|
private queueBlsWork(job: JobQueueItem): void {
|
|
298
|
-
if (this.
|
|
312
|
+
if (this.closePromise !== undefined) {
|
|
299
313
|
throw new QueueError({code: QueueErrorCode.QUEUE_ABORTED});
|
|
300
314
|
}
|
|
301
315
|
|
|
@@ -333,16 +347,20 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
333
347
|
}
|
|
334
348
|
}
|
|
335
349
|
|
|
350
|
+
// First hand work to an idle worker before returning to the caller.
|
|
351
|
+
// Deferring the post to the next macrotask would make the worker
|
|
352
|
+
// sit idle while waiting for the next synchronous work
|
|
353
|
+
else if (job.opts.priority) {
|
|
354
|
+
this.jobs.unshift(job);
|
|
355
|
+
void this.runJob();
|
|
356
|
+
}
|
|
357
|
+
|
|
336
358
|
// Push job and schedule to call `runJob` in the next macro event loop cycle.
|
|
337
359
|
// This is useful to allow batching job submitted from a synchronous for loop,
|
|
338
360
|
// and to prevent large stacks since runJob may be called recursively.
|
|
339
361
|
else {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
} else {
|
|
343
|
-
this.jobs.push(job);
|
|
344
|
-
}
|
|
345
|
-
callInNextEventLoop(this.runJob);
|
|
362
|
+
this.jobs.push(job);
|
|
363
|
+
callInNextEventLoop(() => void this.runJob());
|
|
346
364
|
}
|
|
347
365
|
}
|
|
348
366
|
|
|
@@ -350,7 +368,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
350
368
|
* Potentially submit jobs to an idle worker, only if there's a worker and jobs
|
|
351
369
|
*/
|
|
352
370
|
private runJob = async (): Promise<void> => {
|
|
353
|
-
if (this.
|
|
371
|
+
if (this.closePromise !== undefined) {
|
|
354
372
|
return;
|
|
355
373
|
}
|
|
356
374
|
|
|
@@ -371,13 +389,18 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
371
389
|
// Maybe it's not useful since all data referenced in jobs is likely referenced by others
|
|
372
390
|
|
|
373
391
|
const workerApi = worker.status.workerApi;
|
|
374
|
-
|
|
392
|
+
const completion = defer<BlsWorkResult>();
|
|
393
|
+
worker.status = {
|
|
394
|
+
code: WorkerStatusCode.running,
|
|
395
|
+
workerApi,
|
|
396
|
+
abort: () => completion.reject(new QueueError({code: QueueErrorCode.QUEUE_ABORTED})),
|
|
397
|
+
};
|
|
375
398
|
this.workersBusy++;
|
|
376
399
|
const jobsStarted: JobQueueItem[] = [];
|
|
377
400
|
let completedJobsCount = 0;
|
|
378
401
|
|
|
379
402
|
if (this.jobs.length > 0) {
|
|
380
|
-
callInNextEventLoop(this.runJob);
|
|
403
|
+
callInNextEventLoop(() => void this.runJob());
|
|
381
404
|
}
|
|
382
405
|
|
|
383
406
|
try {
|
|
@@ -423,7 +446,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
423
446
|
if (workReqs.length === 0) {
|
|
424
447
|
worker.status = {code: WorkerStatusCode.idle, workerApi};
|
|
425
448
|
this.workersBusy--;
|
|
426
|
-
callInNextEventLoop(this.runJob);
|
|
449
|
+
callInNextEventLoop(() => void this.runJob());
|
|
427
450
|
return;
|
|
428
451
|
}
|
|
429
452
|
|
|
@@ -437,7 +460,8 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
437
460
|
// If worker communication or result processing throws, all unresolved jobs are rejected.
|
|
438
461
|
|
|
439
462
|
const [jobStartSec, jobStartNs] = process.hrtime();
|
|
440
|
-
|
|
463
|
+
void workerApi.verifyManySignatureSets(workReqs).then(completion.resolve, completion.reject);
|
|
464
|
+
const workResult = await completion.promise;
|
|
441
465
|
const [jobEndSec, jobEndNs] = process.hrtime();
|
|
442
466
|
const {workerId, batchRetries, batchSigsSuccess, verificationCalls, workerStartTime, workerEndTime, results} =
|
|
443
467
|
workResult;
|
|
@@ -481,7 +505,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
481
505
|
}
|
|
482
506
|
} catch (e) {
|
|
483
507
|
// Worker communications should never reject
|
|
484
|
-
if (
|
|
508
|
+
if (this.closePromise === undefined) {
|
|
485
509
|
this.logger.error("BlsMultiThreadWorkerPool error", {}, e as Error);
|
|
486
510
|
}
|
|
487
511
|
// Reject jobs that were not already completed
|
|
@@ -499,7 +523,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
499
523
|
this.workersBusy--;
|
|
500
524
|
|
|
501
525
|
// Potentially run a new job
|
|
502
|
-
callInNextEventLoop(this.runJob);
|
|
526
|
+
callInNextEventLoop(() => void this.runJob());
|
|
503
527
|
};
|
|
504
528
|
|
|
505
529
|
/**
|
|
@@ -542,7 +566,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
542
566
|
this.jobs.unshift(job);
|
|
543
567
|
}
|
|
544
568
|
this.bufferedJobs = null;
|
|
545
|
-
callInNextEventLoop(this.runJob);
|
|
569
|
+
callInNextEventLoop(() => void this.runJob());
|
|
546
570
|
}
|
|
547
571
|
};
|
|
548
572
|
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import worker from "node:worker_threads";
|
|
2
|
-
import {
|
|
3
|
-
type BlsSignatureSet,
|
|
4
|
-
verifySignatureSets,
|
|
5
|
-
verifySignatureSetsSameMessage,
|
|
6
|
-
} from "@chainsafe/lodestar-z/bls-verifier";
|
|
7
2
|
import {expose} from "@chainsafe/threads/worker";
|
|
3
|
+
import {type BlsSignatureSet, verifySignatureSets, verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
8
4
|
import {
|
|
9
5
|
BlsWorkReq,
|
|
10
6
|
BlsWorkResult,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {verifySignatureSetsSameMessage} from "@
|
|
1
|
+
import {verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
2
2
|
import {ISignatureSet} from "@lodestar/state-transition";
|
|
3
3
|
import {Metrics} from "../../metrics/index.js";
|
|
4
4
|
import {IBlsVerifier, SameMessageSignatureSet} from "./interface.js";
|
package/src/chain/bls/utils.ts
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
BLS_VERIFIER_MAX_BATCH_SIZE,
|
|
3
3
|
BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE,
|
|
4
4
|
verifySignatureSets,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@lodestar/native/bls-verifier";
|
|
6
6
|
import {ISignatureSet, SignatureSetType, toBlsSignatureSet} from "@lodestar/state-transition";
|
|
7
7
|
import {SameMessageSignatureSet} from "./interface.js";
|
|
8
8
|
|
package/src/chain/chain.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import {PrivateKey} from "@libp2p/interface";
|
|
3
|
-
import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
4
3
|
import {Type} from "@chainsafe/ssz";
|
|
5
4
|
import {routes} from "@lodestar/api";
|
|
6
5
|
import {BeaconConfig} from "@lodestar/config";
|
|
7
6
|
import {
|
|
7
|
+
AncestorStatus,
|
|
8
8
|
CheckpointWithHex,
|
|
9
9
|
EpochDifference,
|
|
10
10
|
ForkChoiceStateGetter,
|
|
@@ -14,12 +14,14 @@ import {
|
|
|
14
14
|
UpdateHeadOpt,
|
|
15
15
|
} from "@lodestar/fork-choice";
|
|
16
16
|
import {LoggerNode} from "@lodestar/logger/node";
|
|
17
|
+
import {type PubkeyCache} from "@lodestar/native/pubkeys";
|
|
17
18
|
import {
|
|
18
19
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
19
20
|
type ForkPostFulu,
|
|
20
21
|
type ForkPostGloas,
|
|
21
22
|
GENESIS_SLOT,
|
|
22
23
|
SLOTS_PER_EPOCH,
|
|
24
|
+
isForkPostFulu,
|
|
23
25
|
isForkPostGloas,
|
|
24
26
|
} from "@lodestar/params";
|
|
25
27
|
import {
|
|
@@ -33,6 +35,7 @@ import {
|
|
|
33
35
|
isStatePostAltair,
|
|
34
36
|
isStatePostElectra,
|
|
35
37
|
isStatePostGloas,
|
|
38
|
+
proposerShufflingDecisionRoot,
|
|
36
39
|
} from "@lodestar/state-transition";
|
|
37
40
|
import {
|
|
38
41
|
BeaconBlock,
|
|
@@ -60,7 +63,6 @@ import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRoot
|
|
|
60
63
|
import {ProcessShutdownCallback} from "@lodestar/validator";
|
|
61
64
|
import {GENESIS_EPOCH, HALF_SLOT_BPS, ZERO_HASH} from "../constants/index.js";
|
|
62
65
|
import {IBeaconDb} from "../db/index.js";
|
|
63
|
-
import {BLOB_SIDECARS_IN_WRAPPER_INDEX} from "../db/repositories/blobSidecars.js";
|
|
64
66
|
import {decodeArchivedEnvelope} from "../db/repositories/index.js";
|
|
65
67
|
import {BuilderApiClient, BuilderApiClientOpts} from "../execution/builder/apiClient.js";
|
|
66
68
|
import {BuilderStatus} from "../execution/builder/http.js";
|
|
@@ -80,7 +82,7 @@ import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.js";
|
|
|
80
82
|
import {ArchiveStore} from "./archiveStore/archiveStore.js";
|
|
81
83
|
import {CheckpointBalancesCache} from "./balancesCache.js";
|
|
82
84
|
import {BeaconProposerCache} from "./beaconProposerCache.js";
|
|
83
|
-
import {IBlockInput,
|
|
85
|
+
import {IBlockInput, isBlockInputColumns} from "./blocks/blockInput/index.js";
|
|
84
86
|
import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
|
|
85
87
|
import {PayloadEnvelopeInputSource} from "./blocks/payloadEnvelopeInput/index.js";
|
|
86
88
|
import {PayloadEnvelopeProcessor} from "./blocks/payloadEnvelopeProcessor.js";
|
|
@@ -90,8 +92,9 @@ import {persistPayloadEnvelopeInput} from "./blocks/writePayloadEnvelopeInputToD
|
|
|
90
92
|
import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
|
|
91
93
|
import {BuilderCircuitBreaker} from "./builderCircuitBreaker.js";
|
|
92
94
|
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
93
|
-
import {ChainEvent, ChainEventEmitter} from "./emitter.js";
|
|
95
|
+
import {ChainEvent, ChainEventEmitter, ReorgEventData} from "./emitter.js";
|
|
94
96
|
import {ForkchoiceCaller, initializeForkChoice} from "./forkChoice/index.js";
|
|
97
|
+
import {ForkChoiceExecutionEngine} from "./forkChoiceExecutionEngine.js";
|
|
95
98
|
import {GetBlobsTracker} from "./GetBlobsTracker.js";
|
|
96
99
|
import {CommonBlockBody, FindHeadFnName, IBeaconChain, ProposerPreparationData, StateGetOpts} from "./interface.js";
|
|
97
100
|
import {LightClientServer} from "./lightClient/index.js";
|
|
@@ -100,9 +103,11 @@ import {
|
|
|
100
103
|
AttestationPool,
|
|
101
104
|
DeferredVoluntaryExitPool,
|
|
102
105
|
ExecutionPayloadBidPool,
|
|
106
|
+
InclusionListStore,
|
|
103
107
|
OpPool,
|
|
104
108
|
PayloadAttestationPool,
|
|
105
109
|
ProposerPreferencesPool,
|
|
110
|
+
SingleAttestationPool,
|
|
106
111
|
SyncCommitteeMessagePool,
|
|
107
112
|
SyncContributionAndProofPool,
|
|
108
113
|
} from "./opPools/index.js";
|
|
@@ -111,6 +116,7 @@ import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
|
|
|
111
116
|
import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
|
|
112
117
|
import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
|
|
113
118
|
import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
|
|
119
|
+
import {ProposerTracker} from "./proposerTracker.js";
|
|
114
120
|
import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
|
|
115
121
|
import {ReprocessController} from "./reprocess.js";
|
|
116
122
|
import {
|
|
@@ -165,7 +171,7 @@ const DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES = 16;
|
|
|
165
171
|
export class BeaconChain implements IBeaconChain {
|
|
166
172
|
readonly genesisTime: UintNum64;
|
|
167
173
|
readonly genesisValidatorsRoot: Root;
|
|
168
|
-
readonly executionEngine:
|
|
174
|
+
readonly executionEngine: ForkChoiceExecutionEngine;
|
|
169
175
|
readonly executionBuilder?: IExecutionBuilder;
|
|
170
176
|
readonly builderCircuitBreaker: BuilderCircuitBreaker;
|
|
171
177
|
readonly builderApiClient: BuilderApiClient;
|
|
@@ -193,11 +199,19 @@ export class BeaconChain implements IBeaconChain {
|
|
|
193
199
|
// Ops pool
|
|
194
200
|
readonly attestationPool: AttestationPool;
|
|
195
201
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
202
|
+
readonly singleAttestationPool: SingleAttestationPool;
|
|
203
|
+
readonly proposerTracker: ProposerTracker;
|
|
204
|
+
/**
|
|
205
|
+
* Head state epoch and decision root of its next epoch proposers when local proposals were last refreshed. The root
|
|
206
|
+
* alone is not enough: a reorg onto a branch without blocks in a whole epoch keeps the root but moves the epoch
|
|
207
|
+
*/
|
|
208
|
+
private localProposalsKey: string | null = null;
|
|
196
209
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
197
210
|
readonly syncContributionAndProofPool;
|
|
198
211
|
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
199
212
|
readonly payloadAttestationPool: PayloadAttestationPool;
|
|
200
213
|
readonly proposerPreferencesPool = new ProposerPreferencesPool();
|
|
214
|
+
readonly inclusionListStore: InclusionListStore;
|
|
201
215
|
readonly opPool: OpPool;
|
|
202
216
|
readonly deferredVoluntaryExitPool: DeferredVoluntaryExitPool;
|
|
203
217
|
|
|
@@ -315,7 +329,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
315
329
|
this.genesisTime = anchorState.genesisTime;
|
|
316
330
|
this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
|
|
317
331
|
this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
|
|
318
|
-
this.executionEngine = executionEngine;
|
|
319
332
|
this.executionBuilder = executionBuilder;
|
|
320
333
|
const signal = this.abortController.signal;
|
|
321
334
|
const emitter = new ChainEventEmitter();
|
|
@@ -329,12 +342,15 @@ export class BeaconChain implements IBeaconChain {
|
|
|
329
342
|
this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
|
|
330
343
|
this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
|
|
331
344
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics, logger);
|
|
345
|
+
this.singleAttestationPool = new SingleAttestationPool(metrics);
|
|
346
|
+
this.proposerTracker = new ProposerTracker(this.opts.singleAttestationIgnoreProposalDuty ?? false, metrics);
|
|
332
347
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
333
348
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
334
349
|
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
335
350
|
this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
|
|
336
351
|
this.opPool = new OpPool(config);
|
|
337
352
|
this.deferredVoluntaryExitPool = new DeferredVoluntaryExitPool(logger);
|
|
353
|
+
this.inclusionListStore = new InclusionListStore(config);
|
|
338
354
|
|
|
339
355
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
340
356
|
this.seenContributionAndProof = new SeenContributionAndProof(metrics);
|
|
@@ -454,6 +470,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
454
470
|
this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
|
|
455
471
|
|
|
456
472
|
this.forkChoice = forkChoice;
|
|
473
|
+
this.executionEngine = new ForkChoiceExecutionEngine(executionEngine, {
|
|
474
|
+
forkChoice,
|
|
475
|
+
recomputeHeadAfterELInvalidResponse: () => this.recomputeHeadAfterELInvalidResponse(),
|
|
476
|
+
logger,
|
|
477
|
+
metrics,
|
|
478
|
+
});
|
|
457
479
|
|
|
458
480
|
this.builderCircuitBreaker = new BuilderCircuitBreaker(
|
|
459
481
|
{faultInspectionWindow: opts.faultInspectionWindow, allowedFaults: opts.allowedFaults},
|
|
@@ -509,6 +531,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
509
531
|
emitter,
|
|
510
532
|
metrics,
|
|
511
533
|
config,
|
|
534
|
+
signal,
|
|
512
535
|
});
|
|
513
536
|
|
|
514
537
|
this.archiveStore = new ArchiveStore(
|
|
@@ -929,16 +952,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
929
952
|
}
|
|
930
953
|
|
|
931
954
|
async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
|
|
932
|
-
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
933
|
-
if (blockInput) {
|
|
934
|
-
if (!isBlockInputBlobs(blockInput)) {
|
|
935
|
-
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
936
|
-
}
|
|
937
|
-
if (!blockInput.hasAllData()) {
|
|
938
|
-
return null;
|
|
939
|
-
}
|
|
940
|
-
return blockInput.getBlobs();
|
|
941
|
-
}
|
|
942
955
|
const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
|
|
943
956
|
if (unfinalizedBlobSidecars) {
|
|
944
957
|
return unfinalizedBlobSidecars;
|
|
@@ -946,28 +959,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
946
959
|
return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
|
|
947
960
|
}
|
|
948
961
|
|
|
949
|
-
async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
950
|
-
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
951
|
-
if (blockInput) {
|
|
952
|
-
if (!isBlockInputBlobs(blockInput)) {
|
|
953
|
-
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
954
|
-
}
|
|
955
|
-
if (!blockInput.hasAllData()) {
|
|
956
|
-
return null;
|
|
957
|
-
}
|
|
958
|
-
return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
|
|
959
|
-
}
|
|
960
|
-
const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
|
|
961
|
-
if (unfinalizedBlobSidecarsWrapper) {
|
|
962
|
-
return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
963
|
-
}
|
|
964
|
-
const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
|
|
965
|
-
if (finalizedBlobSidecarsWrapper) {
|
|
966
|
-
return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
967
|
-
}
|
|
968
|
-
return null;
|
|
969
|
-
}
|
|
970
|
-
|
|
971
962
|
async getSerializedExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
972
963
|
const [bytes] = await this.getSerializedExecutionPayloadEnvelopes([{blockSlot, blockRootHex}]);
|
|
973
964
|
return bytes;
|
|
@@ -1426,6 +1417,58 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1426
1417
|
}
|
|
1427
1418
|
}
|
|
1428
1419
|
|
|
1420
|
+
/**
|
|
1421
|
+
* Apply chain side effects of a fork choice head change: head state, head metrics, and reorg detection
|
|
1422
|
+
*/
|
|
1423
|
+
onHeadChanged(oldHead: ProtoBlock, newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void {
|
|
1424
|
+
// Set head state as strong reference
|
|
1425
|
+
this.regen.updateHeadState(newHead, maybeHeadState);
|
|
1426
|
+
|
|
1427
|
+
const delaySec = this.clock.secFromSlot(newHead.slot);
|
|
1428
|
+
this.logger.verbose("New chain head", {
|
|
1429
|
+
slot: newHead.slot,
|
|
1430
|
+
root: newHead.blockRoot,
|
|
1431
|
+
payloadStatus: newHead.payloadStatus,
|
|
1432
|
+
delaySec,
|
|
1433
|
+
});
|
|
1434
|
+
this.metrics?.headSlot.set(newHead.slot);
|
|
1435
|
+
|
|
1436
|
+
this.onNewHead(newHead);
|
|
1437
|
+
this.metrics?.forkChoice.changedHead.inc();
|
|
1438
|
+
|
|
1439
|
+
const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
|
|
1440
|
+
if (ancestorResult.code === AncestorStatus.CommonAncestor) {
|
|
1441
|
+
// CommonAncestor = chain reorg, old head and new head not direct descendants
|
|
1442
|
+
|
|
1443
|
+
const forkChoiceReorgEventData: ReorgEventData = {
|
|
1444
|
+
depth: ancestorResult.depth,
|
|
1445
|
+
epoch: computeEpochAtSlot(newHead.slot),
|
|
1446
|
+
slot: newHead.slot,
|
|
1447
|
+
newHeadBlock: newHead.blockRoot,
|
|
1448
|
+
oldHeadBlock: oldHead.blockRoot,
|
|
1449
|
+
newHeadState: newHead.stateRoot,
|
|
1450
|
+
oldHeadState: oldHead.stateRoot,
|
|
1451
|
+
executionOptimistic: isOptimisticBlock(newHead),
|
|
1452
|
+
};
|
|
1453
|
+
|
|
1454
|
+
this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
|
|
1455
|
+
this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
|
|
1456
|
+
|
|
1457
|
+
this.metrics?.forkChoice.reorg.inc();
|
|
1458
|
+
this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
private recomputeHeadAfterELInvalidResponse(): void {
|
|
1463
|
+
// validateLatestHash only re-scores proto-array, the cached head is still the old one
|
|
1464
|
+
const oldHead = this.forkChoice.getHead();
|
|
1465
|
+
const newHead = this.recomputeForkChoiceHead(ForkchoiceCaller.executionInvalid);
|
|
1466
|
+
if (newHead.blockRoot === oldHead.blockRoot && newHead.payloadStatus === oldHead.payloadStatus) {
|
|
1467
|
+
return;
|
|
1468
|
+
}
|
|
1469
|
+
this.onHeadChanged(oldHead, newHead);
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1429
1472
|
/**
|
|
1430
1473
|
* Emit `head` and `head_v2` when the fork choice head differs between two observations. Every caller that
|
|
1431
1474
|
* can move the head, `updateAndGetHead()` and `updateTime()`, must capture the head before and pass both.
|
|
@@ -1482,10 +1525,10 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1482
1525
|
this.metrics?.forkChoice.requests.inc();
|
|
1483
1526
|
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.predictProposerHead});
|
|
1484
1527
|
const slot = this.clock.currentSlot;
|
|
1485
|
-
const
|
|
1528
|
+
const msFromSlot = this.clock.msFromSlot(slot);
|
|
1486
1529
|
|
|
1487
1530
|
try {
|
|
1488
|
-
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead,
|
|
1531
|
+
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, msFromSlot, slot}).head;
|
|
1489
1532
|
} catch (e) {
|
|
1490
1533
|
this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetPredictedProposerHead});
|
|
1491
1534
|
throw e;
|
|
@@ -1497,13 +1540,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1497
1540
|
getProposerHead(slot: Slot): ProtoBlock {
|
|
1498
1541
|
this.metrics?.forkChoice.requests.inc();
|
|
1499
1542
|
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.getProposerHead});
|
|
1500
|
-
const
|
|
1543
|
+
const msFromSlot = this.clock.msFromSlot(slot);
|
|
1501
1544
|
|
|
1502
1545
|
try {
|
|
1503
1546
|
// Do not emit head event here, when proposing we rely on the one emitted when importing our own block
|
|
1504
1547
|
const {head, isHeadTimely, notReorgedReason} = this.forkChoice.updateAndGetHead({
|
|
1505
1548
|
mode: UpdateHeadOpt.GetProposerHead,
|
|
1506
|
-
|
|
1549
|
+
msFromSlot,
|
|
1507
1550
|
slot,
|
|
1508
1551
|
});
|
|
1509
1552
|
|
|
@@ -1825,12 +1868,15 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1825
1868
|
|
|
1826
1869
|
this.attestationPool.prune(slot);
|
|
1827
1870
|
this.aggregatedAttestationPool.prune(slot);
|
|
1871
|
+
this.proposerTracker.prune(slot);
|
|
1872
|
+
this.singleAttestationPool.prune(this.proposerTracker);
|
|
1828
1873
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1829
1874
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1830
1875
|
this.payloadAttestationPool.prune(slot);
|
|
1831
1876
|
this.executionPayloadBidPool.prune(slot);
|
|
1832
1877
|
this.seenExecutionPayloadBids.prune(slot);
|
|
1833
1878
|
this.proposerPreferencesPool.prune(slot);
|
|
1879
|
+
this.inclusionListStore.prune(slot);
|
|
1834
1880
|
this.seenAttestationDatas.onSlot(slot);
|
|
1835
1881
|
this.reprocessController.onSlot(slot);
|
|
1836
1882
|
|
|
@@ -1850,6 +1896,55 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1850
1896
|
}
|
|
1851
1897
|
}
|
|
1852
1898
|
|
|
1899
|
+
/**
|
|
1900
|
+
* Track upcoming proposals of validators connected to this node, so that SingleAttestationPool only collects and
|
|
1901
|
+
* the network only subscribes to all attestation subnets before them. Proposals only change when the decision block
|
|
1902
|
+
* of next epoch proposers changes (the head enters a new epoch or reorgs that block) or a new validator connects,
|
|
1903
|
+
* set localProposalsKey to null before calling for the latter.
|
|
1904
|
+
* Never throws, it runs during block import.
|
|
1905
|
+
*/
|
|
1906
|
+
private refreshLocalProposals(): void {
|
|
1907
|
+
const clockSlot = this.clock.currentSlot;
|
|
1908
|
+
try {
|
|
1909
|
+
const headState = this.getHeadState();
|
|
1910
|
+
const headFork = this.config.getForkName(headState.slot);
|
|
1911
|
+
// post-fulu, the head state knows proposers of its epoch and the next one thanks to the proposer lookahead,
|
|
1912
|
+
// a pre-fulu state only predicts next epoch proposers
|
|
1913
|
+
if (!isForkPostFulu(headFork) || headState.epoch < computeEpochAtSlot(clockSlot) - 1) {
|
|
1914
|
+
return;
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
const decisionRoot = proposerShufflingDecisionRoot(headFork, headState, headState.epoch + 1);
|
|
1918
|
+
if (decisionRoot === null) {
|
|
1919
|
+
return;
|
|
1920
|
+
}
|
|
1921
|
+
const localProposalsKey = `${headState.epoch}_${toRootHex(decisionRoot)}`;
|
|
1922
|
+
if (localProposalsKey === this.localProposalsKey) {
|
|
1923
|
+
return;
|
|
1924
|
+
}
|
|
1925
|
+
this.localProposalsKey = localProposalsKey;
|
|
1926
|
+
|
|
1927
|
+
const startSlot = computeStartSlotAtEpoch(headState.epoch);
|
|
1928
|
+
const newProposalSlots: Slot[] = [];
|
|
1929
|
+
for (const [i, proposerIndex] of [...headState.currentProposers, ...headState.nextProposers].entries()) {
|
|
1930
|
+
const proposalSlot = startSlot + i;
|
|
1931
|
+
if (
|
|
1932
|
+
proposalSlot >= clockSlot &&
|
|
1933
|
+
this.beaconProposerCache.has(proposerIndex) &&
|
|
1934
|
+
this.proposerTracker.addProposal(proposalSlot)
|
|
1935
|
+
) {
|
|
1936
|
+
newProposalSlots.push(proposalSlot);
|
|
1937
|
+
}
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
if (newProposalSlots.length > 0) {
|
|
1941
|
+
this.emitter.emit(ChainEvent.localProposalSlots, newProposalSlots);
|
|
1942
|
+
}
|
|
1943
|
+
} catch (e) {
|
|
1944
|
+
this.logger.debug("Error refreshing local proposals", {slot: clockSlot}, e as Error);
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1853
1948
|
private onClockEpoch(epoch: Epoch): void {
|
|
1854
1949
|
this.metrics?.clockEpoch.set(epoch);
|
|
1855
1950
|
|
|
@@ -1864,6 +1959,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1864
1959
|
protected onNewHead(head: ProtoBlock): void {
|
|
1865
1960
|
this.syncContributionAndProofPool.prune(head.slot);
|
|
1866
1961
|
this.seenContributionAndProof.prune(head.slot);
|
|
1962
|
+
|
|
1963
|
+
this.refreshLocalProposals();
|
|
1867
1964
|
}
|
|
1868
1965
|
|
|
1869
1966
|
private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
|
|
@@ -1932,6 +2029,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1932
2029
|
|
|
1933
2030
|
// Only update validator custody if we discovered new validators
|
|
1934
2031
|
if (newValidatorCount > previousValidatorCount) {
|
|
2032
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2033
|
+
this.localProposalsKey = null;
|
|
2034
|
+
this.refreshLocalProposals();
|
|
1935
2035
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1936
2036
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1937
2037
|
}
|
|
@@ -1947,6 +2047,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1947
2047
|
|
|
1948
2048
|
// Only update validator custody if we discovered new validators
|
|
1949
2049
|
if (hasNewValidators) {
|
|
2050
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2051
|
+
this.localProposalsKey = null;
|
|
2052
|
+
this.refreshLocalProposals();
|
|
1950
2053
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1951
2054
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1952
2055
|
}
|
package/src/chain/emitter.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {StrictEventEmitter} from "strict-event-emitter-types";
|
|
|
3
3
|
import {routes} from "@lodestar/api";
|
|
4
4
|
import {CheckpointWithHex, PtcQuorumEvent} from "@lodestar/fork-choice";
|
|
5
5
|
import {IBeaconStateView} from "@lodestar/state-transition";
|
|
6
|
-
import {DataColumnSidecar, RootHex, Slot,
|
|
6
|
+
import {DataColumnSidecar, RootHex, Slot, phase0} from "@lodestar/types";
|
|
7
7
|
import {PeerIdStr} from "../util/peerId.js";
|
|
8
8
|
import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
|
|
9
9
|
import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
|
|
@@ -50,16 +50,16 @@ export enum ChainEvent {
|
|
|
50
50
|
* and are ready to be published.
|
|
51
51
|
*/
|
|
52
52
|
publishDataColumns = "publishDataColumns",
|
|
53
|
-
/**
|
|
54
|
-
* This event signals that blobs have been fetched from the execution engine
|
|
55
|
-
* and are ready to be published.
|
|
56
|
-
*/
|
|
57
|
-
publishBlobSidecars = "publishBlobSidecars",
|
|
58
53
|
/**
|
|
59
54
|
* This event signals that a proposer slashing has been produced from an observed equivocation
|
|
60
55
|
* and is ready to be published.
|
|
61
56
|
*/
|
|
62
57
|
publishProposerSlashing = "publishProposerSlashing",
|
|
58
|
+
/**
|
|
59
|
+
* New block proposal slots of validators connected to this node, the network subscribes to all attestation
|
|
60
|
+
* subnets before them, see `slotsToSubscribeBeforeProposalDuty`
|
|
61
|
+
*/
|
|
62
|
+
localProposalSlots = "localProposalSlots",
|
|
63
63
|
/**
|
|
64
64
|
* Trigger an update of status so reqresp by peers have current earliestAvailableSlot
|
|
65
65
|
*/
|
|
@@ -123,10 +123,10 @@ export type IChainEvents = ApiEvents & {
|
|
|
123
123
|
|
|
124
124
|
[ChainEvent.publishDataColumns]: (sidecars: DataColumnSidecar[]) => void;
|
|
125
125
|
|
|
126
|
-
[ChainEvent.publishBlobSidecars]: (sidecars: deneb.BlobSidecar[]) => void;
|
|
127
|
-
|
|
128
126
|
[ChainEvent.publishProposerSlashing]: (proposerSlashing: phase0.ProposerSlashing) => void;
|
|
129
127
|
|
|
128
|
+
[ChainEvent.localProposalSlots]: (proposalSlots: Slot[]) => void;
|
|
129
|
+
|
|
130
130
|
[ChainEvent.updateStatus]: () => void;
|
|
131
131
|
|
|
132
132
|
// Sync events that are chain->chain. Initiated from network requests but do not cross the network
|
|
@@ -72,7 +72,7 @@ export enum BlockErrorCode {
|
|
|
72
72
|
* whoever served the block MAY be downscored. Mirrors PayloadErrorCode.EXECUTION_ENGINE_INVALID.
|
|
73
73
|
*/
|
|
74
74
|
EXECUTION_ENGINE_INVALID = "BLOCK_ERROR_EXECUTION_INVALID",
|
|
75
|
-
/** The
|
|
75
|
+
/** The blob or column data did not arrive within the availability wait */
|
|
76
76
|
DATA_UNAVAILABLE = "BLOCK_ERROR_DATA_UNAVAILABLE",
|
|
77
77
|
/** Block contains too many kzg commitments */
|
|
78
78
|
TOO_MANY_KZG_COMMITMENTS = "BLOCK_ERROR_TOO_MANY_KZG_COMMITMENTS",
|