@aztec/p2p 0.0.1-commit.9ef841308 → 0.0.1-commit.a89ec08

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 (207) hide show
  1. package/dest/client/factory.d.ts +2 -2
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +1 -2
  4. package/dest/client/p2p_client.d.ts +1 -1
  5. package/dest/client/p2p_client.d.ts.map +1 -1
  6. package/dest/client/p2p_client.js +4 -6
  7. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -17
  8. package/dest/config.d.ts +6 -6
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +6 -6
  11. package/dest/index.d.ts +2 -1
  12. package/dest/index.d.ts.map +1 -1
  13. package/dest/index.js +1 -0
  14. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -4
  15. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  16. package/dest/mem_pools/attestation_pool/attestation_pool.js +4 -8
  17. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  18. package/dest/mem_pools/index.d.ts +2 -1
  19. package/dest/mem_pools/index.d.ts.map +1 -1
  20. package/dest/mem_pools/instrumentation.d.ts +2 -4
  21. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  22. package/dest/mem_pools/instrumentation.js +14 -16
  23. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +125 -0
  24. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
  25. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +596 -0
  26. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  27. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  28. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  29. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  30. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  31. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  32. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  33. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  34. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +123 -0
  35. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  36. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  37. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  38. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  39. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  40. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  41. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  42. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  43. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  44. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  45. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  46. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  47. package/dest/mem_pools/tx_pool/index.d.ts +3 -0
  48. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
  49. package/dest/mem_pools/tx_pool/index.js +2 -0
  50. package/dest/mem_pools/tx_pool/priority.d.ts +12 -0
  51. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
  52. package/dest/mem_pools/tx_pool/priority.js +15 -0
  53. package/dest/mem_pools/tx_pool/tx_pool.d.ts +127 -0
  54. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
  55. package/dest/mem_pools/tx_pool/tx_pool.js +3 -0
  56. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
  57. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +402 -0
  59. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +5 -7
  60. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/interfaces.js +0 -1
  62. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +6 -5
  63. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +1 -5
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +43 -26
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +1 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +0 -3
  71. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -2
  72. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1 -18
  74. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  75. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/attestation_validator/attestation_validator.js +4 -5
  77. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  78. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  79. package/dest/msg_validators/clock_tolerance.js +3 -4
  80. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +1 -1
  81. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  82. package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
  83. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  84. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  86. package/dest/services/discv5/discV5_service.d.ts +1 -1
  87. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  88. package/dest/services/discv5/discV5_service.js +2 -4
  89. package/dest/services/libp2p/libp2p_service.d.ts +9 -7
  90. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  91. package/dest/services/libp2p/libp2p_service.js +59 -137
  92. package/dest/services/peer-manager/metrics.d.ts +1 -3
  93. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  94. package/dest/services/peer-manager/metrics.js +0 -6
  95. package/dest/services/peer-manager/peer_manager.d.ts +2 -6
  96. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  97. package/dest/services/peer-manager/peer_manager.js +9 -24
  98. package/dest/services/peer-manager/peer_scoring.d.ts +2 -5
  99. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  100. package/dest/services/peer-manager/peer_scoring.js +10 -28
  101. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +8 -11
  102. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  103. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +101 -82
  104. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -3
  105. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  106. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +4 -5
  107. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  108. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +7 -13
  109. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +11 -19
  110. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  111. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +15 -52
  112. package/dest/services/reqresp/reqresp.d.ts +1 -1
  113. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  114. package/dest/services/reqresp/reqresp.js +3 -4
  115. package/dest/services/service.d.ts +1 -7
  116. package/dest/services/service.d.ts.map +1 -1
  117. package/dest/services/tx_collection/fast_tx_collection.d.ts +4 -1
  118. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  119. package/dest/services/tx_collection/fast_tx_collection.js +73 -57
  120. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  121. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  122. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  123. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
  124. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  125. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  126. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  127. package/dest/services/tx_collection/tx_collection.d.ts +6 -3
  128. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  129. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  130. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  131. package/dest/test-helpers/mock-pubsub.d.ts +1 -6
  132. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  133. package/dest/test-helpers/mock-pubsub.js +1 -9
  134. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  135. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  136. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  137. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  138. package/dest/test-helpers/testbench-utils.js +2 -20
  139. package/dest/testbench/p2p_client_testbench_worker.js +15 -44
  140. package/dest/testbench/worker_client_manager.d.ts +1 -1
  141. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  142. package/dest/testbench/worker_client_manager.js +2 -2
  143. package/dest/util.d.ts +4 -9
  144. package/dest/util.d.ts.map +1 -1
  145. package/dest/util.js +9 -2
  146. package/package.json +14 -14
  147. package/src/client/factory.ts +2 -3
  148. package/src/client/p2p_client.ts +4 -6
  149. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +9 -19
  150. package/src/config.ts +10 -10
  151. package/src/index.ts +1 -0
  152. package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -8
  153. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  154. package/src/mem_pools/index.ts +3 -0
  155. package/src/mem_pools/instrumentation.ts +13 -17
  156. package/src/mem_pools/tx_pool/README.md +270 -0
  157. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +746 -0
  158. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  159. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  160. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +163 -0
  161. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  162. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  163. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  164. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  165. package/src/mem_pools/tx_pool/index.ts +2 -0
  166. package/src/mem_pools/tx_pool/priority.ts +20 -0
  167. package/src/mem_pools/tx_pool/tx_pool.ts +141 -0
  168. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +321 -0
  169. package/src/mem_pools/tx_pool_v2/interfaces.ts +4 -7
  170. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +5 -11
  171. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -29
  172. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +0 -3
  173. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1 -19
  174. package/src/msg_validators/attestation_validator/README.md +1 -1
  175. package/src/msg_validators/attestation_validator/attestation_validator.ts +4 -5
  176. package/src/msg_validators/clock_tolerance.ts +3 -4
  177. package/src/msg_validators/proposal_validator/README.md +4 -4
  178. package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -6
  179. package/src/msg_validators/tx_validator/metadata_validator.ts +4 -12
  180. package/src/services/discv5/discV5_service.ts +2 -4
  181. package/src/services/libp2p/libp2p_service.ts +71 -135
  182. package/src/services/peer-manager/metrics.ts +0 -7
  183. package/src/services/peer-manager/peer_manager.ts +9 -28
  184. package/src/services/peer-manager/peer_scoring.ts +5 -21
  185. package/src/services/reqresp/batch-tx-requester/README.md +7 -46
  186. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +111 -78
  187. package/src/services/reqresp/batch-tx-requester/interface.ts +1 -2
  188. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +6 -13
  189. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +24 -68
  190. package/src/services/reqresp/reqresp.ts +3 -5
  191. package/src/services/service.ts +0 -7
  192. package/src/services/tx_collection/fast_tx_collection.ts +83 -57
  193. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  194. package/src/services/tx_collection/proposal_tx_collector.ts +13 -8
  195. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  196. package/src/services/tx_collection/tx_collection.ts +5 -3
  197. package/src/test-helpers/make-test-p2p-clients.ts +1 -1
  198. package/src/test-helpers/mock-pubsub.ts +0 -9
  199. package/src/test-helpers/reqresp-nodes.ts +1 -1
  200. package/src/test-helpers/testbench-utils.ts +3 -28
  201. package/src/testbench/p2p_client_testbench_worker.ts +15 -44
  202. package/src/testbench/worker_client_manager.ts +2 -2
  203. package/src/util.ts +13 -9
  204. package/dest/services/tx_collection/request_tracker.d.ts +0 -53
  205. package/dest/services/tx_collection/request_tracker.d.ts.map +0 -1
  206. package/dest/services/tx_collection/request_tracker.js +0 -84
  207. package/src/services/tx_collection/request_tracker.ts +0 -127
