@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.017a351

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 (633) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +34 -13
  5. package/dest/client/factory.d.ts +23 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +106 -26
  8. package/dest/client/index.d.ts +2 -1
  9. package/dest/client/index.d.ts.map +1 -1
  10. package/dest/client/index.js +1 -0
  11. package/dest/client/interface.d.ts +192 -0
  12. package/dest/client/interface.d.ts.map +1 -0
  13. package/dest/client/interface.js +9 -0
  14. package/dest/client/p2p_client.d.ts +97 -221
  15. package/dest/client/p2p_client.d.ts.map +1 -1
  16. package/dest/client/p2p_client.js +818 -289
  17. package/dest/config.d.ts +235 -133
  18. package/dest/config.d.ts.map +1 -1
  19. package/dest/config.js +295 -36
  20. package/dest/enr/generate-enr.d.ts +11 -3
  21. package/dest/enr/generate-enr.d.ts.map +1 -1
  22. package/dest/enr/generate-enr.js +27 -5
  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/p2p-service.error.d.ts +9 -0
  28. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  29. package/dest/errors/p2p-service.error.js +10 -0
  30. package/dest/errors/reqresp.error.d.ts +1 -20
  31. package/dest/errors/reqresp.error.d.ts.map +1 -1
  32. package/dest/errors/reqresp.error.js +0 -21
  33. package/dest/errors/tx-pool.error.d.ts +8 -0
  34. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  35. package/dest/errors/tx-pool.error.js +9 -0
  36. package/dest/index.d.ts +5 -2
  37. package/dest/index.d.ts.map +1 -1
  38. package/dest/index.js +3 -1
  39. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +165 -30
  40. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  41. package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -3
  42. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  43. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  44. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +680 -173
  45. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  46. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  47. package/dest/mem_pools/attestation_pool/index.js +1 -2
  48. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -11
  49. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  50. package/dest/mem_pools/attestation_pool/mocks.js +21 -21
  51. package/dest/mem_pools/index.d.ts +3 -3
  52. package/dest/mem_pools/index.d.ts.map +1 -1
  53. package/dest/mem_pools/index.js +1 -1
  54. package/dest/mem_pools/instrumentation.d.ts +18 -12
  55. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  56. package/dest/mem_pools/instrumentation.js +74 -41
  57. package/dest/mem_pools/interface.d.ts +6 -7
  58. package/dest/mem_pools/interface.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  60. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  61. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  62. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
  63. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  64. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
  65. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  66. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  101. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  102. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  103. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  104. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  105. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  106. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  107. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +218 -0
  108. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  109. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  114. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  115. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  116. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  117. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  123. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  124. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +914 -0
  125. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +14 -6
  126. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/attestation_validator/attestation_validator.js +106 -12
  128. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
  129. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  130. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
  131. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  132. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  133. package/dest/msg_validators/attestation_validator/index.js +1 -0
  134. package/dest/msg_validators/clock_tolerance.d.ts +32 -0
  135. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  136. package/dest/msg_validators/clock_tolerance.js +90 -0
  137. package/dest/msg_validators/index.d.ts +2 -2
  138. package/dest/msg_validators/index.d.ts.map +1 -1
  139. package/dest/msg_validators/index.js +1 -1
  140. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  141. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  142. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  143. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +15 -0
  144. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  146. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +15 -0
  147. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  148. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +20 -0
  149. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  150. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  151. package/dest/msg_validators/proposal_validator/index.js +3 -0
  152. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +26 -0
  153. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/proposal_validator/proposal_validator.js +150 -0
  155. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  156. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  158. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
  159. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  160. package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
  161. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  162. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  163. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  164. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  165. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  167. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  168. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/block_header_validator.js +7 -6
  170. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  171. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  173. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  174. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  175. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  176. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  177. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  178. package/dest/msg_validators/tx_validator/data_validator.js +94 -87
  179. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -6
  180. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  181. package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
  182. package/dest/msg_validators/tx_validator/factory.d.ts +149 -0
  183. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  184. package/dest/msg_validators/tx_validator/factory.js +275 -0
  185. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  186. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  187. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  188. package/dest/msg_validators/tx_validator/gas_validator.d.ts +108 -0
  189. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  190. package/dest/msg_validators/tx_validator/gas_validator.js +194 -0
  191. package/dest/msg_validators/tx_validator/index.d.ts +13 -1
  192. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  193. package/dest/msg_validators/tx_validator/index.js +12 -0
  194. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
  195. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  196. package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
  197. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  198. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  199. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  200. package/dest/msg_validators/tx_validator/phases_validator.d.ts +35 -0
  201. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  202. package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
  203. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  204. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  205. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  206. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  207. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  208. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  209. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
  210. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  211. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  212. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
  213. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  214. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  215. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  216. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  217. package/dest/msg_validators/tx_validator/tx_proof_validator.js +10 -7
  218. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  219. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  220. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  221. package/dest/services/data_store.d.ts +1 -1
  222. package/dest/services/data_store.d.ts.map +1 -1
  223. package/dest/services/data_store.js +14 -10
  224. package/dest/services/discv5/discV5_service.d.ts +11 -9
  225. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  226. package/dest/services/discv5/discV5_service.js +92 -38
  227. package/dest/services/dummy_service.d.ts +77 -18
  228. package/dest/services/dummy_service.d.ts.map +1 -1
  229. package/dest/services/dummy_service.js +139 -12
  230. package/dest/services/encoding.d.ts +30 -7
  231. package/dest/services/encoding.d.ts.map +1 -1
  232. package/dest/services/encoding.js +88 -12
  233. package/dest/services/gossipsub/index.d.ts +3 -0
  234. package/dest/services/gossipsub/index.d.ts.map +1 -0
  235. package/dest/services/gossipsub/index.js +2 -0
  236. package/dest/services/gossipsub/scoring.d.ts +21 -3
  237. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  238. package/dest/services/gossipsub/scoring.js +24 -7
  239. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  240. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  241. package/dest/services/gossipsub/topic_score_params.js +363 -0
  242. package/dest/services/index.d.ts +6 -1
  243. package/dest/services/index.d.ts.map +1 -1
  244. package/dest/services/index.js +5 -0
  245. package/dest/services/libp2p/instrumentation.d.ts +22 -0
  246. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  247. package/dest/services/libp2p/instrumentation.js +136 -0
  248. package/dest/services/libp2p/libp2p_service.d.ts +165 -111
  249. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  250. package/dest/services/libp2p/libp2p_service.js +1517 -379
  251. package/dest/services/peer-manager/interface.d.ts +23 -0
  252. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  253. package/dest/services/peer-manager/interface.js +1 -0
  254. package/dest/services/peer-manager/metrics.d.ts +14 -3
  255. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  256. package/dest/services/peer-manager/metrics.js +50 -12
  257. package/dest/services/peer-manager/peer_manager.d.ts +108 -24
  258. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  259. package/dest/services/peer-manager/peer_manager.js +583 -85
  260. package/dest/services/peer-manager/peer_scoring.d.ts +12 -2
  261. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  262. package/dest/services/peer-manager/peer_scoring.js +99 -13
  263. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
  264. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  265. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
  266. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  267. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  268. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  269. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  270. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  271. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  272. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  273. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  274. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  275. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  276. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  277. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  278. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  279. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  280. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  281. package/dest/services/reqresp/config.d.ts +13 -11
  282. package/dest/services/reqresp/config.d.ts.map +1 -1
  283. package/dest/services/reqresp/config.js +18 -4
  284. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
  285. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  286. package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
  287. package/dest/services/reqresp/constants.d.ts +12 -0
  288. package/dest/services/reqresp/constants.d.ts.map +1 -0
  289. package/dest/services/reqresp/constants.js +7 -0
  290. package/dest/services/reqresp/index.d.ts +3 -2
  291. package/dest/services/reqresp/index.d.ts.map +1 -1
  292. package/dest/services/reqresp/index.js +2 -1
  293. package/dest/services/reqresp/interface.d.ts +88 -30
  294. package/dest/services/reqresp/interface.d.ts.map +1 -1
  295. package/dest/services/reqresp/interface.js +61 -38
  296. package/dest/services/reqresp/metrics.d.ts +6 -5
  297. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  298. package/dest/services/reqresp/metrics.js +16 -21
  299. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  300. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  301. package/dest/services/reqresp/protocols/auth.js +71 -0
  302. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +35 -0
  303. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  304. package/dest/services/reqresp/protocols/block_txs/bitvector.js +88 -0
  305. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
  306. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  307. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +60 -0
  308. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +75 -0
  309. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  310. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +139 -0
  311. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  312. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  313. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  314. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  315. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  316. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  317. package/dest/services/reqresp/protocols/index.d.ts +3 -2
  318. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  319. package/dest/services/reqresp/protocols/index.js +2 -1
  320. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  321. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  322. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  323. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  324. package/dest/services/reqresp/protocols/status.js +76 -5
  325. package/dest/services/reqresp/protocols/tx.d.ts +20 -4
  326. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  327. package/dest/services/reqresp/protocols/tx.js +52 -6
  328. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  329. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +10 -7
  330. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  331. package/dest/services/reqresp/rate-limiter/rate_limiter.js +20 -10
  332. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  333. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  334. package/dest/services/reqresp/rate-limiter/rate_limits.js +16 -6
  335. package/dest/services/reqresp/reqresp.d.ts +32 -91
  336. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  337. package/dest/services/reqresp/reqresp.js +695 -355
  338. package/dest/services/reqresp/status.d.ts +10 -4
  339. package/dest/services/reqresp/status.d.ts.map +1 -1
  340. package/dest/services/reqresp/status.js +9 -2
  341. package/dest/services/service.d.ts +76 -23
  342. package/dest/services/service.d.ts.map +1 -1
  343. package/dest/services/tx_collection/config.d.ts +25 -0
  344. package/dest/services/tx_collection/config.d.ts.map +1 -0
  345. package/dest/services/tx_collection/config.js +59 -0
  346. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  347. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  348. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  349. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  350. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  351. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  352. package/dest/services/tx_collection/index.d.ts +4 -0
  353. package/dest/services/tx_collection/index.d.ts.map +1 -0
  354. package/dest/services/tx_collection/index.js +3 -0
  355. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  356. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  357. package/dest/services/tx_collection/instrumentation.js +30 -0
  358. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  359. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  360. package/dest/services/tx_collection/request_tracker.js +84 -0
  361. package/dest/services/tx_collection/tx_collection.d.ts +104 -0
  362. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  363. package/dest/services/tx_collection/tx_collection.js +356 -0
  364. package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
  365. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  366. package/dest/services/tx_collection/tx_collection_sink.js +108 -0
  367. package/dest/services/tx_collection/tx_source.d.ts +24 -0
  368. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  369. package/dest/services/tx_collection/tx_source.js +50 -0
  370. package/dest/services/tx_file_store/config.d.ts +16 -0
  371. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  372. package/dest/services/tx_file_store/config.js +22 -0
  373. package/dest/services/tx_file_store/index.d.ts +4 -0
  374. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  375. package/dest/services/tx_file_store/index.js +3 -0
  376. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  377. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  378. package/dest/services/tx_file_store/instrumentation.js +29 -0
  379. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  380. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  381. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  382. package/dest/services/tx_provider.d.ts +53 -0
  383. package/dest/services/tx_provider.d.ts.map +1 -0
  384. package/dest/services/tx_provider.js +223 -0
  385. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  386. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  387. package/dest/services/tx_provider_instrumentation.js +34 -0
  388. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  389. package/dest/test-helpers/get-ports.d.ts +1 -1
  390. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  391. package/dest/test-helpers/index.d.ts +4 -1
  392. package/dest/test-helpers/index.d.ts.map +1 -1
  393. package/dest/test-helpers/index.js +3 -0
  394. package/dest/test-helpers/make-enrs.d.ts +1 -1
  395. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  396. package/dest/test-helpers/make-enrs.js +4 -5
  397. package/dest/test-helpers/make-test-p2p-clients.d.ts +35 -8
  398. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  399. package/dest/test-helpers/make-test-p2p-clients.js +89 -17
  400. package/dest/test-helpers/mock-pubsub.d.ts +99 -0
  401. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  402. package/dest/test-helpers/mock-pubsub.js +231 -0
  403. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  404. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  405. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  406. package/dest/test-helpers/reqresp-nodes.d.ts +17 -15
  407. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  408. package/dest/test-helpers/reqresp-nodes.js +73 -40
  409. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  410. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  411. package/dest/test-helpers/test_tx_provider.js +44 -0
  412. package/dest/test-helpers/testbench-utils.d.ts +161 -0
  413. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  414. package/dest/test-helpers/testbench-utils.js +391 -0
  415. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  416. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  417. package/dest/testbench/p2p_client_testbench_worker.js +310 -95
  418. package/dest/testbench/parse_log_file.d.ts +1 -1
  419. package/dest/testbench/parse_log_file.js +4 -4
  420. package/dest/testbench/testbench.d.ts +1 -1
  421. package/dest/testbench/testbench.js +4 -4
  422. package/dest/testbench/worker_client_manager.d.ts +57 -11
  423. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  424. package/dest/testbench/worker_client_manager.js +283 -58
  425. package/dest/types/index.d.ts +4 -2
  426. package/dest/types/index.d.ts.map +1 -1
  427. package/dest/types/index.js +2 -0
  428. package/dest/util.d.ts +33 -20
  429. package/dest/util.d.ts.map +1 -1
  430. package/dest/util.js +98 -71
  431. package/dest/versioning.d.ts +6 -9
  432. package/dest/versioning.d.ts.map +1 -1
  433. package/dest/versioning.js +9 -25
  434. package/package.json +33 -27
  435. package/src/bootstrap/bootstrap.ts +42 -15
  436. package/src/client/factory.ts +242 -60
  437. package/src/client/index.ts +1 -0
  438. package/src/client/interface.ts +239 -0
  439. package/src/client/p2p_client.ts +527 -460
  440. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  441. package/src/config.ts +518 -127
  442. package/src/enr/generate-enr.ts +39 -6
  443. package/src/errors/attestation-pool.error.ts +13 -0
  444. package/src/errors/p2p-service.error.ts +11 -0
  445. package/src/errors/reqresp.error.ts +0 -25
  446. package/src/errors/tx-pool.error.ts +12 -0
  447. package/src/index.ts +5 -1
  448. package/src/mem_pools/attestation_pool/attestation_pool.ts +605 -29
  449. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +828 -201
  450. package/src/mem_pools/attestation_pool/index.ts +9 -2
  451. package/src/mem_pools/attestation_pool/mocks.ts +32 -19
  452. package/src/mem_pools/index.ts +2 -2
  453. package/src/mem_pools/instrumentation.ts +79 -47
  454. package/src/mem_pools/interface.ts +5 -7
  455. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  456. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  457. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
  458. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  459. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  460. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  461. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  462. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  463. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  464. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  465. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  466. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  467. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  468. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  469. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  470. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  471. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  472. package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
  473. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  474. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  475. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  476. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  477. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
  478. package/src/msg_validators/attestation_validator/README.md +49 -0
  479. package/src/msg_validators/attestation_validator/attestation_validator.ts +105 -15
  480. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +101 -0
  481. package/src/msg_validators/attestation_validator/index.ts +1 -0
  482. package/src/msg_validators/clock_tolerance.ts +121 -0
  483. package/src/msg_validators/index.ts +1 -1
  484. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  485. package/src/msg_validators/proposal_validator/README.md +123 -0
  486. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +30 -0
  487. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +41 -0
  488. package/src/msg_validators/proposal_validator/index.ts +3 -0
  489. package/src/msg_validators/proposal_validator/proposal_validator.ts +159 -0
  490. package/src/msg_validators/tx_validator/README.md +127 -0
  491. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  492. package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
  493. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  494. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  495. package/src/msg_validators/tx_validator/block_header_validator.ts +23 -10
  496. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  497. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  498. package/src/msg_validators/tx_validator/data_validator.ts +138 -71
  499. package/src/msg_validators/tx_validator/double_spend_validator.ts +31 -23
  500. package/src/msg_validators/tx_validator/factory.ts +478 -0
  501. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  502. package/src/msg_validators/tx_validator/gas_validator.ts +268 -0
  503. package/src/msg_validators/tx_validator/index.ts +12 -0
  504. package/src/msg_validators/tx_validator/metadata_validator.ts +80 -24
  505. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  506. package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
  507. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  508. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  509. package/src/msg_validators/tx_validator/timestamp_validator.ts +57 -0
  510. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
  511. package/src/msg_validators/tx_validator/tx_proof_validator.ts +16 -8
  512. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  513. package/src/services/data_store.ts +14 -19
  514. package/src/services/discv5/discV5_service.ts +118 -39
  515. package/src/services/dummy_service.ts +196 -20
  516. package/src/services/encoding.ts +95 -11
  517. package/src/services/gossipsub/README.md +641 -0
  518. package/src/services/gossipsub/index.ts +2 -0
  519. package/src/services/gossipsub/scoring.ts +29 -5
  520. package/src/services/gossipsub/topic_score_params.ts +519 -0
  521. package/src/services/index.ts +5 -0
  522. package/src/services/libp2p/instrumentation.ts +140 -0
  523. package/src/services/libp2p/libp2p_service.ts +1373 -438
  524. package/src/services/peer-manager/interface.ts +29 -0
  525. package/src/services/peer-manager/metrics.ts +62 -12
  526. package/src/services/peer-manager/peer_manager.ts +695 -83
  527. package/src/services/peer-manager/peer_scoring.ts +96 -7
  528. package/src/services/reqresp/README.md +215 -0
  529. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  530. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
  531. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  532. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  533. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  534. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  535. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  536. package/src/services/reqresp/config.ts +27 -10
  537. package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
  538. package/src/services/reqresp/constants.ts +14 -0
  539. package/src/services/reqresp/index.ts +2 -0
  540. package/src/services/reqresp/interface.ts +116 -59
  541. package/src/services/reqresp/metrics.ts +39 -28
  542. package/src/services/reqresp/protocols/auth.ts +83 -0
  543. package/src/services/reqresp/protocols/block_txs/bitvector.ts +107 -0
  544. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +80 -0
  545. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +171 -0
  546. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  547. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  548. package/src/services/reqresp/protocols/index.ts +2 -1
  549. package/src/services/reqresp/protocols/status.ts +121 -5
  550. package/src/services/reqresp/protocols/tx.ts +56 -8
  551. package/src/services/reqresp/rate-limiter/rate_limiter.ts +25 -12
  552. package/src/services/reqresp/rate-limiter/rate_limits.ts +16 -6
  553. package/src/services/reqresp/reqresp.ts +397 -422
  554. package/src/services/reqresp/status.ts +12 -3
  555. package/src/services/service.ts +104 -28
  556. package/src/services/tx_collection/config.ts +89 -0
  557. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  558. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  559. package/src/services/tx_collection/index.ts +3 -0
  560. package/src/services/tx_collection/instrumentation.ts +35 -0
  561. package/src/services/tx_collection/request_tracker.ts +127 -0
  562. package/src/services/tx_collection/tx_collection.ts +468 -0
  563. package/src/services/tx_collection/tx_collection_sink.ts +125 -0
  564. package/src/services/tx_collection/tx_source.ts +57 -0
  565. package/src/services/tx_file_store/config.ts +37 -0
  566. package/src/services/tx_file_store/index.ts +3 -0
  567. package/src/services/tx_file_store/instrumentation.ts +36 -0
  568. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  569. package/src/services/tx_provider.ts +238 -0
  570. package/src/services/tx_provider_instrumentation.ts +54 -0
  571. package/src/test-helpers/index.ts +3 -0
  572. package/src/test-helpers/make-enrs.ts +4 -5
  573. package/src/test-helpers/make-test-p2p-clients.ts +117 -26
  574. package/src/test-helpers/mock-pubsub.ts +311 -0
  575. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  576. package/src/test-helpers/reqresp-nodes.ts +101 -62
  577. package/src/test-helpers/test_tx_provider.ts +69 -0
  578. package/src/test-helpers/testbench-utils.ts +453 -0
  579. package/src/testbench/p2p_client_testbench_worker.ts +477 -95
  580. package/src/testbench/parse_log_file.ts +4 -4
  581. package/src/testbench/testbench.ts +4 -4
  582. package/src/testbench/worker_client_manager.ts +366 -63
  583. package/src/types/index.ts +2 -0
  584. package/src/util.ts +128 -93
  585. package/src/versioning.ts +11 -34
  586. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -22
  587. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  588. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -112
  589. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -17
  590. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  591. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -129
  592. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -66
  593. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  594. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -245
  595. package/dest/mem_pools/tx_pool/index.d.ts +0 -4
  596. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  597. package/dest/mem_pools/tx_pool/index.js +0 -3
  598. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  599. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  600. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  601. package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
  602. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  603. package/dest/mem_pools/tx_pool/priority.js +0 -10
  604. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -66
  605. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  606. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  607. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  608. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  609. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -169
  610. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  611. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  612. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  613. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  614. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  615. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  616. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  617. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  618. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -88
  619. package/dest/services/reqresp/protocols/block.d.ts +0 -4
  620. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  621. package/dest/services/reqresp/protocols/block.js +0 -8
  622. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -159
  623. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -161
  624. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -309
  625. package/src/mem_pools/tx_pool/index.ts +0 -3
  626. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  627. package/src/mem_pools/tx_pool/priority.ts +0 -13
  628. package/src/mem_pools/tx_pool/tx_pool.ts +0 -76
  629. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -130
  630. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  631. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
  632. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -94
  633. package/src/services/reqresp/protocols/block.ts +0 -15
