@aztec/p2p 0.0.1-commit.c7c42ec → 0.0.1-commit.c80b6263

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 (332) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +1 -1
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +6 -5
  7. package/dest/client/interface.d.ts +18 -5
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +10 -13
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +449 -118
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +8 -2
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +4 -2
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +237 -263
  26. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +113 -108
  29. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
  30. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +16 -12
  35. package/dest/mem_pools/instrumentation.d.ts +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.js +5 -14
  38. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
  39. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
  41. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
  42. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
  44. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
  45. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
  47. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  48. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  49. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  50. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
  51. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
  53. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  55. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  58. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  60. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  61. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  62. package/dest/msg_validators/attestation_validator/attestation_validator.js +51 -18
  63. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  64. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  65. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
  66. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  67. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  68. package/dest/msg_validators/clock_tolerance.js +37 -0
  69. package/dest/msg_validators/index.d.ts +2 -2
  70. package/dest/msg_validators/index.d.ts.map +1 -1
  71. package/dest/msg_validators/index.js +1 -1
  72. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  73. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  74. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  75. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  76. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  77. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  78. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  79. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  80. package/dest/msg_validators/proposal_validator/index.js +3 -0
  81. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  82. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  83. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  84. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  85. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  86. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  87. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +3 -2
  88. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  90. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  91. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  93. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  94. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  96. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  97. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/factory.js +21 -11
  99. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  100. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  101. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  102. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  103. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  105. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  106. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/index.js +1 -0
  108. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  109. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  111. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  112. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  114. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  115. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  116. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  117. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  118. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  120. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  121. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  123. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  124. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  126. package/dest/services/discv5/discV5_service.js +1 -1
  127. package/dest/services/dummy_service.d.ts +18 -2
  128. package/dest/services/dummy_service.d.ts.map +1 -1
  129. package/dest/services/dummy_service.js +42 -0
  130. package/dest/services/encoding.d.ts +1 -1
  131. package/dest/services/encoding.d.ts.map +1 -1
  132. package/dest/services/encoding.js +6 -5
  133. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  134. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  135. package/dest/services/libp2p/instrumentation.js +30 -72
  136. package/dest/services/libp2p/libp2p_service.d.ts +36 -13
  137. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  138. package/dest/services/libp2p/libp2p_service.js +741 -173
  139. package/dest/services/peer-manager/metrics.d.ts +2 -2
  140. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  141. package/dest/services/peer-manager/metrics.js +21 -26
  142. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  143. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  144. package/dest/services/peer-manager/peer_manager.js +0 -10
  145. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  146. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  147. package/dest/services/peer-manager/peer_scoring.js +7 -4
  148. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  149. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  150. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  151. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  152. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  153. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  154. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  155. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  156. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  157. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  158. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  159. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  160. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  161. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  162. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  163. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  164. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  165. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  166. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  167. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  168. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  169. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  170. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  171. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  172. package/dest/services/reqresp/constants.d.ts +12 -0
  173. package/dest/services/reqresp/constants.d.ts.map +1 -0
  174. package/dest/services/reqresp/constants.js +7 -0
  175. package/dest/services/reqresp/interface.d.ts +3 -1
  176. package/dest/services/reqresp/interface.d.ts.map +1 -1
  177. package/dest/services/reqresp/metrics.d.ts +6 -5
  178. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  179. package/dest/services/reqresp/metrics.js +17 -21
  180. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  181. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  182. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  183. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  184. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +14 -1
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +15 -3
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  188. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +33 -3
  189. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  190. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  191. package/dest/services/reqresp/protocols/status.js +4 -1
  192. package/dest/services/reqresp/reqresp.d.ts +6 -1
  193. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  194. package/dest/services/reqresp/reqresp.js +460 -46
  195. package/dest/services/service.d.ts +19 -3
  196. package/dest/services/service.d.ts.map +1 -1
  197. package/dest/services/tx_collection/config.d.ts +4 -1
  198. package/dest/services/tx_collection/config.d.ts.map +1 -1
  199. package/dest/services/tx_collection/config.js +9 -1
  200. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
  201. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  202. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  203. package/dest/services/tx_collection/index.d.ts +2 -1
  204. package/dest/services/tx_collection/index.d.ts.map +1 -1
  205. package/dest/services/tx_collection/index.js +1 -0
  206. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  207. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  208. package/dest/services/tx_collection/instrumentation.js +10 -13
  209. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  210. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  211. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  212. package/dest/services/tx_collection/slow_tx_collection.d.ts +3 -3
  213. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  214. package/dest/services/tx_collection/tx_collection.d.ts +8 -8
  215. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  216. package/dest/services/tx_collection/tx_collection.js +5 -5
  217. package/dest/services/tx_provider.d.ts +3 -3
  218. package/dest/services/tx_provider.d.ts.map +1 -1
  219. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  220. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  221. package/dest/services/tx_provider_instrumentation.js +7 -20
  222. package/dest/test-helpers/index.d.ts +3 -1
  223. package/dest/test-helpers/index.d.ts.map +1 -1
  224. package/dest/test-helpers/index.js +2 -0
  225. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  226. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  227. package/dest/test-helpers/test_tx_provider.js +41 -0
  228. package/dest/test-helpers/testbench-utils.d.ts +156 -0
  229. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  230. package/dest/test-helpers/testbench-utils.js +296 -0
  231. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  232. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  233. package/dest/testbench/p2p_client_testbench_worker.js +218 -124
  234. package/dest/testbench/worker_client_manager.d.ts +51 -6
  235. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  236. package/dest/testbench/worker_client_manager.js +226 -39
  237. package/package.json +16 -16
  238. package/src/bootstrap/bootstrap.ts +7 -4
  239. package/src/client/factory.ts +6 -10
  240. package/src/client/interface.ts +19 -4
  241. package/src/client/p2p_client.ts +82 -132
  242. package/src/client/test/tx_proposal_collector/README.md +227 -0
  243. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  244. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  245. package/src/config.ts +8 -3
  246. package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
  247. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +239 -287
  248. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +162 -140
  249. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
  250. package/src/mem_pools/attestation_pool/mocks.ts +19 -13
  251. package/src/mem_pools/instrumentation.ts +10 -18
  252. package/src/mem_pools/tx_pool/README.md +28 -13
  253. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
  254. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
  255. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
  256. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  257. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  258. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  259. package/src/msg_validators/attestation_validator/attestation_validator.ts +36 -21
  260. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +19 -16
  261. package/src/msg_validators/clock_tolerance.ts +51 -0
  262. package/src/msg_validators/index.ts +1 -1
  263. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  264. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  265. package/src/msg_validators/proposal_validator/index.ts +3 -0
  266. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  267. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  268. package/src/msg_validators/tx_validator/block_header_validator.ts +7 -4
  269. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  270. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  271. package/src/msg_validators/tx_validator/factory.ts +64 -23
  272. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  273. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  274. package/src/msg_validators/tx_validator/index.ts +1 -0
  275. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  276. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  277. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  278. package/src/msg_validators/tx_validator/timestamp_validator.ts +9 -4
  279. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  280. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  281. package/src/services/discv5/discV5_service.ts +1 -1
  282. package/src/services/dummy_service.ts +51 -0
  283. package/src/services/encoding.ts +5 -4
  284. package/src/services/libp2p/instrumentation.ts +32 -73
  285. package/src/services/libp2p/libp2p_service.ts +404 -154
  286. package/src/services/peer-manager/metrics.ts +22 -26
  287. package/src/services/peer-manager/peer_manager.ts +1 -2
  288. package/src/services/peer-manager/peer_scoring.ts +3 -4
  289. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  290. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  291. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  292. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  293. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  294. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  295. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  296. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  297. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  298. package/src/services/reqresp/constants.ts +14 -0
  299. package/src/services/reqresp/interface.ts +3 -0
  300. package/src/services/reqresp/metrics.ts +36 -27
  301. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  302. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +16 -2
  303. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +46 -4
  304. package/src/services/reqresp/protocols/status.ts +7 -4
  305. package/src/services/reqresp/reqresp.ts +66 -19
  306. package/src/services/service.ts +23 -4
  307. package/src/services/tx_collection/config.ts +15 -1
  308. package/src/services/tx_collection/fast_tx_collection.ts +36 -13
  309. package/src/services/tx_collection/index.ts +5 -0
  310. package/src/services/tx_collection/instrumentation.ts +5 -13
  311. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  312. package/src/services/tx_collection/slow_tx_collection.ts +2 -2
  313. package/src/services/tx_collection/tx_collection.ts +8 -8
  314. package/src/services/tx_provider.ts +2 -2
  315. package/src/services/tx_provider_instrumentation.ts +13 -20
  316. package/src/test-helpers/index.ts +2 -0
  317. package/src/test-helpers/test_tx_provider.ts +64 -0
  318. package/src/test-helpers/testbench-utils.ts +372 -0
  319. package/src/testbench/p2p_client_testbench_worker.ts +337 -119
  320. package/src/testbench/worker_client_manager.ts +304 -42
  321. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
  322. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
  323. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
  324. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  325. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  326. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  327. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  328. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  329. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  330. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
  331. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  332. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,124 +1,97 @@