@@ -18,6 +18,7 @@ import {
18
18
  type CheckpointProposalCore,
19
19
  type Gossipable,
20
20
  P2PMessage,
21
+ type ValidationResult as P2PValidationResult,
21
22
  PeerErrorSeverity,
22
23
  PeerErrorSeverityByHarshness,
23
24
  TopicType,
@@ -51,10 +52,9 @@ import { yamux } from '@chainsafe/libp2p-yamux';
51
52
  import { bootstrap } from '@libp2p/bootstrap';
52
53
  import { identify } from '@libp2p/identify';
53
54
  import { type Message, type MultiaddrConnection, type PeerId, TopicValidatorResult } from '@libp2p/interface';
54
- import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
55
+ import type { ConnectionManager } from '@libp2p/interface-internal';
55
56
  import { mplex } from '@libp2p/mplex';
56
57
  import { tcp } from '@libp2p/tcp';
57
- import { multiaddr } from '@multiformats/multiaddr';
58
58
  import { ENR } from '@nethermindeth/enr';
59
59
  import { createLibp2p } from 'libp2p';
60
60
 
@@ -131,7 +131,7 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
131
131
  // REFACTOR: Unify with the type above
132
132
  type ReceivedMessageValidationResult<T, M = undefined> =
133
133
  | { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
134
- | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
134
+ | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
135
135
 
136
136
  /**
137
137
  * Lib P2P implementation of the P2PService interface.
@@ -175,10 +175,6 @@ export class LibP2PService extends WithTracer implements P2PService {
175
175
  private checkpointReceivedCallback: P2PCheckpointReceivedCallback;
176
176
 
177
177
  private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
178
- private ipChangedHandler?: (ip: string) => void;
179
-
180
- /** Discovered public IP address (set when queryForIp is enabled and no static IP was configured). */
181
- private discoveredP2pIp?: string;
182
178
 
183
179
  private instrumentation: P2PInstrumentation;
184
180
 
@@ -447,9 +443,8 @@ export class LibP2PService extends WithTracer implements P2PService {
447
443
  topics: topicScoreParams,
448
444
  }),
449
445
  }) as (components: GossipSubComponents) => GossipSub,
