@aztec/p2p 0.0.1-commit.ef17749e1 → 0.0.1-commit.f1b29a41e

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 (226) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +1 -1
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +23 -10
  5. package/dest/client/interface.d.ts +9 -2
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +3 -2
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +37 -12
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
  11. package/dest/config.d.ts +13 -1
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +20 -0
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/index.d.ts +1 -2
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +0 -1
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -4
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -5
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  24. package/dest/mem_pools/index.d.ts +1 -2
  25. package/dest/mem_pools/index.d.ts.map +1 -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 +7 -5
  30. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +9 -2
  32. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +12 -2
  34. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  35. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -0
  37. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
  38. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  39. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +19 -5
  40. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  41. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  42. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  43. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  44. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  45. package/dest/msg_validators/clock_tolerance.js +4 -3
  46. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +1 -1
  47. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  48. package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
  49. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  50. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  51. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  52. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  53. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  54. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  55. package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
  56. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  57. package/dest/msg_validators/tx_validator/factory.js +36 -10
  58. package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
  59. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  60. package/dest/msg_validators/tx_validator/gas_validator.js +39 -9
  61. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  62. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  63. package/dest/msg_validators/tx_validator/phases_validator.js +28 -1
  64. package/dest/services/dummy_service.d.ts +5 -3
  65. package/dest/services/dummy_service.d.ts.map +1 -1
  66. package/dest/services/dummy_service.js +5 -1
  67. package/dest/services/encoding.d.ts +5 -1
  68. package/dest/services/encoding.d.ts.map +1 -1
  69. package/dest/services/encoding.js +7 -1
  70. package/dest/services/libp2p/libp2p_service.d.ts +14 -11
  71. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  72. package/dest/services/libp2p/libp2p_service.js +136 -65
  73. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  74. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  75. package/dest/services/peer-manager/peer_manager.js +22 -8
  76. package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
  77. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  78. package/dest/services/peer-manager/peer_scoring.js +28 -10
  79. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  80. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  81. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +69 -65
  82. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
  83. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  84. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  85. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  86. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  87. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  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 +3 -0
  90. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  91. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  92. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  93. package/dest/services/reqresp/reqresp.d.ts +1 -1
  94. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  95. package/dest/services/reqresp/reqresp.js +17 -9
  96. package/dest/services/service.d.ts +5 -2
  97. package/dest/services/service.d.ts.map +1 -1
  98. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  99. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  100. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  101. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  102. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  103. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  104. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  105. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  106. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  107. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  108. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  109. package/dest/services/tx_collection/request_tracker.js +84 -0
  110. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  111. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  112. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  113. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  114. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  115. package/dest/services/tx_collection/tx_source.js +9 -7
  116. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  117. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  118. package/dest/test-helpers/testbench-utils.js +22 -3
  119. package/dest/testbench/p2p_client_testbench_worker.js +44 -15
  120. package/dest/testbench/worker_client_manager.d.ts +1 -1
  121. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  122. package/dest/testbench/worker_client_manager.js +0 -1
  123. package/package.json +14 -14
  124. package/src/client/factory.ts +41 -13
  125. package/src/client/interface.ts +9 -1
  126. package/src/client/p2p_client.ts +39 -14
  127. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +18 -8
  128. package/src/config.ts +33 -0
  129. package/src/errors/p2p-service.error.ts +11 -0
  130. package/src/index.ts +0 -1
  131. package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -5
  132. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  133. package/src/mem_pools/index.ts +0 -3
  134. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  135. package/src/mem_pools/tx_pool_v2/interfaces.ts +6 -4
  136. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +18 -2
  137. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
  138. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +20 -5
  139. package/src/msg_validators/attestation_validator/README.md +49 -0
  140. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  141. package/src/msg_validators/clock_tolerance.ts +4 -3
  142. package/src/msg_validators/proposal_validator/README.md +123 -0
  143. package/src/msg_validators/proposal_validator/proposal_validator.ts +6 -5
  144. package/src/msg_validators/tx_validator/README.md +5 -1
  145. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  146. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  147. package/src/msg_validators/tx_validator/factory.ts +43 -3
  148. package/src/msg_validators/tx_validator/gas_validator.ts +41 -8
  149. package/src/msg_validators/tx_validator/phases_validator.ts +31 -1
  150. package/src/services/dummy_service.ts +7 -2
  151. package/src/services/encoding.ts +9 -1
  152. package/src/services/libp2p/libp2p_service.ts +137 -79
  153. package/src/services/peer-manager/peer_manager.ts +26 -8
  154. package/src/services/peer-manager/peer_scoring.ts +21 -5
  155. package/src/services/reqresp/README.md +229 -0
  156. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  157. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
  158. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  159. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  160. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  161. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  162. package/src/services/reqresp/reqresp.ts +19 -11
  163. package/src/services/service.ts +6 -1
  164. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  165. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  166. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  167. package/src/services/tx_collection/request_tracker.ts +127 -0
  168. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  169. package/src/services/tx_collection/tx_collection.ts +3 -5
  170. package/src/services/tx_collection/tx_source.ts +8 -7
  171. package/src/test-helpers/testbench-utils.ts +29 -3
  172. package/src/testbench/p2p_client_testbench_worker.ts +43 -14
  173. package/src/testbench/worker_client_manager.ts +0 -1
  174. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  175. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  176. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  177. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  178. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  179. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  180. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  181. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  182. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  183. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  184. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  185. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  186. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  187. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  188. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  189. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  190. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  191. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  192. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  193. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  194. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  195. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  196. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  197. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  198. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  199. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  200. package/dest/mem_pools/tx_pool/index.js +0 -2
  201. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  202. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  203. package/dest/mem_pools/tx_pool/priority.js +0 -15
  204. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  205. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  206. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  207. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  208. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  209. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  210. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  211. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  212. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  213. package/src/mem_pools/tx_pool/README.md +0 -270
  214. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  215. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  216. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  217. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  218. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  219. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  220. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  221. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  222. package/src/mem_pools/tx_pool/index.ts +0 -2
  223. package/src/mem_pools/tx_pool/priority.ts +0 -20
  224. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  225. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  226. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -230,7 +230,7 @@ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.j
