@aztec/p2p 0.0.1-commit.ffe5b04ea → 0.0.1-commit.fff30aa

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 (144) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +2 -2
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +23 -11
  5. package/dest/client/p2p_client.d.ts +1 -1
  6. package/dest/client/p2p_client.d.ts.map +1 -1
  7. package/dest/client/p2p_client.js +16 -6
  8. package/dest/config.d.ts +15 -3
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +21 -1
  11. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +1 -1
  12. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  13. package/dest/mem_pools/attestation_pool/attestation_pool.js +1 -5
  14. package/dest/mem_pools/instrumentation.d.ts +2 -4
  15. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  16. package/dest/mem_pools/instrumentation.js +14 -16
  17. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  18. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  19. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +2 -1
  20. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  21. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  22. package/dest/mem_pools/tx_pool/priority.js +4 -4
  23. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  24. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  26. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  27. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  28. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  29. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +3 -3
  30. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/interfaces.js +0 -1
  32. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +14 -6
  33. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +7 -1
  35. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  36. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +43 -26
  38. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  39. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -3
  41. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -2
  42. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +11 -14
  44. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  45. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  46. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  47. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  48. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  49. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  50. package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
  51. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  52. package/dest/msg_validators/tx_validator/factory.js +36 -10
  53. package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
  54. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  55. package/dest/msg_validators/tx_validator/gas_validator.js +39 -9
  56. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  57. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  58. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  59. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  60. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  61. package/dest/msg_validators/tx_validator/phases_validator.js +28 -1
  62. package/dest/services/encoding.d.ts +5 -1
  63. package/dest/services/encoding.d.ts.map +1 -1
  64. package/dest/services/encoding.js +7 -1
  65. package/dest/services/libp2p/libp2p_service.d.ts +1 -1
  66. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  67. package/dest/services/libp2p/libp2p_service.js +15 -5
  68. package/dest/services/peer-manager/metrics.d.ts +1 -3
  69. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  70. package/dest/services/peer-manager/metrics.js +0 -6
  71. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  72. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  73. package/dest/services/peer-manager/peer_manager.js +1 -2
  74. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -1
  75. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  76. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +37 -14
  77. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +11 -17
  78. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  79. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +15 -49
  80. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  81. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  82. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  83. package/dest/services/reqresp/reqresp.d.ts +1 -1
  84. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  85. package/dest/services/reqresp/reqresp.js +18 -11
  86. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  87. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  88. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  89. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  90. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  91. package/dest/services/tx_collection/tx_source.js +9 -7
  92. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  93. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  94. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  95. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  96. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  97. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  98. package/dest/test-helpers/testbench-utils.js +2 -1
  99. package/dest/testbench/worker_client_manager.d.ts +1 -1
  100. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  101. package/dest/testbench/worker_client_manager.js +1 -2
  102. package/dest/util.d.ts +1 -1
  103. package/package.json +14 -14
  104. package/src/client/factory.ts +42 -15
  105. package/src/client/p2p_client.ts +16 -8
  106. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +1 -1
  107. package/src/config.ts +35 -2
  108. package/src/mem_pools/attestation_pool/attestation_pool.ts +4 -5
  109. package/src/mem_pools/instrumentation.ts +13 -17
  110. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  111. package/src/mem_pools/tx_pool/priority.ts +4 -4
  112. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  113. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  114. package/src/mem_pools/tx_pool_v2/interfaces.ts +2 -3
  115. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +15 -5
  116. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -29
  117. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -4
  118. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +12 -15
  119. package/src/msg_validators/attestation_validator/README.md +49 -0
  120. package/src/msg_validators/proposal_validator/README.md +123 -0
  121. package/src/msg_validators/tx_validator/README.md +5 -1
  122. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  123. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  124. package/src/msg_validators/tx_validator/factory.ts +43 -3
  125. package/src/msg_validators/tx_validator/gas_validator.ts +41 -8
  126. package/src/msg_validators/tx_validator/metadata_validator.ts +4 -12
  127. package/src/msg_validators/tx_validator/phases_validator.ts +31 -1
  128. package/src/services/encoding.ts +9 -1
  129. package/src/services/libp2p/libp2p_service.ts +16 -5
  130. package/src/services/peer-manager/metrics.ts +0 -7
  131. package/src/services/peer-manager/peer_manager.ts +1 -2
  132. package/src/services/reqresp/README.md +229 -0
  133. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +42 -14
  134. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +24 -63
  135. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  136. package/src/services/reqresp/reqresp.ts +20 -14
  137. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  138. package/src/services/tx_collection/tx_source.ts +8 -7
  139. package/src/test-helpers/make-test-p2p-clients.ts +1 -1
  140. package/src/test-helpers/reqresp-nodes.ts +1 -1
  141. package/src/test-helpers/testbench-utils.ts +1 -0
  142. package/src/testbench/p2p_client_testbench_worker.ts +1 -1
  143. package/src/testbench/worker_client_manager.ts +1 -2
  144. package/src/util.ts +1 -1
@@ -1,15 +1,14 @@
1
1
  import type { DateProvider } from '@aztec/foundation/timer';
2
2
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
3
  import type { PeerId } from '@libp2p/interface';
4
- import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
5
4
  import type { IPeerPenalizer } from './interface.js';
6
5
  export declare const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000;