450
- components: (components: { connectionManager: ConnectionManager; addressManager: AddressManager }) => ({
446
+ components: (components: { connectionManager: ConnectionManager }) => ({
451
447
  connectionManager: components.connectionManager,
452
- addressManager: components.addressManager,
453
448
  }),
454
449
  },
455
450
  logger: createLibp2pComponentLogger(logger.module, logger.getBindings()),
@@ -508,10 +503,10 @@ export class LibP2PService extends WithTracer implements P2PService {
508
503
 
509
504
  // Get listen & announce addresses for logging
510
505
  const { p2pIp, p2pPort } = this.config;
511
- if (!p2pIp && !this.config.queryForIp) {
506
+ if (!p2pIp) {
512
507
  throw new Error('Announce address not provided.');
513
508
  }
514
- const announceTcpMultiaddr = p2pIp ? convertToMultiaddr(p2pIp, p2pPort, 'tcp') : undefined;
509
+ const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp');
515
510
 
516
511
  // Create request response protocol handlers
517
512
  const txHandler = reqRespTxHandler(this.mempools);
@@ -565,31 +560,6 @@ export class LibP2PService extends WithTracer implements P2PService {
565
560
  if (!this.config.p2pDiscoveryDisabled) {
566
561
  await this.peerDiscoveryService.start();
567
562
  }
568
-
569
- // When queryForIp is enabled and no static IP was configured, bridge discv5 IP discovery to libp2p.
570
- // Discv5 discovers our public IP via peer WHOAREYOU exchanges (enrUpdate=true) and emits 'ip:changed'.
571
- // We confirm the discovered address in the libp2p AddressManager so it appears in getMultiaddrs()
572
- // and is pushed to all connected peers via the identify protocol.
573
- if (this.config.queryForIp && !p2pIp) {
574
- this.ipChangedHandler = (ip: string) => {
575
- const addressManager = this.node.services.components.addressManager;
576
- const newAddr = multiaddr(convertToMultiaddr(ip, this.config.p2pPort, 'tcp'));
577
-
578
- // Remove old discovered IP if one exists
579
- if (this.discoveredP2pIp) {
580
- const oldAddr = multiaddr(convertToMultiaddr(this.discoveredP2pIp, this.config.p2pPort, 'tcp'));
581
- addressManager.removeObservedAddr(oldAddr);
582
- }
583
-
584
- addressManager.addObservedAddr(newAddr);
585
- addressManager.confirmObservedAddr(newAddr);
586
- // Store discovered IP
587
- this.discoveredP2pIp = ip;
588
- this.logger.info('Public IP discovered via discv5', { ip });
589
- };
590
- this.peerDiscoveryService.on('ip:changed', this.ipChangedHandler);
591
- }
592
-
593
563
  this.discoveryRunningPromise = new RunningPromise(
594
564
  async () => {
595
565
  await this.peerManager.heartbeat();
@@ -602,7 +572,7 @@ export class LibP2PService extends WithTracer implements P2PService {
602
572
  this.logger.info(`Started P2P service`, {
603
573
  listen: this.config.listenAddress,
604
574
  port: this.config.p2pPort,
605
- announce: announceTcpMultiaddr ?? 'pending (queryForIp=true)',
575
+ announce: announceTcpMultiaddr,
606
576
  peerId: this.node.peerId.toString(),
607
577
  });
608
578
  }
@@ -615,12 +585,6 @@ export class LibP2PService extends WithTracer implements P2PService {
615
585
  // Remove gossip sub listener
616
586
  this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.gossipSubEventHandler);
617
587
 
618
- // Remove ip:changed listener if registered
619
- if (this.ipChangedHandler) {
620
- this.peerDiscoveryService.off('ip:changed', this.ipChangedHandler);
621
- this.ipChangedHandler = undefined;
622
- }
623
-
624
588
  // Stop peer manager
625
589
  this.logger.debug('Stopping peer manager...');
626
590
  await this.peerManager.stop();
@@ -790,9 +754,6 @@ export class LibP2PService extends WithTracer implements P2PService {
790
754
  if (!validator || !validator.addMessage(msgId)) {
791
755
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
792
756
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
793
- if (topicType === TopicType.tx) {
794
- this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
795
- }
796
757
  return { result: false, topicType };
797
758
  }
798
759
 
@@ -919,56 +880,30 @@ export class LibP2PService extends WithTracer implements P2PService {
919
880
  source: PeerId,
920
881
  topicType: TopicType,
921
882
  ): Promise<ReceivedMessageValidationResult<T, M>> {
922
- // Default to reject result with a penalty if validation function throws an error
923
- let resultAndObj: ReceivedMessageValidationResult<T, M> = {
924
- result: TopicValidatorResult.Reject,
925
- severity: PeerErrorSeverity.MidToleranceError,
926
- };
883
+ let resultAndObj: ReceivedMessageValidationResult<T, M> = { result: TopicValidatorResult.Reject };
927
884
  const timer = new Timer();
928
885
  try {
929
886
  resultAndObj = await validationFunc();
930
887
  } catch (err) {
931
- this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
932
- }
933
-
934
- if (resultAndObj.result === TopicValidatorResult.Accept) {
935
- this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
936
- this.instrumentation.recordMessageValidation(topicType, timer);
937
- } else if (resultAndObj.result === TopicValidatorResult.Reject) {
938
- this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
888
+ this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
889
+ this.logger.error(`Error deserializing and validating gossipsub message`, err, {
939
890
  msgId,
940
891
  source: source.toString(),
941
892
  topicType,
942
- severity: resultAndObj.severity,
943
893
  });
944
- this.peerManager.penalizePeer(source, resultAndObj.severity);
945
- } else {
946
- this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
894
+ }
895
+
896
+ if (resultAndObj.result === TopicValidatorResult.Accept) {
897
+ this.instrumentation.recordMessageValidation(topicType, timer);
947
898
  }
948
899
 
949
900
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
950
901
  return resultAndObj;
951
902
  }
952
903
 
953
- private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
954
- try {
955
- return deserializeFunc();
956
- } catch (err) {
957
- this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
958
- err,
959
- msgId,
960
- source: source.toString(),
961
- });
962
- return undefined;
963
- }
964
- }
965
-
966
904
  protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
967
905
  const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
968
- const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
969
- if (!tx) {
970
- return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
971
- }
906
+ const tx = Tx.fromBuffer(payloadData);
972
907
 
973
908
  const currentBlockNumber = await this.archiver.getBlockNumber();
974
909
  const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
@@ -988,20 +923,13 @@ export class LibP2PService extends WithTracer implements P2PService {
988
923
  severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
989
924
  }
990
925
 
991
- this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
992
- validator: name,
993
- severity,
994
- source: source.toString(),
995
- });
996
- return { result: TopicValidatorResult.Reject, severity };
926
+ this.peerManager.penalizePeer(source, severity);
927
+ return { result: TopicValidatorResult.Reject };
997
928
  }
998
929
 
999
930
  // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
1000
931
  const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
1001
932
  if (canAdd === 'ignored') {
1002
- this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
1003
- source: source.toString(),
1004
- });
1005
933
  return { result: TopicValidatorResult.Ignore, obj: tx };