1
1
  /**
2
2
  * A testbench worker that creates a p2p client and listens for commands from the parent.
3
3
  *
4
- * Used when running testbench commands
4
+ * Used when running testbench commands.
5
5
  */
6
6
  import { MockL2BlockSource } from '@aztec/archiver/test';
7
7
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
8
- import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
9
- import { EthAddress } from '@aztec/foundation/eth-address';
10
- import { createLogger } from '@aztec/foundation/log';
8
+ import { BlockNumber } from '@aztec/foundation/branded-types';
9
+ import { SecretValue } from '@aztec/foundation/config';
10
+ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
11
+ import { Fr } from '@aztec/foundation/curves/bn254';
12
+ import { type Logger, createLogger } from '@aztec/foundation/log';
11
13
  import { sleep } from '@aztec/foundation/sleep';
14
+ import { DateProvider, Timer } from '@aztec/foundation/timer';
12
15
  import type { DataStoreConfig } from '@aztec/kv-store/config';
13
16
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
17
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
18
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
14
19
  import type { L2BlockSource } from '@aztec/stdlib/block';
15
20
  import type { ContractDataSource } from '@aztec/stdlib/contract';
16
21
  import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
17
- import { P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
18
- import { Tx, TxStatus } from '@aztec/stdlib/tx';
22
+ import { type BlockProposal, P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
23
+ import { ChonkProof } from '@aztec/stdlib/proofs';
24
+ import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing';
25
+ import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx';
19
26
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
20
27
 
21
28
  import type { Message, PeerId } from '@libp2p/interface';
22
29
  import { TopicValidatorResult } from '@libp2p/interface';
23
- import EventEmitter from 'events';
30
+ import { peerIdFromString } from '@libp2p/peer-id';
24
31
 
32
+ import type { P2PClient } from '../client/p2p_client.js';
25
33
  import type { P2PConfig } from '../config.js';
26
34
  import { createP2PClient } from '../index.js';
27
- import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
28
35
  import type { MemPools } from '../mem_pools/interface.js';
29
- import type { TxPool } from '../mem_pools/tx_pool/index.js';
30
36
  import { LibP2PService } from '../services/libp2p/libp2p_service.js';
31
37
  import type { PeerManager } from '../services/peer-manager/peer_manager.js';
38
+ import type { BatchTxRequesterLibP2PService } from '../services/reqresp/batch-tx-requester/interface.js';
39
+ import type { IBatchRequestTxValidator } from '../services/reqresp/batch-tx-requester/tx_validator.js';
40
+ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
32
41
  import type { ReqResp } from '../services/reqresp/reqresp.js';
33
42
  import type { PeerDiscoveryService } from '../services/service.js';
43
+ import {
44
+ BatchTxRequesterCollector,
45
+ SendBatchRequestCollector,
46
+ } from '../services/tx_collection/proposal_tx_collector.js';
34
47
  import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
48
+ import {
49
+ BENCHMARK_CONSTANTS,
50
+ type CollectorType,
51
+ type DistributionPattern,
52
+ InMemoryAttestationPool,
53
+ InMemoryTxPool,
54
+ UNLIMITED_RATE_LIMIT_QUOTA,
55
+ createMockEpochCache,
56
+ createMockWorldStateSynchronizer,
57
+ filterTxsByDistribution,
58
+ } from '../test-helpers/testbench-utils.js';
35
59
  import type { PubSubLibp2p } from '../util.js';
36
60
 
37
- // Simple mock implementation
38
- function mockTxPool(): TxPool {
39
- // Mock all methods
40
- const pool: Omit<TxPool, keyof EventEmitter> = {
41
- isEmpty: () => Promise.resolve(false),
42
- addTxs: () => Promise.resolve(1),
43
- getTxByHash: () => Promise.resolve(undefined),
44
- getArchivedTxByHash: () => Promise.resolve(undefined),
45
- markAsMined: () => Promise.resolve(),
46
- markMinedAsPending: () => Promise.resolve(),
47
- deleteTxs: () => Promise.resolve(),
48
- getAllTxs: () => Promise.resolve([]),
49
- getAllTxHashes: () => Promise.resolve([]),
50
- getPendingTxHashes: () => Promise.resolve([]),
51
- getPendingTxCount: () => Promise.resolve(0),
52
- getMinedTxHashes: () => Promise.resolve([]),
53
- getTxStatus: () => Promise.resolve(TxStatus.PENDING),
54
- getTxsByHash: () => Promise.resolve([]),
55
- hasTxs: () => Promise.resolve([]),
56
- hasTx: () => Promise.resolve(false),
57
- updateConfig: () => {},
58
- markTxsAsNonEvictable: () => Promise.resolve(),
59
- clearNonEvictableTxs: () => Promise.resolve(),
60
- cleanupDeletedMinedTxs: () => Promise.resolve(0),
61
- };
62
- return Object.assign(new EventEmitter(), pool);
63
- }
61
+ export type { DistributionPattern, CollectorType } from '../test-helpers/testbench-utils.js';
62
+ export { COLLECTOR_DISPLAY_NAMES } from '../test-helpers/testbench-utils.js';
64
63
 
65
- function mockAttestationPool(): AttestationPool {
66
- return {
67
- isEmpty: () => Promise.resolve(false),
68
- addAttestations: () => Promise.resolve(),
69
- deleteAttestations: () => Promise.resolve(),
70
- deleteAttestationsOlderThan: () => Promise.resolve(),
71
- deleteAttestationsForSlot: () => Promise.resolve(),
72
- deleteAttestationsForSlotAndProposal: () => Promise.resolve(),
73
- getAttestationsForSlot: () => Promise.resolve([]),
74
- getAttestationsForSlotAndProposal: () => Promise.resolve([]),
75
- addBlockProposal: () => Promise.resolve(),
76
- getBlockProposal: () => Promise.resolve(undefined),
77
- hasBlockProposal: () => Promise.resolve(false),
78
- hasAttestation: () => Promise.resolve(false),
79
- canAddProposal: () => Promise.resolve(true),
80
- canAddAttestation: () => Promise.resolve(true),
81
- };
64
+ export interface BenchReqRespCommand {
65
+ type: 'BENCH_REQRESP';
66
+ txCount: number;
67
+ peerCount: number;
68
+ distribution: DistributionPattern;
69
+ collectorType: CollectorType;
70
+ timeoutMs: number;
71
+ isAggregator: boolean;
72
+ peerIndex: number;
73
+ pinnedPeerIndex?: number;
74
+ pinnedPeerId?: string;
75
+ blockNumber: number;
76
+ seed: number;
82
77
  }
83
78
 
84
- function mockEpochCache(): EpochCacheInterface {
85
- return {
86
- getCommittee: () => Promise.resolve({ committee: [], seed: 1n, epoch: EpochNumber.ZERO }),
87
- getProposerIndexEncoding: () => '0x' as `0x${string}`,
88
- getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n }),
89
- computeProposerIndex: () => 0n,
90
- getProposerAttesterAddressInCurrentOrNextSlot: () =>
91
- Promise.resolve({
92
- currentProposer: EthAddress.ZERO,
93
- nextProposer: EthAddress.ZERO,
94
- currentSlot: SlotNumber.ZERO,
95
- nextSlot: SlotNumber.ZERO,
96
- }),
97
- getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
98
- isInCommittee: () => Promise.resolve(false),
99
- getRegisteredValidators: () => Promise.resolve([]),
100
- filterInCommittee: () => Promise.resolve([]),
101
- };
79
+ export interface BenchResultMessage {
80
+ type: 'BENCH_RESULT';
81
+ durationMs: number;
82
+ fetchedCount: number;
83
+ success: boolean;
84
+ error?: string;
102
85
  }
103
86
 
104
- function mockWorldStateSynchronizer(): WorldStateSynchronizer {
105
- return {
106
- status: () =>
107
- Promise.resolve({
108
- syncSummary: {
109
- latestBlockNumber: 0,
110
- latestBlockHash: '',
111
- finalizedBlockNumber: 0,
112
- treesAreSynched: false,
113
- oldestHistoricBlockNumber: 0,
114
- },
115
- }),
116
- } as WorldStateSynchronizer;
87
+ export interface BenchReadyMessage {
88
+ type: 'BENCH_READY';
117
89
  }
90
+ const txCache = new Map<number, Tx[]>();
118
91
 
119
92
  class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends LibP2PService<T> {
120
93
  private disableTxValidation: boolean;
121
- private gossipMessageCount: number = 0;
94
+ private gossipMessageCount = 0;
122
95
 
123
96
  constructor(
124
97
  clientType: T,
@@ -187,90 +160,335 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
187
160
  }
188
161
  }
189
162
 
163
+ async function generateDeterministicTxs(txCount: number, seed: number, config: P2PConfig): Promise<Tx[]> {
164
+ const cached = txCache.get(seed) ?? [];
165
+ if (cached.length >= txCount) {
166
+ return cached.slice(0, txCount);
167
+ }
168
+
169
+ const includeByTimestampBase = BigInt(seed);
170
+ for (let i = cached.length; i < txCount; i++) {
171
+ const txSeed = seed * 10000 + i;
172
+ const tx = await mockTx(txSeed, {
173
+ chainId: new Fr(config.l1ChainId),
174
+ version: new Fr(config.rollupVersion),
175
+ vkTreeRoot: getVKTreeRoot(),
176
+ protocolContractsHash,
177
+ feePayer: makeAztecAddress(txSeed + 1),
178
+ chonkProof: ChonkProof.empty(),
179
+ numberOfNonRevertiblePublicCallRequests: 0,
180
+ numberOfRevertiblePublicCallRequests: 0,
181
+ numberOfRevertibleNullifiers: 0,
182
+ hasPublicTeardownCallRequest: false,
183
+ publicCalldataSize: 0,
184
+ });
185
+ tx.data.includeByTimestamp = includeByTimestampBase + BigInt(i);
186
+ await tx.recomputeHash();
187
+ cached.push(tx);
188
+ }
189
+
190
+ txCache.set(seed, cached);
191
+ return cached.slice(0, txCount);
192
+ }
193
+
194
+ async function createBlockProposal(blockNumber: number, txHashes: TxHash[], seed: number): Promise<BlockProposal> {
195
+ const archiveRoot = new Fr(BigInt(seed) * 1000000n + BigInt(blockNumber));
196
+ return await makeBlockProposal({
197
+ signer: Secp256k1Signer.random(),
198
+ blockHeader: makeBlockHeader(1, { blockNumber: BlockNumber(blockNumber) }),
199
+ archiveRoot,
200
+ txHashes,
201
+ });
202
+ }
203
+
204
+ function installUnlimitedRateLimits(client: P2PClient): void {
205
+ const reqResp = (client as any).p2pService.reqresp as any;
206
+ const rateLimiter = reqResp.rateLimiter as any;
207
+
208
+ rateLimiter.getRateLimits = () => UNLIMITED_RATE_LIMIT_QUOTA;
209
+ rateLimiter.allow = () => RateLimitStatus.Allowed;
210
+ }
211
+
212
+ async function runAggregatorBenchmark(
213
+ client: P2PClient,
214
+ blockProposal: BlockProposal,
215
+ collectorType: CollectorType,
216
+ timeoutMs: number,
217
+ pinnedPeerId: string | undefined,
218
+ pinnedPeerIndex: number | undefined,
219
+ logger: Logger,
220
+ expectedPeerCount: number,
221
+ ): Promise<BenchResultMessage> {
222
+ let timer = new Timer();
223
+ try {
224
+ installUnlimitedRateLimits(client);
225
+
226
+ const txHashes = blockProposal.txHashes;
227
+ logger.info(`[BENCH] Using block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`);
228
+
229
+ const p2pService = (client as any).p2pService;
230
+ const batchTxRequesterService: BatchTxRequesterLibP2PService = p2pService.getBatchTxRequesterService();
231
+
232
+ const minPeersRequired = Math.max(1, expectedPeerCount - 1);
233
+ const maxWaitMs = BENCHMARK_CONSTANTS.MAX_PEER_WAIT_MS;
234
+ const waitInterval = BENCHMARK_CONSTANTS.PEER_CHECK_INTERVAL_MS;
235
+ let waited = 0;
236
+
237
+ while (waited < maxWaitMs) {
238
+ const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
239
+ if (connectedPeers.length >= minPeersRequired) {
240
+ logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers, starting benchmark`);
241
+ break;
242
+ }
243
+ logger.debug(`[BENCH] Waiting for peers: ${connectedPeers.length}/${minPeersRequired} (waited ${waited}ms)`);
244
+ await sleep(waitInterval);
245
+ waited += waitInterval;
246
+ }
247
+
248
+ const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
249
+ logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers`);
250
+ logger.info(
251
+ `[BENCH] Requesting ${txHashes.length} tx hashes: ${txHashes
252
+ .slice(0, 3)
253
+ .map(h => h.toString())
254
+ .join(', ')}...`,
255
+ );
256
+
257
+ let pinnedPeer: PeerId | undefined;
258
+ if (pinnedPeerId) {
259
+ pinnedPeer = peerIdFromString(pinnedPeerId);
260
+ } else if (pinnedPeerIndex !== undefined) {
261
+ if (pinnedPeerIndex > 0 && pinnedPeerIndex <= connectedPeers.length) {
262
+ pinnedPeer = connectedPeers[pinnedPeerIndex - 1];
263
+ }
264
+ }
265
+
266
+ const noopTxValidator: IBatchRequestTxValidator = {
267
+ validateRequestedTx: (_tx: Tx): Promise<TxValidationResult> => Promise.resolve({ result: 'valid' }),
268
+ validateRequestedTxs: (txs: Tx[]): Promise<TxValidationResult[]> =>
269
+ Promise.resolve(txs.map(() => ({ result: 'valid' }))),
270
+ };
271
+
272
+ timer = new Timer();
273
+ if (collectorType === 'batch-requester') {
274
+ const collector = new BatchTxRequesterCollector(
275
+ batchTxRequesterService,
276
+ logger,
277
+ new DateProvider(),
278
+ noopTxValidator,
279
+ );
280
+ const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
281
+ const durationMs = timer.ms();
282
+ return {
283
+ type: 'BENCH_RESULT',
284
+ durationMs,
285
+ fetchedCount: fetchedTxs.length,
286
+ success: fetchedTxs.length === txHashes.length,
287
+ };
288
+ }
289
+
290
+ const collector = new SendBatchRequestCollector(
291
+ batchTxRequesterService,
292
+ BENCHMARK_CONSTANTS.FIXED_MAX_PEERS,
293
+ BENCHMARK_CONSTANTS.FIXED_MAX_RETRY_ATTEMPTS,
294
+ );
295
+ const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
296
+ const durationMs = timer.ms();
297
+ return {
298
+ type: 'BENCH_RESULT',
299
+ durationMs,
300
+ fetchedCount: fetchedTxs.length,
301
+ success: fetchedTxs.length === txHashes.length,
302
+ };
303
+ } catch (err: any) {
304
+ return {
305
+ type: 'BENCH_RESULT',
306
+ durationMs: timer.ms(),
307
+ fetchedCount: 0,
308
+ success: false,
309
+ error: err?.message ?? String(err),
310
+ };
311
+ }
312
+ }
313
+
314
+ let workerClient: P2PClient | null = null;
315
+ let workerTxPool: InMemoryTxPool | null = null;
316
+ let workerAttestationPool: InMemoryAttestationPool | null = null;
317
+ let workerConfig: P2PConfig | null = null;
318
+ let workerLogger: Logger | null = null;
319
+ let kvStore: Awaited<ReturnType<typeof openTmpStore>> | null = null;
320
+
190
321
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
191
322
  process.on('message', async msg => {
192
- const { type, config, clientIndex } = msg as { type: string; config: P2PConfig; clientIndex: number };
323
+ const {
324
+ type,
325
+ config: rawConfig,
326
+ clientIndex,
327
+ } = msg as {
328
+ type: string;
329
+ config: Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey?: string };
330
+ clientIndex: number;
331
+ };
332
+
193
333
  try {
194
334
  if (type === 'START') {
195
- const txPool = mockTxPool();
196
- const attestationPool = mockAttestationPool();
197
- const epochCache = mockEpochCache();
198
- const worldState = mockWorldStateSynchronizer();
335
+ const config: P2PConfig = {
336
+ ...rawConfig,
337
+ peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
338
+ } as P2PConfig;
339
+
340
+ workerConfig = config;
341
+ workerTxPool = new InMemoryTxPool();
342
+ workerAttestationPool = new InMemoryAttestationPool();
343
+ const epochCache = createMockEpochCache();
344
+ const worldState = createMockWorldStateSynchronizer();
199
345
  const l2BlockSource = new MockL2BlockSource();
200
346
 
201
347
  const proofVerifier = new AlwaysTrueCircuitVerifier();
202
- const kvStore = await openTmpStore(`test-${clientIndex}`);
203
- const logger = createLogger(`p2p:${clientIndex}`);
348
+ kvStore = await openTmpStore(`test-${clientIndex}`);
349
+ workerLogger = createLogger(`p2p:${clientIndex}`);
350
+ workerTxPool.setLogger(workerLogger);
204
351
  const telemetry = getTelemetryClient();
205
352
 
206
353
  const deps = {
207
- txPool,
208
- attestationPool,
354
+ txPool: workerTxPool,
355
+ attestationPool: workerAttestationPool,
209
356
  store: kvStore,
210
- logger,
357
+ logger: workerLogger,
211
358
  };
212
359
 
213
360
  const client = await createP2PClient(
214
361
  P2PClientType.Full,
215
362
  config as P2PConfig & DataStoreConfig,
216
363
  l2BlockSource,
217
- proofVerifier,
364
+ proofVerifier as ClientProtocolCircuitVerifier,
218
365
  worldState,
219
366
  epochCache,
220
367
  'test-p2p-bench-worker',
221
368
  undefined,
222
- telemetry,
369
+ telemetry as TelemetryClient,
223
370
  deps,
224
371
  );
225
372
 
226
- // Create test service with validation disabled
227
373
  const testService = new TestLibP2PService(
228
374
  P2PClientType.Full,
229
375
  config,
230
376
  (client as any).p2pService.node,
231
377
  (client as any).p2pService.peerDiscoveryService,
232
- (client as any).p2pService.mempools,
233
378
  (client as any).p2pService.reqresp,
234
379
  (client as any).p2pService.peerManager,
380
+ (client as any).p2pService.mempools,
235
381
  (client as any).p2pService.archiver,
236
382
  epochCache,
237
383
  proofVerifier,
238
384
  worldState,
239
- telemetry,
240
- logger,
241
- true, // disable validation
385
+ telemetry as TelemetryClient,
386
+ workerLogger,
387
+ true,
242
388
  );
243
389
 
244
- // Replace the existing p2pService with our test version
245
390
  (client as any).p2pService = testService;
246
391
 
247
392
  await client.start();
248
- // Wait until the client is ready
249
393
  for (let i = 0; i < 100; i++) {
250
394
  const isReady = client.isReady();
251
- logger.debug(`Client ${clientIndex} isReady: ${isReady}`);
395
+ workerLogger.debug(`Client ${clientIndex} isReady: ${isReady}`);
252
396
  if (isReady) {
253
397
  break;
254
398
  }
255
399
  await sleep(1000);
256
400
  }
257
401
 
258
- // Listen for commands from parent
259
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
260
- process.on('message', async (cmd: any) => {
261
- switch (cmd.type) {
262
- case 'STOP':
263
- await client.stop();
264
- process.exit(0);
265
- break;
266
- case 'SEND_TX':
267
- await client.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
268
- process.send!({ type: 'TX_SENT' });
269
- break;
402
+ workerClient = client;
403
+ const peerId = (client as any).p2pService.node.peerId.toString();
404
+ process.send!({ type: 'READY', peerId });
405
+ return;
406
+ }
407
+
408
+ const cmd = msg as any;
409
+ switch (cmd.type) {
410
+ case 'STOP':
411
+ if (workerClient) {
412
+ await workerClient.stop();
270
413
  }
271
- });
414
+ if (kvStore?.close) {
415
+ await kvStore.close();
416
+ }
417
+ process.exit(0);
418
+ break;
419
+
420
+ case 'SEND_TX':
421
+ if (workerClient) {
422
+ await workerClient.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
423
+ process.send!({ type: 'TX_SENT' });
424
+ }
425
+ break;
426
+
427
+ case 'BENCH_REQRESP': {
428
+ const benchCmd = cmd as BenchReqRespCommand;
429
+ if (!workerClient || !workerTxPool || !workerAttestationPool || !workerConfig || !workerLogger) {
430
+ process.send!({
431
+ type: 'BENCH_RESULT',
432
+ durationMs: 0,
433
+ fetchedCount: 0,
434
+ success: false,
435
+ error: 'Worker not initialized',
436
+ } as BenchResultMessage);
437
+ break;
438
+ }
439
+
440
+ // Reset state before each benchmark run to avoid cross-run contamination
441
+ workerTxPool.resetState();
442
+ workerAttestationPool.resetState();
443
+
444
+ installUnlimitedRateLimits(workerClient);
445
+
446
+ const allTxs = await generateDeterministicTxs(benchCmd.txCount, benchCmd.seed, workerConfig);
447
+ const txHashes = allTxs.map(tx => tx.getTxHash());
448
+ const blockProposal = await createBlockProposal(benchCmd.blockNumber, txHashes, benchCmd.seed);
272
449
 
273
- process.send!({ type: 'READY' });
450
+ await workerAttestationPool.addBlockProposal(blockProposal);
451
+ workerLogger.debug(
452
+ `[BENCH] Added block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`,
453
+ );
454
+
455
+ if (benchCmd.isAggregator) {
456
+ workerTxPool.clearTxs();
457
+
458
+ workerLogger.info(
459
+ `[BENCH] Aggregator starting benchmark: txCount=${benchCmd.txCount}, collector=${benchCmd.collectorType}, distribution=${benchCmd.distribution}`,
460
+ );
461
+
462
+ const result = await runAggregatorBenchmark(
463
+ workerClient,
464
+ blockProposal,
465
+ benchCmd.collectorType,
466
+ benchCmd.timeoutMs,
467
+ benchCmd.pinnedPeerId,
468
+ benchCmd.pinnedPeerIndex,
469
+ workerLogger,
470
+ benchCmd.peerCount,
471
+ );
472
+
473
+ process.send!(result);
474
+ } else {
475
+ const myTxs = filterTxsByDistribution(
476
+ allTxs,
477
+ benchCmd.peerIndex,
478
+ benchCmd.peerCount,
479
+ benchCmd.distribution,
480
+ benchCmd.pinnedPeerIndex,
481
+ );
482
+ workerTxPool.setTxs(myTxs);
483
+
484
+ workerLogger.info(
485
+ `[BENCH] Peer ${benchCmd.peerIndex} populated tx pool with ${myTxs.length}/${benchCmd.txCount} txs (${benchCmd.distribution})`,
486
+ );
487
+
488
+ process.send!({ type: 'BENCH_READY' } as BenchReadyMessage);
489
+ }
490
+ break;
491
+ }
274
492
  }
275
493
  } catch (err: any) {
276
494
  process.send!({ type: 'ERROR', error: err.message });