@aztec/p2p 0.0.1-commit.7035c9bd6 → 0.0.1-commit.71324e566

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 (225) hide show
  1. package/dest/client/factory.d.ts +1 -1
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +5 -4
  4. package/dest/client/interface.d.ts +9 -2
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +3 -2
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +30 -10
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +16 -6
  10. package/dest/config.d.ts +103 -99
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +10 -5
  13. package/dest/errors/p2p-service.error.d.ts +9 -0
  14. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  15. package/dest/errors/p2p-service.error.js +10 -0
  16. package/dest/index.d.ts +1 -2
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +0 -1
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -2
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +8 -5
  22. package/dest/mem_pools/index.d.ts +1 -2
  23. package/dest/mem_pools/index.d.ts.map +1 -1
  24. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  25. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +1 -1
  26. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  27. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +6 -2
  28. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  29. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  30. package/dest/msg_validators/attestation_validator/attestation_validator.js +17 -9
  31. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  32. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  33. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  34. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  35. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  36. package/dest/msg_validators/clock_tolerance.js +50 -0
  37. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +2 -1
  38. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  39. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +2 -1
  40. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  41. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -1
  42. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  43. package/dest/msg_validators/proposal_validator/proposal_validator.js +16 -8
  44. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  45. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  46. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  47. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  48. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  49. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  50. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  51. package/dest/msg_validators/tx_validator/factory.d.ts +1 -1
  52. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  53. package/dest/msg_validators/tx_validator/factory.js +8 -2
  54. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  55. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  56. package/dest/msg_validators/tx_validator/gas_validator.js +11 -9
  57. package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
  58. package/dest/services/data_store.d.ts +1 -1
  59. package/dest/services/data_store.d.ts.map +1 -1
  60. package/dest/services/data_store.js +5 -5
  61. package/dest/services/dummy_service.d.ts +6 -3
  62. package/dest/services/dummy_service.d.ts.map +1 -1
  63. package/dest/services/dummy_service.js +6 -1
  64. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  65. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  66. package/dest/services/gossipsub/topic_score_params.js +21 -4
  67. package/dest/services/libp2p/libp2p_service.d.ts +15 -18
  68. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  69. package/dest/services/libp2p/libp2p_service.js +117 -91
  70. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  71. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  72. package/dest/services/peer-manager/peer_manager.js +35 -8
  73. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  74. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  75. package/dest/services/peer-manager/peer_scoring.js +32 -10
  76. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -1
  77. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  78. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +3 -0
  79. package/dest/services/reqresp/config.d.ts +3 -3
  80. package/dest/services/reqresp/config.d.ts.map +1 -1
  81. package/dest/services/reqresp/interface.d.ts +14 -9
  82. package/dest/services/reqresp/interface.d.ts.map +1 -1
  83. package/dest/services/reqresp/interface.js +10 -11
  84. package/dest/services/reqresp/metrics.d.ts +1 -1
  85. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  86. package/dest/services/reqresp/metrics.js +0 -1
  87. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  88. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  89. package/dest/services/reqresp/protocols/index.js +0 -1
  90. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  91. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  92. package/dest/services/reqresp/protocols/tx.js +1 -3
  93. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  94. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  95. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  96. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  97. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  98. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  99. package/dest/services/reqresp/reqresp.d.ts +4 -2
  100. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  101. package/dest/services/reqresp/reqresp.js +11 -2
  102. package/dest/services/service.d.ts +5 -2
  103. package/dest/services/service.d.ts.map +1 -1
  104. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  105. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  106. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  107. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  108. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  109. package/dest/services/tx_collection/tx_source.js +9 -7
  110. package/dest/test-helpers/mock-pubsub.d.ts +11 -3
  111. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  112. package/dest/test-helpers/mock-pubsub.js +35 -10
  113. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  114. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  115. package/dest/test-helpers/reqresp-nodes.js +1 -2
  116. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  117. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  118. package/dest/test-helpers/testbench-utils.js +1 -0
  119. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  120. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  121. package/dest/testbench/p2p_client_testbench_worker.js +65 -15
  122. package/dest/testbench/worker_client_manager.d.ts +8 -1
  123. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  124. package/dest/testbench/worker_client_manager.js +49 -1
  125. package/package.json +14 -14
  126. package/src/client/factory.ts +7 -2
  127. package/src/client/interface.ts +9 -1
  128. package/src/client/p2p_client.ts +34 -11
  129. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +17 -6
  130. package/src/config.ts +18 -6
  131. package/src/errors/p2p-service.error.ts +11 -0
  132. package/src/index.ts +0 -1
  133. package/src/mem_pools/attestation_pool/attestation_pool.ts +9 -5
  134. package/src/mem_pools/index.ts +0 -3
  135. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  136. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +8 -2
  137. package/src/msg_validators/attestation_validator/attestation_validator.ts +18 -7
  138. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  139. package/src/msg_validators/clock_tolerance.ts +68 -0
  140. package/src/msg_validators/proposal_validator/README.md +1 -1
  141. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +4 -1
  142. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +4 -1
  143. package/src/msg_validators/proposal_validator/proposal_validator.ts +13 -7
  144. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  145. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  146. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  147. package/src/msg_validators/tx_validator/factory.ts +7 -0
  148. package/src/msg_validators/tx_validator/gas_validator.ts +25 -9
  149. package/src/msg_validators/tx_validator/phases_validator.ts +1 -1
  150. package/src/services/data_store.ts +5 -13
  151. package/src/services/dummy_service.ts +8 -2
  152. package/src/services/gossipsub/topic_score_params.ts +36 -4
  153. package/src/services/libp2p/libp2p_service.ts +117 -102
  154. package/src/services/peer-manager/peer_manager.ts +40 -8
  155. package/src/services/peer-manager/peer_scoring.ts +27 -5
  156. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +3 -0
  157. package/src/services/reqresp/config.ts +2 -2
  158. package/src/services/reqresp/interface.ts +21 -11
  159. package/src/services/reqresp/metrics.ts +0 -1
  160. package/src/services/reqresp/protocols/index.ts +0 -1
  161. package/src/services/reqresp/protocols/tx.ts +1 -3
  162. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  163. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  164. package/src/services/reqresp/reqresp.ts +18 -1
  165. package/src/services/service.ts +6 -1
  166. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  167. package/src/services/tx_collection/tx_source.ts +8 -7
  168. package/src/test-helpers/mock-pubsub.ts +31 -5
  169. package/src/test-helpers/reqresp-nodes.ts +2 -2
  170. package/src/test-helpers/testbench-utils.ts +1 -0
  171. package/src/testbench/p2p_client_testbench_worker.ts +70 -12
  172. package/src/testbench/worker_client_manager.ts +55 -1
  173. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  174. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  175. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  176. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  177. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  178. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  179. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  180. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  181. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  182. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  183. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  184. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  185. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  186. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  187. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  188. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  189. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  190. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  191. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  192. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  193. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  194. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  195. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  196. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  197. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  198. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  199. package/dest/mem_pools/tx_pool/index.js +0 -2
  200. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  201. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  202. package/dest/mem_pools/tx_pool/priority.js +0 -15
  203. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  204. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  205. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  206. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  207. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  208. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  209. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  210. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  211. package/dest/services/reqresp/protocols/block.js +0 -32
  212. package/src/mem_pools/tx_pool/README.md +0 -270
  213. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  214. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  215. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  216. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  217. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  218. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  219. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  220. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  221. package/src/mem_pools/tx_pool/index.ts +0 -2
  222. package/src/mem_pools/tx_pool/priority.ts +0 -20
  223. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  224. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  225. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -370,7 +370,7 @@ function applyDecs2203RFactory() {
370
370
  function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
371
  return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
372
372
  }
