@aztec/p2p 0.0.1-commit.3f296a7d2 → 0.0.1-commit.3f5453c7b

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 (198) 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 +21 -8
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +14 -3
  10. package/dest/config.d.ts +4 -2
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +5 -0
  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/tx_metadata.d.ts +1 -1
  25. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  26. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +5 -1
  27. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  28. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  29. package/dest/msg_validators/attestation_validator/attestation_validator.js +17 -9
  30. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  31. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  32. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  33. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  34. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  35. package/dest/msg_validators/clock_tolerance.js +50 -0
  36. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +2 -1
  37. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  38. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +2 -1
  39. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  40. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -1
  41. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  42. package/dest/msg_validators/proposal_validator/proposal_validator.js +16 -8
  43. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  44. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  45. package/dest/msg_validators/tx_validator/gas_validator.js +11 -9
  46. package/dest/services/data_store.d.ts +1 -1
  47. package/dest/services/data_store.d.ts.map +1 -1
  48. package/dest/services/data_store.js +5 -5
  49. package/dest/services/dummy_service.d.ts +6 -3
  50. package/dest/services/dummy_service.d.ts.map +1 -1
  51. package/dest/services/dummy_service.js +6 -1
  52. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  53. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  54. package/dest/services/gossipsub/topic_score_params.js +21 -4
  55. package/dest/services/libp2p/libp2p_service.d.ts +12 -17
  56. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  57. package/dest/services/libp2p/libp2p_service.js +38 -61
  58. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  59. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  60. package/dest/services/peer-manager/peer_manager.js +33 -8
  61. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  62. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  63. package/dest/services/peer-manager/peer_scoring.js +32 -10
  64. package/dest/services/reqresp/interface.d.ts +14 -9
  65. package/dest/services/reqresp/interface.d.ts.map +1 -1
  66. package/dest/services/reqresp/interface.js +10 -11
  67. package/dest/services/reqresp/metrics.d.ts +1 -1
  68. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  69. package/dest/services/reqresp/metrics.js +0 -1
  70. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  71. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  72. package/dest/services/reqresp/protocols/index.js +0 -1
  73. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  74. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  75. package/dest/services/reqresp/protocols/tx.js +1 -3
  76. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  77. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  78. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  79. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  80. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  81. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  82. package/dest/services/reqresp/reqresp.d.ts +4 -2
  83. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  84. package/dest/services/reqresp/reqresp.js +11 -2
  85. package/dest/services/service.d.ts +5 -2
  86. package/dest/services/service.d.ts.map +1 -1
  87. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  88. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  89. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  90. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  91. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  92. package/dest/services/tx_collection/tx_source.js +9 -7
  93. package/dest/test-helpers/mock-pubsub.d.ts +11 -3
  94. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  95. package/dest/test-helpers/mock-pubsub.js +35 -10
  96. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  97. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  98. package/dest/test-helpers/reqresp-nodes.js +1 -2
  99. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  100. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  101. package/dest/test-helpers/testbench-utils.js +1 -0
  102. package/dest/testbench/p2p_client_testbench_worker.js +63 -12
  103. package/dest/testbench/worker_client_manager.d.ts +8 -1
  104. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  105. package/dest/testbench/worker_client_manager.js +49 -1
  106. package/package.json +14 -14
  107. package/src/client/factory.ts +7 -2
  108. package/src/client/interface.ts +9 -1
  109. package/src/client/p2p_client.ts +23 -8
  110. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +15 -3
  111. package/src/config.ts +13 -1
  112. package/src/errors/p2p-service.error.ts +11 -0
  113. package/src/index.ts +0 -1
  114. package/src/mem_pools/attestation_pool/attestation_pool.ts +9 -5
  115. package/src/mem_pools/index.ts +0 -3
  116. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +7 -1
  117. package/src/msg_validators/attestation_validator/attestation_validator.ts +18 -7
  118. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  119. package/src/msg_validators/clock_tolerance.ts +68 -0
  120. package/src/msg_validators/proposal_validator/README.md +1 -1
  121. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +4 -1
  122. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +4 -1
  123. package/src/msg_validators/proposal_validator/proposal_validator.ts +13 -7
  124. package/src/msg_validators/tx_validator/gas_validator.ts +25 -9
  125. package/src/services/data_store.ts +5 -13
  126. package/src/services/dummy_service.ts +8 -2
  127. package/src/services/gossipsub/topic_score_params.ts +36 -4
  128. package/src/services/libp2p/libp2p_service.ts +42 -64
  129. package/src/services/peer-manager/peer_manager.ts +38 -8
  130. package/src/services/peer-manager/peer_scoring.ts +27 -5
  131. package/src/services/reqresp/interface.ts +21 -11
  132. package/src/services/reqresp/metrics.ts +0 -1
  133. package/src/services/reqresp/protocols/index.ts +0 -1
  134. package/src/services/reqresp/protocols/tx.ts +1 -3
  135. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  136. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  137. package/src/services/reqresp/reqresp.ts +18 -1
  138. package/src/services/service.ts +6 -1
  139. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  140. package/src/services/tx_collection/tx_source.ts +8 -7
  141. package/src/test-helpers/mock-pubsub.ts +31 -5
  142. package/src/test-helpers/reqresp-nodes.ts +2 -2
  143. package/src/test-helpers/testbench-utils.ts +1 -0
  144. package/src/testbench/p2p_client_testbench_worker.ts +67 -9
  145. package/src/testbench/worker_client_manager.ts +55 -1
  146. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  147. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  148. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  149. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  150. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  151. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  152. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  153. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  154. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  155. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  156. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  157. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  158. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  159. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  160. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  161. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  162. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  163. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  164. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  165. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  166. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  167. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  168. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  169. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  170. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  171. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  172. package/dest/mem_pools/tx_pool/index.js +0 -2
  173. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  174. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  175. package/dest/mem_pools/tx_pool/priority.js +0 -15
  176. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  177. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  178. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  179. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  180. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  181. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  182. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  183. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  184. package/dest/services/reqresp/protocols/block.js +0 -32
  185. package/src/mem_pools/tx_pool/README.md +0 -270
  186. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  187. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  188. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  189. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  190. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  191. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  192. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  193. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  194. package/src/mem_pools/tx_pool/index.ts +0 -2
  195. package/src/mem_pools/tx_pool/priority.ts +0 -20
  196. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  197. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  198. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,13 +1,12 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
