@lodestar/beacon-node 1.47.0-dev.f591cb177e → 1.48.0-dev.67344272c0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +44 -12
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +21 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/events/index.d.ts.map +1 -1
- package/lib/api/impl/events/index.js +2 -0
- package/lib/api/impl/events/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.js +1 -1
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +237 -49
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.js +1 -1
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/api/rest/base.d.ts.map +1 -1
- package/lib/api/rest/base.js +7 -0
- package/lib/api/rest/base.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -1
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +3 -2
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +11 -9
- 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 +21 -13
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +2 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +6 -2
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +14 -5
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.js +5 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +5 -2
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +22 -12
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +2 -2
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
- package/lib/chain/bls/index.d.ts +1 -1
- package/lib/chain/bls/index.d.ts.map +1 -1
- package/lib/chain/bls/interface.d.ts +5 -5
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +5 -11
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +116 -101
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/jobItem.d.ts +5 -19
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
- package/lib/chain/bls/multithread/jobItem.js +10 -65
- package/lib/chain/bls/multithread/jobItem.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +29 -8
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/types.js +12 -0
- package/lib/chain/bls/multithread/types.js.map +1 -1
- package/lib/chain/bls/multithread/utils.d.ts +4 -0
- package/lib/chain/bls/multithread/utils.d.ts.map +1 -1
- package/lib/chain/bls/multithread/utils.js +10 -0
- package/lib/chain/bls/multithread/utils.js.map +1 -1
- package/lib/chain/bls/multithread/worker.js +49 -23
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.d.ts +4 -10
- package/lib/chain/bls/singleThread.d.ts.map +1 -1
- package/lib/chain/bls/singleThread.js +8 -45
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.d.ts +4 -4
- package/lib/chain/bls/utils.d.ts.map +1 -1
- package/lib/chain/bls/utils.js +18 -19
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +9 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +22 -8
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +1 -0
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +6 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadBid.js +1 -0
- package/lib/chain/errors/executionPayloadBid.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +4 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/interface.d.ts +8 -4
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
- 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 +1 -1
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts +16 -0
- package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts.map +1 -0
- package/lib/chain/opPools/deferredVoluntaryExitPool.js +57 -0
- package/lib/chain/opPools/deferredVoluntaryExitPool.js.map +1 -0
- package/lib/chain/opPools/executionPayloadBidPool.d.ts +7 -2
- package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.js +4 -4
- package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +2 -1
- 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.js +3 -3
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +1 -1
- 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/prepareNextSlot.d.ts +5 -0
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +47 -6
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +3 -25
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +5 -2
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +3 -0
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/regen/queued.d.ts +2 -2
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +5 -5
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenAttesters.d.ts +9 -5
- package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
- package/lib/chain/seenCache/seenAttesters.js +25 -4
- package/lib/chain/seenCache/seenAttesters.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +28 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +121 -13
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +5 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +6 -0
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +47 -5
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +117 -7
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +3 -3
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/validation/attestation.d.ts.map +1 -1
- package/lib/chain/validation/attestation.js +1 -4
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +1 -1
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +40 -10
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts +15 -3
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +166 -12
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +5 -14
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validation/proposerPreferences.js +2 -2
- package/lib/chain/validation/proposerPreferences.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.d.ts +9 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +46 -1
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/execution/builder/apiClient.d.ts +70 -0
- package/lib/execution/builder/apiClient.d.ts.map +1 -0
- package/lib/execution/builder/apiClient.js +202 -0
- package/lib/execution/builder/apiClient.js.map +1 -0
- package/lib/execution/builder/validateBid.d.ts +23 -0
- package/lib/execution/builder/validateBid.d.ts.map +1 -0
- package/lib/execution/builder/validateBid.js +119 -0
- package/lib/execution/builder/validateBid.js.map +1 -0
- package/lib/metrics/metrics/lodestar.d.ts +84 -23
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +161 -55
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -0
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +37 -0
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +23 -43
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/constants.d.ts +7 -0
- package/lib/network/processor/constants.d.ts.map +1 -0
- package/lib/network/processor/constants.js +7 -0
- package/lib/network/processor/constants.js.map +1 -0
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +6 -2
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -1
- package/lib/network/processor/gossipQueues/indexed.js +0 -1
- package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
- package/lib/network/processor/index.d.ts +3 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +52 -23
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +5 -11
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/util.d.ts +0 -1
- package/lib/network/util.d.ts.map +1 -1
- package/lib/network/util.js +0 -4
- package/lib/network/util.js.map +1 -1
- package/lib/node/deferredVoluntaryExitPublisher.d.ts +15 -0
- package/lib/node/deferredVoluntaryExitPublisher.d.ts.map +1 -0
- package/lib/node/deferredVoluntaryExitPublisher.js +38 -0
- package/lib/node/deferredVoluntaryExitPublisher.js.map +1 -0
- package/lib/node/nodejs.d.ts +2 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +7 -0
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/range/batch.d.ts +23 -5
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +61 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +2 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +32 -12
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.js +1 -1
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/types.d.ts +32 -0
- package/lib/sync/types.d.ts.map +1 -1
- package/lib/sync/types.js +33 -0
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +6 -2
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +143 -68
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +16 -11
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +3 -1
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/package.json +35 -35
- package/src/api/impl/beacon/blocks/index.ts +51 -15
- package/src/api/impl/beacon/pool/index.ts +22 -2
- package/src/api/impl/beacon/state/utils.ts +2 -1
- package/src/api/impl/events/index.ts +3 -1
- package/src/api/impl/lodestar/index.ts +1 -1
- package/src/api/impl/validator/index.ts +290 -49
- package/src/api/impl/validator/utils.ts +1 -1
- package/src/api/rest/base.ts +7 -0
- package/src/chain/archiveStore/archiveStore.ts +1 -1
- package/src/chain/blocks/importExecutionPayload.ts +12 -11
- package/src/chain/blocks/index.ts +25 -13
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +8 -2
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -4
- package/src/chain/blocks/verifyBlock.ts +5 -2
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +25 -16
- package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +1 -9
- package/src/chain/bls/index.ts +1 -1
- package/src/chain/bls/interface.ts +7 -3
- package/src/chain/bls/multithread/index.ts +148 -120
- package/src/chain/bls/multithread/jobItem.ts +12 -82
- package/src/chain/bls/multithread/types.ts +33 -8
- package/src/chain/bls/multithread/utils.ts +11 -0
- package/src/chain/bls/multithread/worker.ts +85 -27
- package/src/chain/bls/singleThread.ts +11 -55
- package/src/chain/bls/utils.ts +23 -24
- package/src/chain/chain.ts +25 -7
- package/src/chain/errors/blockError.ts +8 -2
- package/src/chain/errors/executionPayloadBid.ts +6 -0
- package/src/chain/forkChoice/index.ts +4 -0
- package/src/chain/interface.ts +8 -3
- package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
- package/src/chain/opPools/attestationPool.ts +1 -1
- package/src/chain/opPools/deferredVoluntaryExitPool.ts +65 -0
- package/src/chain/opPools/executionPayloadBidPool.ts +13 -7
- package/src/chain/opPools/index.ts +2 -1
- package/src/chain/opPools/payloadAttestationPool.ts +3 -3
- package/src/chain/opPools/syncCommitteeMessagePool.ts +1 -1
- package/src/chain/opPools/syncContributionAndProofPool.ts +1 -1
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/prepareNextSlot.ts +49 -6
- package/src/chain/produceBlock/computeNewStateRoot.ts +3 -38
- package/src/chain/produceBlock/produceBlockBody.ts +1 -1
- package/src/chain/regen/interface.ts +5 -2
- package/src/chain/regen/queued.ts +5 -5
- package/src/chain/seenCache/seenAttesters.ts +31 -5
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +143 -14
- package/src/chain/stateCache/fifoBlockStateCache.ts +8 -1
- package/src/chain/stateCache/persistentCheckpointsCache.ts +133 -8
- package/src/chain/stateCache/types.ts +3 -3
- package/src/chain/validation/attestation.ts +1 -7
- package/src/chain/validation/attesterSlashing.ts +1 -8
- package/src/chain/validation/block.ts +43 -10
- package/src/chain/validation/executionPayloadBid.ts +193 -14
- package/src/chain/validation/executionPayloadEnvelope.ts +0 -1
- package/src/chain/validation/payloadAttestationMessage.ts +6 -17
- package/src/chain/validation/proposerPreferences.ts +3 -3
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/chain/validation/voluntaryExit.ts +59 -2
- package/src/execution/builder/apiClient.ts +264 -0
- package/src/execution/builder/validateBid.ts +181 -0
- package/src/metrics/metrics/lodestar.ts +176 -61
- package/src/network/gossip/topic.ts +38 -0
- package/src/network/network.ts +29 -54
- package/src/network/processor/constants.ts +6 -0
- package/src/network/processor/gossipHandlers.ts +6 -2
- package/src/network/processor/gossipQueues/indexed.ts +0 -1
- package/src/network/processor/index.ts +67 -30
- package/src/network/reqresp/score.ts +5 -11
- package/src/network/util.ts +0 -5
- package/src/node/deferredVoluntaryExitPublisher.ts +54 -0
- package/src/node/nodejs.ts +10 -1
- package/src/sync/range/batch.ts +83 -28
- package/src/sync/range/chain.ts +35 -13
- package/src/sync/range/range.ts +1 -1
- package/src/sync/types.ts +33 -0
- package/src/sync/unknownBlock.ts +167 -73
- package/src/sync/utils/downloadByRange.ts +21 -12
- package/src/sync/utils/downloadByRoot.ts +3 -1
- package/lib/chain/bls/maybeBatch.d.ts +0 -12
- package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
- package/lib/chain/bls/maybeBatch.js +0 -35
- package/lib/chain/bls/maybeBatch.js.map +0 -1
- package/src/chain/bls/maybeBatch.ts +0 -45
package/lib/sync/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
|
package/lib/sync/types.js
CHANGED
|
@@ -30,6 +30,39 @@ export var PendingBlockInputStatus;
|
|
|
30
30
|
PendingBlockInputStatus["downloaded"] = "downloaded";
|
|
31
31
|
PendingBlockInputStatus["processing"] = "processing";
|
|
32
32
|
})(PendingBlockInputStatus || (PendingBlockInputStatus = {}));
|
|
33
|
+
/**
|
|
34
|
+
* Why a pending item was dropped from BlockInputSync WITHOUT completing.
|
|
35
|
+
* The happy path — a successfully imported/processed block or payload — is removed by the import
|
|
36
|
+
* flow (onPayloadImported, processReadyBlock/processPayload success) and is deliberately NOT tracked
|
|
37
|
+
* here
|
|
38
|
+
*/
|
|
39
|
+
export var DroppedItemReason;
|
|
40
|
+
(function (DroppedItemReason) {
|
|
41
|
+
/** prune: item's own slot is below the finalized slot (routine cleanup), or a downloaded block landed at/below finality */
|
|
42
|
+
DroppedItemReason["belowFinalized"] = "below_finalized";
|
|
43
|
+
/** prune: slot-less, unresolvable payload evicted after PRUNE_UNRESOLVED_SLOT_EPOCHS */
|
|
44
|
+
DroppedItemReason["agedOut"] = "aged_out";
|
|
45
|
+
/** pruneSetToMax evicted the oldest entry because the cache hit its capacity (DoS guard) */
|
|
46
|
+
DroppedItemReason["capacity"] = "capacity";
|
|
47
|
+
/** descendant removed because an ancestor was invalid/removed */
|
|
48
|
+
DroppedItemReason["invalidParent"] = "invalid_parent";
|
|
49
|
+
/** transient execution-engine error removal (EXECUTION_ENGINE_ERROR) */
|
|
50
|
+
DroppedItemReason["elError"] = "el_error";
|
|
51
|
+
/** the execution engine declared the item invalid (EXECUTION_ENGINE_INVALID) */
|
|
52
|
+
DroppedItemReason["elInvalid"] = "el_invalid";
|
|
53
|
+
/** a block failed our own checks (not correct w.r.t. our chain) */
|
|
54
|
+
DroppedItemReason["invalidBlock"] = "invalid_block";
|
|
55
|
+
/** a block declares a parent payload hash that conflicts with the parent's actual payload (gloas) */
|
|
56
|
+
DroppedItemReason["invalidParentPayload"] = "invalid_parent_payload";
|
|
57
|
+
/** a payload envelope failed gossip verification (ENVELOPE_VERIFICATION_ERROR) */
|
|
58
|
+
DroppedItemReason["invalidEnvelope"] = "invalid_envelope";
|
|
59
|
+
/** a payload had an invalid signature (INVALID_SIGNATURE) */
|
|
60
|
+
DroppedItemReason["invalidSignature"] = "invalid_signature";
|
|
61
|
+
/** a block root was given up on after exhausting download attempts (data could not be fetched) */
|
|
62
|
+
DroppedItemReason["unavailable"] = "unavailable";
|
|
63
|
+
/** an unexpected / unhandled error code led to removal */
|
|
64
|
+
DroppedItemReason["unknown"] = "unknown";
|
|
65
|
+
})(DroppedItemReason || (DroppedItemReason = {}));
|
|
33
66
|
export var PendingPayloadInputStatus;
|
|
34
67
|
(function (PendingPayloadInputStatus) {
|
|
35
68
|
PendingPayloadInputStatus["pending"] = "pending";
|
package/lib/sync/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAI1C,MAAM,CAAN,IAAY,gBAuBX;AAvBD,WAAY,gBAAgB;IAC1B;;OAEG;IACH,2DAAuC,CAAA;IACvC;;OAEG;IACH,qDAAiC,CAAA;IACjC;;;OAGG;IACH,mEAA+C,CAAA;IAE/C;;OAEG;IACH,6EAAyD,CAAA;IACzD;;OAEG;IACH,+EAA2D,CAAA;AAC7D,CAAC,EAvBW,gBAAgB,KAAhB,gBAAgB,QAuB3B;AAED,MAAM,CAAN,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,8CAAmB,CAAA;IACnB,gDAAqB,CAAA;IACrB,oDAAyB,CAAA;IACzB,oDAAyB,CAAA;AAC3B,CAAC,EALW,uBAAuB,KAAvB,uBAAuB,QAKlC;AAED,MAAM,CAAN,IAAY,yBAMX;AAND,WAAY,yBAAyB;IACnC,gDAAmB,CAAA;IACnB,kDAAqB,CAAA;IACrB,kEAAqC,CAAA;IACrC,sDAAyB,CAAA;IACzB,sDAAyB,CAAA;AAC3B,CAAC,EANW,yBAAyB,KAAzB,yBAAyB,QAMpC;AAqDD,MAAM,UAAU,mBAAmB,CAAC,OAAgC;IAClE,OAAO,YAAY,IAAI,OAAO,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA6B;IACjE,OAAO,cAAc,IAAI,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAA6B;IACpE,OAAO,UAAU,IAAI,OAAO,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAA8B;IAC9E,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAA8B;IAC3E,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAA6B;IAC1E,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAA6B;IACvE,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IACrD,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;AACnC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAI1C,MAAM,CAAN,IAAY,gBAuBX;AAvBD,WAAY,gBAAgB;IAC1B;;OAEG;IACH,2DAAuC,CAAA;IACvC;;OAEG;IACH,qDAAiC,CAAA;IACjC;;;OAGG;IACH,mEAA+C,CAAA;IAE/C;;OAEG;IACH,6EAAyD,CAAA;IACzD;;OAEG;IACH,+EAA2D,CAAA;AAC7D,CAAC,EAvBW,gBAAgB,KAAhB,gBAAgB,QAuB3B;AAED,MAAM,CAAN,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,8CAAmB,CAAA;IACnB,gDAAqB,CAAA;IACrB,oDAAyB,CAAA;IACzB,oDAAyB,CAAA;AAC3B,CAAC,EALW,uBAAuB,KAAvB,uBAAuB,QAKlC;AAED;;;;;GAKG;AACH,MAAM,CAAN,IAAY,iBAyBX;AAzBD,WAAY,iBAAiB;IAC3B,2HAA2H;IAC3H,uDAAkC,CAAA;IAClC,wFAAwF;IACxF,yCAAoB,CAAA;IACpB,4FAA4F;IAC5F,0CAAqB,CAAA;IACrB,iEAAiE;IACjE,qDAAgC,CAAA;IAChC,wEAAwE;IACxE,yCAAoB,CAAA;IACpB,gFAAgF;IAChF,6CAAwB,CAAA;IACxB,mEAAmE;IACnE,mDAA8B,CAAA;IAC9B,qGAAqG;IACrG,oEAA+C,CAAA;IAC/C,kFAAkF;IAClF,yDAAoC,CAAA;IACpC,6DAA6D;IAC7D,2DAAsC,CAAA;IACtC,kGAAkG;IAClG,gDAA2B,CAAA;IAC3B,0DAA0D;IAC1D,wCAAmB,CAAA;AACrB,CAAC,EAzBW,iBAAiB,KAAjB,iBAAiB,QAyB5B;AAED,MAAM,CAAN,IAAY,yBAMX;AAND,WAAY,yBAAyB;IACnC,gDAAmB,CAAA;IACnB,kDAAqB,CAAA;IACrB,kEAAqC,CAAA;IACrC,sDAAyB,CAAA;IACzB,sDAAyB,CAAA;AAC3B,CAAC,EANW,yBAAyB,KAAzB,yBAAyB,QAMpC;AAqDD,MAAM,UAAU,mBAAmB,CAAC,OAAgC;IAClE,OAAO,YAAY,IAAI,OAAO,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA6B;IACjE,OAAO,cAAc,IAAI,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAA6B;IACpE,OAAO,UAAU,IAAI,OAAO,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAA8B;IAC9E,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAA8B;IAC3E,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAA6B;IAC1E,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAA6B;IACvE,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IACrD,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;AACnC,CAAC"}
|
|
@@ -158,14 +158,18 @@ export declare class UnknownBlockPeerBalancer {
|
|
|
158
158
|
/** Trigger on each peer re-status */
|
|
159
159
|
onPeerConnected(peerId: PeerIdStr, syncMeta: PeerSyncMeta): void;
|
|
160
160
|
onPeerDisconnected(peerId: PeerIdStr): void;
|
|
161
|
+
/** Reset all tracked peer state, e.g. when BlockInputSync unsubscribes from the network. */
|
|
162
|
+
clear(): void;
|
|
161
163
|
onRateLimited(peerId: PeerIdStr, rateLimitedUntilMs: number): void;
|
|
162
164
|
getNextRateLimitRetryAt(pendingColumns?: Set<number>, excludedPeers?: Set<PeerIdStr>): number | null;
|
|
163
165
|
/**
|
|
164
|
-
* called from fetchBlockInput()
|
|
166
|
+
* called from fetchBlockInput()/fetchPayloadInput() with a block/payload root.
|
|
165
167
|
* excludedPeers are the peers that we requested already so we don't want to try again
|
|
166
168
|
* pendingColumns is empty for prefulu, or the 1st time we we download a block by root
|
|
169
|
+
* preferredPeers are the peers NetworkProcessor told us gossiped this root (from
|
|
170
|
+
* pendingBlock/cacheItem.peerIdStrings). They are preferred but not required.
|
|
167
171
|
*/
|
|
168
|
-
bestPeerForPendingColumns(pendingColumns: Set<number>, excludedPeers: Set<PeerIdStr>): PeerSyncMeta | null;
|
|
172
|
+
bestPeerForPendingColumns(pendingColumns: Set<number>, excludedPeers: Set<PeerIdStr>, preferredPeers?: Set<PeerIdStr>): PeerSyncMeta | null;
|
|
169
173
|
/**
|
|
170
174
|
* Consumers don't need to call this method directly, it is called internally by bestPeer*() methods
|
|
171
175
|
* make this public for testing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unknownBlock.d.ts","sourceRoot":"","sources":["../../src/sync/unknownBlock.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAMjD,OAAO,EAAC,MAAM,EAA+D,MAAM,iBAAiB,CAAC;AAMrG,OAAO,EAA6B,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAC,QAAQ,EAAuD,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAC,YAAY,EAAC,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"unknownBlock.d.ts","sourceRoot":"","sources":["../../src/sync/unknownBlock.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAMjD,OAAO,EAAC,MAAM,EAA+D,MAAM,iBAAiB,CAAC;AAMrG,OAAO,EAA6B,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAC,QAAQ,EAAuD,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAC,YAAY,EAAC,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAK5C,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAuDzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,cAAc;IAcvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAlBxB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+C;IAE7E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAClC,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,uBAAuB,CAA6B;IAE5D,YACmB,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,IAAI,CAAC,EAAE,WAAW,YAAA,EAgBpC;IAED,kBAAkB,IAAI,IAAI,CA+BzB;IAED,sBAAsB,IAAI,IAAI,CAe7B;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,qBAAqB,IAAI,OAAO,CAE/B;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAWxB;IAEF;;OAEG;IACH,OAAO,CAAC,sBAAsB,CAS5B;IAEF,OAAO,CAAC,0BAA0B,CAWhC;IAEF,OAAO,CAAC,2BAA2B,CASjC;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe,CA+BrB;IAEF,OAAO,CAAC,eAAe,CAIrB;IAEF,OAAO,CAAC,iBAAiB,CAKvB;IAEF;;;OAGG;IACH,OAAO,CAAC,cAAc,CAoEpB;IAEF,OAAO,CAAC,YAAY,CAiClB;IAEF,OAAO,CAAC,eAAe,CAkCrB;IAEF,OAAO,CAAC,mBAAmB,CAuCzB;IAEF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,iBAAiB,CA4BvB;IAEF,OAAO,CAAC,eAAe,CASrB;IAEF,OAAO,CAAC,kBAAkB,CAIxB;IAEF;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAmCjC,OAAO,CAAC,mBAAmB;IAuC3B,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAwF/B;IAEF,OAAO,CAAC,6BAA6B;IAuBrC,OAAO,CAAC,0BAA0B;YAOpB,aAAa;IA0F3B;;;OAGG;YACW,iBAAiB;IA4H/B;;;;OAIG;YACW,wBAAwB;YAqExB,eAAe;YAyDf,cAAc;IA0F5B;;;;OAIG;YACW,iBAAiB;YAmJjB,6BAA6B;YAmB7B,mBAAmB;IAwCjC;;;;;;;;OAQG;YACW,eAAe;IAqK7B;;;;;OAKG;IACH,OAAO,CAAC,gCAAgC;IA6BxC,OAAO,CAAC,kCAAkC;IAyB1C,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,sBAAsB;CAY/B;AAED;;GAEG;AACH,qBAAa,wBAAwB;IACnC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAExD,cAIC;IAED,qCAAqC;IACrC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAM/D;IAED,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAI1C;IAED,4FAA4F;IAC5F,KAAK,IAAI,IAAI,CAIZ;IAED,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAEjE;IAED,uBAAuB,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CA4BnG;IAED;;;;;;OAMG;IACH,yBAAyB,CACvB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,EAC3B,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC,EAC7B,cAAc,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,GAC9B,YAAY,GAAG,IAAI,CAiBrB;IAED;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEjC;IAED;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE1C;IAED,sBAAsB,IAAI,MAAM,CAM/B;IAED,OAAO,CAAC,WAAW;IA8DnB,OAAO,CAAC,qBAAqB;CAO9B"}
|
package/lib/sync/unknownBlock.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { routes } from "@lodestar/api";
|
|
2
|
-
import { ForkSeq, isForkPostGloas } from "@lodestar/params";
|
|
2
|
+
import { ForkSeq, SLOTS_PER_EPOCH, isForkPostGloas } from "@lodestar/params";
|
|
3
3
|
import { RequestError, RequestErrorCode } from "@lodestar/reqresp";
|
|
4
4
|
import { computeTimeAtSlot } from "@lodestar/state-transition";
|
|
5
5
|
import { fromHex, prettyPrintIndices, pruneSetToMax, sleep, toRootHex } from "@lodestar/utils";
|
|
@@ -12,17 +12,22 @@ import { ChainEvent } from "../chain/index.js";
|
|
|
12
12
|
import { validateGloasBlockDataColumnSidecars } from "../chain/validation/dataColumnSidecar.js";
|
|
13
13
|
import { validateGossipExecutionPayloadEnvelope } from "../chain/validation/executionPayloadEnvelope.js";
|
|
14
14
|
import { NetworkEvent, prettyPrintPeerIdStr } from "../network/index.js";
|
|
15
|
+
import { MAX_PEERS_PER_ROOT } from "../network/processor/constants.js";
|
|
15
16
|
import { shuffle } from "../util/shuffle.js";
|
|
16
17
|
import { sortBy } from "../util/sortBy.js";
|
|
17
18
|
import { wrapError } from "../util/wrapError.js";
|
|
18
19
|
import { MAX_CONCURRENT_REQUESTS } from "./constants.js";
|
|
19
|
-
import { PendingBlockInputStatus, PendingBlockType, PendingPayloadInputStatus, getBlockInputSyncCacheItemRootHex, getBlockInputSyncCacheItemSlot, getPayloadSyncCacheItemRootHex, getPayloadSyncCacheItemSlot, isPendingBlockInput, isPendingPayloadEnvelope, isPendingPayloadInput, } from "./types.js";
|
|
20
|
+
import { DroppedItemReason, PendingBlockInputStatus, PendingBlockType, PendingPayloadInputStatus, getBlockInputSyncCacheItemRootHex, getBlockInputSyncCacheItemSlot, getPayloadSyncCacheItemRootHex, getPayloadSyncCacheItemSlot, isPendingBlockInput, isPendingPayloadEnvelope, isPendingPayloadInput, } from "./types.js";
|
|
20
21
|
import { DownloadByRootError, downloadByRoot } from "./utils/downloadByRoot.js";
|
|
21
22
|
import { getAllDescendantBlocks, getUnknownAndAncestorBlocks } from "./utils/pendingBlocksTree.js";
|
|
22
23
|
import { getRateLimitedUntilMs } from "./utils/rateLimit.js";
|
|
23
24
|
const MAX_ATTEMPTS_PER_BLOCK = 5;
|
|
24
25
|
const MAX_KNOWN_BAD_BLOCKS = 500;
|
|
25
26
|
const MAX_PENDING_BLOCKS = 100;
|
|
27
|
+
/**
|
|
28
|
+
* A pending payload without slot can only stay at most 2 epochs.
|
|
29
|
+
*/
|
|
30
|
+
const PRUNE_UNRESOLVED_SLOT_EPOCHS = 2;
|
|
26
31
|
var FetchResult;
|
|
27
32
|
(function (FetchResult) {
|
|
28
33
|
FetchResult["SuccessResolved"] = "success_resolved";
|
|
@@ -120,6 +125,15 @@ export class BlockInputSync {
|
|
|
120
125
|
this.chain.emitter.on(routes.events.EventType.executionPayload, this.onPayloadImported);
|
|
121
126
|
this.network.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
122
127
|
this.network.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
128
|
+
// Seed the balancer with peers that connected before we subscribed
|
|
129
|
+
for (const peerId of this.network.getConnectedPeers()) {
|
|
130
|
+
try {
|
|
131
|
+
this.peerBalancer.onPeerConnected(peerId, this.network.getConnectedPeerSyncMeta(peerId));
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
this.logger.debug("Failed to seed connected peer into BlockInputSync balancer", { peerId }, e);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
123
137
|
this.subscribedToNetworkEvents = true;
|
|
124
138
|
}
|
|
125
139
|
}
|
|
@@ -136,6 +150,7 @@ export class BlockInputSync {
|
|
|
136
150
|
this.chain.emitter.off(routes.events.EventType.executionPayload, this.onPayloadImported);
|
|
137
151
|
this.network.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
|
|
138
152
|
this.network.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
|
|
153
|
+
this.peerBalancer.clear();
|
|
139
154
|
this.subscribedToNetworkEvents = false;
|
|
140
155
|
}
|
|
141
156
|
close() {
|
|
@@ -149,10 +164,12 @@ export class BlockInputSync {
|
|
|
149
164
|
*/
|
|
150
165
|
onUnknownBlockRoot = (data) => {
|
|
151
166
|
try {
|
|
152
|
-
this.addByRootHex(data.rootHex, data.peer);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
167
|
+
const isNewRoot = this.addByRootHex(data.rootHex, data.peer);
|
|
168
|
+
if (isNewRoot) {
|
|
169
|
+
this.triggerUnknownBlockSearch();
|
|
170
|
+
this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.UNKNOWN_BLOCK_ROOT });
|
|
171
|
+
this.metrics?.blockInputSync.source.inc({ source: data.source });
|
|
172
|
+
}
|
|
156
173
|
}
|
|
157
174
|
catch (e) {
|
|
158
175
|
this.logger.debug("Error handling unknownBlockRoot event", {}, e);
|
|
@@ -174,10 +191,12 @@ export class BlockInputSync {
|
|
|
174
191
|
};
|
|
175
192
|
onUnknownEnvelopeBlockRoot = (data) => {
|
|
176
193
|
try {
|
|
177
|
-
this.addByPayloadRootHex(data.rootHex, data.peer, this.resolvePayloadSlot(data.rootHex));
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
194
|
+
const isNewRoot = this.addByPayloadRootHex(data.rootHex, data.peer, this.resolvePayloadSlot(data.rootHex));
|
|
195
|
+
if (isNewRoot) {
|
|
196
|
+
this.triggerUnknownBlockSearch();
|
|
197
|
+
this.metrics?.blockInputSync.requests.inc({ type: PendingBlockType.UNKNOWN_PAYLOAD_BLOCK_ROOT });
|
|
198
|
+
this.metrics?.blockInputSync.payloadSource.inc({ source: data.source });
|
|
199
|
+
}
|
|
181
200
|
}
|
|
182
201
|
catch (e) {
|
|
183
202
|
this.logger.debug("Error handling unknownEnvelopeBlockRoot event", {}, e);
|
|
@@ -210,7 +229,7 @@ export class BlockInputSync {
|
|
|
210
229
|
parentRoot: missingDependency.parentRootHex,
|
|
211
230
|
parentBlockHash: missingDependency.parentBlockHashHex,
|
|
212
231
|
});
|
|
213
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
232
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.invalidParentPayload);
|
|
214
233
|
}
|
|
215
234
|
return;
|
|
216
235
|
}
|
|
@@ -246,25 +265,35 @@ export class BlockInputSync {
|
|
|
246
265
|
// Use the actual finalized block slot, not computeStartSlotAtEpoch(checkpoint.epoch)
|
|
247
266
|
// because the payload at the finalized block is not finalized
|
|
248
267
|
const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
|
|
249
|
-
|
|
268
|
+
const nowSec = Date.now() / 1000;
|
|
269
|
+
const maxSecInCache = (PRUNE_UNRESOLVED_SLOT_EPOCHS * SLOTS_PER_EPOCH * this.config.SLOT_DURATION_MS) / 1000;
|
|
270
|
+
let belowFinalizedPayloads = 0;
|
|
271
|
+
let agedOutPayloads = 0;
|
|
250
272
|
let unresolvedSlotPayloads = 0;
|
|
251
273
|
for (const [rootHex, payload] of this.pendingPayloads) {
|
|
252
274
|
// Last-effort resolve for a slot-less PendingPayloadRootHex, and store it back for later passes.
|
|
253
275
|
if (!isPendingPayloadInput(payload) && !isPendingPayloadEnvelope(payload) && payload.slot === undefined) {
|
|
254
276
|
payload.slot = this.resolvePayloadSlot(rootHex);
|
|
277
|
+
if (payload.slot === undefined) {
|
|
278
|
+
// Still unresolvable: age it out so the MAX_PENDING_BLOCKS cap cannot stay saturated.
|
|
279
|
+
if (nowSec - payload.timeAddedSec > maxSecInCache) {
|
|
280
|
+
this.pendingPayloads.delete(rootHex);
|
|
281
|
+
agedOutPayloads++;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
unresolvedSlotPayloads++;
|
|
285
|
+
this.logger.debug("BlockInputSync.pruneFinalized: pending payload with unresolved slot", {
|
|
286
|
+
root: rootHex,
|
|
287
|
+
finalizedSlot,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
255
292
|
}
|
|
256
293
|
const slot = getPayloadSyncCacheItemSlot(payload);
|
|
257
|
-
if (typeof slot
|
|
258
|
-
unresolvedSlotPayloads++;
|
|
259
|
-
this.logger.debug("BlockInputSync.pruneFinalized: pending payload with unresolved slot", {
|
|
260
|
-
root: rootHex,
|
|
261
|
-
finalizedSlot,
|
|
262
|
-
});
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
if (slot < finalizedSlot) {
|
|
294
|
+
if (typeof slot === "number" && slot < finalizedSlot) {
|
|
266
295
|
this.pendingPayloads.delete(rootHex);
|
|
267
|
-
|
|
296
|
+
belowFinalizedPayloads++;
|
|
268
297
|
}
|
|
269
298
|
}
|
|
270
299
|
let deletedBlocks = 0;
|
|
@@ -275,13 +304,20 @@ export class BlockInputSync {
|
|
|
275
304
|
deletedBlocks++;
|
|
276
305
|
}
|
|
277
306
|
}
|
|
278
|
-
if (
|
|
279
|
-
this.metrics?.blockInputSync.
|
|
307
|
+
if (belowFinalizedPayloads > 0) {
|
|
308
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.belowFinalized }, belowFinalizedPayloads);
|
|
309
|
+
}
|
|
310
|
+
if (agedOutPayloads > 0) {
|
|
311
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.agedOut }, agedOutPayloads);
|
|
312
|
+
}
|
|
313
|
+
if (deletedBlocks > 0) {
|
|
314
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.belowFinalized }, deletedBlocks);
|
|
280
315
|
}
|
|
281
316
|
this.logger.debug("BlockInputSync.pruneFinalized dropped pre-finalized pending items", {
|
|
282
317
|
finalizedSlot,
|
|
283
318
|
finalizedRoot: checkpoint.rootHex,
|
|
284
|
-
|
|
319
|
+
belowFinalizedPayloads,
|
|
320
|
+
agedOutPayloads,
|
|
285
321
|
deletedBlocks,
|
|
286
322
|
unresolvedSlotPayloads,
|
|
287
323
|
});
|
|
@@ -303,13 +339,16 @@ export class BlockInputSync {
|
|
|
303
339
|
peerIdStr: peerIdStr ?? "unknown peer",
|
|
304
340
|
});
|
|
305
341
|
}
|
|
306
|
-
|
|
342
|
+
// bound peers tracked per root: propagationSource is recorded pre-validation, so cap the set (#9923).
|
|
343
|
+
// Once at the cap, ignore further peers rather than evicting already-tracked ones.
|
|
344
|
+
if (peerIdStr && pendingBlock.peerIdStrings.size < MAX_PEERS_PER_ROOT) {
|
|
307
345
|
pendingBlock.peerIdStrings.add(peerIdStr);
|
|
308
346
|
}
|
|
309
347
|
// TODO: check this prune methodology
|
|
310
348
|
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
311
349
|
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
312
350
|
if (prunedItemCount > 0) {
|
|
351
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
313
352
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
314
353
|
}
|
|
315
354
|
return added;
|
|
@@ -333,13 +372,16 @@ export class BlockInputSync {
|
|
|
333
372
|
delaySec: this.chain.clock.secFromSlot(blockInput.slot),
|
|
334
373
|
});
|
|
335
374
|
}
|
|
336
|
-
|
|
375
|
+
// bound peers tracked per root: propagationSource is recorded pre-validation, so cap the set (#9923).
|
|
376
|
+
// Once at the cap, ignore further peers rather than evicting already-tracked ones.
|
|
377
|
+
if (peerIdStr && pendingBlock.peerIdStrings.size < MAX_PEERS_PER_ROOT) {
|
|
337
378
|
pendingBlock.peerIdStrings.add(peerIdStr);
|
|
338
379
|
}
|
|
339
380
|
// TODO: check this prune methodology
|
|
340
381
|
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
341
382
|
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
342
383
|
if (prunedItemCount > 0) {
|
|
384
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
343
385
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
344
386
|
}
|
|
345
387
|
};
|
|
@@ -363,11 +405,20 @@ export class BlockInputSync {
|
|
|
363
405
|
peerIdStr: peerIdStr ?? "unknown peer",
|
|
364
406
|
});
|
|
365
407
|
}
|
|
366
|
-
if (
|
|
408
|
+
else if (
|
|
409
|
+
// update a previously slot-less entry once a slot becomes available
|
|
410
|
+
slot !== undefined &&
|
|
411
|
+
!isPendingPayloadInput(pendingPayload) &&
|
|
412
|
+
!isPendingPayloadEnvelope(pendingPayload) &&
|
|
413
|
+
pendingPayload.slot === undefined) {
|
|
414
|
+
pendingPayload.slot = slot;
|
|
415
|
+
}
|
|
416
|
+
if (peerIdStr && pendingPayload.peerIdStrings.size < MAX_PEERS_PER_ROOT) {
|
|
367
417
|
pendingPayload.peerIdStrings.add(peerIdStr);
|
|
368
418
|
}
|
|
369
419
|
const prunedItemCount = pruneSetToMax(this.pendingPayloads, this.maxPendingBlocks);
|
|
370
420
|
if (prunedItemCount > 0) {
|
|
421
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
371
422
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingPayloads`);
|
|
372
423
|
}
|
|
373
424
|
return added;
|
|
@@ -394,7 +445,7 @@ export class BlockInputSync {
|
|
|
394
445
|
}
|
|
395
446
|
addByPayloadInput = (payloadInput, peerIdStr, envelope) => {
|
|
396
447
|
const pendingPayload = this.toPendingPayloadInput(payloadInput, this.pendingPayloads.get(payloadInput.blockRootHex), envelope);
|
|
397
|
-
if (peerIdStr) {
|
|
448
|
+
if (peerIdStr && pendingPayload.peerIdStrings.size < MAX_PEERS_PER_ROOT) {
|
|
398
449
|
pendingPayload.peerIdStrings.add(peerIdStr);
|
|
399
450
|
}
|
|
400
451
|
this.pendingPayloads.set(payloadInput.blockRootHex, pendingPayload);
|
|
@@ -405,6 +456,7 @@ export class BlockInputSync {
|
|
|
405
456
|
});
|
|
406
457
|
const prunedItemCount = pruneSetToMax(this.pendingPayloads, this.maxPendingBlocks);
|
|
407
458
|
if (prunedItemCount > 0) {
|
|
459
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
408
460
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingPayloads`);
|
|
409
461
|
}
|
|
410
462
|
};
|
|
@@ -448,13 +500,7 @@ export class BlockInputSync {
|
|
|
448
500
|
if (this.chain.forkChoice.hasPayloadHexUnsafe(parentRootHex)) {
|
|
449
501
|
return { kind: "invalidParentPayload", parentRootHex, parentBlockHashHex };
|
|
450
502
|
}
|
|
451
|
-
|
|
452
|
-
if (parentPayloadInput) {
|
|
453
|
-
if (parentPayloadInput.getBlockHashHex() === parentBlockHashHex) {
|
|
454
|
-
return { kind: "parentPayload", rootHex: parentRootHex, slot: parentBlock.slot };
|
|
455
|
-
}
|
|
456
|
-
return { kind: "invalidParentPayload", parentRootHex, parentBlockHashHex };
|
|
457
|
-
}
|
|
503
|
+
// Parent is in fork choice but its payload `parentBlockHashHex` isn't revealed yet
|
|
458
504
|
return { kind: "parentPayload", rootHex: parentRootHex, slot: parentBlock.slot };
|
|
459
505
|
}
|
|
460
506
|
advancePendingBlock(pendingBlock) {
|
|
@@ -486,7 +532,7 @@ export class BlockInputSync {
|
|
|
486
532
|
parentRoot: missingDependency.parentRootHex,
|
|
487
533
|
parentBlockHash: missingDependency.parentBlockHashHex,
|
|
488
534
|
});
|
|
489
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
535
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.invalidParentPayload);
|
|
490
536
|
return "removed";
|
|
491
537
|
}
|
|
492
538
|
}
|
|
@@ -675,7 +721,7 @@ export class BlockInputSync {
|
|
|
675
721
|
...logCtx2,
|
|
676
722
|
finalizedSlot,
|
|
677
723
|
});
|
|
678
|
-
this.removeAndDownScoreAllDescendants(block);
|
|
724
|
+
this.removeAndDownScoreAllDescendants(block, DroppedItemReason.belowFinalized);
|
|
679
725
|
}
|
|
680
726
|
else {
|
|
681
727
|
this.onUnknownBlockRoot({ rootHex: pending.blockInput.parentRootHex, source: BlockInputSource.byRoot });
|
|
@@ -693,7 +739,7 @@ export class BlockInputSync {
|
|
|
693
739
|
}
|
|
694
740
|
this.metrics?.blockInputSync.downloadedBlocksError.inc();
|
|
695
741
|
this.logger.debug("Ignoring unknown block root after many failed downloads", logCtx, res.err);
|
|
696
|
-
this.removeAndDownScoreAllDescendants(block);
|
|
742
|
+
this.removeAndDownScoreAllDescendants(block, DroppedItemReason.unavailable);
|
|
697
743
|
}
|
|
698
744
|
}
|
|
699
745
|
/**
|
|
@@ -750,9 +796,9 @@ export class BlockInputSync {
|
|
|
750
796
|
// no need to update status to "processed", delete anyway
|
|
751
797
|
this.pendingBlocks.delete(blockRootHex);
|
|
752
798
|
if (isForkPostGloas(fork)) {
|
|
753
|
-
const payloadInput = this.chain.seenPayloadEnvelopeInputCache.
|
|
799
|
+
const payloadInput = await this.chain.seenPayloadEnvelopeInputCache.getOrReload(blockRootHex);
|
|
754
800
|
if (!payloadInput) {
|
|
755
|
-
this.logger.
|
|
801
|
+
this.logger.debug("PayloadEnvelopeInput unavailable during unknown sync processReadyBlock()", logCtx);
|
|
756
802
|
}
|
|
757
803
|
else {
|
|
758
804
|
// Similar to the gossip path: immediately attempt fetch of data columns from the execution engine.
|
|
@@ -788,17 +834,17 @@ export class BlockInputSync {
|
|
|
788
834
|
case BlockErrorCode.EXECUTION_ENGINE_ERROR:
|
|
789
835
|
// Removing the block(s) without penalizing the peers, hoping for EL to
|
|
790
836
|
// recover on a latter download + verify attempt.
|
|
791
|
-
this.removeAllDescendants(pendingBlock);
|
|
837
|
+
this.removeAllDescendants(pendingBlock, DroppedItemReason.elError, DroppedItemReason.elError);
|
|
792
838
|
break;
|
|
793
839
|
case BlockErrorCode.EXECUTION_ENGINE_INVALID:
|
|
794
840
|
// the peer served a bad block
|
|
795
841
|
this.logger.debug("Execution engine rejected block from unknown parent sync", errorData, res.err);
|
|
796
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
842
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.elInvalid);
|
|
797
843
|
break;
|
|
798
844
|
default:
|
|
799
845
|
// Block is not correct with respect to our chain. Log error loudly
|
|
800
846
|
this.logger.debug("Error processing block from unknown parent sync", errorData, res.err);
|
|
801
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
847
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.invalidBlock);
|
|
802
848
|
}
|
|
803
849
|
}
|
|
804
850
|
// Probably a queue error or something unwanted happened, mark as pending to try again latter
|
|
@@ -819,7 +865,6 @@ export class BlockInputSync {
|
|
|
819
865
|
this.pendingPayloads.delete(rootHex);
|
|
820
866
|
return;
|
|
821
867
|
}
|
|
822
|
-
const payloadInput = this.chain.seenPayloadEnvelopeInputCache.get(rootHex);
|
|
823
868
|
if (!this.chain.forkChoice.hasBlockHex(rootHex)) {
|
|
824
869
|
// Block not in fork choice yet. payloadInput may be seeded from the block body during download, so a
|
|
825
870
|
// non-null payloadInput does not imply the block is imported; defer regardless and pull the block first.
|
|
@@ -833,8 +878,9 @@ export class BlockInputSync {
|
|
|
833
878
|
}
|
|
834
879
|
return;
|
|
835
880
|
}
|
|
881
|
+
const payloadInput = await this.chain.seenPayloadEnvelopeInputCache.getOrReload(rootHex);
|
|
836
882
|
if (!payloadInput) {
|
|
837
|
-
this.logger.debug("
|
|
883
|
+
this.logger.debug("PayloadEnvelopeInput not yet reloadable for imported block, will retry", {
|
|
838
884
|
root: rootHex,
|
|
839
885
|
});
|
|
840
886
|
return;
|
|
@@ -966,16 +1012,24 @@ export class BlockInputSync {
|
|
|
966
1012
|
pendingPayload.status = PendingPayloadInputStatus.downloaded;
|
|
967
1013
|
break;
|
|
968
1014
|
case PayloadErrorCode.EXECUTION_ENGINE_INVALID:
|
|
1015
|
+
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1016
|
+
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.elInvalid);
|
|
1017
|
+
break;
|
|
969
1018
|
case PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR:
|
|
1019
|
+
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1020
|
+
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidEnvelope);
|
|
1021
|
+
break;
|
|
970
1022
|
case PayloadErrorCode.INVALID_SIGNATURE:
|
|
971
1023
|
// TODO GLOAS: Decide how invalid payload inputs should eventually leave memory without
|
|
972
1024
|
// reintroducing envelope replacement / recreation flows.
|
|
973
1025
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
974
|
-
this.removePendingPayloadAndDescendants(rootHex);
|
|
1026
|
+
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidSignature);
|
|
975
1027
|
break;
|
|
976
1028
|
default:
|
|
977
1029
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
978
|
-
this.pendingPayloads.delete(rootHex)
|
|
1030
|
+
if (this.pendingPayloads.delete(rootHex)) {
|
|
1031
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.unknown }, 1);
|
|
1032
|
+
}
|
|
979
1033
|
}
|
|
980
1034
|
return;
|
|
981
1035
|
}
|
|
@@ -994,7 +1048,7 @@ export class BlockInputSync {
|
|
|
994
1048
|
let slot = getPayloadSyncCacheItemSlot(cacheItem);
|
|
995
1049
|
let payloadInput = isPendingPayloadInput(cacheItem)
|
|
996
1050
|
? cacheItem.payloadInput
|
|
997
|
-
: this.chain.seenPayloadEnvelopeInputCache.
|
|
1051
|
+
: await this.chain.seenPayloadEnvelopeInputCache.getOrReload(rootHex);
|
|
998
1052
|
let envelope = payloadInput?.hasPayloadEnvelope() ? payloadInput.getPayloadEnvelope() : undefined;
|
|
999
1053
|
let i = 0;
|
|
1000
1054
|
let deferredByRateLimit = false;
|
|
@@ -1002,7 +1056,8 @@ export class BlockInputSync {
|
|
|
1002
1056
|
const pendingColumns = payloadInput?.hasAllData()
|
|
1003
1057
|
? new Set()
|
|
1004
1058
|
: new Set(payloadInput?.getMissingSampledColumnMeta().missing ?? []);
|
|
1005
|
-
|
|
1059
|
+
// prefer peers that gossiped this payload root to us (#9923)
|
|
1060
|
+
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers, cacheItem.peerIdStrings);
|
|
1006
1061
|
if (peerMeta === null) {
|
|
1007
1062
|
if (this.peerBalancer.getNextRateLimitRetryAt(pendingColumns, excludedPeers) !== null) {
|
|
1008
1063
|
throw new UnknownBlockRateLimitedError(`Error fetching payload by root slot=${slot} root=${rootHex} after ${i}: peers with needed columns are rate-limited`);
|
|
@@ -1019,7 +1074,7 @@ export class BlockInputSync {
|
|
|
1019
1074
|
envelope = await this.fetchExecutionPayloadEnvelope(peerId, blockRoot, rootHex);
|
|
1020
1075
|
slot = envelope.message.payload.slotNumber;
|
|
1021
1076
|
}
|
|
1022
|
-
payloadInput ??= this.chain.seenPayloadEnvelopeInputCache.
|
|
1077
|
+
payloadInput ??= await this.chain.seenPayloadEnvelopeInputCache.getOrReload(rootHex);
|
|
1023
1078
|
if (!this.chain.forkChoice.hasBlockHex(rootHex)) {
|
|
1024
1079
|
// Block not in fork choice yet. Validating now would throw BLOCK_ROOT_UNKNOWN, so keep the downloaded
|
|
1025
1080
|
// envelope and wait for the block body; reconcilePayloadEnvelope validates once the block lands.
|
|
@@ -1164,7 +1219,8 @@ export class BlockInputSync {
|
|
|
1164
1219
|
const pendingColumns = isPendingBlockInput(cacheItem) && isBlockInputColumns(cacheItem.blockInput)
|
|
1165
1220
|
? new Set(cacheItem.blockInput.getMissingSampledColumnMeta().missing)
|
|
1166
1221
|
: defaultPendingColumns;
|
|
1167
|
-
|
|
1222
|
+
// prefer peers that gossiped this block root to us (#9923)
|
|
1223
|
+
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers, cacheItem.peerIdStrings);
|
|
1168
1224
|
if (peerMeta === null) {
|
|
1169
1225
|
if (this.peerBalancer.getNextRateLimitRetryAt(pendingColumns, excludedPeers) !== null) {
|
|
1170
1226
|
throw new UnknownBlockRateLimitedError(`Error fetching UnknownBlockRoot slot=${slot} root=${rootHex} after ${i}: peers with needed columns are rate-limited`);
|
|
@@ -1290,9 +1346,9 @@ export class BlockInputSync {
|
|
|
1290
1346
|
* Downscore all peers that have referenced any of this bad blocks. May report peers multiple times if they have
|
|
1291
1347
|
* referenced more than one bad block.
|
|
1292
1348
|
*/
|
|
1293
|
-
removeAndDownScoreAllDescendants(block) {
|
|
1349
|
+
removeAndDownScoreAllDescendants(block, headReason) {
|
|
1294
1350
|
// Get all blocks that are a descendant of this one
|
|
1295
|
-
const badPendingBlocks = this.removeAllDescendants(block);
|
|
1351
|
+
const badPendingBlocks = this.removeAllDescendants(block, headReason, DroppedItemReason.invalidParent);
|
|
1296
1352
|
// just console log and do not penalize on pending/bad blocks for debugging
|
|
1297
1353
|
// console.log("removeAndDownscoreAllDescendants", {block});
|
|
1298
1354
|
for (const block of badPendingBlocks) {
|
|
@@ -1316,16 +1372,21 @@ export class BlockInputSync {
|
|
|
1316
1372
|
pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
|
|
1317
1373
|
}
|
|
1318
1374
|
// Once a parent payload is invalid, every descendant waiting on that payload lineage becomes unrecoverable too.
|
|
1319
|
-
removePendingPayloadAndDescendants(rootHex) {
|
|
1375
|
+
removePendingPayloadAndDescendants(rootHex, headReason) {
|
|
1320
1376
|
// Keep PayloadEnvelopeInput resident in the seen cache. importBlock() owns that object and
|
|
1321
1377
|
// later validation/finalization logic decides when it can leave memory.
|
|
1322
|
-
this.pendingPayloads.delete(rootHex)
|
|
1378
|
+
if (this.pendingPayloads.delete(rootHex)) {
|
|
1379
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: headReason }, 1);
|
|
1380
|
+
}
|
|
1323
1381
|
const badPendingBlocks = getAllDescendantBlocks(rootHex, this.pendingBlocks);
|
|
1324
|
-
this.metrics?.blockInputSync.removedBlocks.inc(badPendingBlocks.length);
|
|
1325
1382
|
for (const block of badPendingBlocks) {
|
|
1326
1383
|
const descendantRootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1327
|
-
this.pendingBlocks.delete(descendantRootHex)
|
|
1328
|
-
|
|
1384
|
+
if (this.pendingBlocks.delete(descendantRootHex)) {
|
|
1385
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.invalidParent }, 1);
|
|
1386
|
+
}
|
|
1387
|
+
if (this.pendingPayloads.delete(descendantRootHex)) {
|
|
1388
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.invalidParent }, 1);
|
|
1389
|
+
}
|
|
1329
1390
|
this.chain.seenBlockInputCache.prune(descendantRootHex);
|
|
1330
1391
|
this.logger.debug("Removing pending descendant after invalid parent payload", {
|
|
1331
1392
|
slot: getBlockInputSyncCacheItemSlot(block),
|
|
@@ -1334,16 +1395,20 @@ export class BlockInputSync {
|
|
|
1334
1395
|
});
|
|
1335
1396
|
}
|
|
1336
1397
|
}
|
|
1337
|
-
removeAllDescendants(block) {
|
|
1398
|
+
removeAllDescendants(block, headReason, descendantReason = DroppedItemReason.invalidParent) {
|
|
1338
1399
|
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1339
1400
|
const slot = getBlockInputSyncCacheItemSlot(block);
|
|
1340
|
-
// Get all blocks that are a descendant of this one
|
|
1401
|
+
// Get all blocks that are a descendant of this one (index 0 is the head item itself)
|
|
1341
1402
|
const badPendingBlocks = [block, ...getAllDescendantBlocks(rootHex, this.pendingBlocks)];
|
|
1342
|
-
|
|
1343
|
-
for (const block of badPendingBlocks) {
|
|
1403
|
+
for (const [i, block] of badPendingBlocks.entries()) {
|
|
1344
1404
|
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1345
|
-
|
|
1346
|
-
this.
|
|
1405
|
+
const reason = i === 0 ? headReason : descendantReason;
|
|
1406
|
+
if (this.pendingBlocks.delete(rootHex)) {
|
|
1407
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason }, 1);
|
|
1408
|
+
}
|
|
1409
|
+
if (this.pendingPayloads.delete(rootHex)) {
|
|
1410
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason }, 1);
|
|
1411
|
+
}
|
|
1347
1412
|
this.chain.seenBlockInputCache.prune(rootHex);
|
|
1348
1413
|
// Keep PayloadEnvelopeInput resident in the seen cache for consistency with the
|
|
1349
1414
|
// importBlock()-owned lifecycle.
|
|
@@ -1387,6 +1452,12 @@ export class UnknownBlockPeerBalancer {
|
|
|
1387
1452
|
this.activeRequests.delete(peerId);
|
|
1388
1453
|
this.rateLimitedUntilByPeer.delete(peerId);
|
|
1389
1454
|
}
|
|
1455
|
+
/** Reset all tracked peer state, e.g. when BlockInputSync unsubscribes from the network. */
|
|
1456
|
+
clear() {
|
|
1457
|
+
this.peersMeta.clear();
|
|
1458
|
+
this.activeRequests.clear();
|
|
1459
|
+
this.rateLimitedUntilByPeer.clear();
|
|
1460
|
+
}
|
|
1390
1461
|
onRateLimited(peerId, rateLimitedUntilMs) {
|
|
1391
1462
|
this.rateLimitedUntilByPeer.set(peerId, rateLimitedUntilMs);
|
|
1392
1463
|
}
|
|
@@ -1414,17 +1485,21 @@ export class UnknownBlockPeerBalancer {
|
|
|
1414
1485
|
return retryAt;
|
|
1415
1486
|
}
|
|
1416
1487
|
/**
|
|
1417
|
-
* called from fetchBlockInput()
|
|
1488
|
+
* called from fetchBlockInput()/fetchPayloadInput() with a block/payload root.
|
|
1418
1489
|
* excludedPeers are the peers that we requested already so we don't want to try again
|
|
1419
1490
|
* pendingColumns is empty for prefulu, or the 1st time we we download a block by root
|
|
1491
|
+
* preferredPeers are the peers NetworkProcessor told us gossiped this root (from
|
|
1492
|
+
* pendingBlock/cacheItem.peerIdStrings). They are preferred but not required.
|
|
1420
1493
|
*/
|
|
1421
|
-
bestPeerForPendingColumns(pendingColumns, excludedPeers) {
|
|
1494
|
+
bestPeerForPendingColumns(pendingColumns, excludedPeers, preferredPeers) {
|
|
1422
1495
|
const eligiblePeers = this.filterPeers(pendingColumns, excludedPeers);
|
|
1423
1496
|
if (eligiblePeers.length === 0) {
|
|
1424
1497
|
return null;
|
|
1425
1498
|
}
|
|
1426
1499
|
const sortedEligiblePeers = sortBy(shuffle(eligiblePeers),
|
|
1427
|
-
// prefer peers
|
|
1500
|
+
// 1st key: prefer peers we heard about this root from
|
|
1501
|
+
(peerId) => (preferredPeers?.has(peerId) ? 0 : 1),
|
|
1502
|
+
// 2nd key (tiebreak): prefer peers with least active req
|
|
1428
1503
|
(peerId) => this.activeRequests.get(peerId) ?? 0);
|
|
1429
1504
|
const bestPeerId = sortedEligiblePeers[0];
|
|
1430
1505
|
this.onRequest(bestPeerId);
|