373
- var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _initProto;
373
+ var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _initProto;
374
374
  import { BlockNumber } from '@aztec/foundation/branded-types';
375
375
  import { maxBy } from '@aztec/foundation/collection';
376
376
  import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
@@ -395,6 +395,7 @@ import { mplex } from '@libp2p/mplex';
395
395
  import { tcp } from '@libp2p/tcp';
396
396
  import { ENR } from '@nethermindeth/enr';
397
397
  import { createLibp2p } from 'libp2p';
398
+ import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
398
399
  import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
399
400
  import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
400
401
  import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
@@ -408,7 +409,7 @@ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring
408
409
  import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
409
410
  import { PeerManager } from '../peer-manager/peer_manager.js';
410
411
  import { PeerScoring } from '../peer-manager/peer_scoring.js';
411
- import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
412
+ import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
412
413
  import { ReqResp } from '../reqresp/reqresp.js';
413
414
  import { P2PInstrumentation } from './instrumentation.js';
414
415
  _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
@@ -430,8 +431,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
430
431
  [Attributes.BLOCK_ARCHIVE]: request.archiveRoot.toString()
431
432
  })), _dec6 = trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx)=>({
432
433
  [Attributes.TX_HASH]: requestedTxHash.toString()
433
- })), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
434
- [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
435
434
  }));
