@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f81dbcf

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 (139) hide show
  1. package/dest/client/factory.d.ts +1 -1
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +7 -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 +8 -26
  7. package/dest/config.d.ts +24 -2
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +65 -6
  10. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +1 -1
  11. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  12. package/dest/mem_pools/attestation_pool/attestation_pool.js +1 -5
  13. package/dest/mem_pools/instrumentation.d.ts +2 -4
  14. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  15. package/dest/mem_pools/instrumentation.js +14 -16
  16. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  17. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  18. package/dest/mem_pools/tx_pool/priority.js +4 -4
  19. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  20. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  21. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  22. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  23. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  24. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  25. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  26. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  27. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  28. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  29. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  30. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +3 -3
  31. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  32. package/dest/mem_pools/tx_pool_v2/interfaces.js +1 -1
  33. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +13 -4
  34. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  35. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +26 -9
  36. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +1 -1
  37. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  38. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +0 -3
  39. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -2
  40. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +2 -11
  42. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +5 -4
  43. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  44. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  45. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +5 -4
  46. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  47. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  48. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +12 -9
  49. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  50. package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -44
  51. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  52. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  53. package/dest/msg_validators/tx_validator/allowed_public_setup.js +21 -32
  54. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  55. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  56. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  57. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  58. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  59. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  60. package/dest/msg_validators/tx_validator/factory.d.ts +15 -4
  61. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  62. package/dest/msg_validators/tx_validator/factory.js +21 -8
  63. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  64. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  65. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  66. package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
  67. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  68. package/dest/msg_validators/tx_validator/gas_validator.js +39 -9
  69. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  70. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  71. package/dest/msg_validators/tx_validator/index.js +1 -0
  72. package/dest/msg_validators/tx_validator/phases_validator.d.ts +1 -1
  73. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/tx_validator/phases_validator.js +21 -1
  75. package/dest/services/libp2p/libp2p_service.d.ts +1 -1
  76. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  77. package/dest/services/libp2p/libp2p_service.js +20 -14
  78. package/dest/services/peer-manager/metrics.d.ts +1 -3
  79. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  80. package/dest/services/peer-manager/metrics.js +0 -6
  81. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  82. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  83. package/dest/services/peer-manager/peer_manager.js +1 -2
  84. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -1
  85. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  86. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +37 -14
  87. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +11 -17
  88. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  89. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +15 -49
  90. package/dest/services/reqresp/reqresp.d.ts +1 -1
  91. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  92. package/dest/services/reqresp/reqresp.js +1 -2
  93. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  94. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  95. package/dest/test-helpers/testbench-utils.js +2 -1
  96. package/dest/testbench/p2p_client_testbench_worker.js +2 -1
  97. package/dest/testbench/worker_client_manager.d.ts +3 -1
  98. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  99. package/dest/testbench/worker_client_manager.js +4 -1
  100. package/package.json +14 -14
  101. package/src/client/factory.ts +7 -1
  102. package/src/client/p2p_client.ts +5 -26
  103. package/src/config.ts +92 -4
  104. package/src/mem_pools/attestation_pool/attestation_pool.ts +4 -5
  105. package/src/mem_pools/instrumentation.ts +13 -17
  106. package/src/mem_pools/tx_pool/priority.ts +4 -4
  107. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  108. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  109. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  110. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  111. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  112. package/src/mem_pools/tx_pool_v2/interfaces.ts +3 -3
  113. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +37 -7
  114. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +0 -3
  115. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +3 -12
  116. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +13 -3
  117. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +19 -6
  118. package/src/msg_validators/proposal_validator/proposal_validator.ts +57 -48
  119. package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
  120. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  121. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  122. package/src/msg_validators/tx_validator/factory.ts +22 -2
  123. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  124. package/src/msg_validators/tx_validator/gas_validator.ts +41 -8
  125. package/src/msg_validators/tx_validator/index.ts +1 -0
  126. package/src/msg_validators/tx_validator/phases_validator.ts +29 -0
  127. package/src/services/libp2p/libp2p_service.ts +21 -13
  128. package/src/services/peer-manager/metrics.ts +0 -7
  129. package/src/services/peer-manager/peer_manager.ts +1 -2
  130. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +42 -14
  131. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +24 -63
  132. package/src/services/reqresp/reqresp.ts +1 -3
  133. package/src/test-helpers/testbench-utils.ts +1 -0
  134. package/src/testbench/p2p_client_testbench_worker.ts +1 -0
  135. package/src/testbench/worker_client_manager.ts +11 -4
  136. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  137. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  138. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  139. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
@@ -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
  }