7
6
  export interface IPeerCollection {
7
+ getAllPeers(): Set<string>;
8
+ getSmartPeers(): Set<string>;
8
9
  markPeerSmart(peerId: PeerId): void;
9
- /** Sample next peer in round-robin fashion. No smart peers if returns undefined */
10
- nextSmartPeerToQuery(): PeerId | undefined;
11
- /** Sample next peer in round-robin fashion. No dumb peers if returns undefined */
12
- nextDumbPeerToQuery(): PeerId | undefined;
10
+ getSmartPeersToQuery(): Array<string>;
11
+ getDumbPeersToQuery(): Array<string>;
13
12
  thereAreSomeDumbRatelimitExceededPeers(): boolean;
14
13
  penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void;
15
14
  unMarkPeerAsBad(peerId: PeerId): void;
@@ -23,25 +22,22 @@ export interface IPeerCollection {
23
22
  getNextSmartPeerAvailabilityDelayMs(): number | undefined;
24
23
  }
25
24
  export declare class PeerCollection implements IPeerCollection {
26
- private readonly connectionSampler;
27
25
  private readonly pinnedPeerId;
28
26
  private readonly dateProvider;
29
27
  private readonly badPeerThreshold;
30
28
  private readonly peerPenalizer?;
29
+ private readonly peers;
31
30
  private readonly smartPeers;
32
31
  private readonly inFlightPeers;
33
32
  private readonly rateLimitExceededPeers;
34
33
  private readonly peerPenaltyCounters;
35
34
  private readonly badPeers;
36
- constructor(connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>, pinnedPeerId: PeerId | undefined, dateProvider: DateProvider, badPeerThreshold?: number, peerPenalizer?: IPeerPenalizer | undefined);
35
+ constructor(initialPeers: PeerId[], pinnedPeerId: PeerId | undefined, dateProvider: DateProvider, badPeerThreshold?: number, peerPenalizer?: IPeerPenalizer | undefined);
36
+ getAllPeers(): Set<string>;
37
+ getSmartPeers(): Set<string>;
37
38
  markPeerSmart(peerId: PeerId): void;
38
- private queriedSmartPeers;
39
- private queriedDumbPeers;
40
- private static nextPeer;
41
- nextSmartPeerToQuery(): PeerId | undefined;
42
- nextDumbPeerToQuery(): PeerId | undefined;
43
- private get availableSmartPeers();
44
- private get availableDumbPeers();
39
+ getSmartPeersToQuery(): Array<string>;
40
+ getDumbPeersToQuery(): Array<string>;
45
41
  thereAreSomeDumbRatelimitExceededPeers(): boolean;
46
42
  markPeerInFlight(peerId: PeerId): void;
47
43
  unMarkPeerInFlight(peerId: PeerId): void;
@@ -54,7 +50,5 @@ export declare class PeerCollection implements IPeerCollection {
54
50
  getNextDumbPeerAvailabilityDelayMs(): number | undefined;
55
51
  getNextSmartPeerAvailabilityDelayMs(): number | undefined;
56
52
  private getNextRateLimitDelayMs;
57
- private orderedPeers;
58
- private get peers();
59
53
  }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvcGVlcl9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVyRixPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRCxlQUFPLE1BQU0sa0NBQWtDLE9BQU8sQ0FBQztBQUV2RCxNQUFNLFdBQVcsZUFBZTtJQUM5QixhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFFcEMsbUZBQW1GO0lBQ25GLG9CQUFvQixJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDM0Msa0ZBQWtGO0lBQ2xGLG1CQUFtQixJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFFMUMsc0NBQXNDLElBQUksT0FBTyxDQUFDO0lBQ2xELFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEUsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLFdBQVcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdkMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDekMseUJB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
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvcGVlcl9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsZUFBTyxNQUFNLGtDQUFrQyxPQUFPLENBQUM7QUFFdkQsTUFBTSxXQUFXLGVBQWU7SUFDOUIsV0FBVyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixhQUFhLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNwQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsbUJBQW1CLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLHNDQUFzQyxJQUFJLE9BQU8sQ0FBQztJQUNsRCxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQztJQUN0QyxXQUFXLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3ZDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2hELHlCQUF5QixJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6Qyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDNUQsa0NBQWtDLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUN6RCxtQ0FBbUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDO0NBQzNEO0FBRUQscUJBQWEsY0FBZSxZQUFXLGVBQWU7SUFXbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQjtJQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztJQWJqQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUV2QixPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBcUI7SUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQXFCO0lBQ25ELE9BQU8sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQTZCO0lBQ3BFLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQTZCO0lBQ2pFLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFxQjtJQUU5QyxZQUNFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFDTCxZQUFZLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDaEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsZ0JBQWdCLEdBQUUsTUFBc0QsRUFDeEUsYUFBYSxDQUFDLDRCQUFnQixFQVdoRDtJQUVNLFdBQVcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBRWhDO0lBRU0sYUFBYSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FFbEM7SUFFTSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRXpDO0lBRU0sb0JBQW9CLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUkzQztJQUVNLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FNMUM7SUFFTSxzQ0FBc0MsSUFBSSxPQUFPLENBS3ZEO0lBRU0sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sUUFFckM7SUFFTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxRQU12QztJQUVNLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxNQUFNLFFBRzlDO0lBRU0seUJBQXlCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQWE5QztJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsR0FBRyxJQUFJLENBUXJFO0lBRU0sZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLFFBSXBDO0lBRU0sV0FBVyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FFaEM7SUFFTSx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBZWpFO0lBRU0sa0NBQWtDLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FXOUQ7SUFFTSxtQ0FBbUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUsvRDtJQUVELE9BQU8sQ0FBQyx1QkFBdUI7Q0EwQmhDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"peer_collection.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/peer_collection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"peer_collection.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/peer_collection.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,17 @@
1
- import { peerIdFromString } from '@libp2p/peer-id';
2
1
  import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD } from './config.js';
3
2
  export const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000; // 1s
4
3
  export class PeerCollection {
5
- connectionSampler;
6
4
  pinnedPeerId;
7
5
  dateProvider;
8
6
  badPeerThreshold;
9
7
  peerPenalizer;
8
+ peers;
10
9
  smartPeers;
11
10
  inFlightPeers;
12
11
  rateLimitExceededPeers;
13
12
  peerPenaltyCounters;
14
13
  badPeers;
15
- constructor(connectionSampler, pinnedPeerId, dateProvider, badPeerThreshold = DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD, peerPenalizer){
16
- this.connectionSampler = connectionSampler;
14
+ constructor(initialPeers, pinnedPeerId, dateProvider, badPeerThreshold = DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD, peerPenalizer){
17
15
  this.pinnedPeerId = pinnedPeerId;
18
16
  this.dateProvider = dateProvider;
19
17
  this.badPeerThreshold = badPeerThreshold;
@@ -23,47 +21,29 @@ export class PeerCollection {
23
21
  this.rateLimitExceededPeers = new Map();
24
22
  this.peerPenaltyCounters = new Map();
25
23
  this.badPeers = new Set();
26
- this.queriedSmartPeers = new Set();
27
- this.queriedDumbPeers = new Set();
28
- this.orderedPeers = new Set();
29
- // Pinned peer is treated specially, always mark it as in-flight
24
+ this.peers = new Set(initialPeers.map((peer)=>peer.toString()));
25
+ // Pinned peer is treaded specially, always mark it as in-flight
30
26
  // and never return it as part of smart/dumb peers
31
27
  if (this.pinnedPeerId) {
32
28
  const peerIdStr = this.pinnedPeerId.toString();
33
29
  this.inFlightPeers.add(peerIdStr);
30
+ this.peers.delete(peerIdStr);
34
31
  }
35
32
  }
36
- markPeerSmart(peerId) {
37
- this.smartPeers.add(peerId.toString());
38
- }
39
- // We keep track of all peers that are queried for peer sampling algorithm
40
- queriedSmartPeers;
41
- queriedDumbPeers;
42
- static nextPeer(allPeers, queried) {
43
- if (allPeers.size === 0) {
44
- return undefined;
45
- }
46
- const availablePeers = allPeers.difference(queried);
47
- let [first] = availablePeers;
48
- if (first === undefined) {
49
- // We queried all peers. Start over
50
- [first] = allPeers;
51
- queried.clear();
52
- }
53
- queried.add(first);
54
- return peerIdFromString(first);
33
+ getAllPeers() {
34
+ return this.peers;
55
35
  }
56
- nextSmartPeerToQuery() {
57
- return PeerCollection.nextPeer(this.availableSmartPeers, this.queriedSmartPeers);
36
+ getSmartPeers() {
37
+ return this.smartPeers;
58
38
  }
59
- nextDumbPeerToQuery() {
60
- return PeerCollection.nextPeer(this.availableDumbPeers, this.queriedDumbPeers);
39
+ markPeerSmart(peerId) {
40
+ this.smartPeers.add(peerId.toString());
61
41
  }
62
- get availableSmartPeers() {
63
- return this.peers.intersection(this.smartPeers.difference(this.getBadPeers().union(this.inFlightPeers).union(this.getRateLimitExceededPeers())));
42
+ getSmartPeersToQuery() {
43
+ return Array.from(this.smartPeers.difference(this.getBadPeers().union(this.inFlightPeers).union(this.getRateLimitExceededPeers())));
64
44
  }
65
- get availableDumbPeers() {
66
- return this.peers.difference(this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()));
45
+ getDumbPeersToQuery() {
46
+ return Array.from(this.peers.difference(this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers())));
67
47
  }
68
48
  thereAreSomeDumbRatelimitExceededPeers() {
69
49
  return this.getRateLimitExceededPeers().difference(this.smartPeers.union(this.badPeers).union(this.inFlightPeers)).size > 0;
@@ -156,18 +136,4 @@ export class PeerCollection {
156
136
  }
157
137
  return minExpiry - now;
158
138
  }
159
- orderedPeers;
160
- get peers() {
161
- const pinnedStr = this.pinnedPeerId?.toString();
162
- const currentlyConnected = new Set(this.connectionSampler.getPeerListSortedByConnectionCountAsc().map((p)=>p.toString()).filter((p)=>p !== pinnedStr));
163
- // Remove disconnected peers, preserving order of the rest.
164
- this.orderedPeers = this.orderedPeers.intersection(currentlyConnected);
165
- // Append newly connected peers at the end (lowest priority).
166
- for (const peer of currentlyConnected){
167
- if (!this.orderedPeers.has(peer)) {
168
- this.orderedPeers.add(peer);
169
- }
170
- }
171
- return this.orderedPeers;
172
- }
173
139
  }
@@ -46,9 +46,10 @@ export declare function prettyPrintRateLimitStatus(status: RateLimitStatus): "Al
46
46
  * 2. Individual rate limits for each peer.
47
47
  *
48
48
  * How it works:
49
- * - When a request comes in, it first checks against the global rate limit.
50
- * - If the global limit allows, it then checks against the specific peer's rate limit.
51
- * - The request is only allowed if both the global and peer-specific limits allow it.
49
+ * - When a request comes in, it first checks against the peer's individual rate limit.
50
+ * - If the peer limit allows, it then checks against the global rate limit.
51
+ * - The request is only allowed if both the peer-specific and global limits allow it.
52
+ * - Checking peer limit first ensures a rate-limited peer cannot exhaust the global quota.
52
53
  * - It automatically creates and manages rate limiters for new peers as they make requests.
53
54
  * - It periodically cleans up rate limiters for inactive peers to conserve memory.
54
55
  *
@@ -101,4 +102,4 @@ export declare class RequestResponseRateLimiter {
101
102
  stop(): void;
102
103
  getRateLimits(protocol: ReqRespSubProtocol): ProtocolRateLimitQuota;
103
104
  }
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZV9saW1pdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9yYXRlLWxpbWl0ZXIvcmF0ZV9saW1pdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLDRCQUE0QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNaEg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxxQkFBYSxlQUFlO0lBRTFCLE9BQU8sQ0FBQyxHQUFHLENBQVM7SUFFcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBUztJQUUxQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBUztJQUV2Qzs7O09BR0c7SUFDSCxZQUFZLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFJbEQ7SUFFRCxLQUFLLElBQUksT0FBTyxDQVVmO0NBQ0Y7QUFTRCxvQkFBWSxlQUFlO0lBQ3pCLFlBQVksSUFBQTtJQUNaLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBRUQsd0JBQWdCLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxlQUFlLDZDQVNqRTtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILHFCQUFhLHNCQUFzQjtJQUNqQyxPQUFPLENBQUMsWUFBWSxDQUEyQztJQUMvRCxPQUFPLENBQUMsYUFBYSxDQUFrQjtJQUN2QyxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBUztJQUN4QyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBUztJQUV6QyxZQUFZLGNBQWMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUsvRztJQUVELEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGVBQWUsQ0FzQnJDO0lBRUQsb0JBQW9CLFNBT25CO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILHFCQUFhLDBCQUEwQjtJQU9uQyxPQUFPLENBQUMsV0FBVztJQU5yQixPQUFPLENBQUMsdUJBQXVCLENBQWtEO0lBQ2pGLE9BQU8sQ0FBQyxVQUFVLENBQStCO0lBRWpELE9BQU8sQ0FBQyxlQUFlLENBQXlDO0lBRWhFLFlBQ1UsV0FBVyxFQUFFLFdBQVcsRUFDaEMsVUFBVSxHQUFFLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBTSxFQWdCdkQ7SUFFRCxLQUFLLFNBSUo7SUFFRCxLQUFLLENBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUcsZUFBZSxDQVd0RTtJQUVELG9CQUFvQixTQUVuQjtJQUVEOztPQUVHO0lBQ0gsSUFBSSxTQUVIO0lBRUQsYUFBYSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FFbEU7Q0FDRiJ9
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZV9saW1pdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9yYXRlLWxpbWl0ZXIvcmF0ZV9saW1pdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLDRCQUE0QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNaEg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxxQkFBYSxlQUFlO0lBRTFCLE9BQU8sQ0FBQyxHQUFHLENBQVM7SUFFcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBUztJQUUxQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBUztJQUV2Qzs7O09BR0c7SUFDSCxZQUFZLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFJbEQ7SUFFRCxLQUFLLElBQUksT0FBTyxDQVVmO0NBQ0Y7QUFTRCxvQkFBWSxlQUFlO0lBQ3pCLFlBQVksSUFBQTtJQUNaLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBRUQsd0JBQWdCLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxlQUFlLDZDQVNqRTtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gscUJBQWEsc0JBQXNCO0lBQ2pDLE9BQU8sQ0FBQyxZQUFZLENBQTJDO0lBQy9ELE9BQU8sQ0FBQyxhQUFhLENBQWtCO0lBQ3ZDLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFTO0lBQ3hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFTO0lBRXpDLFlBQVksY0FBYyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBSy9HO0lBRUQsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsZUFBZSxDQXlCckM7SUFFRCxvQkFBb0IsU0FPbkI7Q0FDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gscUJBQWEsMEJBQTBCO0lBT25DLE9BQU8sQ0FBQyxXQUFXO0lBTnJCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBa0Q7SUFDakYsT0FBTyxDQUFDLFVBQVUsQ0FBK0I7SUFFakQsT0FBTyxDQUFDLGVBQWUsQ0FBeUM7SUFFaEUsWUFDVSxXQUFXLEVBQUUsV0FBVyxFQUNoQyxVQUFVLEdBQUUsT0FBTyxDQUFDLDRCQUE0QixDQUFNLEVBZ0J2RDtJQUVELEtBQUssU0FJSjtJQUVELEtBQUssQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxlQUFlLENBV3RFO0lBRUQsb0JBQW9CLFNBRW5CO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFNBRUg7SUFFRCxhQUFhLENBQUMsUUFBUSxFQUFFLGtCQUFrQixHQUFHLHNCQUFzQixDQUVsRTtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"rate_limiter.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate-limiter/rate_limiter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAMhH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;;OAGG;IACH,YAAY,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAIlD;IAED,KAAK,IAAI,OAAO,CAUf;CACF;AASD,oBAAY,eAAe;IACzB,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,eAAe,6CASjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,YAAY,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAK/G;IAED,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAsBrC;IAED,oBAAoB,SAOnB;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,0BAA0B;IAOnC,OAAO,CAAC,WAAW;IANrB,OAAO,CAAC,uBAAuB,CAAkD;IACjF,OAAO,CAAC,UAAU,CAA+B;IAEjD,OAAO,CAAC,eAAe,CAAyC;IAEhE,YACU,WAAW,EAAE,WAAW,EAChC,UAAU,GAAE,OAAO,CAAC,4BAA4B,CAAM,EAgBvD;IAED,KAAK,SAIJ;IAED,KAAK,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAWtE;IAED,oBAAoB,SAEnB;IAED;;OAEG;IACH,IAAI,SAEH;IAED,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,sBAAsB,CAElE;CACF"}
1
+ {"version":3,"file":"rate_limiter.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate-limiter/rate_limiter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAMhH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;;OAGG;IACH,YAAY,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAIlD;IAED,KAAK,IAAI,OAAO,CAUf;CACF;AASD,oBAAY,eAAe;IACzB,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,eAAe,6CASjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,YAAY,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAK/G;IAED,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAyBrC;IAED,oBAAoB,SAOnB;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,0BAA0B;IAOnC,OAAO,CAAC,WAAW;IANrB,OAAO,CAAC,uBAAuB,CAAkD;IACjF,OAAO,CAAC,UAAU,CAA+B;IAEjD,OAAO,CAAC,eAAe,CAAyC;IAEhE,YACU,WAAW,EAAE,WAAW,EAChC,UAAU,GAAE,OAAO,CAAC,4BAA4B,CAAM,EAgBvD;IAED,KAAK,SAIJ;IAED,KAAK,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAWtE;IAED,oBAAoB,SAEnB;IAED;;OAEG;IACH,IAAI,SAEH;IAED,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,sBAAsB,CAElE;CACF"}
@@ -74,9 +74,10 @@ export function prettyPrintRateLimitStatus(status) {
74
74
  * 2. Individual rate limits for each peer.
75
75
  *
76
76
  * How it works:
77
- * - When a request comes in, it first checks against the global rate limit.
78
- * - If the global limit allows, it then checks against the specific peer's rate limit.
79
- * - The request is only allowed if both the global and peer-specific limits allow it.
77
+ * - When a request comes in, it first checks against the peer's individual rate limit.
78
+ * - If the peer limit allows, it then checks against the global rate limit.
79
+ * - The request is only allowed if both the peer-specific and global limits allow it.
80
+ * - Checking peer limit first ensures a rate-limited peer cannot exhaust the global quota.
80
81
  * - It automatically creates and manages rate limiters for new peers as they make requests.
81
82
  * - It periodically cleans up rate limiters for inactive peers to conserve memory.
82
83
  *
@@ -93,9 +94,6 @@ export function prettyPrintRateLimitStatus(status) {
93
94
  this.peerQuotaTimeMs = peerQuotaTimeMs;
94
95
  }
95
96
  allow(peerId) {
96
- if (!this.globalLimiter.allow()) {
97
- return 0;
98
- }
99
97
  const peerIdStr = peerId.toString();
100
98
  let peerLimiter = this.peerLimiters.get(peerIdStr);
101
99
  if (!peerLimiter) {
@@ -108,10 +106,14 @@ export function prettyPrintRateLimitStatus(status) {
108
106
  } else {
109
107
  peerLimiter.lastAccess = Date.now();
110
108
  }
111
- const peerLimitAllowed = peerLimiter.limiter.allow();
112
- if (!peerLimitAllowed) {
109
+ // Check peer limit first: a rate-limited peer must not consume global quota,
110
+ // otherwise one spamming peer can starve all others by exhausting the global bucket.
111
+ if (!peerLimiter.limiter.allow()) {
113
112
  return 1;
114
113
  }
114
+ if (!this.globalLimiter.allow()) {
115
+ return 0;
116
+ }
115
117
  return 2;
116
118
  }
117
119
  cleanupInactivePeers() {
@@ -126,4 +126,4 @@ export declare class ReqResp implements ReqRespInterface {
126
126
  private categorizeResponseError;
127
127
  private categorizeConnectionErrors;
128
128
  }
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvcmVxcmVzcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQWMsS0FBSyxlQUFlLEVBQWlDLE1BQU0seUJBQXlCLENBQUM7QUFFMUcsT0FBTyxLQUFLLEVBQXNCLE1BQU0sRUFBVSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQVVyQyxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBR0wsS0FBSyxnQkFBZ0IsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUFFLGlCQUFpQixFQUFpQixNQUFNLDRDQUE0QyxDQUFDO0FBQzlGLE9BQU8sRUFFTCxLQUFLLGdCQUFnQixFQUNyQixLQUFLLGVBQWUsRUFDcEIsa0JBQWtCLEVBQ2xCLEtBQUsseUJBQXlCLEVBQzlCLEtBQUssMEJBQTBCLEVBQy9CLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssY0FBYyxFQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBU3hCOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxxQkFBYSxPQUFRLFlBQVcsZ0JBQWdCO0lBZ0I1QyxPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxXQUFXO0lBQ25CLE9BQU8sQ0FBQyxNQUFNO0lBakJoQixPQUFPLENBQUMsMEJBQTBCLENBQWlEO0lBQ25GLE9BQU8sQ0FBQyxhQUFhLENBQTJDO0lBRWhFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBMkM7SUFDdEUsT0FBTyxDQUFDLHFCQUFxQixDQUE2QztJQUUxRSxPQUFPLENBQUMsaUJBQWlCLENBQW9CO0lBQzdDLE9BQU8sQ0FBQyxXQUFXLENBQTZCO0lBRWhELE9BQU8sQ0FBQyxlQUFlLENBQWtCO0lBRXpDLE9BQU8sQ0FBQyxPQUFPLENBQWlCO0lBRWhDLFlBQ0UsTUFBTSxFQUFFLGdCQUFnQixFQUNoQixNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLE1BQU0seUNBQThCLEVBQzVDLFVBQVUsR0FBRSxPQUFPLENBQUMsNEJBQTRCLENBQU0sRUFDdEQsZUFBZSxHQUFFLGVBQXNDLEVBZ0J4RDtJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQVEzRDtJQUVELElBQUksTUFBTSw2Q0FFVDtJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLHVDQUF1QyxDQUFDLENBRXZGO0lBRUQ7O09BRUc7SUFDRyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUUscUJBQXFCLEVBQUUsNEJBQTRCLGlCQWdCL0c7SUFFSyxjQUFjLENBQ2xCLFdBQVcsRUFBRSxrQkFBa0IsRUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUNsQyxTQUFTLEdBQUUsNEJBQTRCLENBQUMsa0JBQWtCLENBQWdELEdBQ3pHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FXZjtJQUVEOztPQUVHO0lBQ0csSUFBSSxrQkFrQlQ7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJHO0lBUUcsZ0JBQWdCLENBQUMsV0FBVyxTQUFTLGtCQUFrQixFQUMzRCxXQUFXLEVBQUUsV0FBVyxFQUN4QixRQUFRLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQ2hFLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixTQUFTLFNBQVEsRUFDakIsUUFBUSxTQUErQyxFQUN2RCxnQkFBZ0IsU0FBSSxHQUNuQixPQUFPLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FxTGxFO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdCRztJQUtVLGlCQUFpQixDQUM1QixNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsRUFBRSxrQkFBa0IsRUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFDZixXQUFXLEdBQUUsTUFBMkIsR0FDdkMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQTJEMUI7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxPQUFPLENBQUMsbUJBQW1CO1lBaUJiLFdBQVc7WUFrRVgsYUFBYTtZQWlFYixhQUFhO1lBd0NiLFlBQVk7SUFtQzFCLE9BQU8sQ0FBQyxrQkFBa0I7SUFPMUI7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxzQkFBc0I7SUFpQjlCOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsdUJBQXVCO0lBeUIvQixPQUFPLENBQUMsMEJBQTBCO0NBOERuQyJ9
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvcmVxcmVzcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQWMsS0FBSyxlQUFlLEVBQWlDLE1BQU0seUJBQXlCLENBQUM7QUFFMUcsT0FBTyxLQUFLLEVBQXNCLE1BQU0sRUFBVSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQVVyQyxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBR0wsS0FBSyxnQkFBZ0IsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUFFLGlCQUFpQixFQUFpQixNQUFNLDRDQUE0QyxDQUFDO0FBQzlGLE9BQU8sRUFFTCxLQUFLLGdCQUFnQixFQUNyQixLQUFLLGVBQWUsRUFDcEIsa0JBQWtCLEVBQ2xCLEtBQUsseUJBQXlCLEVBQzlCLEtBQUssMEJBQTBCLEVBQy9CLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssY0FBYyxFQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBU3hCOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxxQkFBYSxPQUFRLFlBQVcsZ0JBQWdCO0lBZ0I1QyxPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxXQUFXO0lBQ25CLE9BQU8sQ0FBQyxNQUFNO0lBakJoQixPQUFPLENBQUMsMEJBQTBCLENBQWlEO0lBQ25GLE9BQU8sQ0FBQyxhQUFhLENBQTJDO0lBRWhFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBMkM7SUFDdEUsT0FBTyxDQUFDLHFCQUFxQixDQUE2QztJQUUxRSxPQUFPLENBQUMsaUJBQWlCLENBQW9CO0lBQzdDLE9BQU8sQ0FBQyxXQUFXLENBQTZCO0lBRWhELE9BQU8sQ0FBQyxlQUFlLENBQWtCO0lBRXpDLE9BQU8sQ0FBQyxPQUFPLENBQWlCO0lBRWhDLFlBQ0UsTUFBTSxFQUFFLGdCQUFnQixFQUNoQixNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLE1BQU0seUNBQThCLEVBQzVDLFVBQVUsR0FBRSxPQUFPLENBQUMsNEJBQTRCLENBQU0sRUFDdEQsZUFBZSxHQUFFLGVBQXNDLEVBZ0J4RDtJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQVEzRDtJQUVELElBQUksTUFBTSw2Q0FFVDtJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLHVDQUF1QyxDQUFDLENBRXZGO0lBRUQ7O09BRUc7SUFDRyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUUscUJBQXFCLEVBQUUsNEJBQTRCLGlCQWdCL0c7SUFFSyxjQUFjLENBQ2xCLFdBQVcsRUFBRSxrQkFBa0IsRUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUNsQyxTQUFTLEdBQUUsNEJBQTRCLENBQUMsa0JBQWtCLENBQWdELEdBQ3pHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FXZjtJQUVEOztPQUVHO0lBQ0csSUFBSSxrQkFrQlQ7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJHO0lBUUcsZ0JBQWdCLENBQUMsV0FBVyxTQUFTLGtCQUFrQixFQUMzRCxXQUFXLEVBQUUsV0FBVyxFQUN4QixRQUFRLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQ2hFLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixTQUFTLFNBQVEsRUFDakIsUUFBUSxTQUErQyxFQUN2RCxnQkFBZ0IsU0FBSSxHQUNuQixPQUFPLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FxTGxFO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdCRztJQUtVLGlCQUFpQixDQUM1QixNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsRUFBRSxrQkFBa0IsRUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFDZixXQUFXLEdBQUUsTUFBMkIsR0FDdkMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQTJEMUI7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxPQUFPLENBQUMsbUJBQW1CO1lBaUJiLFdBQVc7WUE0RFgsYUFBYTtZQStEYixhQUFhO1lBd0NiLFlBQVk7SUFtQzFCLE9BQU8sQ0FBQyxrQkFBa0I7SUFPMUI7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxzQkFBc0I7SUFpQjlCOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsdUJBQXVCO0lBdUMvQixPQUFPLENBQUMsMEJBQTBCO0NBOERuQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/reqresp.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,eAAe,EAAiC,MAAM,yBAAyB,CAAC;AAE1G,OAAO,KAAK,EAAsB,MAAM,EAAU,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAiB,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAGpB,MAAM,gBAAgB,CAAC;AASxB;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAgB5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IAjBhB,OAAO,CAAC,0BAA0B,CAAiD;IACnF,OAAO,CAAC,aAAa,CAA2C;IAEhE,OAAO,CAAC,mBAAmB,CAA2C;IACtE,OAAO,CAAC,qBAAqB,CAA6C;IAE1E,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,OAAO,CAAiB;IAEhC,YACE,MAAM,EAAE,gBAAgB,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,MAAM,yCAA8B,EAC5C,UAAU,GAAE,OAAO,CAAC,4BAA4B,CAAM,EACtD,eAAe,GAAE,eAAsC,EAgBxD;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAQ3D;IAED,IAAI,MAAM,6CAET;IAED;;OAEG;IACH,oBAAoB,IAAI,IAAI,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAEvF;IAED;;OAEG;IACG,KAAK,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,4BAA4B,iBAgB/G;IAEK,cAAc,CAClB,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,yBAAyB,EAClC,SAAS,GAAE,4BAA4B,CAAC,kBAAkB,CAAgD,GACzG,OAAO,CAAC,IAAI,CAAC,CAWf;IAED;;OAEG;IACG,IAAI,kBAkBT;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IAQG,gBAAgB,CAAC,WAAW,SAAS,kBAAkB,EAC3D,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAChE,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,SAAQ,EACjB,QAAQ,SAA+C,EACvD,gBAAgB,SAAI,GACnB,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAqLlE;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IAKU,iBAAiB,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAA2B,GACvC,OAAO,CAAC,eAAe,CAAC,CA2D1B;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;YAiBb,WAAW;YAkEX,aAAa;YAiEb,aAAa;YAwCb,YAAY;IAmC1B,OAAO,CAAC,kBAAkB;IAO1B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAyB/B,OAAO,CAAC,0BAA0B;CA8DnC"}
1
+ {"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/reqresp.ts"],"names":[],"mappings":"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"}
@@ -380,7 +380,7 @@ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
380
380
  import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
381
381
  import { pipeline } from 'node:stream/promises';
382
382
  import { CollectiveReqRespTimeoutError, IndividualReqRespTimeoutError, InvalidResponseError } from '../../errors/reqresp.error.js';
383
- import { SnappyTransform } from '../encoding.js';
383
+ import { OversizedSnappyResponseError, SnappyTransform } from '../encoding.js';
384
384
  import { DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS, DEFAULT_REQRESP_DIAL_TIMEOUT_MS } from './config.js';
385
385
  import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
386
386
  import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
@@ -729,7 +729,7 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
729
729
  ]), this.individualRequestTimeoutMs, ()=>timeoutErr);
730
730
  return resp;
731
731
  } catch (e) {
732
- this.logger.warn(`SUBPROTOCOL: ${subProtocol}\n`, e);
732
+ this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
733
733
  // On error we immediately abort the stream, this is preferred way,
734
734
  // because it signals to the sender that error happened, whereas
735
735
  // closing the stream only closes our side and is much slower
@@ -807,14 +807,10 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
807
807
  data: message
808
808
  };
809
809
  } catch (e) {
810
+ // All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
811
+ // are re-thrown so the caller can penalize the peer via handleResponseError.
810
812
  this.logger.debug(`Reading message failed: ${e.message}`);
811
- let status = ReqRespStatus.UNKNOWN;
812
- if (e instanceof ReqRespStatusError) {
813
- status = e.status;
814
- }
815
- return {
816
- status
817
- };
813
+ throw e;
818
814
  }
819
815
  }
820
816
  /**
@@ -862,8 +858,7 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
862
858
  // and that this stream should be dropped
863
859
  const isMessageToNotWarn = err instanceof Error && [
864
860
  'stream reset',
865
- 'Cannot push value onto an ended pushable',
866
- 'read ECONNRESET'
861
+ 'Cannot push value onto an ended pushable'
867
862
  ].some((msg)=>err.message.includes(msg));
868
863
  const level = isMessageToNotWarn ? 'debug' : 'warn';
869
864
  this.logger[level]('Unknown stream error while handling the stream, aborting', {
@@ -978,6 +973,18 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
978
973
  this.logger.debug(`Non-punishable error in ${subProtocol}: ${e.message}`, logTags);
979
974
  return undefined;
980
975
  }
976
+ // Invalid status byte: the peer sent a status byte that doesn't match any known status code.
977
+ // This is a protocol violation, penalize harshly.
978
+ if (e instanceof ReqRespStatusError) {
979
+ this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
980
+ return PeerErrorSeverity.LowToleranceError;
981
+ }
982
+ // Oversized snappy response: the peer is sending data that exceeds the allowed size.
983
+ // This is a protocol violation that wastes bandwidth, so penalize harshly.
984
+ if (e instanceof OversizedSnappyResponseError) {
985
+ this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
986
+ return PeerErrorSeverity.LowToleranceError;
987
+ }
981
988
  return this.categorizeConnectionErrors(e, peerId, subProtocol);
982
989
  }
983
990
  /*
@@ -1,5 +1,5 @@
1
1
  import { type Logger } from '@aztec/foundation/log';
2
- import { type TxHash } from '@aztec/stdlib/tx';
2
+ import { type TxHash, type TxValidator } from '@aztec/stdlib/tx';
3
3
  import { type TelemetryClient } from '@aztec/telemetry-client';
4
4
  import type { TxSource, TxSourceCollectionResult } from './tx_source.js';
5
5
  /** TxSource implementation that downloads txs from a file store. */
@@ -7,6 +7,7 @@ export declare class FileStoreTxSource implements TxSource {
7
7
  private readonly fileStore;
8
8
  private readonly baseUrl;
9
9
  private readonly basePath;
10
+ private readonly txValidator;
10
11
  private readonly log;
11
12
  private downloadsSuccess;
12
13
  private downloadsFailed;
@@ -21,7 +22,7 @@ export declare class FileStoreTxSource implements TxSource {
21
22
  * @param telemetry - Optional telemetry client.
22
23
  * @returns The FileStoreTxSource instance, or undefined if creation fails.
23
24
  */
24
- static create(url: string, basePath: string, log?: Logger, telemetry?: TelemetryClient): Promise<FileStoreTxSource | undefined>;
25
+ static create(url: string, basePath: string, txValidator: TxValidator, log?: Logger, telemetry?: TelemetryClient): Promise<FileStoreTxSource | undefined>;
25
26
  getInfo(): string;
26
27
  getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
27
28
  }
@@ -33,5 +34,5 @@ export declare class FileStoreTxSource implements TxSource {
33
34
  * @param telemetry - Optional telemetry client.
34
35
  * @returns Array of successfully created FileStoreTxSource instances.
35
36
  */
36
- export declare function createFileStoreTxSources(urls: string[], basePath: string, log?: Logger, telemetry?: TelemetryClient): Promise<FileStoreTxSource[]>;
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9zdG9yZV90eF9zb3VyY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy90eF9jb2xsZWN0aW9uL2ZpbGVfc3RvcmVfdHhfc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQU0sS0FBSyxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBR0wsS0FBSyxlQUFlLEVBR3JCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsb0VBQW9FO0FBQ3BFLHFCQUFhLGlCQUFrQixZQUFXLFFBQVE7SUFPOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztJQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVE7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBVHRCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0I7SUFDeEMsT0FBTyxDQUFDLGVBQWUsQ0FBZ0I7SUFDdkMsT0FBTyxDQUFDLGdCQUFnQixDQUFZO0lBQ3BDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFFaEMsT0FBTyxlQVlOO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE9BQW9CLE1BQU0sQ0FDeEIsR0FBRyxFQUFFLE1BQU0sRUFDWCxRQUFRLEVBQUUsTUFBTSxFQUNoQixHQUFHLEdBQUUsTUFBaUQsRUFDdEQsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FZeEM7SUFFTSxPQUFPLElBQUksTUFBTSxDQUV2QjtJQUVZLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBK0IvRTtDQUNGO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILHdCQUFzQix3QkFBd0IsQ0FDNUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUNkLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLEdBQUcsR0FBRSxNQUFpRCxFQUN0RCxTQUFTLEdBQUUsZUFBc0MsR0FDaEQsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FHOUIifQ==
37
+ export declare function createFileStoreTxSources(urls: string[], basePath: string, txValidator: TxValidator, log?: Logger, telemetry?: TelemetryClient): Promise<FileStoreTxSource[]>;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9zdG9yZV90eF9zb3VyY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy90eF9jb2xsZWN0aW9uL2ZpbGVfc3RvcmVfdHhfc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQU0sS0FBSyxNQUFNLEVBQUUsS0FBSyxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBR0wsS0FBSyxlQUFlLEVBR3JCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsb0VBQW9FO0FBQ3BFLHFCQUFhLGlCQUFrQixZQUFXLFFBQVE7SUFPOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztJQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVE7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXO0lBQzVCLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRztJQVZ0QixPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBQ3hDLE9BQU8sQ0FBQyxlQUFlLENBQWdCO0lBQ3ZDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBWTtJQUNwQyxPQUFPLENBQUMsWUFBWSxDQUFZO0lBRWhDLE9BQU8sZUFhTjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFvQixNQUFNLENBQ3hCLEdBQUcsRUFBRSxNQUFNLEVBQ1gsUUFBUSxFQUFFLE1BQU0sRUFDaEIsV0FBVyxFQUFFLFdBQVcsRUFDeEIsR0FBRyxHQUFFLE1BQWlELEVBQ3RELFNBQVMsR0FBRSxlQUFzQyxHQUNoRCxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBWXhDO0lBRU0sT0FBTyxJQUFJLE1BQU0sQ0FFdkI7SUFFWSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQXFDL0U7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCx3QkFBc0Isd0JBQXdCLENBQzVDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFDZCxRQUFRLEVBQUUsTUFBTSxFQUNoQixXQUFXLEVBQUUsV0FBVyxFQUN4QixHQUFHLEdBQUUsTUFBaUQsRUFDdEQsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBSzlCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"file_store_tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/file_store_tx_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEzE,oEAAoE;AACpE,qBAAa,iBAAkB,YAAW,QAAQ;IAO9C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,eAYN;IAED;;;;;;;OAOG;IACH,OAAoB,MAAM,CACxB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAiD,EACtD,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAYxC;IAEM,OAAO,IAAI,MAAM,CAEvB;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA+B/E;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAiD,EACtD,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAG9B"}
1
+ {"version":3,"file":"file_store_tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/file_store_tx_source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAM,KAAK,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEzE,oEAAoE;AACpE,qBAAa,iBAAkB,YAAW,QAAQ;IAO9C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAVtB,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,eAaN;IAED;;;;;;;OAOG;IACH,OAAoB,MAAM,CACxB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,GAAG,GAAE,MAAiD,EACtD,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAYxC;IAEM,OAAO,IAAI,MAAM,CAEvB;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAqC/E;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,GAAG,GAAE,MAAiD,EACtD,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAK9B"}
@@ -1,3 +1,4 @@
1
+ import { partitionAsync } from '@aztec/foundation/collection';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import { Timer } from '@aztec/foundation/timer';
3
4
  import { createReadOnlyFileStore } from '@aztec/stdlib/file-store';
@@ -7,15 +8,17 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
7
8
  fileStore;
8
9
  baseUrl;
9
10
  basePath;
11
+ txValidator;
10
12
  log;
11
13
  downloadsSuccess;
12
14
  downloadsFailed;
13
15
  downloadDuration;
14
16
  downloadSize;
15
- constructor(fileStore, baseUrl, basePath, log, telemetry){
17
+ constructor(fileStore, baseUrl, basePath, txValidator, log, telemetry){
16
18
  this.fileStore = fileStore;
17
19
  this.baseUrl = baseUrl;
18
20
  this.basePath = basePath;
21
+ this.txValidator = txValidator;
19
22
  this.log = log;
20
23
  const meter = telemetry.getMeter('file-store-tx-source');
21
24
  this.downloadsSuccess = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_SUCCESS);
@@ -30,14 +33,14 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
30
33
  * @param log - Optional logger.
31
34
  * @param telemetry - Optional telemetry client.
32
35
  * @returns The FileStoreTxSource instance, or undefined if creation fails.
33
- */ static async create(url, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
36
+ */ static async create(url, basePath, txValidator, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
34
37
  try {
35
38
  const fileStore = await createReadOnlyFileStore(url, log);
36
39
  if (!fileStore) {
37
40
  log.warn(`Failed to create file store for URL: ${url}`);
38
41
  return undefined;
39
42
  }
40
- return new FileStoreTxSource(fileStore, url, basePath, log, telemetry);
43
+ return new FileStoreTxSource(fileStore, url, basePath, txValidator, log, telemetry);
41
44
  } catch (err) {
42
45
  log.warn(`Error creating file store for URL: ${url}`, {
43
46
  error: err
@@ -49,31 +52,38 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
49
52
  return `file-store:${this.baseUrl}`;
50
53
  }
51
54
  async getTxsByHash(txHashes) {
52
- const invalidTxHashes = [];
55
+ const results = await Promise.all(txHashes.map(async (txHash)=>{
56
+ const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
57
+ const timer = new Timer();
58
+ try {
59
+ const buffer = await this.fileStore.read(path);
60
+ const tx = Tx.fromBuffer(buffer);
61
+ return {
62
+ tx,
63
+ downloadDuration: timer.ms(),
64
+ downloadSize: buffer.length
65
+ };
66
+ } catch {
67
+ this.downloadsFailed.add(1);
68
+ return undefined;
69
+ }
70
+ }));
71
+ const txs = results.filter((tx)=>tx !== undefined);
72
+ const [validTxs, invalidTxs] = await partitionAsync(txs, async ({ tx, downloadDuration, downloadSize })=>{
73
+ const valid = await this.txValidator.validateTx(tx);
74
+ if (valid.result === 'valid') {
75
+ this.downloadsSuccess.add(1);
76
+ this.downloadDuration.record(Math.ceil(downloadDuration));
77
+ this.downloadSize.record(downloadSize);
78
+ return true;
79
+ } else {
80
+ this.downloadsFailed.add(1);
81
+ return false;
82
+ }
83
+ });
53
84
  return {
54
- validTxs: (await Promise.all(txHashes.map(async (txHash)=>{
55
- const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
56
- const timer = new Timer();
57
- try {
58
- const buffer = await this.fileStore.read(path);
59
- const tx = Tx.fromBuffer(buffer);
60
- if (await tx.validateTxHash() && txHash.equals(tx.txHash)) {
61
- this.downloadsSuccess.add(1);
62
- this.downloadDuration.record(Math.ceil(timer.ms()));
63
- this.downloadSize.record(buffer.length);
64
- return tx;
65
- } else {
66
- invalidTxHashes.push(tx.txHash.toString());
67
- this.downloadsFailed.add(1);
68
- return undefined;
69
- }
70
- } catch {
71
- // Tx not found or error reading - return undefined
72
- this.downloadsFailed.add(1);
73
- return undefined;
74
- }
75
- }))).filter((tx)=>tx !== undefined),
76
- invalidTxHashes: invalidTxHashes
85
+ validTxs: validTxs.map(({ tx })=>tx),
86
+ invalidTxHashes: invalidTxs.map(({ tx })=>tx.getTxHash().toString())
77
87
  };
78
88
  }
79
89
  }
@@ -84,7 +94,7 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
84
94
  * @param log - Optional logger.
85
95
  * @param telemetry - Optional telemetry client.
86
96
  * @returns Array of successfully created FileStoreTxSource instances.
87
- */ export async function createFileStoreTxSources(urls, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
88
- const sources = await Promise.all(urls.map((url)=>FileStoreTxSource.create(url, basePath, log, telemetry)));
97
+ */ export async function createFileStoreTxSources(urls, basePath, txValidator, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
98
+ const sources = await Promise.all(urls.map((url)=>FileStoreTxSource.create(url, basePath, txValidator, log, telemetry)));
89
99
  return sources.filter((s)=>s !== undefined);
90
100
  }
@@ -1,6 +1,6 @@
1
1
  import type { ChainConfig } from '@aztec/stdlib/config';
2
2
  import { type AztecNode } from '@aztec/stdlib/interfaces/client';
3
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
3
+ import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
4
4
  import { type ComponentsVersions } from '@aztec/stdlib/versioning';
5
5
  export type TxSourceCollectionResult = {
6
6
  validTxs: Tx[];
@@ -12,12 +12,13 @@ export interface TxSource {
12
12
  }
13
13
  export declare class NodeRpcTxSource implements TxSource {
14
14
  private readonly client;
15
+ private readonly txValidator;
15
16
  private readonly info;
16
- constructor(client: Pick<AztecNode, 'getTxsByHash'>, info: string);
17
- static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource;
17
+ constructor(client: Pick<AztecNode, 'getTxsByHash'>, txValidator: TxValidator, info: string);
18
+ static fromUrl(nodeUrl: string, txValidator: TxValidator, versions: ComponentsVersions): NodeRpcTxSource;
18
19
  getInfo(): string;
19
20
  getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
20
21
  private verifyTxs;
21
22
  }
22
- export declare function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig): NodeRpcTxSource[];
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxrQkFBa0IsRUFBbUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRyxNQUFNLE1BQU0sd0JBQXdCLEdBQUc7SUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUE7Q0FBRSxDQUFDO0FBRXJGLE1BQU0sV0FBVyxRQUFRO0lBQ3ZCLE9BQU8sSUFBSSxNQUFNLENBQUM7SUFDbEIsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztDQUNyRTtBQUVELHFCQUFhLGVBQWdCLFlBQVcsUUFBUTtJQUU1QyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBRnZCLFlBQ21CLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUN2QyxJQUFJLEVBQUUsTUFBTSxFQUMzQjtJQUVKLE9BQWMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixHQUFHLGVBQWUsQ0FHcEY7SUFFTSxPQUFPLFdBRWI7SUFFWSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUUvRTtZQUVhLFNBQVM7Q0FnQnhCO0FBRUQsd0JBQWdCLHNCQUFzQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxxQkFHOUUifQ==
23
+ export declare function createNodeRpcTxSources(urls: string[], txValidator: TxValidator, chainConfig: ChainConfig): NodeRpcTxSource[];
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQW1DLE1BQU0sMEJBQTBCLENBQUM7QUFHcEcsTUFBTSxNQUFNLHdCQUF3QixHQUFHO0lBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFBO0NBQUUsQ0FBQztBQUVyRixNQUFNLFdBQVcsUUFBUTtJQUN2QixPQUFPLElBQUksTUFBTSxDQUFDO0lBQ2xCLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7Q0FDckU7QUFFRCxxQkFBYSxlQUFnQixZQUFXLFFBQVE7SUFFNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVztJQUM1QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFIdkIsWUFDbUIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQ3ZDLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLElBQUksRUFBRSxNQUFNLEVBQzNCO0lBRUosT0FBYyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsR0FBRyxlQUFlLENBRzlHO0lBRU0sT0FBTyxXQUViO0lBRVksWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FFL0U7WUFFYSxTQUFTO0NBZ0J4QjtBQUVELHdCQUFnQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxxQkFHeEcifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,wBAAwB,GAAG;IAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACrE;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,IAAI,EAAE,MAAM,EAC3B;IAEJ,OAAc,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAGpF;IAEM,OAAO,WAEb;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAE/E;YAEa,SAAS;CAgBxB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,qBAG9E"}
1
+ {"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,wBAAwB,GAAG;IAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACrE;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHvB,YACmB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,MAAM,EAC3B;IAEJ,OAAc,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAG9G;IAEM,OAAO,WAEb;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAE/E;YAEa,SAAS;CAgBxB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,qBAGxG"}
@@ -5,18 +5,20 @@ import { getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
5
5
  import { makeTracedFetch } from '@aztec/telemetry-client';
6
6
  export class NodeRpcTxSource {
7
7
  client;
8
+ txValidator;
8
9
  info;
9
- constructor(client, info){
10
+ constructor(client, txValidator, info){
10
11
  this.client = client;
12
+ this.txValidator = txValidator;
11
13
  this.info = info;
12
14
  }
13
- static fromUrl(nodeUrl, versions) {
15
+ static fromUrl(nodeUrl, txValidator, versions) {
14
16
  const client = createAztecNodeClient(nodeUrl, versions, makeTracedFetch([
15
17
  1,
16
18
  2,
17
19
  3
18
20
  ], false));
19
- return new NodeRpcTxSource(client, nodeUrl);
21
+ return new NodeRpcTxSource(client, txValidator, nodeUrl);
20
22
  }
21
23
  getInfo() {
22
24
  return this.info;
@@ -29,8 +31,8 @@ export class NodeRpcTxSource {
29
31
  const validTxs = [];
30
32
  const invalidTxHashes = [];
31
33
  await Promise.all(txs.map(async (tx)=>{
32
- const isValid = await tx.validateTxHash();
33
- if (isValid) {
34
+ const validation = await this.txValidator.validateTx(tx);
35
+ if (validation.result === 'valid') {
34
36
  validTxs.push(tx);
35
37
  } else {
36
38
  invalidTxHashes.push(tx.getTxHash().toString());
@@ -42,7 +44,7 @@ export class NodeRpcTxSource {
42
44
  };
43
45
  }
44
46
  }
45
- export function createNodeRpcTxSources(urls, chainConfig) {
47
+ export function createNodeRpcTxSources(urls, txValidator, chainConfig) {
46
48
  const versions = getComponentsVersionsFromConfig(chainConfig, protocolContractsHash, getVKTreeRoot());
47
- return urls.map((url)=>NodeRpcTxSource.fromUrl(url, versions));
49
+ return urls.map((url)=>NodeRpcTxSource.fromUrl(url, txValidator, versions));
48
50
  }