436
435
  /**
437
436
  * Lib P2P implementation of the P2PService interface.
@@ -482,11 +481,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
482
481
  _dec6,
483
482
  2,
484
483
  "validateRequestedTxs"
485
- ],
486
- [
487
- _dec7,
488
- 2,
489
- "validateRequestedBlock"
490
484
  ]
491
485
  ], []));
492
486
  }
@@ -510,7 +504,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
510
504
  * Callback for when a checkpoint proposal is received from a peer.
511
505
  * @param checkpoint - The checkpoint proposal received from the peer.
512
506
  * @returns The attestations for the checkpoint, if any.
513
- */ checkpointReceivedCallback;
507
+ */ allNodesCheckpointReceivedCallback;
508
+ /**
509
+ * Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
510
+ * @param checkpoint - The checkpoint proposal received from the peer.
511
+ * @returns The attestations for the checkpoint, if any.
512
+ */ validatorCheckpointReceivedCallback;
514
513
  gossipSubEventHandler;
515
514
  instrumentation;
516
515
  telemetry;
@@ -532,13 +531,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
532
531
  this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
533
532
  this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
534
533
  this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
534
+ const p2pPropagationTime = config.attestationPropagationTime;
535
535
  const proposalValidatorOpts = {
536
536
  txsPermitted: !config.disableTransactions,
537
- maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
537
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
538
+ p2pPropagationTime
538
539
  };
539
540
  this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
540
541
  this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
541
- this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) : new CheckpointAttestationValidator(epochCache);
542
+ this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry, {
543
+ l1PublishingTime: config.l1PublishingTime
544
+ }) : new CheckpointAttestationValidator(epochCache, {
545
+ l1PublishingTime: config.l1PublishingTime
546
+ });
542
547
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
543
548
  this.blockReceivedCallback = async (block)=>{
544
549
  this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
@@ -546,8 +551,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
546
551
  });
547
552
  return true;
548
553
  };
549
- this.checkpointReceivedCallback = (checkpoint)=>{
550
- this.logger.debug(`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`);
554
+ this.allNodesCheckpointReceivedCallback = (_checkpoint)=>{
555
+ throw new CheckpointProposalReceivedCallbackNotRegisteredError();
556
+ };
557
+ this.validatorCheckpointReceivedCallback = (_checkpoint)=>{
551
558
  return Promise.resolve(undefined);
552
559
  };
553
560
  }
@@ -600,9 +607,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
600
607
  const l1Constants = epochCache.getL1Constants();
601
608
  const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
602
609
  slotDurationMs: l1Constants.slotDuration * 1000,
610
+ ethereumSlotDuration: l1Constants.ethereumSlotDuration,
603
611
  heartbeatIntervalMs: config.gossipsubInterval,