@@ -515,8 +515,7 @@ export class PeerManager implements PeerManagerInterface {
515
515
  ...this.peerScoring.getStats(),
516
516
  });
517
517
 
518
- this.metrics.recordPeerCount(connections.length);
519
- this.metrics.recordHealthyPeerCount(healthyConnections.length);
518
+ this.metrics.recordPeerCount(healthyConnections.length);
520
519
 
521
520
  // Exit if no peers to connect
522
521
  if (peersToConnect <= 0) {
@@ -8,6 +8,7 @@ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
8
8
  import { Tx, TxArray, TxHash } from '@aztec/stdlib/tx';
9
9
 
10
10
  import type { PeerId } from '@libp2p/interface';
11
+ import { peerIdFromString } from '@libp2p/peer-id';
11
12
 
12
13
  import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
13
14
  import { ReqRespSubProtocol } from '.././interface.js';
@@ -89,9 +90,10 @@ export class BatchTxRequester {
89
90
  if (this.opts.peerCollection) {
90
91
  this.peers = this.opts.peerCollection;
91
92
  } else {
93
+ const initialPeers = this.p2pService.connectionSampler.getPeerListSortedByConnectionCountAsc();
92
94
  const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
93
95
  this.peers = new PeerCollection(
94
- this.p2pService.connectionSampler,
96
+ initialPeers,
95
97
  this.pinnedPeer,
96
98
  this.dateProvider,
97
99
  badPeerThreshold,
@@ -225,6 +227,7 @@ export class BatchTxRequester {
225
227
  * Starts dumb worker loops
226
228
  * */
227
229
  private async dumbRequester() {
230
+ const nextPeerIndex = this.makeRoundRobinIndexer();
228
231
  const nextBatchIndex = this.makeRoundRobinIndexer();
229
232
 
230
233
  // Chunk missing tx hashes into batches of txBatchSize, wrapping around to ensure no peer gets less than txBatchSize
@@ -260,9 +263,15 @@ export class BatchTxRequester {
260
263
  return { blockRequest, txs };
261
264
  };
262
265
 
263
- const workerCount = this.dumbParallelWorkerCount;
266
+ const nextPeer = () => {
267
+ const peers = this.peers.getDumbPeersToQuery();
268
+ const idx = nextPeerIndex(() => peers.length);
269
+ return idx === undefined ? undefined : peerIdFromString(peers[idx]);
270
+ };
271
+
272
+ const workerCount = Math.min(this.dumbParallelWorkerCount, this.peers.getAllPeers().size);
264
273
  const workers = Array.from({ length: workerCount }, (_, index) =>
265
- this.dumbWorkerLoop(this.peers.nextDumbPeerToQuery.bind(this.peers), makeRequest, index + 1),
274
+ this.dumbWorkerLoop(nextPeer, makeRequest, index + 1),
266
275
  );
267
276
 
268
277
  await Promise.allSettled(workers);
@@ -323,6 +332,14 @@ export class BatchTxRequester {
323
332
  * Starts smart worker loops
324
333
  * */
325
334
  private async smartRequester() {
335
+ const nextPeerIndex = this.makeRoundRobinIndexer();
336
+
337
+ const nextPeer = () => {
338
+ const peers = this.peers.getSmartPeersToQuery();
339
+ const idx = nextPeerIndex(() => peers.length);
340
+ return idx === undefined ? undefined : peerIdFromString(peers[idx]);
341
+ };
342
+
326
343
  const makeRequest = (pid: PeerId) => {
327
344
  const txs = this.txsMetadata.getTxsToRequestFromThePeer(pid);
328
345
  const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
@@ -333,8 +350,9 @@ export class BatchTxRequester {
333
350
  return { blockRequest, txs };
334
351
  };
335
352
 
336
- const workers = Array.from({ length: this.smartParallelWorkerCount }, (_, index) =>
337
- this.smartWorkerLoop(this.peers.nextSmartPeerToQuery.bind(this.peers), makeRequest, index + 1),
353
+ const workers = Array.from(
354
+ { length: Math.min(this.smartParallelWorkerCount, this.peers.getAllPeers().size) },
355
+ (_, index) => this.smartWorkerLoop(nextPeer, makeRequest, index + 1),
338
356
  );
339
357
 
340
358
  await Promise.allSettled(workers);
@@ -369,18 +387,26 @@ export class BatchTxRequester {
369
387
  if (weRanOutOfPeersToQuery) {
370
388
  this.logger.debug(`Worker loop smart: No more peers to query`);
371
389
 
372
- // If we have rate limited peers wait for them.
373
- const nextSmartPeerDelay = this.peers.getNextSmartPeerAvailabilityDelayMs();
374
- const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
375
- if (thereAreSomeRateLimitedSmartPeers) {
376
- await this.sleepClampedToDeadline(nextSmartPeerDelay);
377
- continue;
390
+ // If there are no more dumb peers to query then none of our peers can become smart,
391
+ // thus we can simply exit this worker
392
+ const noMoreDumbPeersToQuery = this.peers.getDumbPeersToQuery().length === 0;
393
+ if (noMoreDumbPeersToQuery) {
394
+ // These might be either smart peers that will get unblocked after _some time_
395
+ const nextSmartPeerDelay = this.peers.getNextSmartPeerAvailabilityDelayMs();
396
+ const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
397
+ if (thereAreSomeRateLimitedSmartPeers) {
398
+ await this.sleepClampedToDeadline(nextSmartPeerDelay);
399
+ continue;
400
+ }
401
+
402
+ this.logger.debug(`Worker loop smart: No more smart peers to query killing ${workerIndex}`);
403
+ break;
378
404
  }
379
405
 
406
+ // Otherwise there are still some dumb peers that could become smart.
380
407
  // We end up here when all known smart peers became temporarily unavailable via combination of
381
408
  // (bad, in-flight, or rate-limited) or in some weird scenario all current smart peers turn bad which is permanent
382
- // but there are dumb peers that could be promoted
383
- // or new peer can join as dumb and be promoted later
409
+ // but dumb peers still exist that could become smart.
384
410
  //
385
411
  // When a dumb peer responds with valid txIndices, it gets
386
412
  // promoted to smart and releases the semaphore, waking this worker.
@@ -573,7 +599,9 @@ export class BatchTxRequester {
573
599
  this.markTxsPeerHas(peerId, response);
574
600
 
575
601
  // Unblock smart workers
576
- this.smartRequesterSemaphore.release();
602
+ if (this.peers.getSmartPeersToQuery().length <= this.smartParallelWorkerCount) {
603
+ this.smartRequesterSemaphore.release();
604
+ }
577
605
  }
578
606
 
579
607
  private isBlockResponseValid(response: BlockTxsResponse): boolean {
@@ -2,22 +2,18 @@ import type { DateProvider } from '@aztec/foundation/timer';
2
2
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
3
 
4
4
  import type { PeerId } from '@libp2p/interface';
5
- import { peerIdFromString } from '@libp2p/peer-id';
6
5
 
7
- import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
8
6
  import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD } from './config.js';
9
7
  import type { IPeerPenalizer } from './interface.js';
10
8
 
11
9
  export const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000; // 1s
12
10
 
13
11
  export interface IPeerCollection {
12
+ getAllPeers(): Set<string>;
13
+ getSmartPeers(): Set<string>;
14
14
  markPeerSmart(peerId: PeerId): void;
15
-
16
- /** Sample next peer in round-robin fashion. No smart peers if returns undefined */
17
- nextSmartPeerToQuery(): PeerId | undefined;
18
- /** Sample next peer in round-robin fashion. No dumb peers if returns undefined */
19
- nextDumbPeerToQuery(): PeerId | undefined;
20
-
15
+ getSmartPeersToQuery(): Array<string>;
16
+ getDumbPeersToQuery(): Array<string>;
21
17
  thereAreSomeDumbRatelimitExceededPeers(): boolean;
22
18
  penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void;
23
19
  unMarkPeerAsBad(peerId: PeerId): void;
@@ -32,6 +28,8 @@ export interface IPeerCollection {
32
28
  }
33
29
 
34
30
  export class PeerCollection implements IPeerCollection {
31
+ private readonly peers;
32
+
35
33
  private readonly smartPeers = new Set<string>();
36
34
  private readonly inFlightPeers = new Set<string>();
37
35
  private readonly rateLimitExceededPeers = new Map<string, number>();
@@ -39,60 +37,46 @@ export class PeerCollection implements IPeerCollection {
39
37
  private readonly badPeers = new Set<string>();
40
38
 
41
39
  constructor(
42
- private readonly connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>,
40
+ initialPeers: PeerId[],
43
41
  private readonly pinnedPeerId: PeerId | undefined,
44
42
  private readonly dateProvider: DateProvider,
45
43
  private readonly badPeerThreshold: number = DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
46
44
  private readonly peerPenalizer?: IPeerPenalizer,
47
45
  ) {
48
- // Pinned peer is treated specially, always mark it as in-flight
46
+ this.peers = new Set(initialPeers.map(peer => peer.toString()));
47
+
48
+ // Pinned peer is treaded specially, always mark it as in-flight
49
49
  // and never return it as part of smart/dumb peers
50
50
  if (this.pinnedPeerId) {
51
51
  const peerIdStr = this.pinnedPeerId.toString();
52
52
  this.inFlightPeers.add(peerIdStr);
53
+ this.peers.delete(peerIdStr);
53
54
  }
54
55
  }
55
56
 
56
- public markPeerSmart(peerId: PeerId): void {
57
- this.smartPeers.add(peerId.toString());
58
- }
59
-
60
- // We keep track of all peers that are queried for peer sampling algorithm
61
- private queriedSmartPeers: Set<string> = new Set<string>();
62
- private queriedDumbPeers: Set<string> = new Set<string>();
63
-
64
- private static nextPeer(allPeers: Set<string>, queried: Set<string>): PeerId | undefined {
65
- if (allPeers.size === 0) {
66
- return undefined;
67
- }
68
- const availablePeers = allPeers.difference(queried);
69
- let [first] = availablePeers;
70
- if (first === undefined) {
71
- // We queried all peers. Start over
72
- [first] = allPeers;
73
- queried.clear();
74
- }
75
- queried.add(first);
76
- return peerIdFromString(first);
57
+ public getAllPeers(): Set<string> {
58
+ return this.peers;
77
59
  }
78
60
 
79
- public nextSmartPeerToQuery(): PeerId | undefined {
80
- return PeerCollection.nextPeer(this.availableSmartPeers, this.queriedSmartPeers);
61
+ public getSmartPeers(): Set<string> {
62
+ return this.smartPeers;
81
63
  }
82
64
 
83
- public nextDumbPeerToQuery(): PeerId | undefined {
84
- return PeerCollection.nextPeer(this.availableDumbPeers, this.queriedDumbPeers);
65
+ public markPeerSmart(peerId: PeerId): void {
66
+ this.smartPeers.add(peerId.toString());
85
67
  }
86
68
 
87
- private get availableSmartPeers(): Set<string> {
88
- return this.peers.intersection(
69
+ public getSmartPeersToQuery(): Array<string> {
70
+ return Array.from(
89
71
  this.smartPeers.difference(this.getBadPeers().union(this.inFlightPeers).union(this.getRateLimitExceededPeers())),
90
72
  );
91
73
  }
92
74
 
93
- private get availableDumbPeers(): Set<string> {
94
- return this.peers.difference(
95
- this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()),
75
+ public getDumbPeersToQuery(): Array<string> {
76
+ return Array.from(
77
+ this.peers.difference(
78
+ this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()),
79
+ ),
96
80
  );
97
81
  }
98
82
 
@@ -218,27 +202,4 @@ export class PeerCollection implements IPeerCollection {
218
202
 
219
203
  return minExpiry! - now;
220
204
  }
221
-
222
- private orderedPeers: Set<string> = new Set();
223
-
224
- private get peers(): Set<string> {
225
- const pinnedStr = this.pinnedPeerId?.toString();
226
- const currentlyConnected = new Set(
227
- this.connectionSampler
228
- .getPeerListSortedByConnectionCountAsc()
229
- .map(p => p.toString())
230
- .filter(p => p !== pinnedStr),
231
- );
232
-
233
- // Remove disconnected peers, preserving order of the rest.
234
- this.orderedPeers = this.orderedPeers.intersection(currentlyConnected);
235
-
236
- // Append newly connected peers at the end (lowest priority).
237
- for (const peer of currentlyConnected) {
238
- if (!this.orderedPeers.has(peer)) {
239
- this.orderedPeers.add(peer);
240
- }
241
- }
242
- return this.orderedPeers;
243
- }
244
205
  }
@@ -627,9 +627,7 @@ export class ReqResp implements ReqRespInterface {
627
627
  // and that this stream should be dropped
628
628
  const isMessageToNotWarn =
629
629
  err instanceof Error &&
630
- ['stream reset', 'Cannot push value onto an ended pushable', 'read ECONNRESET'].some(msg =>
631
- err.message.includes(msg),
632
- );
630
+ ['stream reset', 'Cannot push value onto an ended pushable'].some(msg => err.message.includes(msg));
633
631
  const level = isMessageToNotWarn ? 'debug' : 'warn';
634
632
  this.logger[level]('Unknown stream error while handling the stream, aborting', {
635
633
  protocol,
@@ -292,6 +292,7 @@ export function createMockEpochCache(): EpochCacheInterface {
292
292
  ethereumSlotDuration: 1,
293
293
  proofSubmissionEpochs: 1,
294
294
  targetCommitteeSize: 48,
295
+ rollupManaLimit: Number.MAX_SAFE_INTEGER,
295
296
  }),
296
297
  };
297
298
  }
@@ -340,6 +340,7 @@ process.on('message', async msg => {
340
340
  const config: P2PConfig = {
341
341
  ...rawConfig,
342
342
  peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
343
+ priceBumpPercentage: 10n,
343
344
  } as P2PConfig;
344
345
 
345
346
  workerConfig = config;
@@ -81,13 +81,15 @@ class WorkerClientManager {
81
81
  * Note: We send the raw peerIdPrivateKey string instead of SecretValue
82
82
  * because SecretValue.toJSON() returns '[Redacted]', losing the value.
83
83
  * The worker must re-wrap it in SecretValue.
84
+ * We also omit priceBumpPercentage since it's a bigint and can't be
85
+ * serialized over IPC (which uses JSON under the hood).
84
86
  */
85
87
  private createClientConfig(
86
88
  clientIndex: number,
87
89
  port: number,
88
90
  otherNodes: string[],
89
- ): Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey: string } & Partial<ChainConfig> {
90
- return {
91
+ ): Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & { peerIdPrivateKey: string } & Partial<ChainConfig> {
92
+ const { priceBumpPercentage: _, ...config } = {
91
93
  ...getP2PDefaultConfig(),
92
94
  p2pEnabled: true,
93
95
  peerIdPrivateKey: this.peerIdPrivateKeys[clientIndex],
@@ -96,7 +98,10 @@ class WorkerClientManager {
96
98
  p2pPort: port,
97
99
  bootstrapNodes: [...otherNodes],
98
100
  ...this.p2pConfig,
99
- } as Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey: string } & Partial<ChainConfig>;
101
+ };
102
+ return config as Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
103
+ peerIdPrivateKey: string;
104
+ } & Partial<ChainConfig>;
100
105
  }
101
106
 
102
107
  /**
@@ -104,7 +109,9 @@ class WorkerClientManager {
104
109
  * Config uses raw string for peerIdPrivateKey (not SecretValue) for IPC serialization.
105
110
  */
106
111
  private spawnWorkerProcess(
107
- config: Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey: string } & Partial<ChainConfig>,
112
+ config: Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
113
+ peerIdPrivateKey: string;
114
+ } & Partial<ChainConfig>,
108
115
  clientIndex: number,
109
116
  ): [ChildProcess, Promise<void>] {
110
117
  const useCompiled = existsSync(workerJsPath);
@@ -1,24 +0,0 @@
1
- import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
- import type { EthAddress } from '@aztec/foundation/eth-address';
4
- import { type BlockProposal, type CheckpointProposal, type ValidationResult } from '@aztec/stdlib/p2p';
5
- import type { TxHash } from '@aztec/stdlib/tx';
6
- import type { MockProxy } from 'jest-mock-extended';
7
- export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
8
- validatorFactory: (epochCache: EpochCacheInterface, opts: {
9
- txsPermitted: boolean;
10
- maxTxsPerBlock?: number;
11
- }) => {
12
- validate: (proposal: TProposal) => Promise<ValidationResult>;
13
- };
14
- makeProposal: (options?: any) => Promise<TProposal>;
15
- makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
16
- getSigner: () => Secp256k1Signer;
17
- getAddress: (signer?: Secp256k1Signer) => EthAddress;
18
- getSlot: (slot: number | bigint) => any;
19
- getTxHashes: (n: number) => TxHash[];
20
- getTxs: () => any[];
21
- epochCacheMock: () => MockProxy<EpochCacheInterface>;
22
- }
23
- export declare function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(params: ProposalValidatorTestParams<TProposal>): void;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvcHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxhQUFhLEVBQ2xCLEtBQUssa0JBQWtCLEVBRXZCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHL0MsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsTUFBTSxXQUFXLDJCQUEyQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQy9GLGdCQUFnQixFQUFFLENBQ2hCLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEtBQ3JEO1FBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUFFLENBQUM7SUFDdEUsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDN0csU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0lBQ2pDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsS0FBSyxVQUFVLENBQUM7SUFDckQsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDO0lBQ3hDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7SUFDckMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDcEIsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Q0FDdEQ7QUFFRCx3QkFBZ0IsNEJBQTRCLENBQUMsU0FBUyxTQUFTLGFBQWEsR0FBRyxrQkFBa0IsRUFDL0YsTUFBTSxFQUFFLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxRQXFWL0MifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC/F,gBAAgB,EAAE,CAChB,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KACrD;QAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;IACtE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IAC7G,SAAS,EAAE,MAAM,eAAe,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB,EAC/F,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,QAqV/C"}