@lodestar/beacon-node 1.47.0-dev.931ecbec99 → 1.47.0-dev.9572bcc698
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 +3 -2
- 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/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/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/blocks/importExecutionPayload.d.ts +3 -2
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +10 -8
- 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 +14 -6
- 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/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/chain.d.ts +2 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +10 -2
- 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/interface.d.ts +2 -1
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.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/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +2 -0
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +2 -0
- package/lib/chain/regen/interface.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/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/metrics/metrics/lodestar.d.ts +17 -4
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +20 -2
- 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 +22 -43
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +5 -1
- package/lib/network/processor/gossipHandlers.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.map +1 -1
- package/lib/node/nodejs.js +2 -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 +23 -10
- package/lib/sync/range/chain.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.map +1 -1
- package/lib/sync/unknownBlock.js +95 -51
- 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 +34 -34
- package/src/api/impl/beacon/blocks/index.ts +3 -2
- package/src/api/impl/beacon/pool/index.ts +22 -2
- package/src/api/impl/events/index.ts +3 -1
- package/src/api/rest/base.ts +7 -0
- package/src/chain/blocks/importExecutionPayload.ts +12 -10
- package/src/chain/blocks/index.ts +18 -6
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +8 -2
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -4
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +25 -16
- package/src/chain/chain.ts +10 -1
- package/src/chain/errors/blockError.ts +8 -2
- package/src/chain/interface.ts +2 -0
- package/src/chain/opPools/deferredVoluntaryExitPool.ts +65 -0
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/regen/interface.ts +2 -0
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +143 -14
- package/src/chain/validation/voluntaryExit.ts +59 -2
- package/src/metrics/metrics/lodestar.ts +27 -6
- package/src/network/gossip/topic.ts +38 -0
- package/src/network/network.ts +27 -55
- package/src/network/processor/gossipHandlers.ts +5 -1
- package/src/network/util.ts +0 -5
- package/src/node/deferredVoluntaryExitPublisher.ts +54 -0
- package/src/node/nodejs.ts +3 -0
- package/src/sync/range/batch.ts +83 -28
- package/src/sync/range/chain.ts +26 -11
- package/src/sync/types.ts +33 -0
- package/src/sync/unknownBlock.ts +105 -55
- package/src/sync/utils/downloadByRange.ts +21 -12
- package/src/sync/utils/downloadByRoot.ts +3 -1
package/lib/sync/types.d.ts
CHANGED
|
@@ -31,6 +31,38 @@ export declare enum PendingBlockInputStatus {
|
|
|
31
31
|
downloaded = "downloaded",
|
|
32
32
|
processing = "processing"
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Why a pending item was dropped from BlockInputSync WITHOUT completing.
|
|
36
|
+
* The happy path — a successfully imported/processed block or payload — is removed by the import
|
|
37
|
+
* flow (onPayloadImported, processReadyBlock/processPayload success) and is deliberately NOT tracked
|
|
38
|
+
* here
|
|
39
|
+
*/
|
|
40
|
+
export declare enum DroppedItemReason {
|
|
41
|
+
/** prune: item's own slot is below the finalized slot (routine cleanup), or a downloaded block landed at/below finality */
|
|
42
|
+
belowFinalized = "below_finalized",
|
|
43
|
+
/** prune: slot-less, unresolvable payload evicted after PRUNE_UNRESOLVED_SLOT_EPOCHS */
|
|
44
|
+
agedOut = "aged_out",
|
|
45
|
+
/** pruneSetToMax evicted the oldest entry because the cache hit its capacity (DoS guard) */
|
|
46
|
+
capacity = "capacity",
|
|
47
|
+
/** descendant removed because an ancestor was invalid/removed */
|
|
48
|
+
invalidParent = "invalid_parent",
|
|
49
|
+
/** transient execution-engine error removal (EXECUTION_ENGINE_ERROR) */
|
|
50
|
+
elError = "el_error",
|
|
51
|
+
/** the execution engine declared the item invalid (EXECUTION_ENGINE_INVALID) */
|
|
52
|
+
elInvalid = "el_invalid",
|
|
53
|
+
/** a block failed our own checks (not correct w.r.t. our chain) */
|
|
54
|
+
invalidBlock = "invalid_block",
|
|
55
|
+
/** a block declares a parent payload hash that conflicts with the parent's actual payload (gloas) */
|
|
56
|
+
invalidParentPayload = "invalid_parent_payload",
|
|
57
|
+
/** a payload envelope failed gossip verification (ENVELOPE_VERIFICATION_ERROR) */
|
|
58
|
+
invalidEnvelope = "invalid_envelope",
|
|
59
|
+
/** a payload had an invalid signature (INVALID_SIGNATURE) */
|
|
60
|
+
invalidSignature = "invalid_signature",
|
|
61
|
+
/** a block root was given up on after exhausting download attempts (data could not be fetched) */
|
|
62
|
+
unavailable = "unavailable",
|
|
63
|
+
/** an unexpected / unhandled error code led to removal */
|
|
64
|
+
unknown = "unknown"
|
|
65
|
+
}
|
|
34
66
|
export declare enum PendingPayloadInputStatus {
|
|
35
67
|
pending = "pending",
|
|
36
68
|
fetching = "fetching",
|
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":"AAAA,OAAO,EAAC,OAAO,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,8BAA8B,EAAC,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAC,WAAW,EAAC,MAAM,qCAAqC,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,8DAA8D,CAAC;AAElG,oBAAY,gBAAgB;IAC1B;;OAEG;IACH,kBAAkB,qBAAqB;IACvC;;OAEG;IACH,cAAc,mBAAmB;IACjC;;;OAGG;IACH,sBAAsB,yBAAyB;IAE/C;;OAEG;IACH,0BAA0B,+BAA+B;IACzD;;OAEG;IACH,2BAA2B,gCAAgC;CAC5D;AAED,oBAAY,uBAAuB;IACjC,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,UAAU,eAAe;CAC1B;AAED,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,eAAe,sBAAsB;IACrC,UAAU,eAAe;IACzB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,EAAE,WAAW,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,uBAAuB,CAAC,OAAO,GAAG,uBAAuB,CAAC,QAAQ,CAAC;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAEzE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EACF,yBAAyB,CAAC,OAAO,GACjC,yBAAyB,CAAC,QAAQ,GAClC,yBAAyB,CAAC,UAAU,GACpC,yBAAyB,CAAC,UAAU,CAAC;IACzC,YAAY,EAAE,oBAAoB,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,yBAAyB,CAAC,OAAO,GAAG,yBAAyB,CAAC,QAAQ,CAAC;IAC/E,OAAO,EAAE,OAAO,CAAC;IAIjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,yBAAyB,CAAC,eAAe,CAAC;IAClD,QAAQ,EAAE,8BAA8B,CAAC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,sBAAsB,CAAC;AAExG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,IAAI,iBAAiB,CAElG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,IAAI,mBAAmB,CAEnG;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,IAAI,sBAAsB,CAEzG;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAEzF;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI,GAAG,MAAM,CAE5F;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAUrF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,MAAM,CAUxF"}
|
|
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":"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"}
|
|
@@ -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;AAC3D,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAK5C,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;
|
|
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
|
@@ -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";
|
|
@@ -16,13 +16,17 @@ import { shuffle } from "../util/shuffle.js";
|
|
|
16
16
|
import { sortBy } from "../util/sortBy.js";
|
|
17
17
|
import { wrapError } from "../util/wrapError.js";
|
|
18
18
|
import { MAX_CONCURRENT_REQUESTS } from "./constants.js";
|
|
19
|
-
import { PendingBlockInputStatus, PendingBlockType, PendingPayloadInputStatus, getBlockInputSyncCacheItemRootHex, getBlockInputSyncCacheItemSlot, getPayloadSyncCacheItemRootHex, getPayloadSyncCacheItemSlot, isPendingBlockInput, isPendingPayloadEnvelope, isPendingPayloadInput, } from "./types.js";
|
|
19
|
+
import { DroppedItemReason, PendingBlockInputStatus, PendingBlockType, PendingPayloadInputStatus, getBlockInputSyncCacheItemRootHex, getBlockInputSyncCacheItemSlot, getPayloadSyncCacheItemRootHex, getPayloadSyncCacheItemSlot, isPendingBlockInput, isPendingPayloadEnvelope, isPendingPayloadInput, } from "./types.js";
|
|
20
20
|
import { DownloadByRootError, downloadByRoot } from "./utils/downloadByRoot.js";
|
|
21
21
|
import { getAllDescendantBlocks, getUnknownAndAncestorBlocks } from "./utils/pendingBlocksTree.js";
|
|
22
22
|
import { getRateLimitedUntilMs } from "./utils/rateLimit.js";
|
|
23
23
|
const MAX_ATTEMPTS_PER_BLOCK = 5;
|
|
24
24
|
const MAX_KNOWN_BAD_BLOCKS = 500;
|
|
25
25
|
const MAX_PENDING_BLOCKS = 100;
|
|
26
|
+
/**
|
|
27
|
+
* A pending payload without slot can only stay at most 2 epochs.
|
|
28
|
+
*/
|
|
29
|
+
const PRUNE_UNRESOLVED_SLOT_EPOCHS = 2;
|
|
26
30
|
var FetchResult;
|
|
27
31
|
(function (FetchResult) {
|
|
28
32
|
FetchResult["SuccessResolved"] = "success_resolved";
|
|
@@ -210,7 +214,7 @@ export class BlockInputSync {
|
|
|
210
214
|
parentRoot: missingDependency.parentRootHex,
|
|
211
215
|
parentBlockHash: missingDependency.parentBlockHashHex,
|
|
212
216
|
});
|
|
213
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
217
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.invalidParentPayload);
|
|
214
218
|
}
|
|
215
219
|
return;
|
|
216
220
|
}
|
|
@@ -246,25 +250,35 @@ export class BlockInputSync {
|
|
|
246
250
|
// Use the actual finalized block slot, not computeStartSlotAtEpoch(checkpoint.epoch)
|
|
247
251
|
// because the payload at the finalized block is not finalized
|
|
248
252
|
const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
|
|
249
|
-
|
|
253
|
+
const nowSec = Date.now() / 1000;
|
|
254
|
+
const maxSecInCache = (PRUNE_UNRESOLVED_SLOT_EPOCHS * SLOTS_PER_EPOCH * this.config.SLOT_DURATION_MS) / 1000;
|
|
255
|
+
let belowFinalizedPayloads = 0;
|
|
256
|
+
let agedOutPayloads = 0;
|
|
250
257
|
let unresolvedSlotPayloads = 0;
|
|
251
258
|
for (const [rootHex, payload] of this.pendingPayloads) {
|
|
252
259
|
// Last-effort resolve for a slot-less PendingPayloadRootHex, and store it back for later passes.
|
|
253
260
|
if (!isPendingPayloadInput(payload) && !isPendingPayloadEnvelope(payload) && payload.slot === undefined) {
|
|
254
261
|
payload.slot = this.resolvePayloadSlot(rootHex);
|
|
262
|
+
if (payload.slot === undefined) {
|
|
263
|
+
// Still unresolvable: age it out so the MAX_PENDING_BLOCKS cap cannot stay saturated.
|
|
264
|
+
if (nowSec - payload.timeAddedSec > maxSecInCache) {
|
|
265
|
+
this.pendingPayloads.delete(rootHex);
|
|
266
|
+
agedOutPayloads++;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
unresolvedSlotPayloads++;
|
|
270
|
+
this.logger.debug("BlockInputSync.pruneFinalized: pending payload with unresolved slot", {
|
|
271
|
+
root: rootHex,
|
|
272
|
+
finalizedSlot,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
255
277
|
}
|
|
256
278
|
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) {
|
|
279
|
+
if (typeof slot === "number" && slot < finalizedSlot) {
|
|
266
280
|
this.pendingPayloads.delete(rootHex);
|
|
267
|
-
|
|
281
|
+
belowFinalizedPayloads++;
|
|
268
282
|
}
|
|
269
283
|
}
|
|
270
284
|
let deletedBlocks = 0;
|
|
@@ -275,13 +289,20 @@ export class BlockInputSync {
|
|
|
275
289
|
deletedBlocks++;
|
|
276
290
|
}
|
|
277
291
|
}
|
|
278
|
-
if (
|
|
279
|
-
this.metrics?.blockInputSync.
|
|
292
|
+
if (belowFinalizedPayloads > 0) {
|
|
293
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.belowFinalized }, belowFinalizedPayloads);
|
|
294
|
+
}
|
|
295
|
+
if (agedOutPayloads > 0) {
|
|
296
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.agedOut }, agedOutPayloads);
|
|
297
|
+
}
|
|
298
|
+
if (deletedBlocks > 0) {
|
|
299
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.belowFinalized }, deletedBlocks);
|
|
280
300
|
}
|
|
281
301
|
this.logger.debug("BlockInputSync.pruneFinalized dropped pre-finalized pending items", {
|
|
282
302
|
finalizedSlot,
|
|
283
303
|
finalizedRoot: checkpoint.rootHex,
|
|
284
|
-
|
|
304
|
+
belowFinalizedPayloads,
|
|
305
|
+
agedOutPayloads,
|
|
285
306
|
deletedBlocks,
|
|
286
307
|
unresolvedSlotPayloads,
|
|
287
308
|
});
|
|
@@ -310,6 +331,7 @@ export class BlockInputSync {
|
|
|
310
331
|
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
311
332
|
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
312
333
|
if (prunedItemCount > 0) {
|
|
334
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
313
335
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
314
336
|
}
|
|
315
337
|
return added;
|
|
@@ -340,6 +362,7 @@ export class BlockInputSync {
|
|
|
340
362
|
// Limit pending blocks to prevent DOS attacks that cause OOM
|
|
341
363
|
const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
|
|
342
364
|
if (prunedItemCount > 0) {
|
|
365
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
343
366
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
|
|
344
367
|
}
|
|
345
368
|
};
|
|
@@ -363,11 +386,20 @@ export class BlockInputSync {
|
|
|
363
386
|
peerIdStr: peerIdStr ?? "unknown peer",
|
|
364
387
|
});
|
|
365
388
|
}
|
|
389
|
+
else if (
|
|
390
|
+
// update a previously slot-less entry once a slot becomes available
|
|
391
|
+
slot !== undefined &&
|
|
392
|
+
!isPendingPayloadInput(pendingPayload) &&
|
|
393
|
+
!isPendingPayloadEnvelope(pendingPayload) &&
|
|
394
|
+
pendingPayload.slot === undefined) {
|
|
395
|
+
pendingPayload.slot = slot;
|
|
396
|
+
}
|
|
366
397
|
if (peerIdStr) {
|
|
367
398
|
pendingPayload.peerIdStrings.add(peerIdStr);
|
|
368
399
|
}
|
|
369
400
|
const prunedItemCount = pruneSetToMax(this.pendingPayloads, this.maxPendingBlocks);
|
|
370
401
|
if (prunedItemCount > 0) {
|
|
402
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
371
403
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingPayloads`);
|
|
372
404
|
}
|
|
373
405
|
return added;
|
|
@@ -405,6 +437,7 @@ export class BlockInputSync {
|
|
|
405
437
|
});
|
|
406
438
|
const prunedItemCount = pruneSetToMax(this.pendingPayloads, this.maxPendingBlocks);
|
|
407
439
|
if (prunedItemCount > 0) {
|
|
440
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.capacity }, prunedItemCount);
|
|
408
441
|
this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingPayloads`);
|
|
409
442
|
}
|
|
410
443
|
};
|
|
@@ -448,13 +481,7 @@ export class BlockInputSync {
|
|
|
448
481
|
if (this.chain.forkChoice.hasPayloadHexUnsafe(parentRootHex)) {
|
|
449
482
|
return { kind: "invalidParentPayload", parentRootHex, parentBlockHashHex };
|
|
450
483
|
}
|
|
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
|
-
}
|
|
484
|
+
// Parent is in fork choice but its payload `parentBlockHashHex` isn't revealed yet
|
|
458
485
|
return { kind: "parentPayload", rootHex: parentRootHex, slot: parentBlock.slot };
|
|
459
486
|
}
|
|
460
487
|
advancePendingBlock(pendingBlock) {
|
|
@@ -486,7 +513,7 @@ export class BlockInputSync {
|
|
|
486
513
|
parentRoot: missingDependency.parentRootHex,
|
|
487
514
|
parentBlockHash: missingDependency.parentBlockHashHex,
|
|
488
515
|
});
|
|
489
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
516
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.invalidParentPayload);
|
|
490
517
|
return "removed";
|
|
491
518
|
}
|
|
492
519
|
}
|
|
@@ -675,7 +702,7 @@ export class BlockInputSync {
|
|
|
675
702
|
...logCtx2,
|
|
676
703
|
finalizedSlot,
|
|
677
704
|
});
|
|
678
|
-
this.removeAndDownScoreAllDescendants(block);
|
|
705
|
+
this.removeAndDownScoreAllDescendants(block, DroppedItemReason.belowFinalized);
|
|
679
706
|
}
|
|
680
707
|
else {
|
|
681
708
|
this.onUnknownBlockRoot({ rootHex: pending.blockInput.parentRootHex, source: BlockInputSource.byRoot });
|
|
@@ -693,7 +720,7 @@ export class BlockInputSync {
|
|
|
693
720
|
}
|
|
694
721
|
this.metrics?.blockInputSync.downloadedBlocksError.inc();
|
|
695
722
|
this.logger.debug("Ignoring unknown block root after many failed downloads", logCtx, res.err);
|
|
696
|
-
this.removeAndDownScoreAllDescendants(block);
|
|
723
|
+
this.removeAndDownScoreAllDescendants(block, DroppedItemReason.unavailable);
|
|
697
724
|
}
|
|
698
725
|
}
|
|
699
726
|
/**
|
|
@@ -750,9 +777,9 @@ export class BlockInputSync {
|
|
|
750
777
|
// no need to update status to "processed", delete anyway
|
|
751
778
|
this.pendingBlocks.delete(blockRootHex);
|
|
752
779
|
if (isForkPostGloas(fork)) {
|
|
753
|
-
const payloadInput = this.chain.seenPayloadEnvelopeInputCache.
|
|
780
|
+
const payloadInput = await this.chain.seenPayloadEnvelopeInputCache.getOrReload(blockRootHex);
|
|
754
781
|
if (!payloadInput) {
|
|
755
|
-
this.logger.
|
|
782
|
+
this.logger.debug("PayloadEnvelopeInput unavailable during unknown sync processReadyBlock()", logCtx);
|
|
756
783
|
}
|
|
757
784
|
else {
|
|
758
785
|
// Similar to the gossip path: immediately attempt fetch of data columns from the execution engine.
|
|
@@ -788,17 +815,17 @@ export class BlockInputSync {
|
|
|
788
815
|
case BlockErrorCode.EXECUTION_ENGINE_ERROR:
|
|
789
816
|
// Removing the block(s) without penalizing the peers, hoping for EL to
|
|
790
817
|
// recover on a latter download + verify attempt.
|
|
791
|
-
this.removeAllDescendants(pendingBlock);
|
|
818
|
+
this.removeAllDescendants(pendingBlock, DroppedItemReason.elError, DroppedItemReason.elError);
|
|
792
819
|
break;
|
|
793
820
|
case BlockErrorCode.EXECUTION_ENGINE_INVALID:
|
|
794
821
|
// the peer served a bad block
|
|
795
822
|
this.logger.debug("Execution engine rejected block from unknown parent sync", errorData, res.err);
|
|
796
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
823
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.elInvalid);
|
|
797
824
|
break;
|
|
798
825
|
default:
|
|
799
826
|
// Block is not correct with respect to our chain. Log error loudly
|
|
800
827
|
this.logger.debug("Error processing block from unknown parent sync", errorData, res.err);
|
|
801
|
-
this.removeAndDownScoreAllDescendants(pendingBlock);
|
|
828
|
+
this.removeAndDownScoreAllDescendants(pendingBlock, DroppedItemReason.invalidBlock);
|
|
802
829
|
}
|
|
803
830
|
}
|
|
804
831
|
// Probably a queue error or something unwanted happened, mark as pending to try again latter
|
|
@@ -819,7 +846,6 @@ export class BlockInputSync {
|
|
|
819
846
|
this.pendingPayloads.delete(rootHex);
|
|
820
847
|
return;
|
|
821
848
|
}
|
|
822
|
-
const payloadInput = this.chain.seenPayloadEnvelopeInputCache.get(rootHex);
|
|
823
849
|
if (!this.chain.forkChoice.hasBlockHex(rootHex)) {
|
|
824
850
|
// Block not in fork choice yet. payloadInput may be seeded from the block body during download, so a
|
|
825
851
|
// non-null payloadInput does not imply the block is imported; defer regardless and pull the block first.
|
|
@@ -833,8 +859,9 @@ export class BlockInputSync {
|
|
|
833
859
|
}
|
|
834
860
|
return;
|
|
835
861
|
}
|
|
862
|
+
const payloadInput = await this.chain.seenPayloadEnvelopeInputCache.getOrReload(rootHex);
|
|
836
863
|
if (!payloadInput) {
|
|
837
|
-
this.logger.debug("
|
|
864
|
+
this.logger.debug("PayloadEnvelopeInput not yet reloadable for imported block, will retry", {
|
|
838
865
|
root: rootHex,
|
|
839
866
|
});
|
|
840
867
|
return;
|
|
@@ -966,16 +993,24 @@ export class BlockInputSync {
|
|
|
966
993
|
pendingPayload.status = PendingPayloadInputStatus.downloaded;
|
|
967
994
|
break;
|
|
968
995
|
case PayloadErrorCode.EXECUTION_ENGINE_INVALID:
|
|
996
|
+
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
997
|
+
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.elInvalid);
|
|
998
|
+
break;
|
|
969
999
|
case PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR:
|
|
1000
|
+
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
1001
|
+
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidEnvelope);
|
|
1002
|
+
break;
|
|
970
1003
|
case PayloadErrorCode.INVALID_SIGNATURE:
|
|
971
1004
|
// TODO GLOAS: Decide how invalid payload inputs should eventually leave memory without
|
|
972
1005
|
// reintroducing envelope replacement / recreation flows.
|
|
973
1006
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
974
|
-
this.removePendingPayloadAndDescendants(rootHex);
|
|
1007
|
+
this.removePendingPayloadAndDescendants(rootHex, DroppedItemReason.invalidSignature);
|
|
975
1008
|
break;
|
|
976
1009
|
default:
|
|
977
1010
|
this.logger.debug("Error processing payload from unknown sync", logCtx, res.err);
|
|
978
|
-
this.pendingPayloads.delete(rootHex)
|
|
1011
|
+
if (this.pendingPayloads.delete(rootHex)) {
|
|
1012
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.unknown }, 1);
|
|
1013
|
+
}
|
|
979
1014
|
}
|
|
980
1015
|
return;
|
|
981
1016
|
}
|
|
@@ -994,7 +1029,7 @@ export class BlockInputSync {
|
|
|
994
1029
|
let slot = getPayloadSyncCacheItemSlot(cacheItem);
|
|
995
1030
|
let payloadInput = isPendingPayloadInput(cacheItem)
|
|
996
1031
|
? cacheItem.payloadInput
|
|
997
|
-
: this.chain.seenPayloadEnvelopeInputCache.
|
|
1032
|
+
: await this.chain.seenPayloadEnvelopeInputCache.getOrReload(rootHex);
|
|
998
1033
|
let envelope = payloadInput?.hasPayloadEnvelope() ? payloadInput.getPayloadEnvelope() : undefined;
|
|
999
1034
|
let i = 0;
|
|
1000
1035
|
let deferredByRateLimit = false;
|
|
@@ -1019,7 +1054,7 @@ export class BlockInputSync {
|
|
|
1019
1054
|
envelope = await this.fetchExecutionPayloadEnvelope(peerId, blockRoot, rootHex);
|
|
1020
1055
|
slot = envelope.message.payload.slotNumber;
|
|
1021
1056
|
}
|
|
1022
|
-
payloadInput ??= this.chain.seenPayloadEnvelopeInputCache.
|
|
1057
|
+
payloadInput ??= await this.chain.seenPayloadEnvelopeInputCache.getOrReload(rootHex);
|
|
1023
1058
|
if (!this.chain.forkChoice.hasBlockHex(rootHex)) {
|
|
1024
1059
|
// Block not in fork choice yet. Validating now would throw BLOCK_ROOT_UNKNOWN, so keep the downloaded
|
|
1025
1060
|
// envelope and wait for the block body; reconcilePayloadEnvelope validates once the block lands.
|
|
@@ -1290,9 +1325,9 @@ export class BlockInputSync {
|
|
|
1290
1325
|
* Downscore all peers that have referenced any of this bad blocks. May report peers multiple times if they have
|
|
1291
1326
|
* referenced more than one bad block.
|
|
1292
1327
|
*/
|
|
1293
|
-
removeAndDownScoreAllDescendants(block) {
|
|
1328
|
+
removeAndDownScoreAllDescendants(block, headReason) {
|
|
1294
1329
|
// Get all blocks that are a descendant of this one
|
|
1295
|
-
const badPendingBlocks = this.removeAllDescendants(block);
|
|
1330
|
+
const badPendingBlocks = this.removeAllDescendants(block, headReason, DroppedItemReason.invalidParent);
|
|
1296
1331
|
// just console log and do not penalize on pending/bad blocks for debugging
|
|
1297
1332
|
// console.log("removeAndDownscoreAllDescendants", {block});
|
|
1298
1333
|
for (const block of badPendingBlocks) {
|
|
@@ -1316,16 +1351,21 @@ export class BlockInputSync {
|
|
|
1316
1351
|
pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
|
|
1317
1352
|
}
|
|
1318
1353
|
// Once a parent payload is invalid, every descendant waiting on that payload lineage becomes unrecoverable too.
|
|
1319
|
-
removePendingPayloadAndDescendants(rootHex) {
|
|
1354
|
+
removePendingPayloadAndDescendants(rootHex, headReason) {
|
|
1320
1355
|
// Keep PayloadEnvelopeInput resident in the seen cache. importBlock() owns that object and
|
|
1321
1356
|
// later validation/finalization logic decides when it can leave memory.
|
|
1322
|
-
this.pendingPayloads.delete(rootHex)
|
|
1357
|
+
if (this.pendingPayloads.delete(rootHex)) {
|
|
1358
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: headReason }, 1);
|
|
1359
|
+
}
|
|
1323
1360
|
const badPendingBlocks = getAllDescendantBlocks(rootHex, this.pendingBlocks);
|
|
1324
|
-
this.metrics?.blockInputSync.removedBlocks.inc(badPendingBlocks.length);
|
|
1325
1361
|
for (const block of badPendingBlocks) {
|
|
1326
1362
|
const descendantRootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1327
|
-
this.pendingBlocks.delete(descendantRootHex)
|
|
1328
|
-
|
|
1363
|
+
if (this.pendingBlocks.delete(descendantRootHex)) {
|
|
1364
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason: DroppedItemReason.invalidParent }, 1);
|
|
1365
|
+
}
|
|
1366
|
+
if (this.pendingPayloads.delete(descendantRootHex)) {
|
|
1367
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason: DroppedItemReason.invalidParent }, 1);
|
|
1368
|
+
}
|
|
1329
1369
|
this.chain.seenBlockInputCache.prune(descendantRootHex);
|
|
1330
1370
|
this.logger.debug("Removing pending descendant after invalid parent payload", {
|
|
1331
1371
|
slot: getBlockInputSyncCacheItemSlot(block),
|
|
@@ -1334,16 +1374,20 @@ export class BlockInputSync {
|
|
|
1334
1374
|
});
|
|
1335
1375
|
}
|
|
1336
1376
|
}
|
|
1337
|
-
removeAllDescendants(block) {
|
|
1377
|
+
removeAllDescendants(block, headReason, descendantReason = DroppedItemReason.invalidParent) {
|
|
1338
1378
|
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1339
1379
|
const slot = getBlockInputSyncCacheItemSlot(block);
|
|
1340
|
-
// Get all blocks that are a descendant of this one
|
|
1380
|
+
// Get all blocks that are a descendant of this one (index 0 is the head item itself)
|
|
1341
1381
|
const badPendingBlocks = [block, ...getAllDescendantBlocks(rootHex, this.pendingBlocks)];
|
|
1342
|
-
|
|
1343
|
-
for (const block of badPendingBlocks) {
|
|
1382
|
+
for (const [i, block] of badPendingBlocks.entries()) {
|
|
1344
1383
|
const rootHex = getBlockInputSyncCacheItemRootHex(block);
|
|
1345
|
-
|
|
1346
|
-
this.
|
|
1384
|
+
const reason = i === 0 ? headReason : descendantReason;
|
|
1385
|
+
if (this.pendingBlocks.delete(rootHex)) {
|
|
1386
|
+
this.metrics?.blockInputSync.removedBlocks.inc({ reason }, 1);
|
|
1387
|
+
}
|
|
1388
|
+
if (this.pendingPayloads.delete(rootHex)) {
|
|
1389
|
+
this.metrics?.blockInputSync.removedPayloads.inc({ reason }, 1);
|
|
1390
|
+
}
|
|
1347
1391
|
this.chain.seenBlockInputCache.prune(rootHex);
|
|
1348
1392
|
// Keep PayloadEnvelopeInput resident in the seen cache for consistency with the
|
|
1349
1393
|
// importBlock()-owned lifecycle.
|