604
612
  targetCommitteeSize: l1Constants.targetCommitteeSize,
605
613
  blockDurationMs: config.blockDurationMs,
614
+ l1PublishingTime: config.l1PublishingTime,
615
+ p2pPropagationTime: config.attestationPropagationTime,
606
616
  expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
607
617
  });
608
618
  const node = await createLibp2p({
@@ -717,6 +727,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
717
727
  const peerScoring = new PeerScoring(config, telemetry);
718
728
  const reqresp = new ReqResp(config, node, peerScoring, createLogger(`${logger.module}:reqresp`));
719
729
  const peerManager = new PeerManager(node, peerDiscoveryService, config, telemetry, createLogger(`${logger.module}:peer_manager`), peerScoring, reqresp, worldStateSynchronizer, protocolVersion, epochCache);
730
+ // Gate req/resp data protocols for unauthenticated peers when p2pAllowOnlyValidators is enabled
731
+ reqresp.setShouldRejectPeer((peerId)=>peerManager.shouldDisableP2PGossip(peerId));
720
732
  // Configure application-specific scoring for gossipsub.
721
733
  // The weight scales app score to align with gossipsub thresholds:
722
734
  // - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
@@ -743,13 +755,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
743
755
  // Create request response protocol handlers
744
756
  const txHandler = reqRespTxHandler(this.mempools);
745
757
  const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
746
- const blockHandler = reqRespBlockHandler(this.archiver);
747
758
  const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
748
759
  const requestResponseHandlers = {
749
760
  [ReqRespSubProtocol.PING]: pingHandler,
750
761
  [ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
751
- [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
752
- [ReqRespSubProtocol.BLOCK]: blockHandler.bind(this)
762
+ [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
753
763
  };
754
764
  if (!this.config.disableTransactions) {
755
765
  const blockTxsHandler = reqRespBlockTxsHandler(this.mempools.attestationPool, this.archiver, this.mempools.txPool);
@@ -762,8 +772,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
762
772
  const reqrespSubProtocolValidators = {
763
773
  ...DEFAULT_SUB_PROTOCOL_VALIDATORS,
764
774
  [ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
765
- [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
766
- [ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this)
775
+ [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
767
776
  };
768
777
  await this.peerManager.initializePeers();
769
778
  await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
@@ -851,8 +860,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
851
860
  registerBlockReceivedCallback(callback) {
852
861
  this.blockReceivedCallback = callback;
853
862
  }
854
- registerCheckpointReceivedCallback(callback) {
855
- this.checkpointReceivedCallback = callback;
863
+ registerValidatorCheckpointReceivedCallback(callback) {
864
+ this.validatorCheckpointReceivedCallback = callback;
865
+ }
866
+ registerAllNodesCheckpointReceivedCallback(callback) {
867
+ this.allNodesCheckpointReceivedCallback = callback;
868
+ }
869
+ async notifyOwnCheckpointProposal(checkpoint) {
870
+ await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
856
871
  }
857
872
  /**
858
873
  * Registers a callback to be invoked when a duplicate proposal is detected.
@@ -1029,29 +1044,67 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1029
1044
  return;
1030
1045
  }
1031
1046
  async validateReceivedMessage(validationFunc, msgId, source, topicType) {
1047
+ // Default to reject result with a penalty if validation function throws an error
1032
1048
  let resultAndObj = {
1033
- result: TopicValidatorResult.Reject
1049
+ result: TopicValidatorResult.Reject,
1050
+ severity: PeerErrorSeverity.MidToleranceError
1034
1051
  };
1035
1052
  const timer = new Timer();
1036
1053
  try {
1037
1054
  resultAndObj = await validationFunc();
1038
1055
  } catch (err) {
1039
- this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
1040
- this.logger.error(`Error deserializing and validating gossipsub message`, err, {
1056
+ this.logger.error(`Error validating gossipsub message`, err, {
1041
1057
  msgId,
1042
1058
  source: source.toString(),
1043
1059
  topicType
1044
1060
  });
1045
1061
  }
1046
1062
  if (resultAndObj.result === TopicValidatorResult.Accept) {
1063
+ this.logger.debug(`Message ${topicType} accepted by validator`, {
1064
+ msgId,
1065
+ source: source.toString(),
1066
+ topicType
1067
+ });
1047
1068
  this.instrumentation.recordMessageValidation(topicType, timer);
1069
+ } else if (resultAndObj.result === TopicValidatorResult.Reject) {
1070
+ this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
1071
+ msgId,
1072
+ source: source.toString(),
1073
+ topicType,
1074
+ severity: resultAndObj.severity
1075
+ });
1076
+ this.peerManager.penalizePeer(source, resultAndObj.severity);
1077
+ } else {
1078
+ this.logger.trace(`Message ${topicType} ignored by validator`, {
1079
+ msgId,
1080
+ source: source.toString(),
1081
+ topicType
1082
+ });
1048
1083
  }
1049
1084
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
1050
1085
  return resultAndObj;
1051
1086
  }
1087
+ tryDeserialize(deserializeFunc, msgId, source) {
1088
+ try {
1089
+ return deserializeFunc();
1090
+ } catch (err) {
1091
+ this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
1092
+ err,
1093
+ msgId,
1094
+ source: source.toString()
1095
+ });
1096
+ return undefined;
1097
+ }
1098
+ }
1052
1099
  async handleGossipedTx(payloadData, msgId, source) {
1053
1100
  const validationFunc = async ()=>{
1054
- const tx = Tx.fromBuffer(payloadData);
1101
+ const tx = this.tryDeserialize(()=>Tx.fromBuffer(payloadData), msgId, source);
1102
+ if (!tx) {
1103
+ return {
1104
+ result: TopicValidatorResult.Reject,
1105
+ severity: PeerErrorSeverity.LowToleranceError
1106
+ };
1107
+ }
1055
1108
  const currentBlockNumber = await this.archiver.getBlockNumber();
1056
1109
  const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1057
1110
  // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
@@ -1072,9 +1125,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1072
1125
  severity,
1073
1126
  source: source.toString()
1074
1127
  });
1075
- this.peerManager.penalizePeer(source, severity);
1076
1128
  return {
1077
- result: TopicValidatorResult.Reject
1129
+ result: TopicValidatorResult.Reject,
1130
+ severity
1078
1131
  };
1079
1132
  }
1080
1133
  // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
@@ -1098,9 +1151,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1098
1151
  severity,
1099
1152
  source: source.toString()
1100
1153
  });
1101
- this.peerManager.penalizePeer(source, severity);
1102
1154
  return {
1103
- result: TopicValidatorResult.Reject
1155
+ result: TopicValidatorResult.Reject,
1156
+ severity
1104
1157
  };
1105
1158
  }
1106
1159
  // Pool add: persist the tx
@@ -1132,9 +1185,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1132
1185
  source: source.toString(),
1133
1186
  txHash: txHash.toString()
1134
1187
  });
1135
- this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
1136
1188
  return {
1137
- result: TopicValidatorResult.Reject
1189
+ result: TopicValidatorResult.Reject,
1190
+ severity: PeerErrorSeverity.HighToleranceError
1138
1191
  };
1139
1192
  }
1140
1193
  };
@@ -1155,7 +1208,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1155
1208
  * Process a checkpoint attestation from a peer.
1156
1209
  * Validates the attestation and adds it to the pool.
1157
1210
  */ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
1158
- const { result, obj: attestation } = await this.validateReceivedMessage(()=>this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)), msgId, source, TopicType.checkpoint_attestation);
1211
+ const { result, obj: attestation } = await this.validateReceivedMessage(()=>{
1212
+ const attestation = this.tryDeserialize(()=>CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1213
+ if (!attestation) {
1214
+ return Promise.resolve({
1215
+ result: TopicValidatorResult.Reject,
1216
+ severity: PeerErrorSeverity.LowToleranceError
1217
+ });
1218
+ }
1219
+ return this.validateAndStoreCheckpointAttestation(source, attestation);
1220
+ }, msgId, source, TopicType.checkpoint_attestation);
1159
1221
  if (result !== TopicValidatorResult.Accept || !attestation) {
1160
1222
  return;
1161
1223
  }
@@ -1170,9 +1232,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1170
1232
  const validationResult = await this.checkpointAttestationValidator.validate(attestation);
1171
1233
  if (validationResult.result === 'reject') {
1172
1234
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1173
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1174
1235
  return {
1175
- result: TopicValidatorResult.Reject
1236
+ result: TopicValidatorResult.Reject,
1237
+ severity: validationResult.severity
1176
1238
  };
1177
1239
  }
1178
1240
  if (validationResult.result === 'ignore') {
@@ -1199,9 +1261,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1199
1261
  obj: attestation
1200
1262
  };
1201
1263
  }
1202
- // Could not add (cap reached for signer), no need to re-broadcast
1264
+ // Could not add (cap reached for signer), penalize and do not re-broadcast
1203
1265
  if (!added) {
1204
- this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1266
+ this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1205
1267
  slot: slot.toString(),
1206
1268
  archive: attestation.archive.toString(),
1207
1269
  source: peerId.toString(),
@@ -1209,8 +1271,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1209
1271
  count
1210
1272
  });
1211
1273
  return {
1212
- result: TopicValidatorResult.Ignore,
1213
- obj: attestation
1274
+ result: TopicValidatorResult.Reject,
1275
+ severity: PeerErrorSeverity.HighToleranceError
1214
1276
  };
1215
1277
  }
1216
1278
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1248,9 +1310,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1248
1310
  const validationResult = await this.blockProposalValidator.validate(block);
1249
1311
  if (validationResult.result === 'reject') {
1250
1312
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1251
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1252
1313
  return {
1253
- result: TopicValidatorResult.Reject
1314
+ result: TopicValidatorResult.Reject,
1315
+ severity: validationResult.severity
1254
1316
  };
1255
1317
  }
1256
1318
  if (validationResult.result === 'ignore') {
@@ -1280,7 +1342,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1280
1342
  }
1281
1343
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1282
1344
  if (!added) {
1283
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1284
1345
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1285
1346
  ...block.toBlockInfo(),
1286
1347
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1292,7 +1353,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1292
1353
  result: TopicValidatorResult.Reject,
1293
1354
  metadata: {
1294
1355
  isEquivocated
1295
- }
1356
+ },
1357
+ severity: PeerErrorSeverity.HighToleranceError
1296
1358
  };
1297
1359
  }
1298
1360
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1366,9 +1428,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1366
1428
  const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
1367
1429
  if (validationResult.result === 'reject') {
1368
1430
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1369
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1370
1431
  return {
1371
- result: TopicValidatorResult.Reject
1432
+ result: TopicValidatorResult.Reject,
1433
+ severity: validationResult.severity
1372
1434
  };
1373
1435
  }
1374
1436
  if (validationResult.result === 'ignore') {
@@ -1385,18 +1447,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1385
1447
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1386
1448
  [Attributes.P2P_ID]: peerId.toString()
1387
1449
  });
1388
- const { result, obj, metadata: { isEquivocated } = {} } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1389
- if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1450
+ const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1451
+ const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1452
+ if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1390
1453
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1391
1454
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1392
1455
  [Attributes.P2P_ID]: peerId.toString(),
1393
1456
  isEquivocated,
1394
- result
1457
+ result: blockProposalResult.result
1395
1458
  });
1396
1459
  return {
1397
- result: TopicValidatorResult.Reject
1460
+ result: TopicValidatorResult.Reject,
1461
+ severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
1398
1462
  };
1399
- } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1463
+ } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1400
1464
  processBlock = true;