1006
934
  }
1007
935
 
@@ -1009,13 +937,9 @@ export class LibP2PService extends WithTracer implements P2PService {
1009
937
  const secondStageValidators = this.createSecondStageMessageValidators();
1010
938
  const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
1011
939
  if (!secondStageOutcome.allPassed) {
1012
- const { severity, name } = secondStageOutcome.failure;
1013
- this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
1014
- validator: name,
1015
- severity,
1016
- source: source.toString(),
1017
- });
1018
- return { result: TopicValidatorResult.Reject, severity };
940
+ const { severity } = secondStageOutcome.failure;
941
+ this.peerManager.penalizePeer(source, severity);
942
+ return { result: TopicValidatorResult.Reject };
1019
943
  }
1020
944
 
1021
945
  // Pool add: persist the tx
@@ -1025,7 +949,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1025
949
  const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
1026
950
  const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
1027
951
 
1028
- this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
952
+ this.logger.trace(`Validate propagated tx`, {
1029
953
  wasAccepted,
1030
954
  wasIgnored,
1031
955
  [Attributes.P2P_ID]: source.toString(),
@@ -1040,7 +964,8 @@ export class LibP2PService extends WithTracer implements P2PService {
1040
964
  source: source.toString(),
1041
965
  txHash: txHash.toString(),
1042
966
  });
1043
- return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
967
+ this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
968
+ return { result: TopicValidatorResult.Reject };
1044
969
  }
