@lodestar/beacon-node 1.50.0-dev.ebecebb9ba → 1.50.0-dev.f0a5c36612
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 +6 -1
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/index.js +13 -0
- package/lib/api/impl/beacon/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +4 -4
- 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 +23 -3
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +26 -18
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts +1 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +23 -1
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +6 -0
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +18 -24
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +2 -2
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +5 -7
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/types.d.ts +2 -2
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +1 -1
- package/lib/chain/archiveStore/interface.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts +4 -1
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/pruneHistory.js +5 -3
- package/lib/chain/archiveStore/utils/pruneHistory.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +11 -3
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +2 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +1 -1
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +2 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +5 -4
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/chain.d.ts +9 -5
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +56 -21
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +7 -1
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/envelopeReconstructionError.d.ts +5 -0
- package/lib/chain/errors/envelopeReconstructionError.d.ts.map +1 -1
- package/lib/chain/errors/envelopeReconstructionError.js +2 -0
- package/lib/chain/errors/envelopeReconstructionError.js.map +1 -1
- package/lib/chain/errors/gossipValidation.d.ts +3 -1
- package/lib/chain/errors/gossipValidation.d.ts.map +1 -1
- package/lib/chain/errors/gossipValidation.js +2 -0
- package/lib/chain/errors/gossipValidation.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +2 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/initState.d.ts +2 -9
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +5 -38
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +3 -2
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -2
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +30 -8
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/opPool.d.ts +5 -4
- package/lib/chain/opPools/opPool.d.ts.map +1 -1
- package/lib/chain/opPools/opPool.js +62 -18
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/proposerPreferencesPool.d.ts +4 -4
- package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -1
- package/lib/chain/opPools/proposerPreferencesPool.js +14 -11
- package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +4 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +11 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +2 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +5 -2
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +6 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +2 -0
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +10 -4
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -0
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +21 -0
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +9 -2
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +23 -13
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
- package/lib/chain/shufflingCache.d.ts +1 -0
- package/lib/chain/shufflingCache.d.ts.map +1 -1
- package/lib/chain/shufflingCache.js +4 -0
- package/lib/chain/shufflingCache.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts +4 -4
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +3 -0
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.d.ts +3 -3
- package/lib/chain/validation/proposerSlashing.d.ts.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +3 -0
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +5 -1
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +64 -54
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/beacon.d.ts +2 -0
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +5 -0
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +2 -1
- package/lib/db/buckets.d.ts.map +1 -1
- package/lib/db/buckets.js +1 -0
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +2 -0
- package/lib/db/interface.d.ts.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
- package/lib/db/repositories/earliestAvailableSlot.d.ts +11 -0
- package/lib/db/repositories/earliestAvailableSlot.d.ts.map +1 -0
- package/lib/db/repositories/earliestAvailableSlot.js +19 -0
- package/lib/db/repositories/earliestAvailableSlot.js.map +1 -0
- package/lib/db/repositories/proposerSlashing.d.ts +1 -0
- package/lib/db/repositories/proposerSlashing.d.ts.map +1 -1
- package/lib/db/repositories/proposerSlashing.js +5 -1
- package/lib/db/repositories/proposerSlashing.js.map +1 -1
- package/lib/execution/engine/disabled.d.ts +0 -2
- package/lib/execution/engine/disabled.d.ts.map +1 -1
- package/lib/execution/engine/disabled.js +0 -6
- package/lib/execution/engine/disabled.js.map +1 -1
- package/lib/execution/engine/http.d.ts +1 -3
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +2 -17
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +2 -4
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/mock.d.ts +0 -2
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +0 -8
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +0 -8
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +1 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +4 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/metrics.d.ts +7 -3
- package/lib/metrics/metrics.d.ts.map +1 -1
- package/lib/metrics/metrics.js +4 -4
- package/lib/metrics/metrics.js.map +1 -1
- package/lib/network/metadata.d.ts +1 -1
- package/lib/network/metadata.d.ts.map +1 -1
- package/lib/network/metadata.js +17 -17
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/peers/datastore.d.ts +9 -9
- package/lib/network/peers/datastore.d.ts.map +1 -1
- package/lib/network/peers/datastore.js +36 -36
- package/lib/network/peers/datastore.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +66 -67
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.d.ts +7 -3
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +7 -3
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +9 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +77 -10
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +41 -26
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.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 +27 -4
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/range/batch.d.ts +11 -5
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +21 -17
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +4 -4
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +12 -6
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts.map +1 -1
- package/lib/sync/range/range.js +75 -29
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +14 -7
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +132 -66
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +38 -14
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +84 -39
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/util/execution.d.ts +11 -11
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +6 -2
- package/lib/util/execution.js.map +1 -1
- package/package.json +17 -17
- package/src/api/impl/beacon/blocks/index.ts +7 -4
- package/src/api/impl/beacon/index.ts +15 -0
- package/src/api/impl/beacon/pool/index.ts +4 -4
- package/src/api/impl/beacon/state/index.ts +31 -3
- package/src/api/impl/debug/index.ts +28 -19
- package/src/api/impl/validator/index.ts +24 -2
- package/src/chain/archiveStore/archiveStore.ts +26 -26
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +5 -7
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +1 -1
- package/src/chain/archiveStore/historicalState/types.ts +2 -2
- package/src/chain/archiveStore/historicalState/worker.ts +1 -2
- package/src/chain/archiveStore/interface.ts +1 -1
- package/src/chain/archiveStore/utils/pruneHistory.ts +9 -4
- package/src/chain/blocks/importBlock.ts +13 -3
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +2 -1
- package/src/chain/blocks/verifyBlock.ts +1 -0
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -3
- package/src/chain/chain.ts +76 -23
- package/src/chain/emitter.ts +7 -1
- package/src/chain/errors/envelopeReconstructionError.ts +3 -0
- package/src/chain/errors/gossipValidation.ts +2 -0
- package/src/chain/forkChoice/index.ts +2 -0
- package/src/chain/initState.ts +8 -60
- package/src/chain/interface.ts +3 -2
- package/src/chain/opPools/aggregatedAttestationPool.ts +34 -10
- package/src/chain/opPools/opPool.ts +91 -18
- package/src/chain/opPools/proposerPreferencesPool.ts +14 -10
- package/src/chain/opPools/utils.ts +31 -3
- package/src/chain/options.ts +3 -3
- package/src/chain/prepareNextSlot.ts +6 -3
- package/src/chain/produceBlock/computeNewStateRoot.ts +1 -1
- package/src/chain/produceBlock/produceBlockBody.ts +8 -1
- package/src/chain/regen/regen.ts +12 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +23 -0
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +31 -13
- package/src/chain/shufflingCache.ts +5 -0
- package/src/chain/validation/attesterSlashing.ts +7 -4
- package/src/chain/validation/proposerSlashing.ts +7 -4
- package/src/chain/validatorMonitor.ts +75 -57
- package/src/db/beacon.ts +5 -0
- package/src/db/buckets.ts +1 -0
- package/src/db/interface.ts +2 -0
- package/src/db/repositories/earliestAvailableSlot.ts +19 -0
- package/src/db/repositories/proposerSlashing.ts +6 -1
- package/src/execution/engine/disabled.ts +0 -8
- package/src/execution/engine/http.ts +1 -30
- package/src/execution/engine/interface.ts +2 -6
- package/src/execution/engine/mock.ts +1 -19
- package/src/execution/engine/types.ts +0 -10
- package/src/index.ts +1 -1
- package/src/metrics/metrics/lodestar.ts +4 -0
- package/src/metrics/metrics.ts +21 -6
- package/src/network/metadata.ts +17 -17
- package/src/network/peers/datastore.ts +36 -36
- package/src/network/processor/gossipHandlers.ts +97 -80
- package/src/network/processor/gossipValidatorFn.ts +13 -3
- package/src/network/processor/index.ts +89 -10
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +42 -28
- package/src/node/nodejs.ts +35 -3
- package/src/sync/range/batch.ts +25 -19
- package/src/sync/range/chain.ts +15 -8
- package/src/sync/range/range.ts +76 -30
- package/src/sync/unknownBlock.ts +156 -71
- package/src/sync/utils/downloadByRange.ts +123 -58
- package/src/util/execution.ts +17 -9
|
@@ -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+E,MAAM,iBAAiB,CAAC;AAMrH,OAAO,EAA6B,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"unknownBlock.d.ts","sourceRoot":"","sources":["../../src/sync/unknownBlock.ts"],"names":[],"mappings":"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"}
|
package/lib/sync/unknownBlock.js
CHANGED
|
@@ -11,7 +11,7 @@ import { BlockError, BlockErrorCode } from "../chain/errors/index.js";
|
|
|
11
11
|
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
|
-
import { NetworkEvent, prettyPrintPeerIdStr } from "../network/index.js";
|
|
14
|
+
import { NetworkEvent, PeerAction, prettyPrintPeerIdStr } from "../network/index.js";
|
|
15
15
|
import { MAX_PEERS_PER_ROOT } from "../network/processor/constants.js";
|
|
16
16
|
import { ClockEvent } from "../util/clock.js";
|
|
17
17
|
import { shuffle } from "../util/shuffle.js";
|
|
@@ -34,8 +34,12 @@ const PRUNE_UNRESOLVED_SLOT_EPOCHS = 2;
|
|
|
34
34
|
*/
|
|
35
35
|
export const PAYLOAD_POLL_INTERVAL_MS = 1_000;
|
|
36
36
|
class UnknownBlockRateLimitedError extends Error {
|
|
37
|
-
|
|
37
|
+
retryAt;
|
|
38
|
+
constructor(message,
|
|
39
|
+
/** Earliest backoff expiry seen when the download was deferred, it is retried once that has passed */
|
|
40
|
+
retryAt) {
|
|
38
41
|
super(message);
|
|
42
|
+
this.retryAt = retryAt;
|
|
39
43
|
this.name = "UnknownBlockRateLimitedError";
|
|
40
44
|
}
|
|
41
45
|
}
|
|
@@ -378,6 +382,10 @@ export class BlockInputSync {
|
|
|
378
382
|
});
|
|
379
383
|
};
|
|
380
384
|
addByRootHex = (rootHex, peerIdStr) => {
|
|
385
|
+
if (this.knownBadBlocks.has(rootHex)) {
|
|
386
|
+
this.logger.debug("Ignoring known bad block root", { root: rootHex, peerIdStr: peerIdStr ?? "unknown peer" });
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
381
389
|
let pendingBlock = this.pendingBlocks.get(rootHex);
|
|
382
390
|
let added = false;
|
|
383
391
|
if (!pendingBlock) {
|
|
@@ -409,6 +417,10 @@ export class BlockInputSync {
|
|
|
409
417
|
return added;
|
|
410
418
|
};
|
|
411
419
|
addByBlockInput = (blockInput, peerIdStr) => {
|
|
420
|
+
if (this.knownBadBlocks.has(blockInput.blockRootHex)) {
|
|
421
|
+
this.logger.debug("Ignoring known bad block", { slot: blockInput.slot, root: blockInput.blockRootHex, peerIdStr });
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
412
424
|
let pendingBlock = this.pendingBlocks.get(blockInput.blockRootHex);
|
|
413
425
|
// if entry is missing or was added via rootHex and now we have more complete information overwrite
|
|
414
426
|
// the existing information with the more complete cache entry
|
|
@@ -441,6 +453,14 @@ export class BlockInputSync {
|
|
|
441
453
|
}
|
|
442
454
|
};
|
|
443
455
|
addByPayloadRootHex = (rootHex, peerIdStr, slot) => {
|
|
456
|
+
if (this.knownBadBlocks.has(rootHex)) {
|
|
457
|
+
this.logger.debug("Ignoring payload for known bad block root", {
|
|
458
|
+
slot: slot ?? "unknown",
|
|
459
|
+
root: rootHex,
|
|
460
|
+
peerIdStr,
|
|
461
|
+
});
|
|
462
|
+
return false;
|
|
463
|
+
}
|
|
444
464
|
let pendingPayload = this.pendingPayloads.get(rootHex);
|
|
445
465
|
let added = false;
|
|
446
466
|
if (!pendingPayload) {
|
|
@@ -499,6 +519,14 @@ export class BlockInputSync {
|
|
|
499
519
|
return this.chain.seenPayloadEnvelopeInputCache.get(rootHex)?.slot;
|
|
500
520
|
}
|
|
501
521
|
addByPayloadInput = (payloadInput, peerIdStr, envelope) => {
|
|
522
|
+
if (this.knownBadBlocks.has(payloadInput.blockRootHex)) {
|
|
523
|
+
this.logger.debug("Ignoring payload input for known bad block root", {
|
|
524
|
+
slot: payloadInput.slot,
|
|
525
|
+
root: payloadInput.blockRootHex,
|
|
526
|
+
peerIdStr,
|
|
527
|
+
});
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
502
530
|
const pendingPayload = this.toPendingPayloadInput(payloadInput, this.pendingPayloads.get(payloadInput.blockRootHex), envelope);
|
|
503
531
|
if (peerIdStr && pendingPayload.peerIdStrings.size < MAX_PEERS_PER_ROOT) {
|
|
504
532
|
pendingPayload.peerIdStrings.add(peerIdStr);
|
|
@@ -552,6 +580,7 @@ export class BlockInputSync {
|
|
|
552
580
|
if (this.chain.forkChoice.getBlockHexAndBlockHash(parentRootHex, parentBlockHashHex) !== null) {
|
|
553
581
|
return { kind: "ready" };
|
|
554
582
|
}
|
|
583
|
+
// The parent's payload is known but does not match `parentBlockHashHex`
|
|
555
584
|
if (this.chain.forkChoice.hasPayloadHexUnsafe(parentRootHex)) {
|
|
556
585
|
return { kind: "invalidParentPayload", parentRootHex, parentBlockHashHex };
|
|
557
586
|
}
|
|
@@ -693,21 +722,25 @@ export class BlockInputSync {
|
|
|
693
722
|
this.triggerUnknownBlockSearch();
|
|
694
723
|
}
|
|
695
724
|
};
|
|
725
|
+
/**
|
|
726
|
+
* Returns false if there is no backoff left to wait for, in which case no retry is scheduled.
|
|
727
|
+
*/
|
|
696
728
|
scheduleRateLimitBackoffRetry() {
|
|
697
729
|
this.clearRateLimitBackoffTimer();
|
|
698
730
|
if (!this.subscribedToNetworkEvents || (this.pendingBlocks.size === 0 && this.pendingPayloads.size === 0)) {
|
|
699
|
-
return;
|
|
731
|
+
return false;
|
|
700
732
|
}
|
|
701
733
|
const now = Date.now();
|
|
702
734
|
const retryAt = this.peerBalancer.getNextRateLimitRetryAt();
|
|
703
735
|
if (retryAt === null) {
|
|
704
|
-
return;
|
|
736
|
+
return false;
|
|
705
737
|
}
|
|
706
738
|
this.rateLimitBackoffTimeout = setTimeout(() => {
|
|
707
739
|
this.rateLimitBackoffTimeout = undefined;
|
|
708
740
|
this.triggerUnknownBlockSearch();
|
|
709
741
|
this.scheduleRateLimitBackoffRetry();
|
|
710
742
|
}, Math.max(0, retryAt - now));
|
|
743
|
+
return true;
|
|
711
744
|
}
|
|
712
745
|
clearRateLimitBackoffTimer() {
|
|
713
746
|
if (this.rateLimitBackoffTimeout !== undefined) {
|
|
@@ -882,7 +915,8 @@ export class BlockInputSync {
|
|
|
882
915
|
}
|
|
883
916
|
else if (blockSlot <= finalizedSlot) {
|
|
884
917
|
// the common ancestor of the downloading chain and canonical chain should be at least the finalized slot and
|
|
885
|
-
// we should found it through forkchoice. If not,
|
|
918
|
+
// we should found it through forkchoice. If not, drop the chain without penalizing peers because pending entries are
|
|
919
|
+
// block retained on failed download, so finalization can pass the block while it is still pending
|
|
886
920
|
// 0 - 1 - ... - n - finalizedSlot
|
|
887
921
|
// \
|
|
888
922
|
// parent 1 - parent 2 - ... - unknownParent block
|
|
@@ -890,7 +924,7 @@ export class BlockInputSync {
|
|
|
890
924
|
...logCtx2,
|
|
891
925
|
finalizedSlot,
|
|
892
926
|
});
|
|
893
|
-
this.
|
|
927
|
+
this.removeAllDescendants(block, DroppedItemReason.belowFinalized);
|
|
894
928
|
}
|
|
895
929
|
else {
|
|
896
930
|
this.onUnknownBlockRoot({ rootHex: pending.blockInput.parentRootHex, source: BlockInputSource.byRoot });
|
|
@@ -903,7 +937,11 @@ export class BlockInputSync {
|
|
|
903
937
|
pendingBlock.status = PendingBlockInputStatus.pending;
|
|
904
938
|
}
|
|
905
939
|
this.logger.debug("Deferring unknown block download due to peer rate limit", logCtx, res.err);
|
|
906
|
-
this.scheduleRateLimitBackoffRetry()
|
|
940
|
+
if (!this.scheduleRateLimitBackoffRetry() || res.err.retryAt <= Date.now()) {
|
|
941
|
+
// The backoff this download waited for expired in the meantime, a timer is only armed if another
|
|
942
|
+
// peer is still in backoff and would retry it later than needed
|
|
943
|
+
this.triggerUnknownBlockSearch();
|
|
944
|
+
}
|
|
907
945
|
return;
|
|
908
946
|
}
|
|
909
947
|
this.metrics?.blockInputSync.downloadedBlocksError.inc();
|
|
@@ -1009,14 +1047,17 @@ export class BlockInputSync {
|
|
|
1009
1047
|
this.removeAllDescendants(pendingBlock, DroppedItemReason.elError, DroppedItemReason.elError);
|
|
1010
1048
|
break;
|
|
1011
1049
|
case BlockErrorCode.EXECUTION_ENGINE_INVALID:
|
|
1012
|
-
//
|
|
1050
|
+
// Ban but do not downscore: optimistic-sync peers may forward and serve blocks whose payload is later
|
|
1051
|
+
// rejected by the execution engine. Per the spec, an INVALID execution payload SHOULD NOT cause a peer
|
|
1052
|
+
// to be down-scored or disconnected, only consensus-layer invalidity MAY.
|
|
1053
|
+
// https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/p2p-interface.md#the-reqresp-domain
|
|
1013
1054
|
this.logger.debug("Execution engine rejected block from unknown parent sync", errorData, res.err);
|
|
1014
|
-
this.
|
|
1055
|
+
this.removeAndBanAllDescendants(pendingBlock, DroppedItemReason.elInvalid);
|
|
1015
1056
|
break;
|
|
1016
1057
|
default:
|
|
1017
1058
|
// Block is not correct with respect to our chain. Log error loudly
|
|
1018
1059
|
this.logger.debug("Error processing block from unknown parent sync", errorData, res.err);
|
|
1019
|
-
this.
|
|
1060
|
+
this.removeAllDescendants(pendingBlock, DroppedItemReason.invalidBlock);
|
|
1020
1061
|
}
|
|
1021
1062
|
}
|
|
1022
1063
|
// Probably a queue error or something unwanted happened, mark as pending to try again latter
|
|
@@ -1138,6 +1179,12 @@ export class BlockInputSync {
|
|
|
1138
1179
|
if (!isPendingPayloadEnvelope(payload)) {
|
|
1139
1180
|
payload.status = PendingPayloadInputStatus.pending;
|
|
1140
1181
|
}
|
|
1182
|
+
if (res.err instanceof UnknownBlockRateLimitedError &&
|
|
1183
|
+
(!this.scheduleRateLimitBackoffRetry() || res.err.retryAt <= Date.now())) {
|
|
1184
|
+
// The backoff this download waited for expired in the meantime, a timer is only armed if another
|
|
1185
|
+
// peer is still in backoff and would retry it later than needed
|
|
1186
|
+
this.triggerUnknownBlockSearch();
|
|
1187
|
+
}
|
|
1141
1188
|
}
|
|
1142
1189
|
async processPayload(pendingPayload) {
|
|
1143
1190
|
const rootHex = pendingPayload.payloadInput.blockRootHex;
|
|
@@ -1191,18 +1238,21 @@ export class BlockInputSync {
|
|
|
1191
1238
|
this.logger.debug("Execution engine error while processing payload from unknown sync", logCtx, res.err);
|
|
1192
1239
|
pendingPayload.status = PendingPayloadInputStatus.downloaded;
|
|
1193
1240
|
break;
|
|
1241
|
+
// The invalid envelope is evicted from the seen cache in the cases below, otherwise the next
|
|
1242
|
+
// attempt would reuse it instead of fetching another envelope from peers
|
|
1194
1243
|
case PayloadErrorCode.EXECUTION_ENGINE_INVALID:
|
|
1195
1244
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1245
|
+
this.chain.seenPayloadEnvelopeInputCache.removeInvalid(pendingPayload.payloadInput);
|
|
1196
1246
|
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.elInvalid);
|
|
1197
1247
|
break;
|
|
1198
1248
|
case PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR:
|
|
1199
1249
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1250
|
+
this.chain.seenPayloadEnvelopeInputCache.removeInvalid(pendingPayload.payloadInput);
|
|
1200
1251
|
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidEnvelope);
|
|
1201
1252
|
break;
|
|
1202
1253
|
case PayloadErrorCode.INVALID_SIGNATURE:
|
|
1203
|
-
// TODO GLOAS: Decide how invalid payload inputs should eventually leave memory without
|
|
1204
|
-
// reintroducing envelope replacement / recreation flows.
|
|
1205
1254
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1255
|
+
this.chain.seenPayloadEnvelopeInputCache.removeInvalid(pendingPayload.payloadInput);
|
|
1206
1256
|
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidSignature);
|
|
1207
1257
|
break;
|
|
1208
1258
|
default:
|
|
@@ -1240,11 +1290,14 @@ export class BlockInputSync {
|
|
|
1240
1290
|
const pendingColumns = payloadInput?.hasAllData()
|
|
1241
1291
|
? new Set()
|
|
1242
1292
|
: new Set(payloadInput?.getMissingSampledColumnMeta().missing ?? []);
|
|
1293
|
+
// Same `now` for both calls, a backoff expiring in between would be reported as no peer available
|
|
1294
|
+
const now = Date.now();
|
|
1243
1295
|
// prefer peers that gossiped this payload root to us (#9923)
|
|
1244
|
-
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers, cacheItem.peerIdStrings);
|
|
1296
|
+
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers, cacheItem.peerIdStrings, now);
|
|
1245
1297
|
if (peerMeta === null) {
|
|
1246
|
-
|
|
1247
|
-
|
|
1298
|
+
const retryAt = this.peerBalancer.getNextRateLimitRetryAt(pendingColumns, excludedPeers, now);
|
|
1299
|
+
if (retryAt !== null) {
|
|
1300
|
+
throw new UnknownBlockRateLimitedError(`Error fetching payload by root slot=${slot} root=${rootHex} after ${i}: peers with needed columns are rate-limited`, retryAt);
|
|
1248
1301
|
}
|
|
1249
1302
|
const reason = pendingColumns.size > 0
|
|
1250
1303
|
? `cannot find peer with needed columns=${prettyPrintIndices(Array.from(pendingColumns))}`
|
|
@@ -1254,10 +1307,10 @@ export class BlockInputSync {
|
|
|
1254
1307
|
throw Error(`Error fetching payload by root slot=${slot} root=${rootHex} after ${i}: ${reason}`);
|
|
1255
1308
|
}
|
|
1256
1309
|
const { peerId, client: peerClient } = peerMeta;
|
|
1257
|
-
cacheItem.peerIdStrings.add(peerId);
|
|
1258
1310
|
try {
|
|
1259
1311
|
if (!envelope) {
|
|
1260
1312
|
envelope = await this.fetchExecutionPayloadEnvelope(peerId, blockRoot, rootHex);
|
|
1313
|
+
cacheItem.peerIdStrings.add(peerId);
|
|
1261
1314
|
const slotWasUnknown = typeof slot !== "number";
|
|
1262
1315
|
slot = envelope.message.payload.slotNumber;
|
|
1263
1316
|
if (slotWasUnknown) {
|
|
@@ -1292,6 +1345,8 @@ export class BlockInputSync {
|
|
|
1292
1345
|
const missing = pendingPayload.payloadInput.getMissingSampledColumnMeta().missing;
|
|
1293
1346
|
if (missing.length > 0) {
|
|
1294
1347
|
const columnSidecars = await this.fetchPayloadColumns(peerMeta, pendingPayload.payloadInput, missing);
|
|
1348
|
+
// toPendingPayloadInput copied cacheItem's set, so add to the object that is carried forward
|
|
1349
|
+
pendingPayload.peerIdStrings.add(peerId);
|
|
1295
1350
|
const seenTimestampSec = Date.now() / 1000;
|
|
1296
1351
|
for (const columnSidecar of columnSidecars) {
|
|
1297
1352
|
if (pendingPayload.payloadInput.hasColumn(columnSidecar.index)) {
|
|
@@ -1356,8 +1411,9 @@ export class BlockInputSync {
|
|
|
1356
1411
|
}
|
|
1357
1412
|
this.metrics?.blockInputSync.payloadFetchTime.observe({ result: FetchResult.FailureMaxAttempts }, Date.now() / 1000 - fetchStartSec);
|
|
1358
1413
|
this.metrics?.blockInputSync.payloadFetchPeers.set({ result: FetchResult.FailureMaxAttempts }, i - 1);
|
|
1359
|
-
|
|
1360
|
-
|
|
1414
|
+
const retryAt = deferredByRateLimit ? this.peerBalancer.getNextRateLimitRetryAt() : null;
|
|
1415
|
+
if (retryAt !== null) {
|
|
1416
|
+
throw new UnknownBlockRateLimitedError(`Error fetching payload with slot=${slot} root=${rootHex} after ${i - 1} attempts: peers are rate-limited`, retryAt);
|
|
1361
1417
|
}
|
|
1362
1418
|
throw Error(`Error fetching payload with slot=${slot} root=${rootHex} after ${i - 1} attempts.`);
|
|
1363
1419
|
}
|
|
@@ -1420,11 +1476,14 @@ export class BlockInputSync {
|
|
|
1420
1476
|
const pendingColumns = isPendingBlockInput(cacheItem) && isBlockInputColumns(cacheItem.blockInput)
|
|
1421
1477
|
? new Set(cacheItem.blockInput.getMissingSampledColumnMeta().missing)
|
|
1422
1478
|
: defaultPendingColumns;
|
|
1479
|
+
// Same `now` for both calls, a backoff expiring in between would be reported as no peer available
|
|
1480
|
+
const now = Date.now();
|
|
1423
1481
|
// prefer peers that gossiped this block root to us (#9923)
|
|
1424
|
-
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers, cacheItem.peerIdStrings);
|
|
1482
|
+
const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers, cacheItem.peerIdStrings, now);
|
|
1425
1483
|
if (peerMeta === null) {
|
|
1426
|
-
|
|
1427
|
-
|
|
1484
|
+
const retryAt = this.peerBalancer.getNextRateLimitRetryAt(pendingColumns, excludedPeers, now);
|
|
1485
|
+
if (retryAt !== null) {
|
|
1486
|
+
throw new UnknownBlockRateLimitedError(`Error fetching UnknownBlockRoot slot=${slot} root=${rootHex} after ${i}: peers with needed columns are rate-limited`, retryAt);
|
|
1428
1487
|
}
|
|
1429
1488
|
// no more peer with needed columns to try, throw error
|
|
1430
1489
|
const message = `Error fetching UnknownBlockRoot slot=${slot} root=${rootHex} after ${i}: cannot find peer with needed columns=${prettyPrintIndices(Array.from(pendingColumns))}`;
|
|
@@ -1433,7 +1492,6 @@ export class BlockInputSync {
|
|
|
1433
1492
|
throw Error(message);
|
|
1434
1493
|
}
|
|
1435
1494
|
const { peerId, client: peerClient } = peerMeta;
|
|
1436
|
-
cacheItem.peerIdStrings.add(peerId);
|
|
1437
1495
|
try {
|
|
1438
1496
|
const downloadResult = await downloadByRoot({
|
|
1439
1497
|
config: this.config,
|
|
@@ -1444,6 +1502,7 @@ export class BlockInputSync {
|
|
|
1444
1502
|
cacheItem,
|
|
1445
1503
|
});
|
|
1446
1504
|
cacheItem = downloadResult.result;
|
|
1505
|
+
cacheItem.peerIdStrings.add(peerId);
|
|
1447
1506
|
if (slot === undefined) {
|
|
1448
1507
|
slot = cacheItem.blockInput.slot;
|
|
1449
1508
|
// we were not able to observe the time into slot when starting the fetch, do it now
|
|
@@ -1520,8 +1579,9 @@ export class BlockInputSync {
|
|
|
1520
1579
|
}
|
|
1521
1580
|
} // end while loop over peers
|
|
1522
1581
|
const message = `Error fetching BlockInput with slot=${slot} root=${rootHex} after ${i - 1} attempts.`;
|
|
1523
|
-
|
|
1524
|
-
|
|
1582
|
+
const retryAt = deferredByRateLimit ? this.peerBalancer.getNextRateLimitRetryAt() : null;
|
|
1583
|
+
if (retryAt !== null) {
|
|
1584
|
+
throw new UnknownBlockRateLimitedError(`${message} Peers are rate-limited.`, retryAt);
|
|
1525
1585
|
}
|
|
1526
1586
|
if (!isPendingBlockInput(cacheItem)) {
|
|
1527
1587
|
throw Error(`${message} No block and no data was found.`);
|
|
@@ -1545,41 +1605,8 @@ export class BlockInputSync {
|
|
|
1545
1605
|
this.metrics?.blockInputSync.fetchPeers.set({ result: FetchResult.FailureMaxAttempts }, i - 1);
|
|
1546
1606
|
throw Error(message);
|
|
1547
1607
|
}
|
|
1548
|
-
/**
|
|
1549
|
-
* Gets all descendant blocks of `block` recursively from `pendingBlocks`.
|
|
1550
|
-
* Assumes that if a parent block does not exist or is not processable, all descendant blocks are bad too.
|
|
1551
|
-
* Downscore all peers that have referenced any of this bad blocks. May report peers multiple times if they have
|
|
1552
|
-
* referenced more than one bad block.
|
|
1553
|
-
*/
|
|
1554
|
-
removeAndDownScoreAllDescendants(block, headReason) {
|
|
1555
|
-
// Get all blocks that are a descendant of this one
|
|
1556
|
-
const badPendingBlocks = this.removeAllDescendants(block, headReason, DroppedItemReason.invalidParent);
|
|
1557
|
-
// just console log and do not penalize on pending/bad blocks for debugging
|
|
1558
|
-
// console.log("removeAndDownscoreAllDescendants", {block});
|
|
1559
|
-
for (const block of badPendingBlocks) {
|
|
1560
|
-
//
|
|
1561
|
-
// TODO(fulu): why is this commented out here?
|
|
1562
|
-
//
|
|
1563
|
-
// this.knownBadBlocks.add(block.blockRootHex);
|
|
1564
|
-
// for (const peerIdStr of block.peerIdStrings) {
|
|
1565
|
-
// // TODO: Refactor peerRpcScores to work with peerIdStr only
|
|
1566
|
-
// this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, "BadBlockByRoot");
|
|
1567
|
-
// }
|
|
1568
|
-
this.logger.debug("ignored Banning unknown block", {
|
|
1569
|
-
slot: getBlockInputSyncCacheItemSlot(block),
|
|
1570
|
-
root: getBlockInputSyncCacheItemRootHex(block),
|
|
1571
|
-
peerIdStrings: Array.from(block.peerIdStrings)
|
|
1572
|
-
.map((id) => prettyPrintPeerIdStr(id))
|
|
1573
|
-
.join(","),
|
|
1574
|
-
});
|
|
1575
|
-
}
|
|
1576
|
-
// Prune knownBadBlocks
|
|
1577
|
-
pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
|
|
1578
|
-
}
|
|
1579
1608
|
// Once a parent payload is invalid, every descendant waiting on that payload lineage becomes unrecoverable too.
|
|
1580
1609
|
removePendingPayloadAndDescendants(rootHex, headReason) {
|
|
1581
|
-
// Keep PayloadEnvelopeInput resident in the seen cache. importBlock() owns that object and
|
|
1582
|
-
// later validation/finalization logic decides when it can leave memory.
|
|
1583
1610
|
if (this.pendingPayloads.delete(rootHex)) {
|
|
1584
1611
|
this.metrics?.blockInputSync.removedPayloads.inc({ reason: headReason }, 1);
|
|
1585
1612
|
}
|
|
@@ -1600,9 +1627,50 @@ export class BlockInputSync {
|
|
|
1600
1627
|
});
|
|
1601
1628
|
}
|
|
1602
1629
|
}
|
|
1630
|
+
/**
|
|
1631
|
+
* Same as `removeAndBanAllDescendants`, and downscores every peer that referenced or served a banned item, once per
|
|
1632
|
+
* peer. Only call for consensus-layer invalidity, never for an INVALID execution payload:
|
|
1633
|
+
* https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/p2p-interface.md#the-reqresp-domain
|
|
1634
|
+
*/
|
|
1635
|
+
removeAndDownScoreAllDescendants(block, headReason) {
|
|
1636
|
+
const peersToReport = new Set();
|
|
1637
|
+
for (const bannedBlock of this.removeAndBanAllDescendants(block, headReason)) {
|
|
1638
|
+
for (const peerIdStr of bannedBlock.peerIdStrings) {
|
|
1639
|
+
peersToReport.add(peerIdStr);
|
|
1640
|
+
}
|
|
1641
|
+
}
|
|
1642
|
+
for (const peerIdStr of peersToReport) {
|
|
1643
|
+
this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, headReason);
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
/**
|
|
1647
|
+
* Removes `block` and all its pending descendants and bans their roots in `knownBadBlocks`. Only call when the chain
|
|
1648
|
+
* is provably bad: a banned root is never searched for again. Returns the banned items.
|
|
1649
|
+
*/
|
|
1650
|
+
removeAndBanAllDescendants(block, headReason) {
|
|
1651
|
+
const bannedBlocks = [];
|
|
1652
|
+
for (const badBlock of this.removeAllDescendants(block, headReason, DroppedItemReason.invalidParent)) {
|
|
1653
|
+
const rootHex = getBlockInputSyncCacheItemRootHex(badBlock);
|
|
1654
|
+
// a gossip import may race a failing sync path, never ban a root fork choice has imported
|
|
1655
|
+
if (this.chain.forkChoice.hasBlockHex(rootHex)) {
|
|
1656
|
+
continue;
|
|
1657
|
+
}
|
|
1658
|
+
this.knownBadBlocks.add(rootHex);
|
|
1659
|
+
bannedBlocks.push(badBlock);
|
|
1660
|
+
this.logger.debug("Banning unknown block", {
|
|
1661
|
+
slot: getBlockInputSyncCacheItemSlot(badBlock),
|
|
1662
|
+
root: rootHex,
|
|
1663
|
+
reason: headReason,
|
|
1664
|
+
peerIdStrings: Array.from(badBlock.peerIdStrings)
|
|
1665
|
+
.map((id) => prettyPrintPeerIdStr(id))
|
|
1666
|
+
.join(","),
|
|
1667
|
+
});
|
|
1668
|
+
}
|
|
1669
|
+
pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
|
|
1670
|
+
return bannedBlocks;
|
|
1671
|
+
}
|
|
1603
1672
|
removeAllDescendants(block, headReason, descendantReason = DroppedItemReason.invalidParent) {
|
|
1604
1673
|
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1605
|
-
const slot = getBlockInputSyncCacheItemSlot(block);
|
|
1606
1674
|
// Get all blocks that are a descendant of this one (index 0 is the head item itself)
|
|
1607
1675
|
const badPendingBlocks = [block, ...getAllDescendantBlocks(rootHex, this.pendingBlocks)];
|
|
1608
1676
|
for (const [i, block] of badPendingBlocks.entries()) {
|
|
@@ -1618,8 +1686,8 @@ export class BlockInputSync {
|
|
|
1618
1686
|
// Keep PayloadEnvelopeInput resident in the seen cache for consistency with the
|
|
1619
1687
|
// importBlock()-owned lifecycle.
|
|
1620
1688
|
this.logger.debug("Removing bad/unknown/incomplete BlockInputSyncCacheItem", {
|
|
1621
|
-
slot,
|
|
1622
|
-
|
|
1689
|
+
slot: getBlockInputSyncCacheItemSlot(block),
|
|
1690
|
+
root: rootHex,
|
|
1623
1691
|
});
|
|
1624
1692
|
}
|
|
1625
1693
|
return badPendingBlocks;
|
|
@@ -1666,8 +1734,7 @@ export class UnknownBlockPeerBalancer {
|
|
|
1666
1734
|
onRateLimited(peerId, rateLimitedUntilMs) {
|
|
1667
1735
|
this.rateLimitedUntilByPeer.set(peerId, rateLimitedUntilMs);
|
|
1668
1736
|
}
|
|
1669
|
-
getNextRateLimitRetryAt(pendingColumns, excludedPeers) {
|
|
1670
|
-
const now = Date.now();
|
|
1737
|
+
getNextRateLimitRetryAt(pendingColumns, excludedPeers, now = Date.now()) {
|
|
1671
1738
|
let retryAt = null;
|
|
1672
1739
|
for (const [peerId, rateLimitedUntil] of this.rateLimitedUntilByPeer.entries()) {
|
|
1673
1740
|
if (rateLimitedUntil <= now) {
|
|
@@ -1696,8 +1763,8 @@ export class UnknownBlockPeerBalancer {
|
|
|
1696
1763
|
* preferredPeers are the peers NetworkProcessor told us gossiped this root (from
|
|
1697
1764
|
* pendingBlock/cacheItem.peerIdStrings). They are preferred but not required.
|
|
1698
1765
|
*/
|
|
1699
|
-
bestPeerForPendingColumns(pendingColumns, excludedPeers, preferredPeers) {
|
|
1700
|
-
const eligiblePeers = this.filterPeers(pendingColumns, excludedPeers);
|
|
1766
|
+
bestPeerForPendingColumns(pendingColumns, excludedPeers, preferredPeers, now = Date.now()) {
|
|
1767
|
+
const eligiblePeers = this.filterPeers(pendingColumns, excludedPeers, now);
|
|
1701
1768
|
if (eligiblePeers.length === 0) {
|
|
1702
1769
|
return null;
|
|
1703
1770
|
}
|
|
@@ -1730,8 +1797,7 @@ export class UnknownBlockPeerBalancer {
|
|
|
1730
1797
|
}
|
|
1731
1798
|
return totalActiveRequests;
|
|
1732
1799
|
}
|
|
1733
|
-
filterPeers(pendingDataColumns, excludedPeers) {
|
|
1734
|
-
const now = Date.now();
|
|
1800
|
+
filterPeers(pendingDataColumns, excludedPeers, now) {
|
|
1735
1801
|
let maxColumnCount = 0;
|
|
1736
1802
|
const considerPeers = [];
|
|
1737
1803
|
for (const [peerId, syncMeta] of this.peersMeta.entries()) {
|