1401
1465
  }
1402
1466
  }
@@ -1423,7 +1487,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1423
1487
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1424
1488
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1425
1489
  if (!added) {
1426
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1427
1490
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1428
1491
  ...checkpoint.toCheckpointInfo(),
1429
1492
  count,
@@ -1435,7 +1498,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1435
1498
  metadata: {
1436
1499
  isEquivocated,
1437
1500
  processBlock
1438
- }
1501
+ },
1502
+ severity: PeerErrorSeverity.HighToleranceError
1439
1503
  };
1440
1504
  }
1441
1505
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1485,9 +1549,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1485
1549
  archive: checkpoint.archive.toString(),
1486
1550
  source: sender.toString()
1487
1551
  });
1552
+ await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
1488
1553
  // Call the checkpoint received callback with the core version (without lastBlock)
1489
1554
  // to validate and potentially generate attestations
1490
- const attestations = await this.checkpointReceivedCallback(checkpoint, sender);
1555
+ const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
1491
1556
  if (attestations && attestations.length > 0) {
1492
1557
  // If the callback returned attestations, add them to the pool and propagate them
1493
1558
  await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
@@ -1607,45 +1672,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1607
1672
  return false;
1608
1673
  }
1609
1674
  }
1610
- /**
1611
- * Validates a BLOCK response.
1612
- *
1613
- * If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
1614
- * Penalizes on block number mismatch or hash mismatch.
1615
- *
1616
- * @param requestedBlockNumber - The requested block number.
1617
- * @param responseBlock - The block returned by the peer.
1618
- * @param peerId - The peer that returned the block.
1619
- * @returns True if the response is valid, false otherwise.
1620
- */ async validateRequestedBlock(requestedBlockNumber, responseBlock, peerId) {
1621
- try {
1622
- const reqNum = Number(requestedBlockNumber.toString());
1623
- if (responseBlock.number !== reqNum) {
1624
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
1625
- return false;
1626
- }
1627
- const local = await this.archiver.getBlock(BlockNumber(reqNum));
1628
- if (!local) {
1629
- // We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
1630
- // TODO: Consider extending this validator to accept an expected hash or
1631
- // performing quorum-based checks when using P2P syncing prior to L1 sync.
1632
- this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
1633
- return false;
1634
- }
1635
- const [localHash, respHash] = await Promise.all([
1636
- local.hash(),
1637
- responseBlock.hash()
1638
- ]);
1639
- if (!localHash.equals(respHash)) {
1640
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
1641
- return false;
1642
- }
1643
- return true;
1644
- } catch (e) {
1645
- this.logger.warn(`Error validating requested block`, e);
1646
- return false;
1647
- }
1648
- }
1649
1675
  async validateRequestedTx(tx, peerId, txValidator, requested) {
1650
1676
  const penalize = (severity)=>this.peerManager.penalizePeer(peerId, severity);
1651
1677
  if (requested && !requested.has(tx.getTxHash().toString())) {
@@ -53,11 +53,15 @@ export declare class PeerManager implements PeerManagerInterface {
53
53
  heartbeat(): Promise<void>;
54
54
  setupDirectPeersIfValidator(): Promise<void>;
55
55
  /**
56
- * Cleans up expired timeouts.
56
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
57
57
  *
58
58
  * When peers fail to dial after a number of retries, they are temporarily timed out.
59
59
  * This function removes any peers that have been in the timed out state for too long.
60
60
  * To give them a chance to reconnect.
61
+ *
62
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
63
+ * Without this, peers that probe once and never reconnect would leave their entries in the
64
+ * map forever, causing an unbounded memory leak.
61
65
  */
62
66
  private cleanupExpiredTimeouts;
63
67
  private processScheduledDisconnects;
@@ -171,4 +175,4 @@ export declare class PeerManager implements PeerManagerInterface {
171
175
  handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
172
176
  private updateAuthenticatedPeers;
173
177
  }
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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
@@ -1 +1 @@
1
- {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
@@ -172,19 +172,27 @@ export class PeerManager {
172
172
  this.initializedPreferredPeers = true;
173
173
  }
174
174
  /**
175
- * Cleans up expired timeouts.
175
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
176
176
  *
177
177
  * When peers fail to dial after a number of retries, they are temporarily timed out.
178
178
  * This function removes any peers that have been in the timed out state for too long.
179
179
  * To give them a chance to reconnect.
180
+ *
181
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
182
+ * Without this, peers that probe once and never reconnect would leave their entries in the
183
+ * map forever, causing an unbounded memory leak.
180
184
  */ cleanupExpiredTimeouts() {
181
- // Clean up expired timeouts
182
185
  const now = this.dateProvider.now();
183
186
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()){
184
187
  if (now >= timedOutPeer.timeoutUntilMs) {
185
188
  this.timedOutPeers.delete(peerId);
186
189
  }
187
190
  }
191
+ for (const [id, entry] of this.failedAuthHandshakes.entries()){
192
+ if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
193
+ this.failedAuthHandshakes.delete(id);
194
+ }
195
+ }
188
196
  }
189
197
  /**
190
198
  * Processes scheduled disconnects during heartbeat.
@@ -238,13 +246,17 @@ export class PeerManager {
238
246
  * @param e - The disconnected peer event.
239
247
  */ handleDisconnectedPeerEvent(e) {
240
248
  const peerId = e.detail;
249
+ const peerIdStr = peerId.toString();
241
250
  this.metrics.peerDisconnected(peerId);
242
- this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
243
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
251
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
252
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
244
253
  if (validatorAddress !== undefined) {
245
- this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`);
254
+ this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`);
246
255
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
247
- this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
256
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
257
+ }
258
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
259
+ this.peerScoring.removePeer(peerIdStr);
248
260
  }
249
261
  }