1045
970
  };
1046
971
 
@@ -1070,16 +995,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1070
995
  source: PeerId,
1071
996
  ): Promise<void> {
1072
997
  const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
1073
- () => {
1074
- const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1075
- if (!attestation) {
1076
- return Promise.resolve({
1077
- result: TopicValidatorResult.Reject,
1078
- severity: PeerErrorSeverity.LowToleranceError,
1079
- });
1080
- }
1081
- return this.validateAndStoreCheckpointAttestation(source, attestation);
1082
- },
998
+ () => this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)),
1083
999
  msgId,
1084
1000
  source,
1085
1001
  TopicType.checkpoint_attestation,
@@ -1112,7 +1028,8 @@ export class LibP2PService extends WithTracer implements P2PService {
1112
1028
 
1113
1029
  if (validationResult.result === 'reject') {
1114
1030
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1115
- return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1031
+ this.peerManager.penalizePeer(peerId, validationResult.severity);
1032
+ return { result: TopicValidatorResult.Reject };
1116
1033
  }
1117
1034
 
1118
1035
  if (validationResult.result === 'ignore') {
@@ -1138,16 +1055,16 @@ export class LibP2PService extends WithTracer implements P2PService {
1138
1055
  return { result: TopicValidatorResult.Ignore, obj: attestation };
1139
1056
  }
1140
1057
 
1141
- // Could not add (cap reached for signer), penalize and do not re-broadcast
1058
+ // Could not add (cap reached for signer), no need to re-broadcast
1142
1059
  if (!added) {
1143
- this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1060
+ this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1144
1061
  slot: slot.toString(),
1145
1062
  archive: attestation.archive.toString(),
1146
1063
  source: peerId.toString(),
1147
1064
  attester: attestation.getSender()?.toString(),
1148
1065
  count,
1149
1066
  });
1150
- return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
1067
+ return { result: TopicValidatorResult.Ignore, obj: attestation };
1151
1068
  }
