@aztec/p2p 0.0.1-commit.b655e406 → 0.0.1-commit.c2595eba

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 (444) 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 +2 -2
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +8 -8
  7. package/dest/client/index.d.ts +1 -1
  8. package/dest/client/interface.d.ts +18 -3
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +16 -37
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +464 -126
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  19. package/dest/config.d.ts +69 -60
  20. package/dest/config.d.ts.map +1 -1
  21. package/dest/config.js +23 -14
  22. package/dest/enr/generate-enr.d.ts +1 -1
  23. package/dest/enr/index.d.ts +1 -1
  24. package/dest/errors/attestation-pool.error.d.ts +7 -0
  25. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  26. package/dest/errors/attestation-pool.error.js +12 -0
  27. package/dest/errors/reqresp.error.d.ts +1 -1
  28. package/dest/errors/reqresp.error.d.ts.map +1 -1
  29. package/dest/index.d.ts +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +77 -36
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +241 -266
  35. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  36. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +24 -14
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +123 -95
  39. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +18 -12
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +91 -108
  42. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  44. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  45. package/dest/mem_pools/index.d.ts +1 -1
  46. package/dest/mem_pools/instrumentation.d.ts +9 -1
  47. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  48. package/dest/mem_pools/instrumentation.js +37 -10
  49. package/dest/mem_pools/interface.d.ts +3 -4
  50. package/dest/mem_pools/interface.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +33 -58
  52. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
  54. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  55. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  57. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  58. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  60. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  61. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  63. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  66. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  67. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  69. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  70. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  72. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  73. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  75. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  76. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  77. package/dest/mem_pools/tx_pool/index.js +0 -1
  78. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  79. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool/priority.js +6 -1
  81. package/dest/mem_pools/tx_pool/tx_pool.d.ts +11 -6
  82. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  84. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
  86. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -6
  87. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  88. package/dest/msg_validators/attestation_validator/attestation_validator.js +57 -24
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  90. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  91. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
  92. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  93. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/index.js +1 -0
  95. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  96. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  97. package/dest/msg_validators/clock_tolerance.js +37 -0
  98. package/dest/msg_validators/index.d.ts +2 -2
  99. package/dest/msg_validators/index.d.ts.map +1 -1
  100. package/dest/msg_validators/index.js +1 -1
  101. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  102. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  104. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  105. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  106. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  107. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  108. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  109. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  110. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  111. package/dest/msg_validators/proposal_validator/index.js +3 -0
  112. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  113. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  114. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  115. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  116. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  117. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  118. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  119. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  121. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  122. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  124. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  125. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
  127. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  128. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  130. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  131. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  133. package/dest/msg_validators/tx_validator/factory.d.ts +10 -4
  134. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/factory.js +22 -12
  136. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  137. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  138. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  139. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  140. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  142. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  143. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  144. package/dest/msg_validators/tx_validator/index.js +1 -0
  145. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  146. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  147. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  148. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  149. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/phases_validator.js +6 -4
  151. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  152. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  153. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  154. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  155. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +5 -3
  157. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  159. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  160. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  161. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  162. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  163. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  165. package/dest/services/data_store.d.ts +1 -1
  166. package/dest/services/data_store.d.ts.map +1 -1
  167. package/dest/services/discv5/discV5_service.d.ts +1 -1
  168. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  169. package/dest/services/discv5/discV5_service.js +1 -1
  170. package/dest/services/dummy_service.d.ts +18 -2
  171. package/dest/services/dummy_service.d.ts.map +1 -1
  172. package/dest/services/dummy_service.js +42 -0
  173. package/dest/services/encoding.d.ts +1 -1
  174. package/dest/services/encoding.d.ts.map +1 -1
  175. package/dest/services/encoding.js +7 -6
  176. package/dest/services/gossipsub/scoring.d.ts +1 -1
  177. package/dest/services/index.d.ts +1 -1
  178. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  179. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  180. package/dest/services/libp2p/instrumentation.js +36 -71
  181. package/dest/services/libp2p/libp2p_service.d.ts +48 -81
  182. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  183. package/dest/services/libp2p/libp2p_service.js +926 -193
  184. package/dest/services/peer-manager/interface.d.ts +1 -1
  185. package/dest/services/peer-manager/metrics.d.ts +9 -2
  186. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  187. package/dest/services/peer-manager/metrics.js +39 -16
  188. package/dest/services/peer-manager/peer_manager.d.ts +2 -33
  189. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  190. package/dest/services/peer-manager/peer_manager.js +6 -12
  191. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  192. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  193. package/dest/services/peer-manager/peer_scoring.js +43 -2
  194. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  195. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  196. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  197. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  198. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  199. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  200. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  201. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  202. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  203. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  204. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  205. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  206. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  207. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  208. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  209. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  210. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  211. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  212. package/dest/services/reqresp/config.d.ts +1 -1
  213. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  214. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  215. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  216. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -4
  217. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  218. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  219. package/dest/services/reqresp/constants.d.ts +12 -0
  220. package/dest/services/reqresp/constants.d.ts.map +1 -0
  221. package/dest/services/reqresp/constants.js +7 -0
  222. package/dest/services/reqresp/index.d.ts +1 -1
  223. package/dest/services/reqresp/interface.d.ts +4 -2
  224. package/dest/services/reqresp/interface.d.ts.map +1 -1
  225. package/dest/services/reqresp/interface.js +1 -1
  226. package/dest/services/reqresp/metrics.d.ts +6 -5
  227. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  228. package/dest/services/reqresp/metrics.js +17 -21
  229. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  230. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  231. package/dest/services/reqresp/protocols/auth.js +2 -2
  232. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  233. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  234. package/dest/services/reqresp/protocols/block.js +3 -2
  235. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  236. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  237. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  238. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  239. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  240. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +14 -1
  241. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +17 -7
  242. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  243. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +34 -4
  244. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  245. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  246. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  247. package/dest/services/reqresp/protocols/index.d.ts +1 -1
  248. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  249. package/dest/services/reqresp/protocols/status.d.ts +6 -5
  250. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  251. package/dest/services/reqresp/protocols/status.js +7 -3
  252. package/dest/services/reqresp/protocols/tx.d.ts +2 -3
  253. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  254. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  255. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
  256. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  257. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  258. package/dest/services/reqresp/reqresp.d.ts +6 -41
  259. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  260. package/dest/services/reqresp/reqresp.js +460 -46
  261. package/dest/services/reqresp/status.d.ts +2 -2
  262. package/dest/services/reqresp/status.d.ts.map +1 -1
  263. package/dest/services/service.d.ts +19 -3
  264. package/dest/services/service.d.ts.map +1 -1
  265. package/dest/services/tx_collection/config.d.ts +4 -1
  266. package/dest/services/tx_collection/config.d.ts.map +1 -1
  267. package/dest/services/tx_collection/config.js +10 -2
  268. package/dest/services/tx_collection/fast_tx_collection.d.ts +9 -12
  269. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  270. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  271. package/dest/services/tx_collection/index.d.ts +2 -1
  272. package/dest/services/tx_collection/index.d.ts.map +1 -1
  273. package/dest/services/tx_collection/index.js +1 -0
  274. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  275. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  276. package/dest/services/tx_collection/instrumentation.js +10 -13
  277. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  278. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  279. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  280. package/dest/services/tx_collection/slow_tx_collection.d.ts +4 -5
  281. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  282. package/dest/services/tx_collection/slow_tx_collection.js +2 -1
  283. package/dest/services/tx_collection/tx_collection.d.ts +10 -10
  284. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  285. package/dest/services/tx_collection/tx_collection.js +5 -5
  286. package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
  287. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  288. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  289. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  290. package/dest/services/tx_provider.d.ts +4 -2
  291. package/dest/services/tx_provider.d.ts.map +1 -1
  292. package/dest/services/tx_provider.js +11 -2
  293. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  294. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  295. package/dest/services/tx_provider_instrumentation.js +14 -14
  296. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  297. package/dest/test-helpers/get-ports.d.ts +1 -1
  298. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  299. package/dest/test-helpers/index.d.ts +3 -1
  300. package/dest/test-helpers/index.d.ts.map +1 -1
  301. package/dest/test-helpers/index.js +2 -0
  302. package/dest/test-helpers/make-enrs.d.ts +1 -1
  303. package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
  304. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  305. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  306. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  307. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  308. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  309. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  310. package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
  311. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  312. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  313. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  314. package/dest/test-helpers/test_tx_provider.js +41 -0
  315. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  316. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  317. package/dest/test-helpers/testbench-utils.js +297 -0
  318. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  319. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  320. package/dest/testbench/p2p_client_testbench_worker.js +218 -120
  321. package/dest/testbench/parse_log_file.d.ts +1 -1
  322. package/dest/testbench/testbench.d.ts +1 -1
  323. package/dest/testbench/worker_client_manager.d.ts +51 -6
  324. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  325. package/dest/testbench/worker_client_manager.js +226 -39
  326. package/dest/types/index.d.ts +1 -1
  327. package/dest/util.d.ts +2 -1
  328. package/dest/util.d.ts.map +1 -1
  329. package/dest/util.js +11 -2
  330. package/dest/versioning.d.ts +1 -1
  331. package/package.json +19 -18
  332. package/src/bootstrap/bootstrap.ts +7 -4
  333. package/src/client/factory.ts +11 -20
  334. package/src/client/interface.ts +20 -2
  335. package/src/client/p2p_client.ts +108 -155
  336. package/src/client/test/tx_proposal_collector/README.md +227 -0
  337. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  338. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  339. package/src/config.ts +36 -20
  340. package/src/errors/attestation-pool.error.ts +13 -0
  341. package/src/mem_pools/attestation_pool/attestation_pool.ts +86 -35
  342. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +243 -278
  343. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +175 -111
  344. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +147 -136
  345. package/src/mem_pools/attestation_pool/mocks.ts +21 -15
  346. package/src/mem_pools/instrumentation.ts +48 -10
  347. package/src/mem_pools/interface.ts +2 -4
  348. package/src/mem_pools/tx_pool/README.md +270 -0
  349. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +367 -371
  350. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  351. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  352. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  353. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  354. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  355. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  356. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  357. package/src/mem_pools/tx_pool/index.ts +0 -1
  358. package/src/mem_pools/tx_pool/priority.ts +8 -1
  359. package/src/mem_pools/tx_pool/tx_pool.ts +11 -5
  360. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
  361. package/src/msg_validators/attestation_validator/attestation_validator.ts +45 -32
  362. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
  363. package/src/msg_validators/attestation_validator/index.ts +1 -0
  364. package/src/msg_validators/clock_tolerance.ts +51 -0
  365. package/src/msg_validators/index.ts +1 -1
  366. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  367. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  368. package/src/msg_validators/proposal_validator/index.ts +3 -0
  369. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  370. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  371. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  372. package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
  373. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  374. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  375. package/src/msg_validators/tx_validator/factory.ts +67 -25
  376. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  377. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  378. package/src/msg_validators/tx_validator/index.ts +1 -0
  379. package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
  380. package/src/msg_validators/tx_validator/phases_validator.ts +8 -4
  381. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  382. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  383. package/src/msg_validators/tx_validator/timestamp_validator.ts +11 -5
  384. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  385. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  386. package/src/services/discv5/discV5_service.ts +1 -1
  387. package/src/services/dummy_service.ts +51 -0
  388. package/src/services/encoding.ts +6 -5
  389. package/src/services/libp2p/instrumentation.ts +39 -71
  390. package/src/services/libp2p/libp2p_service.ts +628 -194
  391. package/src/services/peer-manager/metrics.ts +44 -16
  392. package/src/services/peer-manager/peer_manager.ts +7 -4
  393. package/src/services/peer-manager/peer_scoring.ts +45 -3
  394. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  395. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  396. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  397. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  398. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  399. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  400. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  401. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  402. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  403. package/src/services/reqresp/constants.ts +14 -0
  404. package/src/services/reqresp/interface.ts +4 -1
  405. package/src/services/reqresp/metrics.ts +36 -27
  406. package/src/services/reqresp/protocols/auth.ts +2 -2
  407. package/src/services/reqresp/protocols/block.ts +3 -2
  408. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  409. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +16 -2
  410. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -5
  411. package/src/services/reqresp/protocols/status.ts +16 -12
  412. package/src/services/reqresp/protocols/tx.ts +1 -2
  413. package/src/services/reqresp/reqresp.ts +66 -19
  414. package/src/services/service.ts +23 -4
  415. package/src/services/tx_collection/config.ts +16 -2
  416. package/src/services/tx_collection/fast_tx_collection.ts +39 -15
  417. package/src/services/tx_collection/index.ts +5 -0
  418. package/src/services/tx_collection/instrumentation.ts +5 -13
  419. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  420. package/src/services/tx_collection/slow_tx_collection.ts +5 -4
  421. package/src/services/tx_collection/tx_collection.ts +10 -9
  422. package/src/services/tx_provider.ts +19 -3
  423. package/src/services/tx_provider_instrumentation.ts +24 -14
  424. package/src/test-helpers/index.ts +2 -0
  425. package/src/test-helpers/mock-pubsub.ts +1 -1
  426. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  427. package/src/test-helpers/reqresp-nodes.ts +1 -1
  428. package/src/test-helpers/test_tx_provider.ts +64 -0
  429. package/src/test-helpers/testbench-utils.ts +374 -0
  430. package/src/testbench/p2p_client_testbench_worker.ts +338 -116
  431. package/src/testbench/worker_client_manager.ts +304 -42
  432. package/src/util.ts +12 -2
  433. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
  434. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  435. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
  436. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  437. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  438. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -70
  439. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  440. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  441. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  442. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
  443. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
  444. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,20 +1,27 @@