250
262
  registerThisValidatorAddresses(address) {
@@ -559,6 +571,11 @@ export class PeerManager {
559
571
  if (this.peerScoring.getScoreState(peerIdString) != PeerScoreState.Healthy) {
560
572
  return;
561
573
  }
574
+ // Don't dial peers that have exceeded the auth failure threshold
575
+ if (!this.isNodeAllowedToConnect(peerId)) {
576
+ this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
577
+ return;
578
+ }
562
579
  const [multiaddrTcp] = await Promise.all([
563
580
  enr.getFullMultiaddr('tcp')
564
581
  ]);
@@ -774,6 +791,8 @@ export class PeerManager {
774
791
  ...logData,
775
792
  address: sender.toString()
776
793
  });
794
+ this.markAuthHandshakeFailed(peerId);
795
+ this.markPeerForDisconnect(peerId);
777
796
  return;
778
797
  }
779
798
  this.markAuthHandshakeSuccess(peerId);
@@ -799,13 +818,13 @@ export class PeerManager {
799
818
  const now = this.dateProvider.now();
800
819
  const peerIdStr = peerId.toString();
801
820
  const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
821
+ const failureCount = (existingEntry?.count || 0) + 1;
802
822
  this.failedAuthHandshakes.set(peerIdStr, {
803
- count: (existingEntry?.count || 0) + 1,
823
+ count: failureCount,
804
824
  lastFailureTimestamp: now
805
825
  });
806
826
  const connections = this.libP2PNode.getConnections(peerId);
807
827
  connections.forEach((conn)=>{
808
- // We mark the IP address
809
828
  const address = conn.remoteAddr.nodeAddress().address;
810
829
  const existingAddressEntry = this.failedAuthHandshakes.get(address);
811
830
  this.failedAuthHandshakes.set(address, {
@@ -813,6 +832,14 @@ export class PeerManager {
813
832
  lastFailureTimestamp: now
814
833
  });
815
834
  });
835
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
836
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
837
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
838
+ this.timedOutPeers.set(peerIdStr, {
839
+ peerId: peerIdStr,
840
+ timeoutUntilMs: now + backoffMs
841
+ });
842
+ this.cachedPeers.delete(peerIdStr);
816
843
  }
817
844
  /*
818
845
  * Marks when peer exchanges auth handshake