1152
1069
 
1153
1070
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1202,7 +1119,8 @@ export class LibP2PService extends WithTracer implements P2PService {
1202
1119
 
1203
1120
  if (validationResult.result === 'reject') {
1204
1121
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1205
- return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1122
+ this.peerManager.penalizePeer(peerId, validationResult.severity);
1123
+ return { result: TopicValidatorResult.Reject };
1206
1124
  }
1207
1125
 
1208
1126
  if (validationResult.result === 'ignore') {
@@ -1226,6 +1144,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1226
1144
 
1227
1145
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1228
1146
  if (!added) {
1147
+ this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1229
1148
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1230
1149
  ...block.toBlockInfo(),
1231
1150
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1233,11 +1152,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1233
1152
  proposer: block.getSender()?.toString(),
1234
1153
  source: peerId.toString(),
1235
1154
  });
1236
- return {
1237
- result: TopicValidatorResult.Reject,
1238
- metadata: { isEquivocated },
1239
- severity: PeerErrorSeverity.HighToleranceError,
1240
- };
1155
+ return { result: TopicValidatorResult.Reject, metadata: { isEquivocated } };
1241
1156
  }
1242
1157
 
1243
1158
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1330,7 +1245,8 @@ export class LibP2PService extends WithTracer implements P2PService {
1330
1245
 
1331
1246
  if (validationResult.result === 'reject') {
1332
1247
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1333
- return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1248
+ this.peerManager.penalizePeer(peerId, validationResult.severity);
1249
+ return { result: TopicValidatorResult.Reject };
1334
1250
  }
1335
1251
 
1336
1252
  if (validationResult.result === 'ignore') {
@@ -1345,21 +1261,20 @@ export class LibP2PService extends WithTracer implements P2PService {
1345
1261
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1346
1262
  [Attributes.P2P_ID]: peerId.toString(),
1347
1263
  });
1348
- const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1349
- const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1350
- if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1264
+ const {
1265
+ result,
1266
+ obj,
1267
+ metadata: { isEquivocated } = {},
1268
+ } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1269
+ if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1351
1270
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1352
1271
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1353
1272
  [Attributes.P2P_ID]: peerId.toString(),
1354
1273
  isEquivocated,
1355
- result: blockProposalResult.result,
1274
+ result,
1356
1275
  });
1357
- return {
1358
- result: TopicValidatorResult.Reject,
1359
- severity:
1360
- 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
1361
- };
1362
- } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1276
+ return { result: TopicValidatorResult.Reject };
1277
+ } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1363
1278
  processBlock = true;
1364
1279
  }
1365
1280
  }
@@ -1386,17 +1301,13 @@ export class LibP2PService extends WithTracer implements P2PService {
1386
1301
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1387
1302
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1388
1303
  if (!added) {
1304
+ this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1389
1305
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1390
1306
  ...checkpoint.toCheckpointInfo(),
1391
1307
  count,
1392
1308
  source: peerId.toString(),
1393
1309
  });
1394
- return {
1395
- result: TopicValidatorResult.Reject,
1396
- obj: checkpoint,
1397
- metadata: { isEquivocated, processBlock },
1398
- severity: PeerErrorSeverity.HighToleranceError,
1399
- };
1310
+ return { result: TopicValidatorResult.Reject, obj: checkpoint, metadata: { isEquivocated, processBlock } };
1400
1311
  }