1
1
  import {
2
2
  Attributes,
3
3
  type Gauge,
4
+ type Histogram,
4
5
  Metrics,
5
6
  type TelemetryClient,
6
7
  type Tracer,
7
8
  type UpDownCounter,
8
- ValueType,
9
+ createUpDownCounterWithDefault,
9
10
  getTelemetryClient,
10
11
  } from '@aztec/telemetry-client';
11
12
 
12
- import { type GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
13
+ import type { PeerId } from '@libp2p/interface';
14
+
15
+ import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
13
16
 
14
17
  export class PeerManagerMetrics {
15
18
  private sentGoodbyes: UpDownCounter;
16
19
  private receivedGoodbyes: UpDownCounter;
17
20
  private peerCount: Gauge;
21
+ private lowScoreDisconnects: UpDownCounter;
22
+ private peerConnectionDuration: Histogram;
23
+
24
+ private peerConnectedAt: Map<string, number> = new Map<string, number>();
18
25
 
19
26
  public readonly tracer: Tracer;
20
27
 
@@ -25,21 +32,27 @@ export class PeerManagerMetrics {
25
32
  this.tracer = telemetryClient.getTracer(name);
26
33
 
27
34
  const meter = telemetryClient.getMeter(name);
28
- this.sentGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_SENT, {
29
- description: 'Number of goodbyes sent to peers',
30
- unit: 'peers',
31
- valueType: ValueType.INT,
32
- });
33
- this.receivedGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_RECEIVED, {
34
- description: 'Number of goodbyes received from peers',
35
- unit: 'peers',
36
- valueType: ValueType.INT,
37
- });
38
- this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT, {
39
- description: 'Number of peers',
40
- unit: 'peers',
41
- valueType: ValueType.INT,
35
+ const goodbyeReasonAttrs = {
36
+ [Attributes.P2P_GOODBYE_REASON]: [
37
+ prettyGoodbyeReason(GoodByeReason.SHUTDOWN),
38
+ prettyGoodbyeReason(GoodByeReason.MAX_PEERS),
39
+ prettyGoodbyeReason(GoodByeReason.LOW_SCORE),
40
+ prettyGoodbyeReason(GoodByeReason.BANNED),
41
+ prettyGoodbyeReason(GoodByeReason.WRONG_NETWORK),
42
+ prettyGoodbyeReason(GoodByeReason.UNKNOWN),
43
+ ],
44
+ };
45
+ this.sentGoodbyes = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_GOODBYES_SENT, goodbyeReasonAttrs);
46
+ this.receivedGoodbyes = createUpDownCounterWithDefault(
47
+ meter,
48
+ Metrics.PEER_MANAGER_GOODBYES_RECEIVED,
49
+ goodbyeReasonAttrs,
50
+ );
51
+ this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
52
+ this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
53
+ [Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
42
54
  });