230
230
  /**
231
231
  * Creates a mock EpochCache for testing.
232
232
  */ export function createMockEpochCache() {
233
- return {
233
+ const cache = {
234
234
  getCommittee: ()=>Promise.resolve({
235
235
  committee: [],
236
236
  seed: 1n,
@@ -238,27 +238,44 @@ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.j
238
238
  isEscapeHatchOpen: false
239
239
  }),
240
240
  getProposerIndexEncoding: ()=>'0x',
241
+ getSlotNow: ()=>SlotNumber.ZERO,
242
+ getTargetSlot: ()=>SlotNumber.ZERO,
243
+ getEpochNow: ()=>EpochNumber.ZERO,
244
+ getTargetEpoch: ()=>EpochNumber.ZERO,
241
245
  getEpochAndSlotNow: ()=>({
242
246
  epoch: EpochNumber.ZERO,
243
247
  slot: SlotNumber.ZERO,
244
248
  ts: 0n,
245
249
  nowMs: 0n
246
250
  }),
251
+ isProposerPipeliningEnabled: ()=>false,
247
252
  computeProposerIndex: ()=>0n,
248
253
  getCurrentAndNextSlot: ()=>({
249
254
  currentSlot: SlotNumber.ZERO,
250
255
  nextSlot: SlotNumber.ZERO
251
256
  }),
257
+ getTargetAndNextSlot: ()=>({
258
+ targetSlot: SlotNumber.ZERO,
259
+ nextSlot: SlotNumber.ZERO
260
+ }),
252
261
  getProposerAttesterAddressInSlot: ()=>Promise.resolve(undefined),
253
262
  getEpochAndSlotInNextL1Slot: ()=>({
254
263
  epoch: EpochNumber.ZERO,
255
264
  slot: SlotNumber.ZERO,
256
265
  ts: 0n,
257
- now: 0n
266
+ nowSeconds: 0n
267
+ }),
268
+ getTargetEpochAndSlotInNextL1Slot: ()=>({
269
+ epoch: EpochNumber.ZERO,
270
+ slot: SlotNumber.ZERO,
271
+ ts: 0n,
272
+ nowSeconds: 0n
258
273
  }),
259
274
  isInCommittee: ()=>Promise.resolve(false),
260
275
  getRegisteredValidators: ()=>Promise.resolve([]),
261
276
  filterInCommittee: ()=>Promise.resolve([]),
277
+ isEscapeHatchOpen: ()=>Promise.resolve(false),
278
+ isEscapeHatchOpenAtSlot: ()=>Promise.resolve(false),
262
279
  getL1Constants: ()=>({
263
280
  l1StartBlock: 0n,
264
281
  l1GenesisTime: 0n,
@@ -266,9 +283,11 @@ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.j
266
283
  slotDuration: 1,
267
284
  ethereumSlotDuration: 1,
268
285
  proofSubmissionEpochs: 1,
269
- targetCommitteeSize: 48
286
+ targetCommitteeSize: 48,
287
+ rollupManaLimit: Number.MAX_SAFE_INTEGER
270
288
  })
271
289
  };
290
+ return cache;
272
291
  }
273
292
  /**
274
293
  * Creates a mock WorldStateSynchronizer for testing.
@@ -23,7 +23,7 @@ import { peerIdFromString } from '@libp2p/peer-id';
23
23
  import { createP2PClient } from '../index.js';
24
24
  import { BatchTxRequesterCollector, LibP2PService, SendBatchRequestCollector } from '../services/index.js';
25
25
  import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
26
- import { MissingTxsTracker } from '../services/tx_collection/missing_txs_tracker.js';
26
+ import { RequestTracker } from '../services/tx_collection/request_tracker.js';
27
27
  import { AlwaysTrueCircuitVerifier } from '../test-helpers/index.js';
28
28
  import { BENCHMARK_CONSTANTS, InMemoryAttestationPool, InMemoryTxPool, UNLIMITED_RATE_LIMIT_QUOTA, createMockEpochCache, createMockWorldStateSynchronizer, filterTxsByDistribution } from '../test-helpers/index.js';
29
29
  export { COLLECTOR_DISPLAY_NAMES } from '../test-helpers/testbench-utils.js';
@@ -154,7 +154,7 @@ async function runAggregatorBenchmark(client, blockProposal, collectorType, time
154
154
  timer = new Timer();
155
155
  if (collectorType === 'batch-requester') {
156
156
  const collector = new BatchTxRequesterCollector(batchTxRequesterService, logger, new DateProvider(), noopTxValidator);
157
- const fetchedTxs = await collector.collectTxs(MissingTxsTracker.fromArray(txHashes), blockProposal, pinnedPeer, timeoutMs);
157
+ const fetchedTxs = await collector.collectTxs(RequestTracker.create(txHashes, new Date(Date.now() + timeoutMs)), blockProposal, pinnedPeer);
158
158
  const durationMs = timer.ms();
159
159
  return {
160
160
  type: 'BENCH_RESULT',
@@ -164,7 +164,7 @@ async function runAggregatorBenchmark(client, blockProposal, collectorType, time
164
164
  };
165
165
  }
166
166
  const collector = new SendBatchRequestCollector(batchTxRequesterService, BENCHMARK_CONSTANTS.FIXED_MAX_PEERS, BENCHMARK_CONSTANTS.FIXED_MAX_RETRY_ATTEMPTS);
167
- const fetchedTxs = await collector.collectTxs(MissingTxsTracker.fromArray(txHashes), blockProposal, pinnedPeer, timeoutMs);
167
+ const fetchedTxs = await collector.collectTxs(RequestTracker.create(txHashes, new Date(Date.now() + timeoutMs)), blockProposal, pinnedPeer);
168
168
  const durationMs = timer.ms();
169
169
  return {
170
170
  type: 'BENCH_RESULT',
@@ -188,6 +188,35 @@ let workerAttestationPool = null;
188
188
  let workerConfig = null;
189
189
  let workerLogger = null;
190
190
  let kvStore = null;
191
+ async function stopWorker() {
192
+ try {
193
+ if (workerClient) {
194
+ await workerClient.stop();
195
+ workerClient = null;
196
+ }
197
+ } catch (e) {
198
+ workerLogger?.error('Error stopping worker client', e);
199
+ }
200
+ try {
201
+ if (kvStore?.close) {
202
+ await kvStore.close();
203
+ kvStore = null;
204
+ }
205
+ } catch (e) {
206
+ workerLogger?.error('Error closing kv store', e);
207
+ }
208
+ }
209
+ function gracefulExit(code = 0) {
210
+ try {
211
+ if (process.connected) {
212
+ process.disconnect();
213
+ }
214
+ } catch {
215
+ // IPC channel already closed
216
+ }
217
+ // Safety fallback if lingering handles prevent the event loop from draining
218
+ setTimeout(()=>process.exit(code), 5000).unref();
219
+ }
191
220
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
192
221
  process.on('message', async (msg)=>{
193
222
  const { type, config: rawConfig, clientIndex } = msg;
@@ -238,13 +267,8 @@ process.on('message', async (msg)=>{
238
267
  const cmd = msg;
239
268
  switch(cmd.type){
240
269
  case 'STOP':
241
- if (workerClient) {
242
- await workerClient.stop();
243
- }
244
- if (kvStore?.close) {
245
- await kvStore.close();
246
- }
247
- process.exit(0);
270
+ await stopWorker();
271
+ gracefulExit(0);
248
272
  break;
249
273
  case 'SEND_TX':
250
274
  if (workerClient) {
@@ -293,10 +317,15 @@ process.on('message', async (msg)=>{
293
317
  }
294
318
  }
295
319
  } catch (err) {
296
- process.send({
297
- type: 'ERROR',
298
- error: err.message
299
- });
300
- process.exit(1);
320
+ try {
321
+ process.send({
322
+ type: 'ERROR',
323
+ error: err.message
324
+ });
325
+ } catch {
326
+ // IPC channel may be closed
327
+ }
328
+ await stopWorker();
329
+ gracefulExit(1);
301
330
  }
302
331
  });
@@ -95,4 +95,4 @@ declare class WorkerClientManager {
95
95
  export { WorkerClientManager, testChainConfig };
96
96
  export type { DistributionPattern, CollectorType } from './p2p_client_testbench_worker.js';
97
97
  export { COLLECTOR_DISPLAY_NAMES } from './p2p_client_testbench_worker.js';
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyX2NsaWVudF9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3dvcmtlcl9jbGllbnRfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUtuRSxPQUFPLEtBQUssRUFHVixhQUFhLEVBQ2IsbUJBQW1CLEVBQ3BCLE1BQU0sa0NBQWtDLENBQUM7QUFRMUMsUUFBQSxNQUFNLGVBQWUsRUFBRSxXQU10QixDQUFDO0FBRUYsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztJQUNsQyxhQUFhLEVBQUUsYUFBYSxDQUFDO0lBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDZjtBQUVELE1BQU0sV0FBVyxzQkFBc0I7SUFDckMsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7SUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQztJQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUNqQixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEI7QUFFRCxjQUFNLG1CQUFtQjtJQUNoQixTQUFTLEVBQUUsWUFBWSxFQUFFLENBQU07SUFDL0IsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDakMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQ3hCLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBTTtJQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBcUI7SUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBUztJQUN2QixPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUd4RDtJQUVELE9BQU8sU0FLTjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBb0IxQjs7O09BR0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBa0cxQjs7Ozs7OztPQU9HO0lBQ0csaUJBQWlCLENBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLE9BQU8sR0FBRTtRQUNQLGFBQWEsQ0FBQyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNuQixZQUFZLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDbEIscUJBK0RQO0lBRUQsNEJBQTRCLFNBRTNCO0lBRUQsa0NBQWtDLFdBRWpDO0lBRUQ7Ozs7O09BS0c7SUFDRyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkE4Q3BEO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsZ0JBQWdCO0lBcUN4Qjs7T0FFRztJQUNHLE9BQU8sa0JBZ0NaO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0csbUJBQW1CLENBQUMsTUFBTSxFQUFFLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQXVFekY7SUFFRCxPQUFPLENBQUMsaUJBQWlCO0lBa0N6QixPQUFPLENBQUMsa0JBQWtCO0NBaUMzQjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNoRCxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUMifQ==
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyX2NsaWVudF9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3dvcmtlcl9jbGllbnRfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUtuRSxPQUFPLEtBQUssRUFHVixhQUFhLEVBQ2IsbUJBQW1CLEVBQ3BCLE1BQU0sa0NBQWtDLENBQUM7QUFRMUMsUUFBQSxNQUFNLGVBQWUsRUFBRSxXQU10QixDQUFDO0FBRUYsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztJQUNsQyxhQUFhLEVBQUUsYUFBYSxDQUFDO0lBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDZjtBQUVELE1BQU0sV0FBVyxzQkFBc0I7SUFDckMsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7SUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQztJQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUNqQixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEI7QUFFRCxjQUFNLG1CQUFtQjtJQUNoQixTQUFTLEVBQUUsWUFBWSxFQUFFLENBQU07SUFDL0IsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDakMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQ3hCLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBTTtJQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBcUI7SUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBUztJQUN2QixPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUd4RDtJQUVELE9BQU8sU0FJTjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBb0IxQjs7O09BR0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBa0cxQjs7Ozs7OztPQU9HO0lBQ0csaUJBQWlCLENBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLE9BQU8sR0FBRTtRQUNQLGFBQWEsQ0FBQyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNuQixZQUFZLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDbEIscUJBK0RQO0lBRUQsNEJBQTRCLFNBRTNCO0lBRUQsa0NBQWtDLFdBRWpDO0lBRUQ7Ozs7O09BS0c7SUFDRyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkE4Q3BEO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsZ0JBQWdCO0lBcUN4Qjs7T0FFRztJQUNHLE9BQU8sa0JBZ0NaO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0csbUJBQW1CLENBQUMsTUFBTSxFQUFFLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQXVFekY7SUFFRCxPQUFPLENBQUMsaUJBQWlCO0lBa0N6QixPQUFPLENBQUMsa0JBQWtCO0NBaUMzQjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNoRCxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAKxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAKnE,OAAO,KAAK,EAGV,aAAa,EACb,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAQ1C,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,SAKN;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;;;;;;OAOG;IACG,iBAAiB,CACrB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KAClB,qBA+DP;IAED,4BAA4B,SAE3B;IAED,kCAAkC,WAEjC;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBA8CpD;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACG,OAAO,kBAgCZ;IAED;;;;;;;;;OASG;IACG,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuEzF;IAED,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;CAiC3B;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAKxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAKnE,OAAO,KAAK,EAGV,aAAa,EACb,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAQ1C,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,SAIN;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;;;;;;OAOG;IACG,iBAAiB,CACrB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KAClB,qBA+DP;IAED,4BAA4B,SAE3B;IAED,kCAAkC,WAEjC;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBA8CpD;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACG,OAAO,kBAgCZ;IAED;;;;;;;;;OASG;IACG,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuEzF;IAED,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;CAiC3B;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -37,7 +37,6 @@ class WorkerClientManager {
37
37
  destroy() {
38
38
  this.cleanup().catch((error)=>{
39
39
  this.logger.error('Failed to cleanup worker client manager', error);
40
- process.exit(1);
41
40
  });
42
41
  }
43
42
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/p2p",
3
- "version": "0.0.1-commit.ef17749e1",
3
+ "version": "0.0.1-commit.f1b29a41e",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -67,17 +67,17 @@
67
67
  ]
68
68
  },
69
69
  "dependencies": {
70
- "@aztec/constants": "0.0.1-commit.ef17749e1",
71
- "@aztec/epoch-cache": "0.0.1-commit.ef17749e1",
72
- "@aztec/ethereum": "0.0.1-commit.ef17749e1",
73
- "@aztec/foundation": "0.0.1-commit.ef17749e1",
74
- "@aztec/kv-store": "0.0.1-commit.ef17749e1",
75
- "@aztec/noir-contracts.js": "0.0.1-commit.ef17749e1",
76
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.ef17749e1",
77
- "@aztec/protocol-contracts": "0.0.1-commit.ef17749e1",
78
- "@aztec/simulator": "0.0.1-commit.ef17749e1",
79
- "@aztec/stdlib": "0.0.1-commit.ef17749e1",
80
- "@aztec/telemetry-client": "0.0.1-commit.ef17749e1",
70
+ "@aztec/constants": "0.0.1-commit.f1b29a41e",
71
+ "@aztec/epoch-cache": "0.0.1-commit.f1b29a41e",
72
+ "@aztec/ethereum": "0.0.1-commit.f1b29a41e",
73
+ "@aztec/foundation": "0.0.1-commit.f1b29a41e",
74
+ "@aztec/kv-store": "0.0.1-commit.f1b29a41e",
75
+ "@aztec/noir-contracts.js": "0.0.1-commit.f1b29a41e",
76
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.f1b29a41e",
77
+ "@aztec/protocol-contracts": "0.0.1-commit.f1b29a41e",
78
+ "@aztec/simulator": "0.0.1-commit.f1b29a41e",
79
+ "@aztec/stdlib": "0.0.1-commit.f1b29a41e",
80
+ "@aztec/telemetry-client": "0.0.1-commit.f1b29a41e",
81
81
  "@chainsafe/libp2p-gossipsub": "13.0.0",
82
82
  "@chainsafe/libp2p-noise": "^15.0.0",
83
83
  "@chainsafe/libp2p-yamux": "^6.0.2",
@@ -104,8 +104,8 @@
104
104
  "xxhash-wasm": "^1.1.0"
105
105
  },
106
106
  "devDependencies": {
107
- "@aztec/archiver": "0.0.1-commit.ef17749e1",
108
- "@aztec/world-state": "0.0.1-commit.ef17749e1",
107
+ "@aztec/archiver": "0.0.1-commit.f1b29a41e",
108
+ "@aztec/world-state": "0.0.1-commit.f1b29a41e",
109
109
  "@jest/globals": "^30.0.0",
110
110
  "@types/jest": "^30.0.0",
111
111
  "@types/node": "^22.15.17",
@@ -17,7 +17,12 @@ import { AttestationPool, type AttestationPoolApi } from '../mem_pools/attestati
17
17
  import type { MemPools } from '../mem_pools/interface.js';
18
18
  import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
19
19
  import { AztecKVTxPoolV2 } from '../mem_pools/tx_pool_v2/tx_pool_v2.js';
20
- import { createTxValidatorForTransactionsEnteringPendingTxPool } from '../msg_validators/index.js';
20
+ import {
21
+ createCheckAllowedSetupCalls,
22
+ createTxValidatorForReqResponseReceivedTxs,
23
+ createTxValidatorForTransactionsEnteringPendingTxPool,
24
+ getDefaultAllowedSetupFunctions,
25
+ } from '../msg_validators/index.js';
21
26
  import { DummyP2PService } from '../services/dummy_service.js';
22
27
  import { LibP2PService } from '../services/index.js';
23
28
  import { createFileStoreTxSources } from '../services/tx_collection/file_store_tx_source.js';
@@ -75,6 +80,33 @@ export async function createP2PClient(
75
80
  const rollupAddress = inputConfig.l1Contracts.rollupAddress.toString().toLowerCase().replace(/^0x/, '');
76
81
  const txFileStoreBasePath = `aztec-${inputConfig.l1ChainId}-${inputConfig.rollupVersion}-0x${rollupAddress}`;
77
82
 
83
+ const allowedInSetup = [
84
+ ...(await getDefaultAllowedSetupFunctions()),
85
+ ...(inputConfig.txPublicSetupAllowListExtend ?? []),
86
+ ];
87
+ const checkAllowedSetupCalls = createCheckAllowedSetupCalls(
88
+ archiver,
89
+ allowedInSetup,
90
+ () => epochCache.getEpochAndSlotInNextL1Slot().ts,
91
+ );
92
+
93
+ const createTxValidator = async () => {
94
+ // We accept transactions if they are not expired by the next slot and block number (checked based on the ExpirationTimestamp field)
95
+ const currentBlockNumber = await archiver.getBlockNumber();
96
+ const { ts: nextSlotTimestamp } = epochCache.getEpochAndSlotInNextL1Slot();
97
+ const l1Constants = await archiver.getL1Constants();
98
+ return createTxValidatorForTransactionsEnteringPendingTxPool(
99
+ worldStateSynchronizer,
100
+ nextSlotTimestamp,
101
+ BlockNumber(currentBlockNumber + 1),
102
+ {
103
+ rollupManaLimit: l1Constants.rollupManaLimit,
104
+ maxBlockL2Gas: config.validateMaxL2BlockGas,
105
+ maxBlockDAGas: config.validateMaxDABlockGas,
106
+ },
107
+ );
108
+ };
109
+
78
110
  const txPool =
79
111
  deps.txPool ??
80
112
  new AztecKVTxPoolV2(
@@ -83,16 +115,8 @@ export async function createP2PClient(
83
115
  {
84
116
  l2BlockSource: archiver,
85
117
  worldStateSynchronizer,
86
- createTxValidator: async () => {
87
- // We accept transactions if they are not expired by the next slot and block number (checked based on the ExpirationTimestamp field)
88
- const currentBlockNumber = await archiver.getBlockNumber();
89
- const { ts: nextSlotTimestamp } = epochCache.getEpochAndSlotInNextL1Slot();
90
- return createTxValidatorForTransactionsEnteringPendingTxPool(
91
- worldStateSynchronizer,
92
- nextSlotTimestamp,
93
- BlockNumber(currentBlockNumber + 1),
94
- );
95
- },
118
+ checkAllowedSetupCalls,
119
+ createTxValidator,
96
120
  },
97
121
  telemetry,
98
122
  {
@@ -125,9 +149,12 @@ export async function createP2PClient(
125
149
  telemetry,
126
150
  );
127
151
 
152
+ const txValidatorForTxCollection = createTxValidatorForReqResponseReceivedTxs(proofVerifier, config);
128
153
  const nodeSources = [
129
- ...createNodeRpcTxSources(config.txCollectionNodeRpcUrls, config),
130
- ...(deps.rpcTxProviders ?? []).map((node, i) => new NodeRpcTxSource(node, `node-rpc-provider-${i}`)),
154
+ ...createNodeRpcTxSources(config.txCollectionNodeRpcUrls, txValidatorForTxCollection, config),
155
+ ...(deps.rpcTxProviders ?? []).map(
156
+ (node, i) => new NodeRpcTxSource(node, txValidatorForTxCollection, `node-rpc-provider-${i}`),
157
+ ),
131
158
  ...(deps.txCollectionNodeSources ?? []),
132
159
  ];
133
160
  if (nodeSources.length > 0) {
@@ -139,6 +166,7 @@ export async function createP2PClient(
139
166
  const fileStoreSources = await createFileStoreTxSources(
140
167
  config.txCollectionFileStoreUrls,
141
168
  txFileStoreBasePath,
169
+ txValidatorForTxCollection,
142
170
  logger.createChild('file-store-tx-source'),
143
171
  telemetry,
144
172
  );
@@ -82,7 +82,15 @@ export type P2P = P2PClient & {
82
82
  *
83
83
  * @param handler - A function taking a received checkpoint proposal and producing attestations
84
84
  */
85
- registerCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
85
+ registerValidatorCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
86
+
87
+ /**
88
+ * Registers a callback that runs for ALL nodes (not just validators) when a checkpoint proposal is received.
89
+ * Used to set the proposed checkpoint number on the archiver so the sequencer can build on top of it.
90
+ *
91
+ * @param handler - A function taking a received checkpoint proposal
92
+ */
93
+ registerAllNodesCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
86
94
 
87
95
  /**
88
96
  * Registers a callback invoked when a duplicate proposal is detected (equivocation).
@@ -357,6 +357,8 @@ export class P2PClient extends WithTracer implements P2P {
357
357
  // Store our own last-block proposal so we can respond to req/resp requests for it.
358
358
  await this.attestationPool.tryAddBlockProposal(blockProposal);
359
359
  }
360
+ // Gossipsub doesn't deliver own messages, so fire the all-nodes handler locally
361
+ await this.p2pService.notifyOwnCheckpointProposal(proposal.toCore());
360
362
  return this.p2pService.propagate(proposal);
361
363
  }
362
364
 
@@ -388,8 +390,12 @@ export class P2PClient extends WithTracer implements P2P {
388
390
  this.p2pService.registerBlockReceivedCallback(handler);
389
391
  }
390
392
 
391
- public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
392
- this.p2pService.registerCheckpointReceivedCallback(handler);
393
+ public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
394
+ this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
395
+ }
396
+
397
+ public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
398
+ this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
393
399
  }
394
400
 
395
401
  public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
@@ -669,31 +675,50 @@ export class P2PClient extends WithTracer implements P2P {
669
675
  }
670
676
 
671
677
  /**
672
- * Returns true if the prune crossed a checkpoint boundary.
673
- * If the old and new checkpoint numbers are the same, the prune is within a single checkpoint.
674
- * If they differ, the prune spans across checkpoints (epoch prune).
678
+ * Returns true if the prune is an epoch prune (new checkpoint number is less than old).
679
+ * If the checkpoint number stays the same or increases, the prune is within a checkpoint.
675
680
  */
676
681
  private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
677
682
  const tips = await this.l2Tips.getL2Tips();
678
683
  const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
679
- if (oldCheckpointNumber <= CheckpointNumber.ZERO) {
684
+ if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
680
685
  return false;
681
686
  }
682
- const isEpochPrune = oldCheckpointNumber !== newCheckpoint.number;
683
- this.log.info(
684
- `Detected epoch prune: ${isEpochPrune}. Old checkpoint: ${oldCheckpointNumber}, new checkpoint: ${newCheckpoint.number}`,
685
- );
687
+ const newCheckpointNumber = newCheckpoint.number;
688
+ // We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
689
+ // To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
690
+ // This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
691
+ const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
692
+ const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
693
+ if (isEpochPrune) {
694
+ this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
695
+ oldCheckpointNumber,
696
+ newCheckpointNumber,
697
+ thresholdForEpochPrune,
698
+ });
699
+ }
686
700
  return isEpochPrune;