1401
1312
 
1402
1313
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1820,6 +1731,31 @@ export class LibP2PService extends WithTracer implements P2PService {
1820
1731
  return PeerErrorSeverity.HighToleranceError;
1821
1732
  }
1822
1733
 
1734
+ /**
1735
+ * Validate a checkpoint attestation.
1736
+ *
1737
+ * @param attestation - The checkpoint attestation to validate.
1738
+ * @returns True if the checkpoint attestation is valid, false otherwise.
1739
+ */
1740
+ @trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
1741
+ [Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
1742
+ [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
1743
+ [Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
1744
+ }))
1745
+ public async validateCheckpointAttestation(
1746
+ peerId: PeerId,
1747
+ attestation: CheckpointAttestation,
1748
+ ): Promise<P2PValidationResult> {
1749
+ const result = await this.checkpointAttestationValidator.validate(attestation);
1750
+
1751
+ if (result.result === 'reject') {
1752
+ this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1753
+ this.peerManager.penalizePeer(peerId, result.severity);
1754
+ }
1755
+
1756
+ return result;
1757
+ }
1758
+
1823
1759
  public getPeerScore(peerId: PeerId): number {
1824
1760
  return this.node.services.pubsub.score.score(peerId.toString());
1825
1761
  }
@@ -18,7 +18,6 @@ export class PeerManagerMetrics {
18
18
  private sentGoodbyes: UpDownCounter;
19
19
  private receivedGoodbyes: UpDownCounter;
20
20
  private peerCount: Gauge;
21
- private healthyPeerCount: Gauge;
22
21
  private lowScoreDisconnects: UpDownCounter;
23
22
  private peerConnectionDuration: Histogram;
24
23
 
@@ -50,7 +49,6 @@ export class PeerManagerMetrics {
50
49
  goodbyeReasonAttrs,
51
50
  );
52
51
  this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
53
- this.healthyPeerCount = meter.createGauge(Metrics.PEER_MANAGER_HEALTHY_PEER_COUNT);
54
52
  this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
55
53
  [Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
56
54
  });
@@ -69,10 +67,6 @@ export class PeerManagerMetrics {
69
67
  this.peerCount.record(count);
70
68
  }
71
69
 
72
- public recordHealthyPeerCount(count: number) {
73
- this.healthyPeerCount.record(count);
74
- }
75
-
76
70
  public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
77
71
  this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
78
72
  }
@@ -85,7 +79,6 @@ export class PeerManagerMetrics {
85
79
  const connectedAt = this.peerConnectedAt.get(id.toString());
86
80
  if (connectedAt) {
87
81
  this.peerConnectionDuration.record(Date.now() - connectedAt);
88
- this.peerConnectedAt.delete(id.toString());
89
82
  }
90
83
  }
91
84
  }
@@ -32,7 +32,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
32
32
  const MAX_DIAL_ATTEMPTS = 3;
33
33
  const MAX_CACHED_PEERS = 100;
34
34
  const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
35
- const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
35
+ const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
36
36
  const GOODBYE_DIAL_TIMEOUT_MS = 1000;
37
37
  const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
38
38
 
@@ -226,30 +226,20 @@ export class PeerManager implements PeerManagerInterface {
226
226
  }
227
227
 
228
228
  /**
229
- * Cleans up expired timeouts and stale failed-auth-handshake entries.
229
+ * Cleans up expired timeouts.
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.
238
234
  */
239
235
  private cleanupExpiredTimeouts() {
236
+ // Clean up expired timeouts
240
237
  const now = this.dateProvider.now();
241
-
242
238
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
243
239
  if (now >= timedOutPeer.timeoutUntilMs) {
244
240
  this.timedOutPeers.delete(peerId);
245
241
  }
246
242
  }
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
- }
253
243
  }
254
244
 
255
245
  /**
@@ -313,20 +303,15 @@ export class PeerManager implements PeerManagerInterface {
313
303
  */
314
304
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
315
305
  const peerId = e.detail;