55
+ this.peerConnectionDuration = meter.createHistogram(Metrics.PEER_MANAGER_PEER_CONNECTION_DURATION);
43
56
  }
44
57
 
45
58
  public recordGoodbyeSent(reason: GoodByeReason) {
@@ -53,4 +66,19 @@ export class PeerManagerMetrics {
53
66
  public recordPeerCount(count: number) {
54
67
  this.peerCount.record(count);
55
68
  }
69
+
70
+ public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
71
+ this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
72
+ }
73
+
74
+ public peerConnected(id: PeerId) {
75
+ this.peerConnectedAt.set(id.toString(), Date.now());
76
+ }
77
+
78
+ public peerDisconnected(id: PeerId) {
79
+ const connectedAt = this.peerConnectedAt.get(id.toString());
80
+ if (connectedAt) {
81
+ this.peerConnectionDuration.record(Date.now() - connectedAt);
82
+ }
83
+ }
56
84
  }
@@ -1,13 +1,13 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto';
2
+ import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import type { EthAddress } from '@aztec/foundation/eth-address';
4
- import { Fr } from '@aztec/foundation/fields';
5
5
  import { createLogger } from '@aztec/foundation/log';
6
6
  import { bufferToHex } from '@aztec/foundation/string';
7
7
  import { DateProvider } from '@aztec/foundation/timer';