@@ -1,33 +1,34 @@
1
1
  // @attribution: lodestar impl for inspiration
2
- import { type Logger, createLogger } from '@aztec/foundation/log';
2
+ import { AbortError, TimeoutError } from '@aztec/foundation/error';
3
+ import { createLogger } from '@aztec/foundation/log';
3
4
  import { executeTimeout } from '@aztec/foundation/timer';
4
5
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
5
6
  import { Attributes, type TelemetryClient, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
6
7
 
7
8
  import type { IncomingStreamData, PeerId, Stream } from '@libp2p/interface';
8
- import { pipe } from 'it-pipe';
9
9
  import type { Libp2p } from 'libp2p';
10
+ import { pipeline } from 'node:stream/promises';
10
11
  import type { Uint8ArrayList } from 'uint8arraylist';
11
12
 
12
- import {
13
- CollectiveReqRespTimeoutError,
14
- IndividualReqRespTimeoutError,
15
- InvalidResponseError,
16
- } from '../../errors/reqresp.error.js';
17
- import { SnappyTransform } from '../encoding.js';
13
+ import { IndividualReqRespTimeoutError } from '../../errors/reqresp.error.js';
14
+ import { OversizedSnappyResponseError, SnappyTransform } from '../encoding.js';
18
15
  import type { PeerScoring } from '../peer-manager/peer_scoring.js';
19
- import type { P2PReqRespConfig } from './config.js';
20
- import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
21
- import { ConnectionSampler } from './connection-sampler/connection_sampler.js';
22
16
  import {
23
- DEFAULT_SUB_PROTOCOL_HANDLERS,
24
- DEFAULT_SUB_PROTOCOL_VALIDATORS,
17
+ DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
18
+ DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
19
+ type P2PReqRespConfig,
20
+ } from './config.js';
21
+ import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
22
+ import {
23
+ type ReqRespInterface,
25
24
  type ReqRespResponse,
26
25
  ReqRespSubProtocol,
26
+ type ReqRespSubProtocolHandler,
27
27
  type ReqRespSubProtocolHandlers,
28
- type ReqRespSubProtocolValidators,
29
- type SubProtocolMap,
30
- subProtocolMap,
28
+ type ReqRespSubProtocolRateLimits,
29
+ type ShouldRejectPeer,
30
+ UNAUTHENTICATED_ALLOWED_PROTOCOLS,
31
+ subProtocolSizeCalculators,
31
32
  } from './interface.js';
32
33
  import { ReqRespMetrics } from './metrics.js';
33
34
  import {
@@ -35,13 +36,13 @@ import {
35
36
  RequestResponseRateLimiter,
36
37
  prettyPrintRateLimitStatus,
37
38
  } from './rate-limiter/rate_limiter.js';
38
- import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqRespStatus } from './status.js';
39
+ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
39
40
 
40
41
  /**
41
42
  * The Request Response Service
42
43
  *
43
44
  * It allows nodes to request specific information from their peers, its use case covers recovering
44
- * information that was missed during a syncronisation or a gossip event.
45
+ * information that was missed during a synchronisation or a gossip event.
45
46
  *
46
47
  * This service implements the request response sub protocol, it is heavily inspired from
47
48
  * ethereum implementations of the same name.
@@ -51,56 +52,80 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
51
52
  *
52
53
  * see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-reqresp-domain
53
54
  */
54
- export class ReqResp {
55
- protected readonly logger: Logger;
55
+ export class ReqResp implements ReqRespInterface {
56
+ private individualRequestTimeoutMs: number = DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS;
57
+ private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
56
58
 
57
- private overallRequestTimeoutMs: number;
58
- private individualRequestTimeoutMs: number;
59
-
60
- // Warning, if the `start` function is not called as the parent class constructor, then the default sub protocol handlers will be used ( not good )
61
- private subProtocolHandlers: ReqRespSubProtocolHandlers = DEFAULT_SUB_PROTOCOL_HANDLERS;
62
- private subProtocolValidators: ReqRespSubProtocolValidators = DEFAULT_SUB_PROTOCOL_VALIDATORS;
59
+ private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
63
60
 
64
61
  private connectionSampler: ConnectionSampler;
65
62
  private rateLimiter: RequestResponseRateLimiter;
66
63
 
67
64
  private snappyTransform: SnappyTransform;
68
65
 
66
+ private shouldRejectPeer: ShouldRejectPeer | undefined;
67
+
69
68
  private metrics: ReqRespMetrics;
70
69
 
71
70
  constructor(
72
71
  config: P2PReqRespConfig,
73
72
  private libp2p: Libp2p,
74
73
  private peerScoring: PeerScoring,
74
+ private logger = createLogger('p2p:reqresp'),
75
+ rateLimits: Partial<ReqRespSubProtocolRateLimits> = {},
75
76
  telemetryClient: TelemetryClient = getTelemetryClient(),
76
77
  ) {
77
- this.logger = createLogger('p2p:reqresp');
78
+ this.updateConfig(config);
78
79
 
79
- this.overallRequestTimeoutMs = config.overallRequestTimeoutMs;
80
- this.individualRequestTimeoutMs = config.individualRequestTimeoutMs;
81
-
82
- this.rateLimiter = new RequestResponseRateLimiter(peerScoring);
80
+ this.rateLimiter = new RequestResponseRateLimiter(peerScoring, rateLimits);
83
81
 
84
82
  // Connection sampler is used to sample our connected peers
85
- this.connectionSampler = new ConnectionSampler(libp2p);
83
+ this.connectionSampler = new ConnectionSampler(
84
+ libp2p,
85
+ new RandomSampler(),
86
+ createLogger(`${logger.module}:connection-sampler`),
87
+ config,
88
+ );
86
89
 
87
90
  this.snappyTransform = new SnappyTransform();
88
91
  this.metrics = new ReqRespMetrics(telemetryClient);
89
92
  }
90
93
 
94
+ public updateConfig(config: Partial<P2PReqRespConfig>): void {
95
+ if (typeof config.individualRequestTimeoutMs === 'number') {
96
+ this.individualRequestTimeoutMs = config.individualRequestTimeoutMs;
97
+ }
98
+
99
+ if (typeof config.dialTimeoutMs === 'number') {
100
+ this.dialTimeoutMs = config.dialTimeoutMs;
101
+ }
102
+ }
103
+
104
+ public setShouldRejectPeer(checker: ShouldRejectPeer): void {
105
+ this.shouldRejectPeer = checker;
106
+ }
107
+
91
108
  get tracer() {
92
109
  return this.metrics.tracer;
93
110
  }
94
111
 
112
+ /**
113
+ * Get the connection sampler instance
114
+ */
115
+ getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'> {
116
+ return this.connectionSampler;
117
+ }
118
+
95
119
  /**
96
120
  * Start the reqresp service
97
121
  */
98
- async start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators) {
99
- this.subProtocolHandlers = subProtocolHandlers;
100
- this.subProtocolValidators = subProtocolValidators;
122
+ async start(subProtocolHandlers: ReqRespSubProtocolHandlers) {
123
+ Object.assign(this.subProtocolHandlers, subProtocolHandlers);
101
124
 
102
- // Register all protocol handlers
103
- for (const subProtocol of Object.keys(this.subProtocolHandlers)) {
125
+ // Register streamHandler with libp2p.
126
+ // The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
127
+ for (const subProtocol of Object.keys(subProtocolHandlers)) {
128
+ this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
104
129
  await this.libp2p.handle(
105
130
  subProtocol,
106
131
  (data: IncomingStreamData) =>
@@ -112,6 +137,18 @@ export class ReqResp {
112
137
  this.rateLimiter.start();
113
138
  }
114
139
 
140
+ async addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
141
+ this.subProtocolHandlers[subProtocol] = handler;
142
+ this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
143
+ await this.libp2p.handle(
144
+ subProtocol,
145
+ (data: IncomingStreamData) =>
146
+ void this.streamHandler(subProtocol as ReqRespSubProtocol, data).catch(err =>
147
+ this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err),
148
+ ),
149
+ );
150
+ }
151
+
115
152
  /**
116
153
  * Stop the reqresp service
117
154
  */
@@ -135,260 +172,6 @@ export class ReqResp {
135
172
  // NOTE: We assume libp2p instance is managed by the caller
136
173
  }
137
174
 
138
- /**
139
- * Send a request to peers, returns the first response
140
- *
141
- * @param subProtocol - The protocol being requested
142
- * @param request - The request to send
143
- * @returns - The response from the peer, otherwise undefined
144
- *
145
- * @description
146
- * This method attempts to send a request to all active peers using the specified sub-protocol.
147
- * It opens a stream with each peer, sends the request, and awaits a response.
148
- * If a valid response is received, it returns the response; otherwise, it continues to the next peer.
149
- * If no response is received from any peer, it returns undefined.
150
- *
151
- * The method performs the following steps:
152
- * - Sample a peer to send the request to.
153
- * - Opens a stream with the peer using the specified sub-protocol.
154
- *
155
- * When a response is received, it is validated using the given sub protocols response validator.
156
- * To see the interface for the response validator - see `interface.ts`
157
- *
158
- * Failing a response validation requests in a severe peer penalty, and will
159
- * prompt the node to continue to search to the next peer.
160
- * For example, a transaction request validator will check that the payload returned does in fact
161
- * match the txHash that was requested. A peer that fails this check an only be an extremely naughty peer.
162
- *
163
- * This entire operation is wrapped in an overall timeout, that is independent of the
164
- * peer it is requesting data from.
165
- *
166
- */
167
- async sendRequest<SubProtocol extends ReqRespSubProtocol>(
168
- subProtocol: SubProtocol,
169
- request: InstanceType<SubProtocolMap[SubProtocol]['request']>,
170
- ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined> {
171
- const responseValidator = this.subProtocolValidators[subProtocol];
172
- const requestBuffer = request.toBuffer();
173
-
174
- const requestFunction = async () => {
175
- // Attempt to ask all of our peers, but sampled in a random order
176
- // This function is wrapped in a timeout, so we will exit the loop if we have not received a response
177
- const numberOfPeers = this.libp2p.getPeers().length;
178
-
179
- if (numberOfPeers === 0) {
180
- this.logger.debug('No active peers to send requests to');
181
- return undefined;
182
- }
183
-
184
- const attemptedPeers: Map<string, boolean> = new Map();
185
- for (let i = 0; i < numberOfPeers; i++) {
186
- // Sample a peer to make a request to
187
- const peer = this.connectionSampler.getPeer(attemptedPeers);
188
- this.logger.trace(`Attempting to send request to peer: ${peer?.toString()}`);
189
- if (!peer) {
190
- this.logger.debug('No peers available to send requests to');
191
- return undefined;
192
- }
193
-
194
- attemptedPeers.set(peer.toString(), true);
195
-
196
- this.logger.trace(`Sending request to peer: ${peer.toString()}`);
197
- const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffer);
198
-
199
- if (response && response.status !== ReqRespStatus.SUCCESS) {
200
- this.logger.debug(
201
- `Request to peer ${peer.toString()} failed with status ${prettyPrintReqRespStatus(response.status)}`,
202
- );
203
- continue;
204
- }
205
-
206
- // If we get a response, return it, otherwise we iterate onto the next peer
207
- // We do not consider it a success if we have an empty buffer
208
- if (response && response.data.length > 0) {
209
- const object = subProtocolMap[subProtocol].response.fromBuffer(response.data);
210
- // The response validator handles peer punishment within
211
- const isValid = await responseValidator(request, object, peer);
212
- if (!isValid) {
213
- throw new InvalidResponseError();
214
- }
215
- return object;
216
- }
217
- }
218
- };
219
-
220
- try {
221
- return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined>(
222
- requestFunction,
223
- this.overallRequestTimeoutMs,
224
- () => new CollectiveReqRespTimeoutError(),
225
- );
226
- } catch (e: any) {
227
- this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
228
- return undefined;
229
- }
230
- }
231
-
232
- /**
233
- * Request multiple messages over the same sub protocol, balancing the requests across peers.
234
- *
235
- * @devnote
236
- * - The function prioritizes sending requests to free peers using a batch sampling strategy.
237
- * - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
238
- * - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
239
- * - Responses are validated using a custom validator for the sub-protocol.*
240
- *
241
- * Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
242
- * - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
243
- * - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
244
- * - Responses are validated using a custom validator for the sub-protocol.*
245
- *
246
- * @param subProtocol
247
- * @param requests
248
- * @param timeoutMs
249
- * @param maxPeers
250
- * @returns
251
- *
252
- * @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
253
- */
254
- @trackSpan(
255
- 'ReqResp.sendBatchRequest',
256
- (subProtocol: ReqRespSubProtocol, requests: InstanceType<SubProtocolMap[ReqRespSubProtocol]['request']>[]) => ({
257
- [Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
258
- [Attributes.P2P_REQ_RESP_BATCH_REQUESTS_COUNT]: requests.length,
259
- }),
260
- )
261
- async sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
262
- subProtocol: SubProtocol,
263
- requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
264
- timeoutMs = 10000,
265
- maxPeers = Math.min(10, requests.length),
266
- maxRetryAttempts = 3,
267
- ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
268
- const responseValidator = this.subProtocolValidators[subProtocol];
269
- const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
270
- const requestBuffers = requests.map(req => req.toBuffer());
271
-
272
- const requestFunction = async () => {
273
- // Track which requests still need to be processed
274
- const pendingRequestIndices = new Set(requestBuffers.map((_, i) => i));
275
-
276
- // Create batch sampler with the total number of requests and max peers
277
- const batchSampler = new BatchConnectionSampler(this.connectionSampler, requests.length, maxPeers);
278
-
279
- if (batchSampler.activePeerCount === 0) {
280
- this.logger.debug('No active peers to send requests to');
281
- return [];
282
- }
283
-
284
- // This is where it gets fun
285
- // The outer loop is the retry loop, we will continue to retry until we process all indices we have
286
- // not received a response for, or we have reached the max retry attempts
287
-
288
- // The inner loop is the batch loop, we will process all requests for each peer in parallel
289
- // We will then process the results of the requests, and resample any peers that failed to respond
290
- // We will continue to retry until we have processed all indices, or we have reached the max retry attempts
291
-
292
- let retryAttempts = 0;
293
- while (pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts) {
294
- // Process requests in parallel for each available peer
295
- const requestBatches = new Map<PeerId, number[]>();
296
-
297
- // Group requests by peer
298
- for (const requestIndex of pendingRequestIndices) {
299
- const peer = batchSampler.getPeerForRequest(requestIndex);
300
- if (!peer) {
301
- break;
302
- }
303
-
304
- if (!requestBatches.has(peer)) {
305
- requestBatches.set(peer, []);
306
- }
307
- requestBatches.get(peer)!.push(requestIndex);
308
- }
309
-
310
- // Make parallel requests for each peer's batch
311
- // A batch entry will look something like this:
312
- // PeerId0: [0, 1, 2, 3]
313
- // PeerId1: [4, 5, 6, 7]
314
-
315
- // Peer Id 0 will send requests 0, 1, 2, 3 in serial
316
- // while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
317
-
318
- const batchResults = await Promise.all(
319
- Array.from(requestBatches.entries()).map(async ([peer, indices]) => {
320
- try {
321
- // Requests all going to the same peer are sent synchronously
322
- const peerResults: { index: number; response: InstanceType<SubProtocolMap[SubProtocol]['response']> }[] =
323
- [];
324
- for (const index of indices) {
325
- const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
326
-
327
- // Check the status of the response buffer
328
- if (response && response.status !== ReqRespStatus.SUCCESS) {
329
- this.logger.debug(
330
- `Request to peer ${peer.toString()} failed with status ${prettyPrintReqRespStatus(
331
- response.status,
332
- )}`,
333
- );
334
-
335
- // If we hit a rate limit or some failure, we remove the peer and return the results,
336
- // they will be split among remaining peers and the new sampled peer
337
- batchSampler.removePeerAndReplace(peer);
338
- return { peer, results: peerResults };
339
- }
340
-
341
- if (response && response.data.length > 0) {
342
- const object = subProtocolMap[subProtocol].response.fromBuffer(response.data);
343
- const isValid = await responseValidator(requests[index], object, peer);
344
-
345
- if (isValid) {
346
- peerResults.push({ index, response: object });
347
- }
348
- }
349
- }
350
-
351
- return { peer, results: peerResults };
352
- } catch (error) {
353
- this.logger.debug(`Failed batch request to peer ${peer.toString()}:`, error);
354
- batchSampler.removePeerAndReplace(peer);
355
- return { peer, results: [] };
356
- }
357
- }),
358
- );
359
-
360
- // Process results
361
- for (const { results } of batchResults) {
362
- for (const { index, response } of results) {
363
- if (response) {
364
- responses[index] = response;
365
- pendingRequestIndices.delete(index);
366
- }
367
- }
368
- }
369
-
370
- retryAttempts++;
371
- }
372
-
373
- if (retryAttempts >= maxRetryAttempts) {
374
- this.logger.debug(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
375
- }
376
-
377
- return responses;
378
- };
379
-
380
- try {
381
- return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>(
382
- requestFunction,
383
- timeoutMs,
384
- () => new CollectiveReqRespTimeoutError(),
385
- );
386
- } catch (e: any) {
387
- this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
388
- return [];
389
- }
390
- }
391
-
392
175
  /**
393
176
  * Sends a request to a specific peer
394
177
  *
@@ -399,6 +182,7 @@ export class ReqResp {
399
182
  * @param peerId - The peer to send the request to
400
183
  * @param subProtocol - The protocol to use to request
401
184
  * @param payload - The payload to send
185
+ * @param dialTimeout - If establishing a stream takes longer than this an error will be thrown
402
186
  * @returns If the request is successful, the response is returned, otherwise undefined
403
187
  *
404
188
  * @description
@@ -421,29 +205,59 @@ export class ReqResp {
421
205
  peerId: PeerId,
422
206
  subProtocol: ReqRespSubProtocol,
423
207
  payload: Buffer,
424
- ): Promise<ReqRespResponse | undefined> {
208
+ dialTimeout: number = this.dialTimeoutMs,
209
+ ): Promise<ReqRespResponse> {
425
210
  let stream: Stream | undefined;
426
211
  try {
427
212
  this.metrics.recordRequestSent(subProtocol);
428
213
 
429
- stream = await this.connectionSampler.dialProtocol(peerId, subProtocol);
214
+ // Calculate expected response size based on the request payload
215
+ const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
430
216
 
431
- // Open the stream with a timeout
432
- const result = await executeTimeout<ReqRespResponse>(
433
- (): Promise<ReqRespResponse> => pipe([payload], stream!, this.readMessage.bind(this)),
434
- this.individualRequestTimeoutMs,
435
- () => new IndividualReqRespTimeoutError(),
217
+ this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
218
+ stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
219
+ this.logger.trace(
220
+ `Opened stream ${stream.id} for sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`,
436
221
  );
437
222
 
438
- return result;
223
+ const timeoutErr = new IndividualReqRespTimeoutError();
224
+ // Create a wrapper to pass the expected size to readMessage
225
+ const readMessageWithSizeLimit = (source: AsyncIterable<Uint8ArrayList>) =>
226
+ this.readMessage(source, expectedSizeKb);
227
+ const [_, resp] = await executeTimeout(
228
+ signal =>
229
+ Promise.all([
230
+ pipeline([payload], stream!.sink, { signal }),
231
+ pipeline(stream!.source, readMessageWithSizeLimit, { signal }),
232
+ ]),
233
+ this.individualRequestTimeoutMs,
234
+ () => timeoutErr,
235
+ );
236
+ return resp;
439
237
  } catch (e: any) {
238
+ this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
239
+ // On error we immediately abort the stream, this is preferred way,
240
+ // because it signals to the sender that error happened, whereas
241
+ // closing the stream only closes our side and is much slower
242
+ if (stream) {
243
+ stream!.abort(e);
244
+ }
245
+
440
246
  this.metrics.recordRequestError(subProtocol);
441
247
  this.handleResponseError(e, peerId, subProtocol);
248
+
249
+ // If there is an exception, we return an unknown response
250
+ this.logger.debug(`Error sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}: ${e}`);
251
+ return { status: ReqRespStatus.FAILURE };
442
252
  } finally {
443
253
  // Only close the stream if we created it
254
+ // Note even if we aborted the stream, calling close on it is ok, it's just a no-op
444
255
  if (stream) {
445
256
  try {
446
- await this.connectionSampler.close(stream.id);
257
+ this.logger.trace(
258
+ `Closing stream ${stream.id} for request to peer ${peerId.toString()} on sub protocol ${subProtocol}`,
259
+ );
260
+ await this.connectionSampler.close(stream);
447
261
  } catch (closeError) {
448
262
  this.logger.error(
449
263
  `Error closing stream: ${closeError instanceof Error ? closeError.message : 'Unknown error'}`,
@@ -464,107 +278,58 @@ export class ReqResp {
464
278
  * @returns If the error is non pubishable, then undefined is returned, otherwise the peer is penalized
465
279
  */
466
280
  private handleResponseError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): void {
467
- const severity = this.categorizeError(e, peerId, subProtocol);
281
+ const severity = this.categorizeResponseError(e, peerId, subProtocol);
468
282
  if (severity) {
469
283
  this.peerScoring.penalizePeer(peerId, severity);
470
284
  }
471
285
  }
472
286
 
473
- /**
474
- * Categorize the error and log it.
475
- */
476
- private categorizeError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): PeerErrorSeverity | undefined {
477
- // Non punishable errors - we do not expect a response for goodbye messages
478
- if (subProtocol === ReqRespSubProtocol.GOODBYE) {
479
- this.logger.debug('Error encountered on goodbye sub protocol, no penalty', {
480
- peerId: peerId.toString(),
481
- subProtocol,
482
- });
483
- return undefined;
484
- }
485
-
486
- // We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour
487
- const logTags = {
488
- peerId: peerId.toString(),
489
- subProtocol,
490
- };
491
- if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) {
492
- this.logger.debug(
493
- `Non-punishable error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`,
494
- logTags,
495
- );
496
- return undefined;
497
- }
498
-
499
- // Pubishable errors
500
- // Connection reset errors in the networking stack are punished with high severity
501
- // it just signals an unreliable peer
502
- // We assume that the requesting node has a functioning networking stack.
503
- if (e?.code === 'ECONNRESET' || e?.code === 'EPIPE') {
504
- this.logger.debug(`Connection reset: ${peerId.toString()}`, logTags);
505
- return PeerErrorSeverity.HighToleranceError;
506
- }
507
-
508
- if (e?.code === 'ECONNREFUSED') {
509
- this.logger.debug(`Connection refused: ${peerId.toString()}`, logTags);
510
- return PeerErrorSeverity.HighToleranceError;
511
- }
512
-
513
- // Timeout errors are punished with high tolerance, they can be due to a geogrpahically far away peer or an
514
- // overloaded peer
515
- if (e instanceof IndividualReqRespTimeoutError) {
516
- this.logger.debug(
517
- `Timeout error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`,
518
- logTags,
519
- );
520
- return PeerErrorSeverity.HighToleranceError;
521
- }
522
-
523
- // Catch all error
524
- this.logger.error(`Unexpected error sending request to peer`, e, logTags);
525
- return PeerErrorSeverity.HighToleranceError;
526
- }
527
-
528
287
  /**
529
288
  * Read a message returned from a stream into a single buffer
530
289
  *
531
290
  * The message is split into two components
532
291
  * - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
533
292
  * - The second chunk should contain the response data
293
+ *
294
+ * @param source - The async iterable source of data chunks
295
+ * @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
534
296
  */
535
- private async readMessage(source: AsyncIterable<Uint8ArrayList>): Promise<ReqRespResponse> {
536
- let statusBuffer: ReqRespStatus | undefined;
297
+ private async readMessage(source: AsyncIterable<Uint8ArrayList>, maxSizeKb?: number): Promise<ReqRespResponse> {
298
+ let status: ReqRespStatus | undefined;
537
299
  const chunks: Uint8Array[] = [];
538
300
 
539
301
  try {
540
302
  for await (const chunk of source) {
541
- if (statusBuffer === undefined) {
542
- const firstChunkBuffer = chunk.subarray();
543
- statusBuffer = parseStatusChunk(firstChunkBuffer);
544
- } else {
303
+ const statusParsed = status !== undefined;
304
+ if (statusParsed) {
545
305
  chunks.push(chunk.subarray());
306
+ continue;
307
+ }
308
+
309
+ const firstChunkBuffer = chunk.subarray();
310
+ status = parseStatusChunk(firstChunkBuffer);
311
+
312
+ // In case status is not SUCCESS, we do not expect any data in the response
313
+ // we can return early
314
+ if (status !== ReqRespStatus.SUCCESS) {
315
+ return {
316
+ status,
317
+ };
546
318
  }
547
319
  }
548
320
 
549
321
  const messageData = Buffer.concat(chunks);
550
- const message: Buffer = this.snappyTransform.inboundTransformNoTopic(messageData);
322
+ const message: Buffer = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
551
323
 
552
324
  return {
553
- status: statusBuffer ?? ReqRespStatus.UNKNOWN,
325
+ status: status ?? ReqRespStatus.UNKNOWN,
554
326
  data: message,
555
327
  };
556
328
  } catch (e: any) {
329
+ // All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
330
+ // are re-thrown so the caller can penalize the peer via handleResponseError.
557
331
  this.logger.debug(`Reading message failed: ${e.message}`);
558
-
559
- let status = ReqRespStatus.UNKNOWN;
560
- if (e instanceof ReqRespStatusError) {
561
- status = e.status;
562
- }
563
-
564
- return {
565
- status,
566
- data: Buffer.from([]),
567
- };
332
+ throw e;
568
333
  }
569
334
  }
570
335
 
@@ -572,7 +337,8 @@ export class ReqResp {
572
337
  * Stream Handler
573
338
  * Reads the incoming stream, determines the protocol, then triggers the appropriate handler
574
339
  *
575
- * @param param0 - The incoming stream data
340
+ * @param protocol - The sub protocol to handle
341
+ * @param incomingStream - The incoming stream data containing the stream and connection
576
342
  *
577
343
  * @description
578
344
  * An individual stream handler will be bound to each sub protocol, and handles returning data back
@@ -588,14 +354,13 @@ export class ReqResp {
588
354
  [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol,
589
355
  [Attributes.P2P_ID]: connection.remotePeer.toString(),
590
356
  }))
591
- private async streamHandler(protocol: ReqRespSubProtocol, { stream, connection }: IncomingStreamData) {
592
- this.metrics.recordRequestReceived(protocol);
593
-
357
+ private async streamHandler(protocol: ReqRespSubProtocol, incomingStream: IncomingStreamData) {
358
+ const { stream, connection } = incomingStream;
594
359
  try {
595
- // Store a reference to from this for the async generator
360
+ this.metrics.recordRequestReceived(protocol);
596
361
  const rateLimitStatus = this.rateLimiter.allow(protocol, connection.remotePeer);
597
- if (rateLimitStatus != RateLimitStatus.Allowed) {
598
- this.logger.warn(
362
+ if (rateLimitStatus !== RateLimitStatus.Allowed) {
363
+ this.logger.verbose(
599
364
  `Rate limit exceeded ${prettyPrintRateLimitStatus(rateLimitStatus)} for ${protocol} from ${
600
365
  connection.remotePeer
601
366
  }`,
@@ -604,58 +369,268 @@ export class ReqResp {
604
369
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
605
370
  }
606
371
 
607
- const handler = this.subProtocolHandlers[protocol];
608
- const transform = this.snappyTransform;
372
+ // When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
373
+ if (
374
+ !UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
375
+ (this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
376
+ ) {
377
+ this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
378
+ throw new ReqRespStatusError(ReqRespStatus.FAILURE);
379
+ }
609
380
 
610
- await pipe(
611
- stream,
612
- async function* (source: any) {
613
- for await (const chunkList of source) {
614
- const msg = Buffer.from(chunkList.subarray());
615
- const response = await handler(connection.remotePeer, msg);
381
+ await this.processStream(protocol, incomingStream);
382
+ } catch (err: any) {
383
+ this.metrics.recordResponseError(protocol);
384
+ this.handleRequestError(err, connection.remotePeer, protocol);
385
+
386
+ if (err instanceof ReqRespStatusError) {
387
+ const errorSent = await this.trySendError(stream, connection.remotePeer, protocol, err.status);
388
+ const logMessage = errorSent
389
+ ? 'Protocol error sent successfully.'
390
+ : 'Stream already closed or poisoned, not sending error response.';
391
+
392
+ const isRateLimit = err.status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
393
+
394
+ const level = isRateLimit ? 'debug' : 'warn';
395
+ this.logger[level](logMessage + ` Status: ${ReqRespStatus[err.status]}`, {
396
+ protocol,
397
+ err,
398
+ errorStatus: err.status,
399
+ cause: err.cause ?? 'Cause unknown',
400
+ });
401
+ } else {
402
+ // In erroneous case we abort the stream, this will signal the peer that something went wrong
403
+ // and that this stream should be dropped
404
+ const isMessageToNotWarn =
405
+ err instanceof Error &&
406
+ ['stream reset', 'Cannot push value onto an ended pushable', 'read ECONNRESET'].some(msg =>
407
+ err.message.includes(msg),
408
+ );
409
+ const level = isMessageToNotWarn ? 'debug' : 'warn';
410
+ this.logger[level]('Unknown stream error while handling the stream, aborting', {
411
+ protocol,
412
+ err,
413
+ });
616
414
 
617
- if (protocol === ReqRespSubProtocol.GOODBYE) {
618
- // Don't respond
619
- await stream.close();
620
- return;
621
- }
415
+ stream.abort(err);
416
+ }
417
+ } finally {
418
+ //NOTE: This is idempotent action, so it's ok to call it even if stream was aborted
419
+ await stream.close();
420
+ }
421
+ }
622
422
 
623
- // Send success code first, then the response
624
- const successChunk = Buffer.from([ReqRespStatus.SUCCESS]);
625
- yield new Uint8Array(successChunk);
423
+ /**
424
+ * Reads incoming data from the stream, processes it according to the sub protocol,
425
+ * and puts response back into the stream.
426
+ *
427
+ * @param protocol - The sub protocol to use for processing the stream
428
+ * @param incomingStream - The incoming stream data containing the stream and connection
429
+ *
430
+ * */
431
+ private async processStream(protocol: ReqRespSubProtocol, { stream, connection }: IncomingStreamData): Promise<void> {
432
+ const handler = this.subProtocolHandlers[protocol];
433
+ if (!handler) {
434
+ throw new Error(`No handler defined for reqresp subprotocol ${protocol}`);
435
+ }
436
+
437
+ const snappy = this.snappyTransform;
438
+ const SUCCESS = Uint8Array.of(ReqRespStatus.SUCCESS);
439
+
440
+ await pipeline(
441
+ stream.source,
442
+ async function* (source: any) {
443
+ for await (const chunk of source) {
444
+ const response = await handler(connection.remotePeer, chunk.subarray());
626
445
 
627
- yield new Uint8Array(transform.outboundTransformNoTopic(response));
446
+ if (protocol === ReqRespSubProtocol.GOODBYE) {
447
+ // NOTE: The stream was already closed by Goodbye handler
448
+ // peerManager.goodbyeReceived(peerId, reason); will call libp2p.hangUp closing all active streams and connections
449
+ // Don't try to respond
450
+ return;
628
451
  }
629
- },
630
- stream,
631
- );
452
+
453
+ stream.metadata.written = true; // Mark the stream as written to;
454
+
455
+ yield SUCCESS;
456
+ yield snappy.outboundTransformData(response);
457
+ }
458
+ },
459
+ stream.sink,
460
+ );
461
+ }
462
+
463
+ /**
464
+ * Try to send error status to the peer. We say try, because the stream,
465
+ * might already be closed
466
+ * @param stream - The stream opened between us and the peer
467
+ * @param status - The error status to send back to the peer
468
+ * @returns true if error was sent successfully, otherwise false
469
+ *
470
+ */
471
+ private async trySendError(
472
+ stream: Stream,
473
+ peerId: PeerId,
474
+ protocol: ReqRespSubProtocol,
475
+ status: ReqRespStatus,
476
+ ): Promise<boolean> {
477
+ const canWriteToStream =
478
+ // 'writing' is a bit weird naming, but it actually means that the stream is ready to write
479
+ // 'ready' means that stream ready to be opened for writing
480
+ stream.status === 'open' && (stream.writeStatus === 'writing' || stream.writeStatus === 'ready');
481
+
482
+ // Stream was already written to, we consider it poisoned, in a sense,
483
+ // that even if we write an error response, it will not be interpreted correctly by the peer
484
+ const streamPoisoned = stream.metadata.written === true;
485
+ const shouldWriteToStream = canWriteToStream && !streamPoisoned;
486
+
487
+ if (!shouldWriteToStream) {
488
+ return false;
489
+ }
490
+
491
+ try {
492
+ await pipeline(function* () {
493
+ yield Uint8Array.of(status);
494
+ }, stream.sink);
495
+
496
+ return true;
632
497
  } catch (e: any) {
633
- this.logger.warn('Reqresp Response error: ', e);
634
- this.metrics.recordResponseError(protocol);
498
+ this.logger.warn('Error while sending error response', e);
499
+ stream.abort(e);
635
500
 
636
- // If we receive a known error, we use the error status in the response chunk, otherwise we categorize as unknown
637
- let errorStatus = ReqRespStatus.UNKNOWN;
638
- if (e instanceof ReqRespStatusError) {
639
- errorStatus = e.status;
640
- }
501
+ this.handleRequestError(e, peerId, protocol);
502
+ return false;
503
+ }
504
+ }
641
505
 
642
- const sendErrorChunk = this.sendErrorChunk(errorStatus);
506
+ private handleRequestError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): void {
507
+ const severity = this.categorizeRequestError(e, peerId, subProtocol);
508
+ if (severity) {
509
+ this.peerScoring.penalizePeer(peerId, severity);
510
+ }
511
+ }
643
512
 
644
- // Return and yield the response chunk
645
- await pipe(
646
- stream,
647
- async function* (_source: any) {
648
- yield* sendErrorChunk;
649
- },
650
- stream,
651
- );
652
- } finally {
653
- await stream.close();
513
+ /**
514
+ * Categorize the request error and log it.
515
+ *
516
+ * @returns Severity of the error, or undefined if the error is not punishable.
517
+ */
518
+ private categorizeRequestError(
519
+ e: any,
520
+ peerId: PeerId,
521
+ subProtocol: ReqRespSubProtocol,
522
+ ): PeerErrorSeverity | undefined {
523
+ const logTags = { peerId: peerId.toString(), subProtocol };
524
+
525
+ // Punishable error - peer should never send badly formed request
526
+ if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
527
+ this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
528
+ return PeerErrorSeverity.LowToleranceError;
529
+ }
530
+
531
+ // TODO: (mralj): think if we should penalize peer here based on connection errors
532
+ return undefined;
533
+ }
534
+
535
+ /**
536
+ * Categorize the response error and log it.
537
+ *
538
+ * @returns Severity of the error, or undefined if the error is not punishable.
539
+ */
540
+ private categorizeResponseError(
541
+ e: any,
542
+ peerId: PeerId,
543
+ subProtocol: ReqRespSubProtocol,
544
+ ): PeerErrorSeverity | undefined {
545
+ const logTags = { peerId: peerId.toString(), subProtocol };
546
+
547
+ // Non punishable errors - we do not expect a response for goodbye messages
548
+ if (subProtocol === ReqRespSubProtocol.GOODBYE) {
549
+ this.logger.debug('Error encountered on goodbye sub protocol, no penalty', logTags);
550
+ return undefined;
551
+ }
552
+
553
+ // Invalid status byte: the peer sent a status byte that doesn't match any known status code.
554
+ // This is a protocol violation, penalize harshly.
555
+ if (e instanceof ReqRespStatusError) {
556
+ this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
557
+ return PeerErrorSeverity.LowToleranceError;
558
+ }
559
+
560
+ // Oversized snappy response: the peer is sending data that exceeds the allowed size.
561
+ // This is a protocol violation that wastes bandwidth, so penalize harshly.
562
+ if (e instanceof OversizedSnappyResponseError) {
563
+ this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
564
+ return PeerErrorSeverity.LowToleranceError;
654
565
  }
566
+
567
+ return this.categorizeConnectionErrors(e, peerId, subProtocol);
655
568
  }
656
569
 
657
- private async *sendErrorChunk(error: ReqRespStatus): AsyncIterable<Uint8Array> {
658
- const errorChunk = Buffer.from([error]);
659
- yield new Uint8Array(errorChunk);
570
+ /*
571
+ * Errors specific to connection handling
572
+ * These can happen both when sending request and response.
573
+ */
574
+ private categorizeConnectionErrors(
575
+ e: any,
576
+ peerId: PeerId,
577
+ subProtocol: ReqRespSubProtocol,
578
+ ): PeerErrorSeverity | undefined {
579
+ const logTags = { peerId: peerId.toString(), subProtocol };
580
+ // Do not punish if we are stopping the service
581
+ if (e instanceof AbortError || e?.code == 'ABORT_ERR') {
582
+ this.logger.debug(`Request aborted: ${e.message}`, logTags);
583
+ return undefined;
584
+ }
585
+
586
+ // Do not punish if we are the ones closing the connection
587
+ if (
588
+ e?.code === 'ERR_CONNECTION_BEING_CLOSED' ||
589
+ e?.code === 'ERR_CONNECTION_CLOSED' ||
590
+ e?.code === 'ERR_TRANSIENT_CONNECTION' ||
591
+ e?.message?.includes('Muxer already closed') ||
592
+ e?.message?.includes('muxer closed') ||
593
+ e?.message?.includes('ended pushable')
594
+ ) {
595
+ this.logger.debug(
596
+ `Connection closed to peer from our side: ${peerId.toString()} (${e?.message ?? 'missing error message'})`,
597
+ logTags,
598
+ );
599
+ return undefined;
600
+ }
601
+
602
+ // Pubishable errors
603
+ // Connection reset errors in the networking stack are punished with high severity
604
+ // it just signals an unreliable peer
605
+ // We assume that the requesting node has a functioning networking stack.
606
+ if (e?.code === 'ECONNRESET' || e?.code === 'EPIPE') {
607
+ this.logger.debug(`Connection reset: ${peerId.toString()}`, logTags);
608
+ return PeerErrorSeverity.HighToleranceError;
609
+ }
610
+
611
+ if (e?.code === 'ECONNREFUSED') {
612
+ this.logger.debug(`Connection refused: ${peerId.toString()}`, logTags);
613
+ return PeerErrorSeverity.HighToleranceError;
614
+ }
615
+
616
+ if (e?.code === 'ERR_UNEXPECTED_EOF') {
617
+ this.logger.debug(`Connection unexpected EOF: ${peerId.toString()}`, logTags);
618
+ return PeerErrorSeverity.HighToleranceError;
619
+ }
620
+
621
+ if (e?.code === 'ERR_UNSUPPORTED_PROTOCOL') {
622
+ this.logger.debug(`Sub protocol not supported by peer: ${peerId.toString()}`, logTags);
623
+ return PeerErrorSeverity.HighToleranceError;
624
+ }
625
+
626
+ // Timeout errors are punished with high tolerance, they can be due to a geographically far away or overloaded peer
627
+ if (e instanceof IndividualReqRespTimeoutError || e instanceof TimeoutError) {
628
+ this.logger.debug(`Timeout error in ${subProtocol}: ${e.message}`, logTags);
629
+ return PeerErrorSeverity.HighToleranceError;
630
+ }
631
+
632
+ // Catch all error
633
+ this.logger.error(`Unexpected error in ReqResp protocol`, e, logTags);
634
+ return PeerErrorSeverity.HighToleranceError;
660
635
  }
661
636
  }