316
- const peerIdStr = peerId.toString();
317
306
  this.metrics.peerDisconnected(peerId);
318
- this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
319
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
307
+ this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
308
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
320
309
  if (validatorAddress !== undefined) {
321
310
  this.logger.info(
322
- `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
311
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
323
312
  );
324
313
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
325
- this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
326
- }
327
-
328
- if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
329
- this.peerScoring.removePeer(peerIdStr);
314
+ this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
330
315
  }
331
316
  }
332
317
 
@@ -530,8 +515,7 @@ export class PeerManager implements PeerManagerInterface {
530
515
  ...this.peerScoring.getStats(),
531
516
  });
532
517
 
533
- this.metrics.recordPeerCount(connections.length);
534
- this.metrics.recordHealthyPeerCount(healthyConnections.length);
518
+ this.metrics.recordPeerCount(healthyConnections.length);
535
519
 
536
520
  // Exit if no peers to connect
537
521
  if (peersToConnect <= 0) {
@@ -791,8 +775,7 @@ export class PeerManager implements PeerManagerInterface {
791
775
  // Add to timed out peers
792
776
  this.timedOutPeers.set(id, {
793
777
  peerId: id,
794
- timeoutUntilMs:
795
- this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
778
+ timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
796
779
  });
797
780
  }
798
781
  }
@@ -954,8 +937,6 @@ export class PeerManager implements PeerManagerInterface {
954
937
  `Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
955
938
  { ...logData, address: sender.toString() },
956
939
  );
957
- this.markAuthHandshakeFailed(peerId);
958
- this.markPeerForDisconnect(peerId);
959
940
  return;
960
941
  }
961
942
 
@@ -1,6 +1,5 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
- import { DateProvider } from '@aztec/foundation/timer';
4
3
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
5
4
  import {
6
5
  Attributes,
@@ -55,7 +54,6 @@ export enum PeerScoreState {
55
54
  // TODO: move into config / constants
56
55
  const MIN_SCORE_BEFORE_BAN = -100;
57
56
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
58
- const SCORE_CLEANUP_THRESHOLD = 0.1;
59
57
 
60
58
  export class PeerScoring {
61
59
  private logger = createLogger('p2p:peer-scoring');
@@ -67,11 +65,7 @@ export class PeerScoring {
67
65
 
68
66
  private peerStateCounter: UpDownCounter;
69
67
 
70
- constructor(
71
- config: P2PConfig,
72
- telemetry: TelemetryClient = getTelemetryClient(),
73
- private readonly dateProvider: DateProvider = new DateProvider(),
74
- ) {
68
+ constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
75
69
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
76
70
  this.peerPenalties = {
77
71
  [PeerErrorSeverity.HighToleranceError]:
@@ -98,7 +92,7 @@ export class PeerScoring {
98
92
  }
99
93
 
100
94
  updateScore(peerId: string, scoreDelta: number): number {
101
- const currentTime = this.dateProvider.now();
95
+ const currentTime = Date.now();
102
96
  const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
103
97
  const timePassed = currentTime - lastUpdate;
104
98
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
@@ -117,29 +111,19 @@ export class PeerScoring {
117
111
  }
118
112
 
119
113
  decayAllScores(): void {
120
- const currentTime = this.dateProvider.now();
114
+ const currentTime = Date.now();
121
115
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
122
116
  const timePassed = currentTime - lastUpdate;
123
117
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
124
118
  if (decayPeriods > 0) {
125
119
  let score = this.scores.get(peerId) || 0;
126
120
  score *= Math.pow(this.decayFactor, decayPeriods);
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
- }
121
+ this.scores.set(peerId, score);
122
+ this.lastUpdateTime.set(peerId, currentTime);
134
123
  }
135
124
  }
136
125
  }
137
126
 
138
- removePeer(peerId: string): void {
139
- this.scores.delete(peerId);
140
- this.lastUpdateTime.delete(peerId);
141
- }
142
-
143
127
  getScore(peerId: string): number {
144
128
  return this.scores.get(peerId) || 0;
145
129
  }