3
3
  import { maxBy } from '@aztec/foundation/collection';
4
- import { Fr } from '@aztec/foundation/curves/bn254';
5
4
  import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
6
5
  import { RunningPromise } from '@aztec/foundation/running-promise';
7
6
  import { Timer } from '@aztec/foundation/timer';
8
7
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
9
8
  import { protocolContractsHash } from '@aztec/protocol-contracts';
10
- import type { EthAddress, L2Block, L2BlockSource } from '@aztec/stdlib/block';
9
+ import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
11
10
  import type { ContractDataSource } from '@aztec/stdlib/contract';
12
11
  import { GasFees } from '@aztec/stdlib/gas';
13
12
  import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
@@ -58,6 +57,7 @@ import { ENR } from '@nethermindeth/enr';
58
57
  import { createLibp2p } from 'libp2p';
59
58
 
60
59
  import type { P2PConfig } from '../../config.js';
60
+ import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
61
61
  import type { MemPools } from '../../mem_pools/interface.js';
62
62
  import {
63
63
  BlockProposalValidator,
@@ -104,7 +104,6 @@ import {
104
104
  ValidationError,
105
105
  pingHandler,
106
106
  reqGoodbyeHandler,
107
- reqRespBlockHandler,
108
107
  reqRespBlockTxsHandler,
109
108
  reqRespStatusHandler,
110
109
  reqRespTxHandler,
@@ -171,7 +170,13 @@ export class LibP2PService extends WithTracer implements P2PService {
171
170
  * @param checkpoint - The checkpoint proposal received from the peer.
172
171
  * @returns The attestations for the checkpoint, if any.
173
172
  */
174
- private checkpointReceivedCallback: P2PCheckpointReceivedCallback;
173
+ private allNodesCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
174
+ /**
175
+ * Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
176
+ * @param checkpoint - The checkpoint proposal received from the peer.
177
+ * @returns The attestations for the checkpoint, if any.
178
+ */
179
+ private validatorCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
175
180
 
176
181
  private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
177
182
 
@@ -223,15 +228,19 @@ export class LibP2PService extends WithTracer implements P2PService {
223
228
  this.protocolVersion,
224
229
  );
225
230
 
231
+ const p2pPropagationTime = config.attestationPropagationTime;
226
232
  const proposalValidatorOpts = {
227
233
  txsPermitted: !config.disableTransactions,
228
234
  maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
235
+ p2pPropagationTime,
229
236
  };
230
237
  this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
231
238
  this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
232
239
  this.checkpointAttestationValidator = config.fishermanMode
233
- ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
234
- : new CheckpointAttestationValidator(epochCache);
240
+ ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry, {
241
+ l1PublishingTime: config.l1PublishingTime,
242
+ })
243
+ : new CheckpointAttestationValidator(epochCache, { l1PublishingTime: config.l1PublishingTime });
235
244
 
236
245
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
237
246
 
@@ -243,12 +252,15 @@ export class LibP2PService extends WithTracer implements P2PService {
243
252
  return true;
244
253
  };
245
254
 
246
- this.checkpointReceivedCallback = (
247
- checkpoint: CheckpointProposalCore,
255
+ this.allNodesCheckpointReceivedCallback = (
256
+ _checkpoint: CheckpointProposalCore,
257
+ ): Promise<CheckpointAttestation[] | undefined> => {
258
+ throw new CheckpointProposalReceivedCallbackNotRegisteredError();
259
+ };
260
+
261
+ this.validatorCheckpointReceivedCallback = (
262
+ _checkpoint: CheckpointProposalCore,
248
263
  ): Promise<CheckpointAttestation[] | undefined> => {
249
- this.logger.debug(
250
- `Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`,
251
- );
252
264
  return Promise.resolve(undefined);
253
265
  };
254
266
  }
@@ -338,9 +350,12 @@ export class LibP2PService extends WithTracer implements P2PService {
338
350
  const l1Constants = epochCache.getL1Constants();
339
351
  const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
340
352
  slotDurationMs: l1Constants.slotDuration * 1000,
353
+ ethereumSlotDuration: l1Constants.ethereumSlotDuration,
341
354
  heartbeatIntervalMs: config.gossipsubInterval,
342
355
  targetCommitteeSize: l1Constants.targetCommitteeSize,
343
356
  blockDurationMs: config.blockDurationMs,
357
+ l1PublishingTime: config.l1PublishingTime,
358
+ p2pPropagationTime: config.attestationPropagationTime,
344
359
  expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot,
345
360
  });
346
361
 
@@ -465,6 +480,9 @@ export class LibP2PService extends WithTracer implements P2PService {
465
480
  epochCache,
466
481
  );
467
482
 
483
+ // Gate req/resp data protocols for unauthenticated peers when p2pAllowOnlyValidators is enabled
484
+ reqresp.setShouldRejectPeer(peerId => peerManager.shouldDisableP2PGossip(peerId));
485
+
468
486
  // Configure application-specific scoring for gossipsub.
469
487
  // The weight scales app score to align with gossipsub thresholds:
470
488
  // - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
@@ -510,14 +528,12 @@ export class LibP2PService extends WithTracer implements P2PService {
510
528
  // Create request response protocol handlers
511
529
  const txHandler = reqRespTxHandler(this.mempools);
512
530
  const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
513
- const blockHandler = reqRespBlockHandler(this.archiver);
514
531
  const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
515
532
 
516
533
  const requestResponseHandlers: Partial<ReqRespSubProtocolHandlers> = {
517
534
  [ReqRespSubProtocol.PING]: pingHandler,
518
535
  [ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
519
536
  [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
520
- [ReqRespSubProtocol.BLOCK]: blockHandler.bind(this),
521
537
  };
522
538
 
523
539
  if (!this.config.disableTransactions) {
@@ -538,7 +554,6 @@ export class LibP2PService extends WithTracer implements P2PService {
538
554
  ...DEFAULT_SUB_PROTOCOL_VALIDATORS,
539
555
  [ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
540
556
  [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
541
- [ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this),
542
557
  };
543
558
 
544
559
  await this.peerManager.initializePeers();
@@ -666,8 +681,16 @@ export class LibP2PService extends WithTracer implements P2PService {
666
681
  this.blockReceivedCallback = callback;
667
682
  }
668
683
 
669
- public registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
670
- this.checkpointReceivedCallback = callback;
684
+ public registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
685
+ this.validatorCheckpointReceivedCallback = callback;
686
+ }
687
+
688
+ public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
689
+ this.allNodesCheckpointReceivedCallback = callback;
690
+ }
691
+
692
+ public async notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void> {
693
+ await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
671
694
  }
672
695
 
673
696
  /**
@@ -1404,9 +1427,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1404
1427
  source: sender.toString(),
1405
1428
  });
1406
1429
 
1430
+ await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
1431
+
1407
1432
  // Call the checkpoint received callback with the core version (without lastBlock)
1408
1433
  // to validate and potentially generate attestations
1409
- const attestations = await this.checkpointReceivedCallback(checkpoint, sender);
1434
+ const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
1410
1435
  if (attestations && attestations.length > 0) {
1411
1436
  // If the callback returned attestations, add them to the pool and propagate them
1412
1437
  await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
@@ -1554,53 +1579,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1554
1579
  }
1555
1580
  }
1556
1581
 
1557
- /**
1558
- * Validates a BLOCK response.
1559
- *
1560
- * If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
1561
- * Penalizes on block number mismatch or hash mismatch.
1562
- *
1563
- * @param requestedBlockNumber - The requested block number.
1564
- * @param responseBlock - The block returned by the peer.
1565
- * @param peerId - The peer that returned the block.
1566
- * @returns True if the response is valid, false otherwise.
1567
- */
1568
- @trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock) => ({
1569
- [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString(),
1570
- }))
1571
- protected async validateRequestedBlock(
1572
- requestedBlockNumber: Fr,
1573
- responseBlock: L2Block,
1574
- peerId: PeerId,
1575
- ): Promise<boolean> {
1576
- try {
1577
- const reqNum = Number(requestedBlockNumber.toString());
1578
- if (responseBlock.number !== reqNum) {
1579
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
1580
- return false;
1581
- }
1582
-
1583
- const local = await this.archiver.getBlock(BlockNumber(reqNum));
1584
- if (!local) {
1585
- // We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
1586
- // TODO: Consider extending this validator to accept an expected hash or
1587
- // performing quorum-based checks when using P2P syncing prior to L1 sync.
1588
- this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
1589
- return false;
1590
- }
1591
- const [localHash, respHash] = await Promise.all([local.hash(), responseBlock.hash()]);
1592
- if (!localHash.equals(respHash)) {
1593
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
1594
- return false;
1595
- }
1596
-
1597
- return true;
1598
- } catch (e) {
1599
- this.logger.warn(`Error validating requested block`, e);
1600
- return false;
1601
- }
1602
- }
1603
-
1604
1582
  protected async validateRequestedTx(
1605
1583
  tx: Tx,
1606
1584
  peerId: PeerId,
@@ -226,20 +226,30 @@ export class PeerManager implements PeerManagerInterface {
226
226
  }
227
227
 
228
228
  /**
229
- * Cleans up expired timeouts.
229
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
230
230
  *
231
231
  * When peers fail to dial after a number of retries, they are temporarily timed out.
232
232
  * This function removes any peers that have been in the timed out state for too long.
233
233
  * To give them a chance to reconnect.
234
+ *
235
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
236
+ * Without this, peers that probe once and never reconnect would leave their entries in the
237
+ * map forever, causing an unbounded memory leak.
234
238
  */
235
239
  private cleanupExpiredTimeouts() {
236
- // Clean up expired timeouts
237
240
  const now = this.dateProvider.now();
241
+
238
242
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
239
243
  if (now >= timedOutPeer.timeoutUntilMs) {
240
244
  this.timedOutPeers.delete(peerId);
241
245
  }
242
246
  }
247
+
248
+ for (const [id, entry] of this.failedAuthHandshakes.entries()) {
249
+ if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
250
+ this.failedAuthHandshakes.delete(id);
251
+ }
252
+ }
243
253
  }
244
254
 
245
255
  /**
@@ -303,15 +313,20 @@ export class PeerManager implements PeerManagerInterface {
303
313
  */
304
314
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
315
  const peerId = e.detail;
316
+ const peerIdStr = peerId.toString();
306
317
  this.metrics.peerDisconnected(peerId);
307
- this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
308
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
318
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
319
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
309
320
  if (validatorAddress !== undefined) {
310
321
  this.logger.info(
311
- `Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
322
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
312
323
  );
313
324
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
314
- this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
325
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
326
+ }
327
+
328
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
329
+ this.peerScoring.removePeer(peerIdStr);
315
330
  }
316
331
  }
317
332
 
@@ -713,6 +728,12 @@ export class PeerManager implements PeerManagerInterface {
713
728
  return;
714
729
  }
715
730
 
731
+ // Don't dial peers that have exceeded the auth failure threshold
732
+ if (!this.isNodeAllowedToConnect(peerId)) {
733
+ this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
734
+ return;
735
+ }
736
+
716
737
  const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
717
738
 
718
739
  this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
@@ -970,14 +991,14 @@ export class PeerManager implements PeerManagerInterface {
970
991
  const peerIdStr = peerId.toString();
971
992
 
972
993
  const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
994
+ const failureCount = (existingEntry?.count || 0) + 1;
973
995
  this.failedAuthHandshakes.set(peerIdStr, {
974
- count: (existingEntry?.count || 0) + 1,
996
+ count: failureCount,
975
997
  lastFailureTimestamp: now,
976
998
  });
977
999
 
978
1000
  const connections = this.libP2PNode.getConnections(peerId);
979
1001
  connections.forEach(conn => {
980
- // We mark the IP address
981
1002
  const address = conn.remoteAddr.nodeAddress().address;
982
1003
  const existingAddressEntry = this.failedAuthHandshakes.get(address);
983
1004
  this.failedAuthHandshakes.set(address, {
@@ -985,6 +1006,15 @@ export class PeerManager implements PeerManagerInterface {
985
1006
  lastFailureTimestamp: now,
986
1007
  });
987
1008
  });
1009
+
1010
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
1011
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
1012
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
1013
+ this.timedOutPeers.set(peerIdStr, {
1014
+ peerId: peerIdStr,
1015
+ timeoutUntilMs: now + backoffMs,
1016
+ });
1017
+ this.cachedPeers.delete(peerIdStr);
988
1018
  }
989
1019
 
990
1020
  /*
@@ -1,5 +1,6 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
3
4
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
5
  import {
5
6
  Attributes,
@@ -54,6 +55,7 @@ export enum PeerScoreState {
54
55
  // TODO: move into config / constants
55
56
  const MIN_SCORE_BEFORE_BAN = -100;
56
57
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
58
+ const SCORE_CLEANUP_THRESHOLD = 0.1;
57
59
 
58
60
  export class PeerScoring {
59
61
  private logger = createLogger('p2p:peer-scoring');
@@ -65,7 +67,11 @@ export class PeerScoring {
65
67
 
66
68
  private peerStateCounter: UpDownCounter;
67
69
 
68
- constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
70
+ constructor(
71
+ config: P2PConfig,
72
+ telemetry: TelemetryClient = getTelemetryClient(),
73
+ private readonly dateProvider: DateProvider = new DateProvider(),
74
+ ) {
69
75
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
70
76
  this.peerPenalties = {
71
77
  [PeerErrorSeverity.HighToleranceError]:
@@ -92,7 +98,7 @@ export class PeerScoring {
92
98
  }
93
99
 
94
100
  updateScore(peerId: string, scoreDelta: number): number {
95
- const currentTime = Date.now();
101
+ const currentTime = this.dateProvider.now();
96
102
  const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
97
103
  const timePassed = currentTime - lastUpdate;
98
104
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
@@ -111,19 +117,35 @@ export class PeerScoring {
111
117
  }
112
118
 
113
119
  decayAllScores(): void {
114
- const currentTime = Date.now();
120
+ const currentTime = this.dateProvider.now();
115
121
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
116
122
  const timePassed = currentTime - lastUpdate;
117
123
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
118
124
  if (decayPeriods > 0) {
119
125
  let score = this.scores.get(peerId) || 0;
120
126
  score *= Math.pow(this.decayFactor, decayPeriods);
121
- this.scores.set(peerId, score);
122
- this.lastUpdateTime.set(peerId, currentTime);
127
+ if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
128
+ this.scores.delete(peerId);
129
+ this.lastUpdateTime.delete(peerId);
130
+ } else {
131
+ this.scores.set(peerId, score);
132
+ this.lastUpdateTime.set(peerId, currentTime);
133
+ }
123
134
  }
124
135
  }
125
136
  }
126
137
 
138
+ /** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
139
+ resetAllScores(): void {
140
+ this.scores.clear();
141
+ this.lastUpdateTime.clear();
142
+ }
143
+
144
+ removePeer(peerId: string): void {
145
+ this.scores.delete(peerId);
146
+ this.lastUpdateTime.delete(peerId);
147
+ }
148
+
127
149
  getScore(peerId: string): number {
128
150
  return this.scores.get(peerId) || 0;
129
151
  }
@@ -1,6 +1,3 @@
1
- import { Fr } from '@aztec/foundation/curves/bn254';
2
- import { L2Block } from '@aztec/stdlib/block';
3
- import { MAX_L2_BLOCK_SIZE_KB } from '@aztec/stdlib/p2p';
4
1
  import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
5
2
 
6
3
  import type { PeerId } from '@libp2p/interface';
@@ -24,7 +21,6 @@ export const PING_PROTOCOL = '/aztec/req/ping/1.0.0';
24
21
  export const STATUS_PROTOCOL = '/aztec/req/status/1.0.0';
25
22
  export const GOODBYE_PROTOCOL = '/aztec/req/goodbye/1.0.0';
26
23
  export const TX_REQ_PROTOCOL = '/aztec/req/tx/1.0.0';
27
- export const BLOCK_REQ_PROTOCOL = '/aztec/req/block/1.0.0';
28
24
  export const AUTH_PROTOCOL = '/aztec/req/auth/1.0.0';
29
25
  export const BLOCK_TXS_REQ_PROTOCOL = '/aztec/req/block_txs/1.0.0';
30
26
 
@@ -33,7 +29,6 @@ export enum ReqRespSubProtocol {
33
29
  STATUS = STATUS_PROTOCOL,
34
30
  GOODBYE = GOODBYE_PROTOCOL,
35
31
  TX = TX_REQ_PROTOCOL,
36
- BLOCK = BLOCK_REQ_PROTOCOL,
37
32
  AUTH = AUTH_PROTOCOL,
38
33
  BLOCK_TXS = BLOCK_TXS_REQ_PROTOCOL,
39
34
  }
@@ -100,12 +95,29 @@ export type ReqRespSubProtocolValidators = {
100
95
  [S in ReqRespSubProtocol]: ResponseValidator<any, any>;
101
96
  };
102
97
 
98
+ /**
99
+ * Protocols that are always allowed without authentication, even when p2pAllowOnlyValidators is enabled.
100
+ * These are needed for the handshake and connection management flow.
101
+ * All other protocols require the remote peer to be authenticated.
102
+ */
103
+ export const UNAUTHENTICATED_ALLOWED_PROTOCOLS: ReadonlySet<ReqRespSubProtocol> = new Set([
104
+ ReqRespSubProtocol.PING,
105
+ ReqRespSubProtocol.STATUS,
106
+ ReqRespSubProtocol.AUTH,
107
+ ReqRespSubProtocol.GOODBYE,
108
+ ]);
109
+
110
+ /**
111
+ * Callback that checks whether a peer should be rejected from req/resp data protocols.
112
+ * Returns true if the peer should be rejected (i.e. p2pAllowOnlyValidators is on and peer is unauthenticated).
113
+ */
114
+ export type ShouldRejectPeer = (peerId: string) => boolean;
115
+
103
116
  export const DEFAULT_SUB_PROTOCOL_VALIDATORS: ReqRespSubProtocolValidators = {
104
117
  [ReqRespSubProtocol.PING]: noopValidator,
105
118
  [ReqRespSubProtocol.STATUS]: noopValidator,
106
119
  [ReqRespSubProtocol.TX]: noopValidator,
107
120
  [ReqRespSubProtocol.GOODBYE]: noopValidator,
108
- [ReqRespSubProtocol.BLOCK]: noopValidator,
109
121
  [ReqRespSubProtocol.AUTH]: noopValidator,
110
122
  [ReqRespSubProtocol.BLOCK_TXS]: noopValidator,
111
123
  };
@@ -203,10 +215,6 @@ export const subProtocolMap = {
203
215
  request: RequestableBuffer,
204
216
  response: RequestableBuffer,
205
217
  },
206
- [ReqRespSubProtocol.BLOCK]: {
207
- request: Fr, // block number
208
- response: L2Block,
209
- },
210
218
  [ReqRespSubProtocol.AUTH]: {
211
219
  request: AuthRequest,
212
220
  response: AuthResponse,
@@ -229,7 +237,6 @@ export type ExpectedResponseSizeCalculator = (requestBuffer: Buffer) => number;
229
237
  export const subProtocolSizeCalculators: Record<ReqRespSubProtocol, ExpectedResponseSizeCalculator> = {
230
238
  [ReqRespSubProtocol.TX]: calculateTxResponseSize,
231
239
  [ReqRespSubProtocol.BLOCK_TXS]: calculateBlockTxsResponseSize,
232
- [ReqRespSubProtocol.BLOCK]: () => MAX_L2_BLOCK_SIZE_KB,
233
240
  [ReqRespSubProtocol.STATUS]: () => 1,
234
241
  [ReqRespSubProtocol.PING]: () => 1,
235
242
  [ReqRespSubProtocol.AUTH]: () => 1,
@@ -264,5 +271,8 @@ export interface ReqRespInterface {
264
271
 
265
272
  updateConfig(config: Partial<P2PReqRespConfig>): void;
266
273
 
274
+ /** Sets the callback used to reject unauthenticated peers on gated req/resp protocols. */
275
+ setShouldRejectPeer(checker: ShouldRejectPeer): void;
276
+
267
277
  getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
268
278
  }
@@ -26,7 +26,6 @@ export class ReqRespMetrics {
26
26
  ReqRespSubProtocol.STATUS,
27
27
  ReqRespSubProtocol.GOODBYE,
28
28
  ReqRespSubProtocol.TX,
29
- ReqRespSubProtocol.BLOCK,
30
29
  ReqRespSubProtocol.AUTH,
31
30
  ReqRespSubProtocol.BLOCK_TXS,
32
31
  ],
@@ -5,6 +5,5 @@ export * from './ping.js';
5
5
  export * from './status.js';
6
6
  export * from './tx.js';
7
7
  export * from './goodbye.js';
8
- export * from './block.js';
9
8
  export * from './auth.js';
10
9
  export * from './block_txs/index.js';
@@ -51,9 +51,7 @@ export function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocolHandler
51
51
  * Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
52
52
  * we define Q as max number of transactions per batch, the comment explains why we use 8.
53
53
  */
54
- //TODO: (mralj) chunk size should by default be 8, this is just temporary until the protocol is implemented correctly
55
- //more info: https://github.com/AztecProtocol/aztec-packages/pull/15516#pullrequestreview-2995474321
56
- export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 1): Array<TxHashArray> {
54
+ export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 8): Array<TxHashArray> {
57
55
  return chunk(hashes, chunkSize).map(chunk => new TxHashArray(...chunk));
58
56
  }
59
57
 
@@ -97,9 +97,10 @@ export function prettyPrintRateLimitStatus(status: RateLimitStatus) {
97
97
  * 2. Individual rate limits for each peer.
98
98
  *
99
99
  * How it works:
100
- * - When a request comes in, it first checks against the global rate limit.
101
- * - If the global limit allows, it then checks against the specific peer's rate limit.
102
- * - The request is only allowed if both the global and peer-specific limits allow it.
100
+ * - When a request comes in, it first checks against the peer's individual rate limit.
101
+ * - If the peer limit allows, it then checks against the global rate limit.
102
+ * - The request is only allowed if both the peer-specific and global limits allow it.
103
+ * - Checking peer limit first ensures a rate-limited peer cannot exhaust the global quota.
103
104
  * - It automatically creates and manages rate limiters for new peers as they make requests.
104
105
  * - It periodically cleans up rate limiters for inactive peers to conserve memory.
105
106
  *
@@ -119,10 +120,6 @@ export class SubProtocolRateLimiter {
119
120
  }
120
121
 
121
122
  allow(peerId: PeerId): RateLimitStatus {
122
- if (!this.globalLimiter.allow()) {
123
- return RateLimitStatus.DeniedGlobal;
124
- }
125
-
126
123
  const peerIdStr = peerId.toString();
127
124
  let peerLimiter: PeerRateLimiter | undefined = this.peerLimiters.get(peerIdStr);
128
125
  if (!peerLimiter) {
@@ -135,10 +132,17 @@ export class SubProtocolRateLimiter {
135
132
  } else {
136
133
  peerLimiter.lastAccess = Date.now();
137
134
  }
138
- const peerLimitAllowed = peerLimiter.limiter.allow();
139
- if (!peerLimitAllowed) {
135
+
136
+ // Check peer limit first: a rate-limited peer must not consume global quota,
137
+ // otherwise one spamming peer can starve all others by exhausting the global bucket.
138
+ if (!peerLimiter.limiter.allow()) {
140
139
  return RateLimitStatus.DeniedPeer;
141
140
  }
141
+
142
+ if (!this.globalLimiter.allow()) {
143
+ return RateLimitStatus.DeniedGlobal;
144
+ }
145
+
142
146
  return RateLimitStatus.Allowed;
143
147
  }
144
148
 
@@ -42,16 +42,6 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
42
42
  quotaCount: 200,
43
43
  },
44
44
  },
45
- [ReqRespSubProtocol.BLOCK]: {
46
- peerLimit: {
47
- quotaTimeMs: 1000,
48
- quotaCount: 2,
49
- },
50
- globalLimit: {
51
- quotaTimeMs: 1000,
52
- quotaCount: 5,
53
- },
54
- },
55
45
  [ReqRespSubProtocol.GOODBYE]: {
56
46
  peerLimit: {
57
47
  quotaTimeMs: 1000,
@@ -34,7 +34,9 @@ import {
34
34
  type ReqRespSubProtocolHandlers,
35
35
  type ReqRespSubProtocolRateLimits,
36
36
  type ReqRespSubProtocolValidators,
37
+ type ShouldRejectPeer,
37
38
  type SubProtocolMap,
39
+ UNAUTHENTICATED_ALLOWED_PROTOCOLS,
38
40
  responseFromBuffer,
39
41
  subProtocolSizeCalculators,
40
42
  } from './interface.js';
@@ -72,6 +74,8 @@ export class ReqResp implements ReqRespInterface {
72
74
 
73
75
  private snappyTransform: SnappyTransform;
74
76
 
77
+ private shouldRejectPeer: ShouldRejectPeer | undefined;
78
+
75
79
  private metrics: ReqRespMetrics;
76
80
 
77
81
  constructor(
@@ -108,6 +112,10 @@ export class ReqResp implements ReqRespInterface {
108
112
  }
109
113
  }
110
114
 
115
+ public setShouldRejectPeer(checker: ShouldRejectPeer): void {
116
+ this.shouldRejectPeer = checker;
117
+ }
118
+
111
119
  get tracer() {
112
120
  return this.metrics.tracer;
113
121
  }
@@ -462,7 +470,7 @@ export class ReqResp implements ReqRespInterface {
462
470
  );
463
471
  return resp;
464
472
  } catch (e: any) {
465
- this.logger.warn(`SUBPROTOCOL: ${subProtocol}\n`, e);
473
+ this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
466
474
  // On error we immediately abort the stream, this is preferred way,
467
475
  // because it signals to the sender that error happened, whereas
468
476
  // closing the stream only closes our side and is much slower
@@ -596,6 +604,15 @@ export class ReqResp implements ReqRespInterface {
596
604
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
597
605
  }
598
606
 
607
+ // When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
608
+ if (
609
+ !UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
610
+ (this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
611
+ ) {
612
+ this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
613
+ throw new ReqRespStatusError(ReqRespStatus.FAILURE);
614
+ }
615
+
599
616
  await this.processStream(protocol, incomingStream);
600
617
  } catch (err: any) {
601
618
  this.metrics.recordResponseError(protocol);
@@ -117,7 +117,12 @@ export interface P2PService {
117
117
  // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
118
118
  registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
119
119
 
120
- registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
120
+ registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
121
+
122
+ registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
123
+
124
+ /** Fires the all-nodes checkpoint callback for our own proposal (gossipsub doesn't deliver own messages). */
125
+ notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void>;
121
126
 
122
127
  /**
123
128
  * Registers a callback invoked when a duplicate proposal is detected (equivocation).