@lodestar/beacon-node 1.50.0-dev.f2d839a25c → 1.50.0-dev.fc618d94e9
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/validator/index.d.ts +1 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +17 -1
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +7 -3
- 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 +4 -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 +4 -0
- 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 +6 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +43 -16
- 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 +2 -2
- package/lib/chain/interface.d.ts.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 +1 -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/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/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.map +1 -1
- package/lib/db/beacon.js +2 -0
- package/lib/db/beacon.js.map +1 -1
- 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.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 +7 -4
- 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.map +1 -1
- package/lib/node/nodejs.js +25 -3
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/range/batch.d.ts +6 -0
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +10 -0
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +5 -1
- 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 +50 -18
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +9 -5
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +88 -46
- package/lib/sync/unknownBlock.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 +16 -16
- 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/validator/index.ts +16 -2
- package/src/chain/archiveStore/archiveStore.ts +10 -4
- 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 +6 -4
- package/src/chain/blocks/importBlock.ts +4 -0
- 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 +50 -19
- 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 +2 -2
- 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 +2 -2
- 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/seenPayloadEnvelopeInput.ts +31 -13
- 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 +2 -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.ts +21 -6
- package/src/network/metadata.ts +17 -17
- package/src/network/peers/datastore.ts +36 -36
- package/src/network/processor/gossipHandlers.ts +7 -4
- 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 +31 -3
- package/src/sync/range/batch.ts +11 -0
- package/src/sync/range/chain.ts +6 -1
- package/src/sync/range/range.ts +50 -18
- package/src/sync/unknownBlock.ts +99 -50
- package/src/util/execution.ts +17 -9
|
@@ -156,14 +156,18 @@ export declare class BlockInputSync {
|
|
|
156
156
|
* Also verifies the received block root + returns the peer that provided the block for future downscoring.
|
|
157
157
|
*/
|
|
158
158
|
private fetchBlockInput;
|
|
159
|
+
private removePendingPayloadAndDescendants;
|
|
159
160
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
* referenced more than one bad block.
|
|
161
|
+
* Same as `removeAndBanAllDescendants`, and downscores every peer that referenced or served a banned item, once per
|
|
162
|
+
* peer. Only call for consensus-layer invalidity, never for an INVALID execution payload:
|
|
163
|
+
* https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/p2p-interface.md#the-reqresp-domain
|
|
164
164
|
*/
|
|
165
165
|
private removeAndDownScoreAllDescendants;
|
|
166
|
-
|
|
166
|
+
/**
|
|
167
|
+
* Removes `block` and all its pending descendants and bans their roots in `knownBadBlocks`. Only call when the chain
|
|
168
|
+
* is provably bad: a banned root is never searched for again. Returns the banned items.
|
|
169
|
+
*/
|
|
170
|
+
private removeAndBanAllDescendants;
|
|
167
171
|
private removeAllDescendants;
|
|
168
172
|
private getMaxDownloadAttempts;
|
|
169
173
|
}
|
|
@@ -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";
|
|
@@ -378,6 +378,10 @@ export class BlockInputSync {
|
|
|
378
378
|
});
|
|
379
379
|
};
|
|
380
380
|
addByRootHex = (rootHex, peerIdStr) => {
|
|
381
|
+
if (this.knownBadBlocks.has(rootHex)) {
|
|
382
|
+
this.logger.debug("Ignoring known bad block root", { root: rootHex, peerIdStr: peerIdStr ?? "unknown peer" });
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
381
385
|
let pendingBlock = this.pendingBlocks.get(rootHex);
|
|
382
386
|
let added = false;
|
|
383
387
|
if (!pendingBlock) {
|
|
@@ -409,6 +413,10 @@ export class BlockInputSync {
|
|
|
409
413
|
return added;
|
|
410
414
|
};
|
|
411
415
|
addByBlockInput = (blockInput, peerIdStr) => {
|
|
416
|
+
if (this.knownBadBlocks.has(blockInput.blockRootHex)) {
|
|
417
|
+
this.logger.debug("Ignoring known bad block", { slot: blockInput.slot, root: blockInput.blockRootHex, peerIdStr });
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
412
420
|
let pendingBlock = this.pendingBlocks.get(blockInput.blockRootHex);
|
|
413
421
|
// if entry is missing or was added via rootHex and now we have more complete information overwrite
|
|
414
422
|
// the existing information with the more complete cache entry
|
|
@@ -441,6 +449,14 @@ export class BlockInputSync {
|
|
|
441
449
|
}
|
|
442
450
|
};
|
|
443
451
|
addByPayloadRootHex = (rootHex, peerIdStr, slot) => {
|
|
452
|
+
if (this.knownBadBlocks.has(rootHex)) {
|
|
453
|
+
this.logger.debug("Ignoring payload for known bad block root", {
|
|
454
|
+
slot: slot ?? "unknown",
|
|
455
|
+
root: rootHex,
|
|
456
|
+
peerIdStr,
|
|
457
|
+
});
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
444
460
|
let pendingPayload = this.pendingPayloads.get(rootHex);
|
|
445
461
|
let added = false;
|
|
446
462
|
if (!pendingPayload) {
|
|
@@ -499,6 +515,14 @@ export class BlockInputSync {
|
|
|
499
515
|
return this.chain.seenPayloadEnvelopeInputCache.get(rootHex)?.slot;
|
|
500
516
|
}
|
|
501
517
|
addByPayloadInput = (payloadInput, peerIdStr, envelope) => {
|
|
518
|
+
if (this.knownBadBlocks.has(payloadInput.blockRootHex)) {
|
|
519
|
+
this.logger.debug("Ignoring payload input for known bad block root", {
|
|
520
|
+
slot: payloadInput.slot,
|
|
521
|
+
root: payloadInput.blockRootHex,
|
|
522
|
+
peerIdStr,
|
|
523
|
+
});
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
502
526
|
const pendingPayload = this.toPendingPayloadInput(payloadInput, this.pendingPayloads.get(payloadInput.blockRootHex), envelope);
|
|
503
527
|
if (peerIdStr && pendingPayload.peerIdStrings.size < MAX_PEERS_PER_ROOT) {
|
|
504
528
|
pendingPayload.peerIdStrings.add(peerIdStr);
|
|
@@ -552,6 +576,7 @@ export class BlockInputSync {
|
|
|
552
576
|
if (this.chain.forkChoice.getBlockHexAndBlockHash(parentRootHex, parentBlockHashHex) !== null) {
|
|
553
577
|
return { kind: "ready" };
|
|
554
578
|
}
|
|
579
|
+
// The parent's payload is known but does not match `parentBlockHashHex`
|
|
555
580
|
if (this.chain.forkChoice.hasPayloadHexUnsafe(parentRootHex)) {
|
|
556
581
|
return { kind: "invalidParentPayload", parentRootHex, parentBlockHashHex };
|
|
557
582
|
}
|
|
@@ -882,7 +907,8 @@ export class BlockInputSync {
|
|
|
882
907
|
}
|
|
883
908
|
else if (blockSlot <= finalizedSlot) {
|
|
884
909
|
// 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,
|
|
910
|
+
// we should found it through forkchoice. If not, drop the chain without penalizing peers because pending entries are
|
|
911
|
+
// block retained on failed download, so finalization can pass the block while it is still pending
|
|
886
912
|
// 0 - 1 - ... - n - finalizedSlot
|
|
887
913
|
// \
|
|
888
914
|
// parent 1 - parent 2 - ... - unknownParent block
|
|
@@ -890,7 +916,7 @@ export class BlockInputSync {
|
|
|
890
916
|
...logCtx2,
|
|
891
917
|
finalizedSlot,
|
|
892
918
|
});
|
|
893
|
-
this.
|
|
919
|
+
this.removeAllDescendants(block, DroppedItemReason.belowFinalized);
|
|
894
920
|
}
|
|
895
921
|
else {
|
|
896
922
|
this.onUnknownBlockRoot({ rootHex: pending.blockInput.parentRootHex, source: BlockInputSource.byRoot });
|
|
@@ -1009,14 +1035,17 @@ export class BlockInputSync {
|
|
|
1009
1035
|
this.removeAllDescendants(pendingBlock, DroppedItemReason.elError, DroppedItemReason.elError);
|
|
1010
1036
|
break;
|
|
1011
1037
|
case BlockErrorCode.EXECUTION_ENGINE_INVALID:
|
|
1012
|
-
//
|
|
1038
|
+
// Ban but do not downscore: optimistic-sync peers may forward and serve blocks whose payload is later
|
|
1039
|
+
// rejected by the execution engine. Per the spec, an INVALID execution payload SHOULD NOT cause a peer
|
|
1040
|
+
// to be down-scored or disconnected, only consensus-layer invalidity MAY.
|
|
1041
|
+
// https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/p2p-interface.md#the-reqresp-domain
|
|
1013
1042
|
this.logger.debug("Execution engine rejected block from unknown parent sync", errorData, res.err);
|
|
1014
|
-
this.
|
|
1043
|
+
this.removeAndBanAllDescendants(pendingBlock, DroppedItemReason.elInvalid);
|
|
1015
1044
|
break;
|
|
1016
1045
|
default:
|
|
1017
1046
|
// Block is not correct with respect to our chain. Log error loudly
|
|
1018
1047
|
this.logger.debug("Error processing block from unknown parent sync", errorData, res.err);
|
|
1019
|
-
this.
|
|
1048
|
+
this.removeAllDescendants(pendingBlock, DroppedItemReason.invalidBlock);
|
|
1020
1049
|
}
|
|
1021
1050
|
}
|
|
1022
1051
|
// Probably a queue error or something unwanted happened, mark as pending to try again latter
|
|
@@ -1191,18 +1220,21 @@ export class BlockInputSync {
|
|
|
1191
1220
|
this.logger.debug("Execution engine error while processing payload from unknown sync", logCtx, res.err);
|
|
1192
1221
|
pendingPayload.status = PendingPayloadInputStatus.downloaded;
|
|
1193
1222
|
break;
|
|
1223
|
+
// The invalid envelope is evicted from the seen cache in the cases below, otherwise the next
|
|
1224
|
+
// attempt would reuse it instead of fetching another envelope from peers
|
|
1194
1225
|
case PayloadErrorCode.EXECUTION_ENGINE_INVALID:
|
|
1195
1226
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1227
|
+
this.chain.seenPayloadEnvelopeInputCache.removeInvalid(pendingPayload.payloadInput);
|
|
1196
1228
|
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.elInvalid);
|
|
1197
1229
|
break;
|
|
1198
1230
|
case PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR:
|
|
1199
1231
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1232
|
+
this.chain.seenPayloadEnvelopeInputCache.removeInvalid(pendingPayload.payloadInput);
|
|
1200
1233
|
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidEnvelope);
|
|
1201
1234
|
break;
|
|
1202
1235
|
case PayloadErrorCode.INVALID_SIGNATURE:
|
|
1203
|
-
// TODO GLOAS: Decide how invalid payload inputs should eventually leave memory without
|
|
1204
|
-
// reintroducing envelope replacement / recreation flows.
|
|
1205
1236
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1237
|
+
this.chain.seenPayloadEnvelopeInputCache.removeInvalid(pendingPayload.payloadInput);
|
|
1206
1238
|
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidSignature);
|
|
1207
1239
|
break;
|
|
1208
1240
|
default:
|
|
@@ -1254,10 +1286,10 @@ export class BlockInputSync {
|
|
|
1254
1286
|
throw Error(`Error fetching payload by root slot=${slot} root=${rootHex} after ${i}: ${reason}`);
|
|
1255
1287
|
}
|
|
1256
1288
|
const { peerId, client: peerClient } = peerMeta;
|
|
1257
|
-
cacheItem.peerIdStrings.add(peerId);
|
|
1258
1289
|
try {
|
|
1259
1290
|
if (!envelope) {
|
|
1260
1291
|
envelope = await this.fetchExecutionPayloadEnvelope(peerId, blockRoot, rootHex);
|
|
1292
|
+
cacheItem.peerIdStrings.add(peerId);
|
|
1261
1293
|
const slotWasUnknown = typeof slot !== "number";
|
|
1262
1294
|
slot = envelope.message.payload.slotNumber;
|
|
1263
1295
|
if (slotWasUnknown) {
|
|
@@ -1292,6 +1324,8 @@ export class BlockInputSync {
|
|
|
1292
1324
|
const missing = pendingPayload.payloadInput.getMissingSampledColumnMeta().missing;
|
|
1293
1325
|
if (missing.length > 0) {
|
|
1294
1326
|
const columnSidecars = await this.fetchPayloadColumns(peerMeta, pendingPayload.payloadInput, missing);
|
|
1327
|
+
// toPendingPayloadInput copied cacheItem's set, so add to the object that is carried forward
|
|
1328
|
+
pendingPayload.peerIdStrings.add(peerId);
|
|
1295
1329
|
const seenTimestampSec = Date.now() / 1000;
|
|
1296
1330
|
for (const columnSidecar of columnSidecars) {
|
|
1297
1331
|
if (pendingPayload.payloadInput.hasColumn(columnSidecar.index)) {
|
|
@@ -1433,7 +1467,6 @@ export class BlockInputSync {
|
|
|
1433
1467
|
throw Error(message);
|
|
1434
1468
|
}
|
|
1435
1469
|
const { peerId, client: peerClient } = peerMeta;
|
|
1436
|
-
cacheItem.peerIdStrings.add(peerId);
|
|
1437
1470
|
try {
|
|
1438
1471
|
const downloadResult = await downloadByRoot({
|
|
1439
1472
|
config: this.config,
|
|
@@ -1444,6 +1477,7 @@ export class BlockInputSync {
|
|
|
1444
1477
|
cacheItem,
|
|
1445
1478
|
});
|
|
1446
1479
|
cacheItem = downloadResult.result;
|
|
1480
|
+
cacheItem.peerIdStrings.add(peerId);
|
|
1447
1481
|
if (slot === undefined) {
|
|
1448
1482
|
slot = cacheItem.blockInput.slot;
|
|
1449
1483
|
// we were not able to observe the time into slot when starting the fetch, do it now
|
|
@@ -1545,41 +1579,8 @@ export class BlockInputSync {
|
|
|
1545
1579
|
this.metrics?.blockInputSync.fetchPeers.set({ result: FetchResult.FailureMaxAttempts }, i - 1);
|
|
1546
1580
|
throw Error(message);
|
|
1547
1581
|
}
|
|
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
1582
|
// Once a parent payload is invalid, every descendant waiting on that payload lineage becomes unrecoverable too.
|
|
1580
1583
|
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
1584
|
if (this.pendingPayloads.delete(rootHex)) {
|
|
1584
1585
|
this.metrics?.blockInputSync.removedPayloads.inc({ reason: headReason }, 1);
|
|
1585
1586
|
}
|
|
@@ -1600,9 +1601,50 @@ export class BlockInputSync {
|
|
|
1600
1601
|
});
|
|
1601
1602
|
}
|
|
1602
1603
|
}
|
|
1604
|
+
/**
|
|
1605
|
+
* Same as `removeAndBanAllDescendants`, and downscores every peer that referenced or served a banned item, once per
|
|
1606
|
+
* peer. Only call for consensus-layer invalidity, never for an INVALID execution payload:
|
|
1607
|
+
* https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/p2p-interface.md#the-reqresp-domain
|
|
1608
|
+
*/
|
|
1609
|
+
removeAndDownScoreAllDescendants(block, headReason) {
|
|
1610
|
+
const peersToReport = new Set();
|
|
1611
|
+
for (const bannedBlock of this.removeAndBanAllDescendants(block, headReason)) {
|
|
1612
|
+
for (const peerIdStr of bannedBlock.peerIdStrings) {
|
|
1613
|
+
peersToReport.add(peerIdStr);
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
for (const peerIdStr of peersToReport) {
|
|
1617
|
+
this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, headReason);
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
/**
|
|
1621
|
+
* Removes `block` and all its pending descendants and bans their roots in `knownBadBlocks`. Only call when the chain
|
|
1622
|
+
* is provably bad: a banned root is never searched for again. Returns the banned items.
|
|
1623
|
+
*/
|
|
1624
|
+
removeAndBanAllDescendants(block, headReason) {
|
|
1625
|
+
const bannedBlocks = [];
|
|
1626
|
+
for (const badBlock of this.removeAllDescendants(block, headReason, DroppedItemReason.invalidParent)) {
|
|
1627
|
+
const rootHex = getBlockInputSyncCacheItemRootHex(badBlock);
|
|
1628
|
+
// a gossip import may race a failing sync path, never ban a root fork choice has imported
|
|
1629
|
+
if (this.chain.forkChoice.hasBlockHex(rootHex)) {
|
|
1630
|
+
continue;
|
|
1631
|
+
}
|
|
1632
|
+
this.knownBadBlocks.add(rootHex);
|
|
1633
|
+
bannedBlocks.push(badBlock);
|
|
1634
|
+
this.logger.debug("Banning unknown block", {
|
|
1635
|
+
slot: getBlockInputSyncCacheItemSlot(badBlock),
|
|
1636
|
+
root: rootHex,
|
|
1637
|
+
reason: headReason,
|
|
1638
|
+
peerIdStrings: Array.from(badBlock.peerIdStrings)
|
|
1639
|
+
.map((id) => prettyPrintPeerIdStr(id))
|
|
1640
|
+
.join(","),
|
|
1641
|
+
});
|
|
1642
|
+
}
|
|
1643
|
+
pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
|
|
1644
|
+
return bannedBlocks;
|
|
1645
|
+
}
|
|
1603
1646
|
removeAllDescendants(block, headReason, descendantReason = DroppedItemReason.invalidParent) {
|
|
1604
1647
|
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1605
|
-
const slot = getBlockInputSyncCacheItemSlot(block);
|
|
1606
1648
|
// Get all blocks that are a descendant of this one (index 0 is the head item itself)
|
|
1607
1649
|
const badPendingBlocks = [block, ...getAllDescendantBlocks(rootHex, this.pendingBlocks)];
|
|
1608
1650
|
for (const [i, block] of badPendingBlocks.entries()) {
|
|
@@ -1618,8 +1660,8 @@ export class BlockInputSync {
|
|
|
1618
1660
|
// Keep PayloadEnvelopeInput resident in the seen cache for consistency with the
|
|
1619
1661
|
// importBlock()-owned lifecycle.
|
|
1620
1662
|
this.logger.debug("Removing bad/unknown/incomplete BlockInputSyncCacheItem", {
|
|
1621
|
-
slot,
|
|
1622
|
-
|
|
1663
|
+
slot: getBlockInputSyncCacheItemSlot(block),
|
|
1664
|
+
root: rootHex,
|
|
1623
1665
|
});
|
|
1624
1666
|
}
|
|
1625
1667
|
return badPendingBlocks;
|