@lodestar/beacon-node 1.48.0-dev.b24dce51bf → 1.48.0-dev.b4a608e68f

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.
Files changed (96) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +0 -7
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/utils.js +14 -0
  6. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  7. package/lib/api/impl/config/index.d.ts.map +1 -1
  8. package/lib/api/impl/config/index.js +4 -1
  9. package/lib/api/impl/config/index.js.map +1 -1
  10. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  11. package/lib/chain/archiveStore/archiveStore.js +4 -1
  12. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  13. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +9 -1
  14. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  15. package/lib/chain/archiveStore/utils/archiveBlocks.js +37 -4
  16. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  17. package/lib/chain/blocks/importBlock.d.ts +5 -1
  18. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  19. package/lib/chain/blocks/importBlock.js +12 -5
  20. package/lib/chain/blocks/importBlock.js.map +1 -1
  21. package/lib/chain/blocks/index.d.ts +8 -4
  22. package/lib/chain/blocks/index.d.ts.map +1 -1
  23. package/lib/chain/blocks/index.js +80 -15
  24. package/lib/chain/blocks/index.js.map +1 -1
  25. package/lib/chain/blocks/types.d.ts +8 -0
  26. package/lib/chain/blocks/types.d.ts.map +1 -1
  27. package/lib/chain/blocks/types.js.map +1 -1
  28. package/lib/chain/blocks/utils/chainSegment.d.ts +1 -1
  29. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  30. package/lib/chain/blocks/utils/chainSegment.js +26 -11
  31. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  32. package/lib/chain/chain.d.ts +2 -2
  33. package/lib/chain/chain.d.ts.map +1 -1
  34. package/lib/chain/chain.js +2 -2
  35. package/lib/chain/chain.js.map +1 -1
  36. package/lib/chain/errors/executionPayloadBid.d.ts +4 -0
  37. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  38. package/lib/chain/errors/executionPayloadBid.js +1 -0
  39. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  40. package/lib/chain/errors/gossipValidation.d.ts +2 -1
  41. package/lib/chain/errors/gossipValidation.d.ts.map +1 -1
  42. package/lib/chain/errors/gossipValidation.js +1 -0
  43. package/lib/chain/errors/gossipValidation.js.map +1 -1
  44. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  45. package/lib/chain/forkChoice/index.js +2 -0
  46. package/lib/chain/forkChoice/index.js.map +1 -1
  47. package/lib/chain/interface.d.ts +2 -2
  48. package/lib/chain/interface.d.ts.map +1 -1
  49. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  50. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  51. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  52. package/lib/chain/validation/executionPayloadBid.js +16 -0
  53. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  54. package/lib/chain/validatorMonitor.d.ts +7 -1
  55. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  56. package/lib/chain/validatorMonitor.js +22 -5
  57. package/lib/chain/validatorMonitor.js.map +1 -1
  58. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  59. package/lib/execution/builder/validateBid.js +3 -0
  60. package/lib/execution/builder/validateBid.js.map +1 -1
  61. package/lib/metrics/metrics/lodestar.d.ts +4 -3
  62. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  63. package/lib/metrics/metrics/lodestar.js +5 -5
  64. package/lib/metrics/metrics/lodestar.js.map +1 -1
  65. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  66. package/lib/network/processor/gossipHandlers.js +378 -278
  67. package/lib/network/processor/gossipHandlers.js.map +1 -1
  68. package/lib/network/processor/index.d.ts.map +1 -1
  69. package/lib/network/processor/index.js +22 -16
  70. package/lib/network/processor/index.js.map +1 -1
  71. package/lib/sync/range/range.d.ts.map +1 -1
  72. package/lib/sync/range/range.js +24 -1
  73. package/lib/sync/range/range.js.map +1 -1
  74. package/package.json +14 -14
  75. package/src/api/impl/beacon/blocks/index.ts +0 -10
  76. package/src/api/impl/beacon/state/utils.ts +15 -0
  77. package/src/api/impl/config/index.ts +4 -1
  78. package/src/chain/archiveStore/archiveStore.ts +6 -0
  79. package/src/chain/archiveStore/utils/archiveBlocks.ts +39 -3
  80. package/src/chain/blocks/importBlock.ts +25 -7
  81. package/src/chain/blocks/index.ts +107 -21
  82. package/src/chain/blocks/types.ts +9 -0
  83. package/src/chain/blocks/utils/chainSegment.ts +26 -12
  84. package/src/chain/chain.ts +4 -4
  85. package/src/chain/errors/executionPayloadBid.ts +2 -0
  86. package/src/chain/errors/gossipValidation.ts +1 -0
  87. package/src/chain/forkChoice/index.ts +2 -0
  88. package/src/chain/interface.ts +2 -2
  89. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  90. package/src/chain/validation/executionPayloadBid.ts +18 -0
  91. package/src/chain/validatorMonitor.ts +24 -7
  92. package/src/execution/builder/validateBid.ts +4 -0
  93. package/src/metrics/metrics/lodestar.ts +6 -5
  94. package/src/network/processor/gossipHandlers.ts +487 -348
  95. package/src/network/processor/index.ts +24 -17
  96. package/src/sync/range/range.ts +23 -1