8
8
  import type { PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
9
9
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
10
- import { type TelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
+ import type { TelemetryClient } from '@aztec/telemetry-client';
11
11
 
12
12
  import type { Connection, PeerId } from '@libp2p/interface';
13
13
  import { peerIdFromString } from '@libp2p/peer-id';
@@ -161,7 +161,6 @@ export class PeerManager implements PeerManagerInterface {
161
161
  return this.metrics.tracer;
162
162
  }
163
163
 
164
- @trackSpan('PeerManager.heartbeat')
165
164
  public async heartbeat() {
166
165
  this.heartbeatCounter++;
167
166
  this.peerScoring.decayAllScores();
@@ -278,6 +277,7 @@ export class PeerManager implements PeerManagerInterface {
278
277
  private handleConnectedPeerEvent(e: CustomEvent<PeerId>) {
279
278
  const peerId = e.detail;
280
279
  this.logger.verbose(`Connected to peer ${peerId.toString()}`);
280
+ this.metrics.peerConnected(peerId);
281
281
  if (this.config.p2pDisableStatusHandshake) {
282
282
  return;
283
283
  }
@@ -303,6 +303,7 @@ export class PeerManager implements PeerManagerInterface {
303
303
  */
304
304
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
305
  const peerId = e.detail;
306
+ this.metrics.peerDisconnected(peerId);
306
307
  this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
307
308
  const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
308
309
  if (validatorAddress !== undefined) {
@@ -577,9 +578,11 @@ export class PeerManager implements PeerManagerInterface {
577
578
  const score = this.peerScoring.getScoreState(peer.remotePeer.toString());
578
579
  switch (score) {
579
580
  case PeerScoreState.Banned:
581
+ this.metrics.recordLowScoreDisconnect('Banned');
580
582
  void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.BANNED);
581
583
  break;
582
584
  case PeerScoreState.Disconnect:
585
+ this.metrics.recordLowScoreDisconnect('Disconnect');
583
586
  void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.LOW_SCORE);
584
587
  break;
585
588
  case PeerScoreState.Healthy:
@@ -1,6 +1,14 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
3
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ import {
5
+ Attributes,
6
+ Metrics,
7
+ type TelemetryClient,
8
+ type UpDownCounter,
9
+ createUpDownCounterWithDefault,
10
+ getTelemetryClient,
11
+ } from '@aztec/telemetry-client';
4
12
 
5
13
  import type { PeerId } from '@libp2p/interface';
6
14
 
@@ -30,7 +38,9 @@ export class PeerScoring {
30
38
  private decayFactor = 0.9;
31
39
  peerPenalties: { [key in PeerErrorSeverity]: number };
32
40
 
33
- constructor(config: P2PConfig) {
41
+ private peerStateCounter: UpDownCounter;
42
+
43
+ constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
34
44
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
35
45
  this.peerPenalties = {
36
46
  [PeerErrorSeverity.HighToleranceError]:
@@ -40,6 +50,12 @@ export class PeerScoring {
40
50
  [PeerErrorSeverity.LowToleranceError]:
41
51
  orderedValues?.[2] ?? DefaultPeerPenalties[PeerErrorSeverity.LowToleranceError],
42
52
  };
53
+
54
+ const meter = telemetry.getMeter('PeerScoring');
55
+
56
+ this.peerStateCounter = createUpDownCounterWithDefault(meter, Metrics.P2P_PEER_STATE_COUNT, {
57
+ [Attributes.P2P_PEER_SCORE_STATE]: ['Healthy', 'Disconnect', 'Banned'],
58
+ });
43
59
  }
44
60
 
45
61
  public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
@@ -99,7 +115,33 @@ export class PeerScoring {
99
115
  return PeerScoreState.Healthy;
100
116
  }
101
117
 
102
- getStats(): { medianScore: number } {
103
- return { medianScore: median(Array.from(this.scores.values())) ?? 0 };
118
+ getStats(): { medianScore: number; healthyCount: number; disconnectCount: number; bannedCount: number } {
119
+ const stateCounts = { healthy: 0, disconnect: 0, banned: 0 };
120
+
121
+ for (const peerId of this.scores.keys()) {
122
+ const state = this.getScoreState(peerId);
123
+ switch (state) {
124
+ case PeerScoreState.Healthy:
125
+ stateCounts.healthy++;
126
+ break;
127
+ case PeerScoreState.Disconnect:
128
+ stateCounts.disconnect++;
129
+ break;
130
+ case PeerScoreState.Banned:
131
+ stateCounts.banned++;
132
+ break;
133
+ }
134
+ }
135
+
136
+ this.peerStateCounter.add(stateCounts.healthy, { [Attributes.P2P_PEER_SCORE_STATE]: 'Healthy' });
137
+ this.peerStateCounter.add(stateCounts.disconnect, { [Attributes.P2P_PEER_SCORE_STATE]: 'Disconnect' });
138
+ this.peerStateCounter.add(stateCounts.banned, { [Attributes.P2P_PEER_SCORE_STATE]: 'Banned' });
139
+
140
+ return {
141
+ medianScore: median(Array.from(this.scores.values())) ?? 0,
142
+ healthyCount: stateCounts.healthy,
143
+ disconnectCount: stateCounts.disconnect,
144
+ bannedCount: stateCounts.banned,
145
+ };
104
146
  }
105
147
  }
@@ -0,0 +1,305 @@
1
+ # BatchTxRequester
2
+
3
+ The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node receives a block proposal but lacks some of the referenced transactions. This is critical for validators who need all transactions to attest to a proposal.
4
+
5
+ ## Overview
6
+
7
+ When a validator receives a block proposal, they must verify all transactions in the block. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the attestation deadline.
8
+
9
+ ```
10
+ ┌─────────────────────────────────────────────────────────────────────────────┐
11
+ │ Block Proposal Received │
12
+ │ (contains hashes of N transactions) │
13
+ └─────────────────────────────────────────────────────────────────────────────┘
14
+
15
+
16
+ ┌─────────────────────────────────┐
17
+ │ Check local mempool for txs │
18
+ └─────────────────────────────────┘
19
+
20
+ ┌─────────────────┴─────────────────┐
21
+ │ │
22
+ ▼ ▼
23
+ ┌─────────────────┐ ┌─────────────────┐
24
+ │ All txs found │ │ Missing M txs │
25
+ │ → Attest now │ │ │
26
+ └─────────────────┘ └─────────────────┘
27
+
28
+
29
+ ┌───────────────────────────────┐
30
+ │ BatchTxRequester.run() │
31
+ │ Fetch missing txs until │
32
+ │ deadline or all collected │
33
+ └───────────────────────────────┘
34
+ ```
35
+
36
+ ## Architecture
37
+
38
+ ### Peer Classification
39
+
40
+ The requester classifies peers into three categories to optimize fetching:
41
+
42
+ ```
43
+ ┌─────────────────────────────┐
44
+ │ All Known Peers │
45
+ └─────────────────────────────┘
46
+
47
+ ┌────────────────────────────┼────────────────────────────┐
48
+ │ │ │
49
+ ▼ ▼ ▼
50
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
51
+ │ Pinned Peer │ │ Dumb Peers │ │ Smart Peers │
52
+ │ │ │ │ │ │
53
+ │ The peer who │ │ Peers we query │ │ Peers that have │
54
+ │ sent us the │ │ blindly - we │ │ told us which │
55
+ │ block proposal. │ │ don't know what │ │ txs they have │
56
+ │ Should have ALL │ │ txs they have. │ │ via BitVector │
57
+ │ transactions. │ │ │ │ responses. │
58
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
59
+ │ │ │
60
+ │ │ │
61
+ ▼ ▼ ▼
62
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
63
+ │ Queried in │ │ Queried with │ │ Queried with │
64
+ │ dedicated loop, │ │ full tx hashes │ │ BitVector only │
65
+ │ prioritizes │ │ (peer may not │ │ (peer has the │
66
+ │ least-requested │ │ have proposal) │ │ block proposal) │
67
+ │ transactions │ │ │ │ │
68
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
69
+ ```
70
+
71
+ ### Blind Phase → Smart Phase Transition
72
+
73
+ Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxsResponse` containing:
74
+ 1. A matching `blockHash`
75
+ 2. A non-empty `txIndices` BitVector indicating which transactions they have
76
+ 3. At least one transaction we're still missing
77
+
78
+ ```
79
+ ┌──────────────────────────────────────────────────────────────────────────────┐
80
+ │ BLIND PHASE │
81
+ │ ┌────────────────────────────────────────────────────────────────────────┐ │
82
+ │ │ Initial State: All peers are "dumb" (except pinned peer) │ │
83
+ │ │ │ │
84
+ │ │ Request: [blockHash, txHashes (full list), txIndices (BitVector)] │ │
85
+ │ │ └─ Include full hashes because peer may not have proposal │ │
86
+ │ │ │ │
87
+ │ │ Response: [blockHash, txs[], txIndices (what peer has)] │ │
88
+ │ │ └─ Tells us exactly which txs this peer can provide │ │
89
+ │ └────────────────────────────────────────────────────────────────────────┘ │
90
+ └──────────────────────────────────────────────────────────────────────────────┘
91
+
92
+ │ Peer responds with valid txIndices
93
+ │ AND has txs we're missing
94
+
95
+ ┌──────────────────────────────────────────────────────────────────────────────┐
96
+ │ SMART PHASE │
97
+ │ ┌────────────────────────────────────────────────────────────────────────┐ │
98
+ │ │ Peer promoted to "smart" - we know exactly what they have │ │
99
+ │ │ │ │
100
+ │ │ Request: [blockHash, txIndices (BitVector only)] │ │
101
+ │ │ └─ No need for full hashes, peer has the proposal │ │
102
+ │ │ │ │
103
+ │ │ Response: [blockHash, txs[], txIndices (updated availability)] │ │
104
+ │ │ └─ May have received more txs since last response │ │
105
+ │ └────────────────────────────────────────────────────────────────────────┘ │
106
+ └──────────────────────────────────────────────────────────────────────────────┘
107
+ ```
108
+
109
+ ## Concurrent Worker Architecture
110
+
111
+ The `BatchTxRequester` runs three types of workers concurrently:
112
+
113
+ ```
114
+ ┌─────────────────────────────────────┐
115
+ │ BatchTxRequester.run() │
116
+ │ │
117
+ │ ┌─────────────────────────────┐ │
118
+ │ │ txQueue (FifoMemoryQueue)│◄───┼──── Yields Tx objects
119
+ │ └─────────────────────────────┘ │ to caller
120
+ └─────────────────────────────────────┘
121
+
122
+ │ put(tx)
123
+ ┌──────────────────────────────┼────────────────────────────┐
124
+ │ │ │
125
+ │ │ │
126
+ ┌──────────┴──────────┐ ┌───────────┴─────────┐ ┌──────────┴──────────┐
127
+ │ pinnedPeerRequester │ │ dumbRequester │ │ smartRequester │
128
+ │ │ │ │ │ │
129
+ │ Single dedicated │ │ N parallel workers │ │ M parallel workers │
130
+ │ loop for pinned │ │ (default: 10) │ │ (default: 10) │
131
+ │ peer │ │ │ │ │
132
+ │ │ │ Round-robin through │ │ Wait on semaphore │
133
+ │ Prioritizes txs │ │ available dumb │ │ until peers become │
134
+ │ that have been │ │ peers │ │ smart │
135
+ │ requested least │ │ │ │ │
136
+ └─────────────────────┘ └─────────────────────┘ └─────────────────────┘
137
+ │ │ │
138
+ └──────────────────────────────┼──────────────────────────────┘
139
+
140
+
141
+ ┌───────────────────────┐
142
+ │ requestTxBatch() │
143
+ │ │
144
+ │ sendRequestToPeer() │
145
+ │ via libp2p ReqResp │
146
+ └───────────────────────┘
147
+ ```
148
+
149
+ ## Wire Protocol
150
+
151
+ ### BlockTxsRequest
152
+
153
+ ```typescript
154
+ class BlockTxsRequest {
155
+ blockHash: Fr; // 32-byte hash of the proposed block header
156
+ txHashes: TxHashArray; // Full tx hashes (for dumb peers without proposal)
157
+ txIndices: BitVector; // Which txs from proposal we're requesting (1 = want)
158
+ }
159
+ ```
160
+
161
+ ### BlockTxsResponse
162
+
163
+ ```typescript
164
+ class BlockTxsResponse {
165
+ blockHash: Fr; // Echo back the block hash
166
+ txs: TxArray; // Actual transaction data
167
+ txIndices: BitVector; // Which txs the peer has available (1 = have)
168
+ }
169
+ ```
170
+
171
+ The `BitVector` is a compact representation where each bit corresponds to a transaction index in the block proposal. This allows efficient capability advertisement without repeating full hashes.
172
+
173
+ ## Key Files
174
+
175
+ | File | Description |
176
+ |------|-------------|
177
+ | `batch_tx_requester.ts` | Main orchestrator with worker loops |
178
+ | `missing_txs.ts` | Tracks metadata for each missing tx (request count, in-flight status, which peers have it) |
179
+ | `peer_collection.ts` | Manages peer classification (dumb/smart/bad) and rate limiting |
180
+ | `interface.ts` | Type definitions for dependencies |
181
+ | `../protocols/block_txs/` | Wire protocol definitions (`BlockTxsRequest`, `BlockTxsResponse`, `BitVector`) |
182
+
183
+ ## Stopping Conditions
184
+
185
+ The `BatchTxRequester` stops when any of these conditions are met:
186
+
187
+ 1. **All transactions fetched** - Success!
188
+ 2. **Deadline exceeded** - Timeout configured by caller
189
+ 3. **Abort signal** - External cancellation
190
+ 4. **No transactions to fetch** - Nothing was missing
191
+
192
+ ## Configuration
193
+
194
+ | Parameter | Default | Description |
195
+ |-----------|---------|-------------|
196
+ | `batchTxRequesterSmartParallelWorkerCount` | 10 | Max concurrent requests to smart peers |
197
+ | `batchTxRequesterDumbParallelWorkerCount` | 10 | Max concurrent requests to dumb peers |
198
+ | `batchTxRequesterTxBatchSize` | 8 | Max transactions per request |
199
+ | `batchTxRequesterBadPeerThreshold` | 2 | Penalties before marking peer as bad (see > threshold logic) |
200
+ | `RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL` | 1000ms | Cooldown after rate limit hit |
201
+
202
+ ## Error Handling
203
+
204
+ ### Peer States
205
+
206
+ - **Bad Peer**: After `batchTxRequesterBadPeerThreshold` penalties, peer is excluded from queries
207
+ - **Bad Peer Penalties**: A penalty is applied on `FAILURE`/`UNKNOWN` responses or when transaction validation fails
208
+ - **Rate Limited**: On `RATE_LIMIT_EXCEEDED` response, peer is temporarily excluded
209
+ - **Redemption**: A peer is removed from the bad set only after a successful response with all transactions valid (this clears the penalty counter)
210
+ - **Peer Scoring**: Each penalty is forwarded to the injected `peerScoring` service with a severity
211
+
212
+ ### Failure Recovery
213
+
214
+ ```
215
+ Request to peer fails
216
+
217
+ ├── RATE_LIMIT_EXCEEDED → Mark peer rate-limited, sleep, retry later
218
+
219
+ ├── FAILURE/UNKNOWN → Penalise peer (severity), increment penalty counter
220
+ │ │
221
+ │ ├── Counter < threshold → Continue querying
222
+ │ │
223
+ │ └── Counter ≥ threshold → Exclude peer
224
+
225
+ └── SUCCESS → Process response, if all transactions are valid clear penalties
226
+ ```
227
+
228
+ ## Usage Example
229
+
230
+ ```typescript
231
+ const requester = new BatchTxRequester(
232
+ missingTxHashes, // TxHash[] - what we need
233
+ blockProposal, // BlockProposal - the proposal we're attesting to
234
+ pinnedPeer, // PeerId | undefined - who sent us the proposal
235
+ timeoutMs, // number - how long to try
236
+ p2pService, // BatchTxRequesterLibP2PService
237
+ );
238
+
239
+ // Async generator yields transactions as they arrive
240
+ for await (const tx of requester.run()) {
241
+ // Process each transaction as it's fetched and validated
242
+ mempool.addTx(tx);
243
+ }
244
+
245
+ // Or collect all at once
246
+ const txs = await BatchTxRequester.collectAllTxs(requester.run());
247
+ ```
248
+
249
+ ## Integration with Broader Codebase
250
+
251
+ ```
252
+ ┌─────────────────────────────────────────────────────────────────────────────┐
253
+ │ P2PClient │
254
+ │ │
255
+ │ Receives block proposals via gossipsub │
256
+ │ Triggers transaction collection when needed │
257
+ └───────────────────────────────────┬─────────────────────────────────────────┘
258
+
259
+
260
+ ┌─────────────────────────────────────────────────────────────────────────────┐
261
+ │ TxCollection │
262
+ │ │
263
+ │ Coordinates Fast and Slow collection strategies │
264
+ │ Manages lifecycle of collection requests │
265
+ └───────────────────┬─────────────────────────────────┬───────────────────────┘
266
+ │ │
267
+ ▼ ▼
268
+ ┌───────────────────────────────────┐ ┌─────────────────────────────────────┐
269
+ │ FastTxCollection │ │ SlowTxCollection │
270
+ │ │ │ │
271
+ │ Time-critical: attestations │ │ Background: unproven blocks │
272
+ │ │ │ │
273
+ │ 1. Try RPC nodes first (fast) │ │ Periodic polling of RPC nodes │
274
+ │ 2. Fall back to BatchTxRequester │ │ and peers for missing txs │
275
+ │ │ │ │
276
+ └───────────────────┬───────────────┘ └─────────────────────────────────────┘
277
+
278
+ │ For 'proposal' requests
279
+
280
+ ┌─────────────────────────────────────────────────────────────────────────────┐
281
+ │ BatchTxRequester │
282
+ │ │
283
+ │ Aggressive parallel fetching from multiple peers │
284
+ │ Uses BLOCK_TXS sub-protocol for efficient batching │
285
+ └───────────────────┬─────────────────────────────────────────────────────────┘
286
+
287
+
288
+ ┌─────────────────────────────────────────────────────────────────────────────┐
289
+ │ ReqResp (libp2p) │
290
+ │ │
291
+ │ Low-level stream management │
292
+ │ sendRequestToPeer() → opens stream → sends request → awaits response │
293
+ └───────────────────┬─────────────────────────────────────────────────────────┘
294
+
295
+
296
+ ┌─────────────────────────────────────────────────────────────────────────────┐
297
+ │ reqRespBlockTxsHandler (on peer) │
298
+ │ │
299
+ │ 1. Parse BlockTxsRequest │
300
+ │ 2. Look up block proposal in AttestationPool │
301
+ │ 3. Check TxPool for available transactions │
302
+ │ 4. Build BitVector of available tx indices │
303
+ │ 5. Return BlockTxsResponse with txs + availability info │
304
+ └─────────────────────────────────────────────────────────────────────────────┘
305
+ ```