687
701
  }
688
702
 
689
703
  /** Checks if the slot has changed and calls prepareForSlot if so. */
690
704
  private async maybeCallPrepareForSlot(): Promise<void> {
691
- const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
692
- if (currentSlot <= this.lastSlotProcessed) {
705
+ // If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
706
+ const l2Tips = await this.l2Tips.getL2Tips();
707
+ const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
708
+
709
+ let slot;
710
+ if (this.epochCache.isProposerPipeliningEnabled() && hasProposedCheckpoint) {
711
+ const { targetSlot } = this.epochCache.getTargetAndNextSlot();
712
+ slot = targetSlot;
713
+ } else {
714
+ const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
715
+ slot = currentSlot;
716
+ }
717
+ if (slot <= this.lastSlotProcessed) {
693
718
  return;
694
719
  }
695
- this.lastSlotProcessed = currentSlot;
696
- await this.txPool.prepareForSlot(currentSlot);
720
+ this.lastSlotProcessed = slot;
721
+ await this.txPool.prepareForSlot(slot);
697
722
  }
698
723
 
699
724
  private async startServiceIfSynched() {
@@ -19,7 +19,7 @@ import type { P2PConfig } from '../../../config.js';
19
19
  import { BatchTxRequesterCollector, SendBatchRequestCollector } from '../../../services/index.js';
20
20
  import type { IBatchRequestTxValidator } from '../../../services/reqresp/batch-tx-requester/tx_validator.js';
21
21
  import { RateLimitStatus } from '../../../services/reqresp/rate-limiter/rate_limiter.js';
22
- import { MissingTxsTracker } from '../../../services/tx_collection/missing_txs_tracker.js';
22
+ import { RequestTracker } from '../../../services/tx_collection/request_tracker.js';
23
23
  import {
24
24
  AlwaysTrueCircuitVerifier,
25
25
  BENCHMARK_CONSTANTS,
@@ -213,10 +213,9 @@ async function runCollector(cmd: Extract<WorkerCommand, { type: 'RUN_COLLECTOR'
213
213
  const fetched = await executeTimeout(
214
214
  (_signal: AbortSignal) =>
215
215
  collector.collectTxs(
216
- MissingTxsTracker.fromArray(parsedTxHashes),
216
+ RequestTracker.create(parsedTxHashes, new Date(Date.now() + internalTimeoutMs)),
217
217
  parsedProposal,
218
218
  pinnedPeer,
219
- internalTimeoutMs,
220
219
  ),
221
220
  timeoutMs,
222
221
  () => new Error(`Collector timed out after ${timeoutMs}ms`),
@@ -231,10 +230,9 @@ async function runCollector(cmd: Extract<WorkerCommand, { type: 'RUN_COLLECTOR'
231
230
  const fetched = await executeTimeout(
232
231
  (_signal: AbortSignal) =>
233
232
  collector.collectTxs(
234
- MissingTxsTracker.fromArray(parsedTxHashes),
233
+ RequestTracker.create(parsedTxHashes, new Date(Date.now() + internalTimeoutMs)),
235
234
  parsedProposal,
236
235
  pinnedPeer,
237
- internalTimeoutMs,
238
236
  ),
239
237
  timeoutMs,
240
238
  () => new Error(`Collector timed out after ${timeoutMs}ms`),
@@ -261,9 +259,20 @@ async function stopClient() {
261
259
  attestationPool = undefined;
262
260
  }
263
261
 
262
+ function gracefulExit(code: number = 0) {
263
+ try {
264
+ if (process.connected) {
265
+ process.disconnect();
266
+ }
267
+ } catch {
268
+ // IPC channel already closed
269
+ }
270
+ setTimeout(() => process.exit(code), 5000).unref();
271
+ }
272
+
264
273
  process.on('disconnect', () => {
265
274
  ipcDisconnected = true;
266
- void stopClient().finally(() => process.exit(0));
275
+ void stopClient();
267
276
  });
268
277
 
269
278
  process.on('error', err => {
@@ -327,7 +336,7 @@ process.on('message', (msg: WorkerCommand) => {
327
336
  case 'STOP': {
328
337
  await stopClient();
329
338
  await sendMessage({ type: 'STOPPED', requestId });
330
- process.exit(0);
339
+ gracefulExit(0);
331
340
  break;
332
341
  }
333
342
  default: {
@@ -338,7 +347,8 @@ process.on('message', (msg: WorkerCommand) => {
338
347
  } catch (err: any) {
339
348
  await sendMessage({ type: 'ERROR', requestId, error: err?.message ?? String(err) });
340
349
  if (msg.type === 'START') {
341
- process.exit(1);
350
+ await stopClient();
351
+ gracefulExit(1);
342
352
  }
343
353
  }
344
354
  })();
package/src/config.ts CHANGED
@@ -43,6 +43,15 @@ export interface P2PConfig
43
43
  /** Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set. */
44
44
  validateMaxTxsPerBlock?: number;
45
45
 
46
+ /** Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set. */
47
+ validateMaxTxsPerCheckpoint?: number;
48
+
49
+ /** Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected. */
50
+ validateMaxL2BlockGas?: number;
51
+
52
+ /** Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected. */
53
+ validateMaxDABlockGas?: number;
54
+
46
55
  /** A flag dictating whether the P2P subsystem should be enabled. */
47
56
  p2pEnabled: boolean;
48
57
 
@@ -61,6 +70,9 @@ export interface P2PConfig
61
70
  /** The frequency in which to check for new peers. */
62
71
  peerCheckIntervalMS: number;
63
72
 
73
+ /** How long to ban a peer after it fails MAX_DIAL_ATTEMPTS dials. */
74
+ peerFailedBanTimeMs: number;
75
+
64
76
  /** Size of queue of L2 blocks to store. */
65
77
  l2QueueSize: number;
66
78
 
@@ -208,6 +220,22 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
208
220
  'Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set.',
209
221
  parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
210
222
  },
223
+ validateMaxTxsPerCheckpoint: {
224
+ env: 'VALIDATOR_MAX_TX_PER_CHECKPOINT',
225
+ description:
226
+ 'Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set.',
227
+ parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
228
+ },
229
+ validateMaxL2BlockGas: {
230
+ env: 'VALIDATOR_MAX_L2_BLOCK_GAS',
231
+ description: 'Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected.',
232
+ parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
233
+ },
234
+ validateMaxDABlockGas: {
235
+ env: 'VALIDATOR_MAX_DA_BLOCK_GAS',
236
+ description: 'Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected.',
237
+ parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
238
+ },
211
239
  p2pEnabled: {
212
240
  env: 'P2P_ENABLED',
213
241
  description: 'A flag dictating whether the P2P subsystem should be enabled.',
@@ -238,6 +266,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
238
266
  description: 'The frequency in which to check for new peers.',
239
267
  ...numberConfigHelper(30_000),
240
268
  },
269
+ peerFailedBanTimeMs: {
270
+ env: 'P2P_PEER_FAILED_BAN_TIME_MS',
271
+ description: 'How long to ban a peer after it fails maximum dial attempts.',
272
+ ...numberConfigHelper(5 * 60 * 1000),
273
+ },
241
274
  l2QueueSize: {
242
275
  env: 'P2P_L2_QUEUE_SIZE',
243
276
  description: 'Size of queue of L2 blocks to store.',
@@ -0,0 +1,11 @@
1
+ /** Checkpoint Proposal Received Callback Not Registered Error
2
+ *
3
+ * Error triggered if the allNodesCheckpointReceivedCallback is not registered
4
+ * @category Errors
5
+ */
6
+ export class CheckpointProposalReceivedCallbackNotRegisteredError extends Error {
7
+ constructor() {
8
+ super('FATAL (allNodesCheckpointReceivedCallback): All nodes should register a checkpoint proposal handler');
9
+ this.name = 'CheckpointProposalReceivedCallbackNotRegisteredError';
10
+ }
11
+ }
package/src/index.ts CHANGED
@@ -6,7 +6,6 @@ export * from './client/index.js';
6
6
  export * from './enr/index.js';
7
7
  export * from './config.js';
8
8
  export * from './mem_pools/attestation_pool/index.js';
9
- export * from './mem_pools/tx_pool/index.js';
10
9
  export * from './mem_pools/tx_pool_v2/index.js';
11
10
  export * from './msg_validators/index.js';
12
11
  export * from './services/index.js';
@@ -26,10 +26,10 @@ export type TryAddResult = {
26
26
  count: number;
27
27
  };
28
28
 
29
- export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 5;
30
- export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
29
+ export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
30
+ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
31
31
  /** Maximum attestations a single signer can make per slot before being rejected. */
32
- export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 3;
32
+ export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
33
33
 
34
34
  /** Public API interface for attestation pools. Used for typing mocks and test implementations. */
35
35
  export type AttestationPoolApi = Pick<
@@ -278,7 +278,7 @@ export class AttestationPool {
278
278
  * @returns Result indicating whether the proposal was added and duplicate detection info
279
279
  */
280
280
  public async tryAddCheckpointProposal(proposal: CheckpointProposalCore): Promise<TryAddResult> {
281
- return await this.store.transactionAsync(async () => {
281
+ const result = await this.store.transactionAsync(async () => {
282
282
  const proposalId = proposal.archive.toString();
283
283
 
284
284
  // Check if already exists
@@ -304,6 +304,8 @@ export class AttestationPool {
304
304
 
305
305
  return { added: true, alreadyExists: false, count: count + 1 };
306
306
  });
307
+
308
+ return result;
307
309
  }
308
310
 
309
311
  /** Internal method - must be called within a transaction. */
@@ -345,7 +347,7 @@ export class AttestationPool {
345
347
  await this.store.transactionAsync(async () => {
346
348
  for (const attestation of attestations) {
347
349
  const slotNumber = attestation.payload.header.slotNumber;
348
- const proposalId = attestation.archive;
350
+ const proposalId = attestation.archive.toString();
349
351
  const sender = attestation.getSender();
350
352
 
351
353
  // Skip attestations with invalid signatures