@@ -11,7 +11,6 @@ import {IBeaconChain} from "../../chain/interface.js";
11
11
  import {IBeaconDb} from "../../db/interface.js";
12
12
  import {Metrics} from "../../metrics/metrics.js";
13
13
  import {ClockEvent} from "../../util/clock.js";
14
- import {callInNextEventLoop} from "../../util/eventLoop.js";
15
14
  import {PeerIdStr} from "../../util/peerId.js";
16
15
  import {
17
16
  getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized,
@@ -361,6 +360,19 @@ export class NetworkProcessor {
361
360
  return;
362
361
  }
363
362
 
363
+ // DOS protection: drop far-future messages before allocating any unknown-root tracking entry.
364
+ // Bound each topic to what its gossip validator accepts; only execution_payload_bid accepts the next slot.
365
+ const latestPermissableSlot =
366
+ this.chain.clock.currentSlotWithGossipDisparity + (topicType === GossipType.execution_payload_bid ? 1 : 0);
367
+ if (slot > latestPermissableSlot) {
368
+ // No need to report the dropped job to gossip. It will be eventually pruned from the mcache
369
+ this.metrics?.networkProcessor.gossipValidationError.inc({
370
+ topic: topicType,
371
+ error: GossipErrorCode.FUTURE_SLOT,
372
+ });
373
+ return;
374
+ }
375
+
364
376
  message.msgSlot = slot;
365
377
 
366
378
  // this determines whether this message needs to wait for a Block or Envelope
@@ -781,27 +793,22 @@ export class NetworkProcessor {
781
793
  this.trackJobTime(messageOrArray, 1, acceptanceArr[0]);
782
794
  }
783
795
 
784
- // Use setTimeout to yield to the macro queue
785
- // This is mostly due to too many attestation messages, and a gossipsub RPC may
786
- // contain multiple of them. This helps avoid the I/O lag issue.
787
-
796
+ // Report the validation verdict synchronously so it reaches the network worker before any deferred
797
+ // handler (e.g. block import) runs on the next event loop. At network thread side, gossipsub onValidationResult()
798
+ // has its own callInNextEventLoop
788
799
  if (Array.isArray(messageOrArray)) {
789
800
  for (const [i, msg] of messageOrArray.entries()) {
790
- callInNextEventLoop(() => {
791
- this.events.emit(NetworkEvent.gossipMessageValidationResult, {
792
- msgId: msg.msgId,
793
- propagationSource: msg.propagationSource,
794
- acceptance: acceptanceArr[i],
795
- });
801
+ this.events.emit(NetworkEvent.gossipMessageValidationResult, {
802
+ msgId: msg.msgId,
803
+ propagationSource: msg.propagationSource,
804
+ acceptance: acceptanceArr[i],
796
805
  });
797
806
  }
798
807
  } else {
799
- callInNextEventLoop(() => {
800
- this.events.emit(NetworkEvent.gossipMessageValidationResult, {
801
- msgId: messageOrArray.msgId,
802
- propagationSource: messageOrArray.propagationSource,
803
- acceptance: acceptanceArr[0],
804
- });
808
+ this.events.emit(NetworkEvent.gossipMessageValidationResult, {
809
+ msgId: messageOrArray.msgId,
810
+ propagationSource: messageOrArray.propagationSource,
811
+ acceptance: acceptanceArr[0],
805
812
  });
806
813
  }
807
814
  }
@@ -217,7 +217,29 @@ export class RangeSync extends (EventEmitter as {new (): RangeSyncEmitter}) {
217
217
  }
218
218
  }
219
219
  } else {
220
- await this.chain.processChainSegment(blocks, payloadEnvelopes, flags);
220
+ const {orphaned, skipped} = await this.chain.processChainSegment(blocks, payloadEnvelopes, flags);
221
+ // We log orphaned payloads to work with different clients
222
+ // in the future, consider applying penalties in certain conditions
223
+ // make sure the payload source was from range sync in that case
224
+ for (const {slot, payloadEnvelopeInput} of orphaned) {
225
+ const {peerIdStr, source} = payloadEnvelopeInput.getPayloadEnvelopeSource();
226
+ let client = "unknown";
227
+ if (peerIdStr !== undefined) {
228
+ try {
229
+ client = this.getConnectedPeerSyncMeta(peerIdStr).client;
230
+ } catch {
231
+ // peer disconnected since serving the envelope, keep "unknown"
232
+ }
233
+ }
234
+ this.logger.debug("Orphaned payload envelope in range sync batch", {
235
+ slot,
236
+ root: payloadEnvelopeInput.blockRootHex,
237
+ peer: peerIdStr ?? "unknown",
238
+ source,
239
+ client,
240
+ skipped,
241
+ });
242
+ }
221
243
  }
222
244
  };
223
245