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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/dest/client/factory.d.ts +8 -8
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +42 -13
  4. package/dest/client/interface.d.ts +39 -33
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +37 -50
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +144 -223
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
  10. package/dest/config.d.ts +47 -11
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +94 -31
  13. package/dest/errors/tx-pool.error.d.ts +8 -0
  14. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  15. package/dest/errors/tx-pool.error.js +9 -0
  16. package/dest/index.d.ts +2 -1
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +1 -0
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +67 -37
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +53 -53
  25. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  26. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  29. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  31. package/dest/mem_pools/index.d.ts +2 -1
  32. package/dest/mem_pools/index.d.ts.map +1 -1
  33. package/dest/mem_pools/interface.d.ts +3 -3
  34. package/dest/mem_pools/interface.d.ts.map +1 -1
  35. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  36. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  37. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  38. package/dest/mem_pools/tx_pool/priority.js +4 -4
  39. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -2
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  62. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  63. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  68. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  69. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  71. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  72. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  74. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +22 -8
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +68 -11
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +132 -17
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +36 -14
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +11 -6
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +13 -5
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +336 -185
  92. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  93. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  94. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  95. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  96. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  98. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  99. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/proposal_validator/proposal_validator.js +48 -36
  101. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  102. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  104. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  105. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  106. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  107. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  108. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  109. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  110. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  111. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  113. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  114. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  116. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  117. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  119. package/dest/msg_validators/tx_validator/factory.d.ts +125 -6
  120. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/factory.js +233 -59
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  126. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  128. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  129. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/index.js +2 -0
  131. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  132. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  134. package/dest/msg_validators/tx_validator/phases_validator.d.ts +2 -2
  135. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/phases_validator.js +44 -23
  137. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  138. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  140. package/dest/services/dummy_service.d.ts +9 -5
  141. package/dest/services/dummy_service.d.ts.map +1 -1
  142. package/dest/services/dummy_service.js +7 -4
  143. package/dest/services/encoding.d.ts +3 -3
  144. package/dest/services/encoding.d.ts.map +1 -1
  145. package/dest/services/encoding.js +11 -10
  146. package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
  147. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  148. package/dest/services/gossipsub/topic_score_params.js +32 -10
  149. package/dest/services/libp2p/libp2p_service.d.ts +25 -14
  150. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  151. package/dest/services/libp2p/libp2p_service.js +158 -123
  152. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -3
  153. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  154. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +5 -9
  155. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
  156. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  157. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -13
  158. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  159. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +25 -46
  160. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  161. package/dest/services/reqresp/interface.d.ts +10 -1
  162. package/dest/services/reqresp/interface.d.ts.map +1 -1
  163. package/dest/services/reqresp/interface.js +15 -1
  164. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  165. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  166. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  167. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  168. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  169. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  170. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  171. package/dest/services/reqresp/protocols/tx.js +20 -0
  172. package/dest/services/reqresp/reqresp.d.ts +1 -1
  173. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  174. package/dest/services/reqresp/reqresp.js +11 -4
  175. package/dest/services/service.d.ts +22 -3
  176. package/dest/services/service.d.ts.map +1 -1
  177. package/dest/services/tx_collection/config.d.ts +19 -1
  178. package/dest/services/tx_collection/config.d.ts.map +1 -1
  179. package/dest/services/tx_collection/config.js +46 -0
  180. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
  181. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  182. package/dest/services/tx_collection/fast_tx_collection.js +56 -36
  183. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  184. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  185. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  186. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  187. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  188. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  189. package/dest/services/tx_collection/index.d.ts +2 -1
  190. package/dest/services/tx_collection/index.d.ts.map +1 -1
  191. package/dest/services/tx_collection/index.js +1 -0
  192. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  193. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  194. package/dest/services/tx_collection/instrumentation.js +2 -1
  195. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  196. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  197. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  198. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
  199. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  200. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  201. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  202. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  203. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  204. package/dest/services/tx_collection/tx_collection.d.ts +23 -10
  205. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  206. package/dest/services/tx_collection/tx_collection.js +75 -3
  207. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  208. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  209. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  210. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  211. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  212. package/dest/services/tx_collection/tx_source.js +19 -2
  213. package/dest/services/tx_file_store/config.d.ts +1 -3
  214. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  215. package/dest/services/tx_file_store/config.js +0 -4
  216. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  217. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  218. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  219. package/dest/services/tx_provider.d.ts +4 -4
  220. package/dest/services/tx_provider.d.ts.map +1 -1
  221. package/dest/services/tx_provider.js +9 -8
  222. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  223. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  224. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  225. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  226. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  227. package/dest/test-helpers/mock-pubsub.js +105 -4
  228. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  229. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  230. package/dest/test-helpers/reqresp-nodes.js +2 -2
  231. package/dest/test-helpers/testbench-utils.d.ts +35 -24
  232. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  233. package/dest/test-helpers/testbench-utils.js +95 -36
  234. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  235. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  236. package/dest/testbench/p2p_client_testbench_worker.js +16 -15
  237. package/dest/testbench/worker_client_manager.d.ts +3 -1
  238. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  239. package/dest/testbench/worker_client_manager.js +4 -1
  240. package/dest/util.d.ts +2 -2
  241. package/dest/util.d.ts.map +1 -1
  242. package/package.json +14 -14
  243. package/src/client/factory.ts +77 -23
  244. package/src/client/interface.ts +43 -33
  245. package/src/client/p2p_client.ts +165 -265
  246. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -10
  247. package/src/config.ts +139 -33
  248. package/src/errors/tx-pool.error.ts +12 -0
  249. package/src/index.ts +1 -0
  250. package/src/mem_pools/attestation_pool/attestation_pool.ts +95 -44
  251. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +57 -53
  252. package/src/mem_pools/attestation_pool/index.ts +3 -3
  253. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  254. package/src/mem_pools/index.ts +3 -0
  255. package/src/mem_pools/interface.ts +2 -2
  256. package/src/mem_pools/tx_pool/README.md +1 -1
  257. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  258. package/src/mem_pools/tx_pool/priority.ts +4 -4
  259. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  260. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  261. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  262. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  263. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -2
  264. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  265. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  266. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  267. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  268. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  269. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  270. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  271. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  272. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  273. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  274. package/src/mem_pools/tx_pool_v2/interfaces.ts +23 -8
  275. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +189 -23
  276. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -16
  277. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +18 -7
  278. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +379 -182
  279. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  280. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  281. package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -40
  282. package/src/msg_validators/tx_validator/README.md +115 -0
  283. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  284. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  285. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  286. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  287. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  288. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  289. package/src/msg_validators/tx_validator/factory.ts +373 -77
  290. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  291. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  292. package/src/msg_validators/tx_validator/index.ts +2 -0
  293. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  294. package/src/msg_validators/tx_validator/phases_validator.ts +51 -26
  295. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  296. package/src/services/dummy_service.ts +12 -6
  297. package/src/services/encoding.ts +9 -9
  298. package/src/services/gossipsub/README.md +29 -14
  299. package/src/services/gossipsub/topic_score_params.ts +49 -13
  300. package/src/services/libp2p/libp2p_service.ts +170 -132
  301. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +6 -6
  302. package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
  303. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
  304. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  305. package/src/services/reqresp/interface.ts +26 -1
  306. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
  307. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  308. package/src/services/reqresp/protocols/tx.ts +22 -0
  309. package/src/services/reqresp/reqresp.ts +13 -3
  310. package/src/services/service.ts +31 -2
  311. package/src/services/tx_collection/config.ts +68 -0
  312. package/src/services/tx_collection/fast_tx_collection.ts +65 -32
  313. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  314. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  315. package/src/services/tx_collection/index.ts +1 -0
  316. package/src/services/tx_collection/instrumentation.ts +7 -1
  317. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  318. package/src/services/tx_collection/proposal_tx_collector.ts +8 -7
  319. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  320. package/src/services/tx_collection/tx_collection.ts +113 -16
  321. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  322. package/src/services/tx_collection/tx_source.ts +22 -3
  323. package/src/services/tx_file_store/config.ts +0 -6
  324. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  325. package/src/services/tx_provider.ts +10 -9
  326. package/src/test-helpers/make-test-p2p-clients.ts +3 -5
  327. package/src/test-helpers/mock-pubsub.ts +146 -9
  328. package/src/test-helpers/reqresp-nodes.ts +2 -5
  329. package/src/test-helpers/testbench-utils.ts +109 -40
  330. package/src/testbench/p2p_client_testbench_worker.ts +24 -20
  331. package/src/testbench/worker_client_manager.ts +11 -4
  332. package/src/util.ts +7 -1
  333. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  334. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  335. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  336. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -370,15 +370,15 @@ function applyDecs2203RFactory() {
370
370
  function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
371
  return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
372
372
  }
373
- var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _initProto;
373
+ var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _initProto;
374
374
  import { BlockNumber } from '@aztec/foundation/branded-types';
375
- import { randomInt } from '@aztec/foundation/crypto/random';
375
+ import { maxBy } from '@aztec/foundation/collection';
376
376
  import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
377
377
  import { RunningPromise } from '@aztec/foundation/running-promise';
378
378
  import { Timer } from '@aztec/foundation/timer';
379
379
  import { protocolContractsHash } from '@aztec/protocol-contracts';
380
380
  import { GasFees } from '@aztec/stdlib/gas';
381
- import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PClientType, P2PMessage, PeerErrorSeverity, TopicType, createTopicString, getTopicsForClientAndConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
381
+ import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, PeerErrorSeverityByHarshness, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
382
382
  import { MerkleTreeId } from '@aztec/stdlib/trees';
383
383
  import { Tx } from '@aztec/stdlib/tx';
384
384
  import { compressComponentVersions } from '@aztec/stdlib/versioning';
@@ -397,7 +397,7 @@ import { ENR } from '@nethermindeth/enr';
397
397
  import { createLibp2p } from 'libp2p';
398
398
  import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
399
399
  import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
400
- import { createTxMessageValidators, createTxReqRespValidator } from '../../msg_validators/tx_validator/factory.js';
400
+ import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
401
401
  import { GossipSubEvent } from '../../types/index.js';
402
402
  import { convertToMultiaddr } from '../../util.js';
403
403
  import { getVersions } from '../../versioning.js';
@@ -408,8 +408,7 @@ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring
408
408
  import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
409
409
  import { PeerManager } from '../peer-manager/peer_manager.js';
410
410
  import { PeerScoring } from '../peer-manager/peer_scoring.js';
411
- import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError } from '../reqresp/index.js';
412
- import { pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
411
+ import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
413
412
  import { ReqResp } from '../reqresp/reqresp.js';
414
413
  import { P2PInstrumentation } from './instrumentation.js';
415
414
  _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
@@ -433,9 +432,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
433
432
  [Attributes.TX_HASH]: requestedTxHash.toString()
434
433
  })), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
435
434
  [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
436
- })), _dec8 = trackSpan('Libp2pService.validatePropagatedTx', (tx)=>({
437
- [Attributes.TX_HASH]: tx.getTxHash().toString()
438
- })), _dec9 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
435
+ })), _dec8 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
439
436
  [Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
440
437
  [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
441
438
  [Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
@@ -443,7 +440,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
443
440
  /**
444
441
  * Lib P2P implementation of the P2PService interface.
445
442
  */ export class LibP2PService extends WithTracer {
446
- clientType;
447
443
  config;
448
444
  node;
449
445
  peerDiscoveryService;
@@ -499,11 +495,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
499
495
  [
500
496
  _dec8,
501
497
  2,
502
- "validatePropagatedTx"
503
- ],
504
- [
505
- _dec9,
506
- 2,
507
498
  "validateCheckpointAttestation"
508
499
  ]
509
500
  ], []));
@@ -518,6 +509,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
518
509
  topicStrings;
519
510
  feesCache;
520
511
  /** Callback invoked when a duplicate proposal is detected (triggers slashing). */ duplicateProposalCallback;
512
+ /** Callback invoked when a duplicate attestation is detected (triggers slashing). */ duplicateAttestationCallback;
521
513
  /**
522
514
  * Callback for when a block is received from a peer.
523
515
  * @param block - The block received from the peer.
@@ -532,8 +524,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
532
524
  instrumentation;
533
525
  telemetry;
534
526
  logger;
535
- constructor(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
536
- super(telemetry, 'LibP2PService'), this.clientType = clientType, this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
527
+ constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
528
+ super(telemetry, 'LibP2PService'), this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
537
529
  this.telemetry = telemetry;
538
530
  // Create child logger with fisherman prefix if in fisherman mode
539
531
  this.logger = config.fishermanMode ? logger.createChild('[FISHERMAN]') : logger;
@@ -549,19 +541,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
549
541
  this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
550
542
  this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
551
543
  this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
552
- this.blockProposalValidator = new BlockProposalValidator(epochCache, {
553
- txsPermitted: !config.disableTransactions
554
- });
555
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
556
- txsPermitted: !config.disableTransactions
557
- });
544
+ const proposalValidatorOpts = {
545
+ txsPermitted: !config.disableTransactions,
546
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
547
+ };
548
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
549
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
558
550
  this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) : new CheckpointAttestationValidator(epochCache);
559
551
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
560
552
  this.blockReceivedCallback = async (block)=>{
561
- this.logger.debug(`Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`, {
553
+ this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
562
554
  p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier()
563
555
  });
564
- return false;
556
+ return true;
565
557
  };
566
558
  this.checkpointReceivedCallback = (checkpoint)=>{
567
559
  this.logger.debug(`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`);
@@ -576,7 +568,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
576
568
  * @param config - The configuration to use when creating the service.
577
569
  * @param txPool - The transaction pool to be accessed by the service.
578
570
  * @returns The new service.
579
- */ static async new(clientType, config, peerId, deps) {
571
+ */ static async new(config, peerId, deps) {
580
572
  const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, telemetry, logger, packageVersion } = deps;
581
573
  const { p2pPort, maxPeerCount, listenAddress } = config;
582
574
  const bindAddrTcp = convertToMultiaddr(listenAddress, p2pPort, 'tcp');
@@ -619,7 +611,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
619
611
  slotDurationMs: l1Constants.slotDuration * 1000,
620
612
  heartbeatIntervalMs: config.gossipsubInterval,
621
613
  targetCommitteeSize: l1Constants.targetCommitteeSize,
622
- blockDurationMs: config.blockDurationMs
614
+ blockDurationMs: config.blockDurationMs,
615
+ expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
623
616
  });
624
617
  const node = await createLibp2p({
625
618
  start: false,
@@ -740,7 +733,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
740
733
  // Note: positive topic scores can offset penalties, so alignment is best-effort.
741
734
  node.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
742
735
  node.services.pubsub.score.params.appSpecificScore = (peerId)=>peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
743
- return new LibP2PService(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
736
+ return new LibP2PService(config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
744
737
  }
745
738
  /**
746
739
  * Starts the LibP2P service.
@@ -785,7 +778,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
785
778
  await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
786
779
  await this.node.start();
787
780
  // Subscribe to standard GossipSub topics by default
788
- for (const topic of getTopicsForClientAndConfig(this.clientType, this.config.disableTransactions)){
781
+ for (const topic of getTopicsForConfig(this.config.disableTransactions)){
789
782
  this.subscribeToTopic(this.topicStrings[topic]);
790
783
  }
791
784
  // add GossipSub listener
@@ -833,6 +826,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
833
826
  getPeers(includePending) {
834
827
  return this.peerManager.getPeers(includePending);
835
828
  }
829
+ getGossipMeshPeerCount(topicType) {
830
+ return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length;
831
+ }
836
832
  handleGossipSubEvent(e) {
837
833
  this.logger.trace(`Received PUBSUB message.`);
838
834
  const safeJob = async ()=>{
@@ -874,6 +870,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
874
870
  this.duplicateProposalCallback = callback;
875
871
  }
876
872
  /**
873
+ * Registers a callback to be invoked when a duplicate attestation is detected.
874
+ * A validator signing attestations for different proposals at the same slot.
875
+ * This callback is triggered on the first duplicate (when count goes from 1 to 2).
876
+ */ registerDuplicateAttestationCallback(callback) {
877
+ this.duplicateAttestationCallback = callback;
878
+ }
879
+ /**
877
880
  * Subscribes to a topic.
878
881
  * @param topic - The topic to subscribe to.
879
882
  */ subscribeToTopic(topic) {
@@ -984,9 +987,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
984
987
  if (msg.topic === this.topicStrings[TopicType.tx]) {
985
988
  await this.handleGossipedTx(p2pMessage.payload, msgId, source);
986
989
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
987
- if (this.clientType === P2PClientType.Full) {
988
- await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
989
- }
990
+ await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
990
991
  } else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
991
992
  await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
992
993
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
@@ -1054,26 +1055,71 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1054
1055
  async handleGossipedTx(payloadData, msgId, source) {
1055
1056
  const validationFunc = async ()=>{
1056
1057
  const tx = Tx.fromBuffer(payloadData);
1057
- const isValid = await this.validatePropagatedTx(tx, source);
1058
- const exists = isValid && await this.mempools.txPool.hasTx(tx.getTxHash());
1058
+ const currentBlockNumber = await this.archiver.getBlockNumber();
1059
+ const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1060
+ // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
1061
+ const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
1062
+ const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
1063
+ if (!firstStageOutcome.allPassed) {
1064
+ const { name } = firstStageOutcome.failure;
1065
+ let { severity } = firstStageOutcome.failure;
1066
+ // Double spend validator has a special case handler. We perform more detailed examination
1067
+ // as to how recently the nullifier was entered into the tree and if the transaction should
1068
+ // have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
1069
+ if (name === 'doubleSpendValidator') {
1070
+ const txBlockNumber = BlockNumber(currentBlockNumber + 1);
1071
+ severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
1072
+ }
1073
+ this.peerManager.penalizePeer(source, severity);
1074
+ return {
1075
+ result: TopicValidatorResult.Reject
1076
+ };
1077
+ }
1078
+ // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
1079
+ const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
1080
+ if (canAdd === 'ignored') {
1081
+ return {
1082
+ result: TopicValidatorResult.Ignore,
1083
+ obj: tx
1084
+ };
1085
+ }
1086
+ // Stage 2: expensive proof verification
1087
+ const secondStageValidators = this.createSecondStageMessageValidators();
1088
+ const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
1089
+ if (!secondStageOutcome.allPassed) {
1090
+ const { severity } = secondStageOutcome.failure;
1091
+ this.peerManager.penalizePeer(source, severity);
1092
+ return {
1093
+ result: TopicValidatorResult.Reject
1094
+ };
1095
+ }
1096
+ // Pool add: persist the tx
1097
+ const txHash = tx.getTxHash();
1098
+ const addResult = await this.mempools.txPool.addPendingTxs([
1099
+ tx
1100
+ ], {
1101
+ source: 'gossip'
1102
+ });
1103
+ const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
1104
+ const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
1059
1105
  this.logger.trace(`Validate propagated tx`, {
1060
- isValid,
1061
- exists,
1106
+ wasAccepted,
1107
+ wasIgnored,
1062
1108
  [Attributes.P2P_ID]: source.toString()
1063
1109
  });
1064
- if (!isValid) {
1110
+ if (wasAccepted) {
1065
1111
  return {
1066
- result: TopicValidatorResult.Reject
1112
+ result: TopicValidatorResult.Accept,
1113
+ obj: tx
1067
1114
  };
1068
- } else if (exists) {
1115
+ } else if (wasIgnored) {
1069
1116
  return {
1070
1117
  result: TopicValidatorResult.Ignore,
1071
1118
  obj: tx
1072
1119
  };
1073
1120
  } else {
1074
1121
  return {
1075
- result: TopicValidatorResult.Accept,
1076
- obj: tx
1122
+ result: TopicValidatorResult.Reject
1077
1123
  };
1078
1124
  }
1079
1125
  };
@@ -1081,20 +1127,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1081
1127
  if (result !== TopicValidatorResult.Accept || !tx) {
1082
1128
  return;
1083
1129
  }
1130
+ // Tx was accepted into pool and will be propagated - just log and record metrics
1084
1131
  const txHash = tx.getTxHash();
1085
1132
  const txHashString = txHash.toString();
1086
1133
  this.logger.verbose(`Received tx ${txHashString} from external peer ${source.toString()} via gossip`, {
1087
1134
  source: source.toString(),
1088
1135
  txHash: txHashString
1089
1136
  });
1090
- if (this.config.dropTransactions && randomInt(1000) < this.config.dropTransactionsProbability * 1000) {
1091
- this.logger.warn(`Intentionally dropping tx ${txHashString} (probability rule)`);
1092
- return;
1093
- }
1094
1137
  this.instrumentation.incrementTxReceived(1);
1095
- await this.mempools.txPool.addTxs([
1096
- tx
1097
- ]);
1098
1138
  }
1099
1139
  /**
1100
1140
  * Process a checkpoint attestation from a peer.
@@ -1126,38 +1166,56 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1126
1166
  obj: attestation
1127
1167
  };
1128
1168
  }
1129
- // Get committee size for the attestation's slot
1130
- const slot = attestation.payload.header.slotNumber;
1131
- const { committee } = await this.epochCache.getCommittee(slot);
1132
- const committeeSize = committee?.length ?? 0;
1133
1169
  // Try to add the attestation: this handles existence check, cap check, and adding in one call
1134
- const { added, alreadyExists } = await this.mempools.attestationPool.tryAddCheckpointAttestation(attestation, committeeSize);
1170
+ // count is the number of attestations by this signer for this slot (for duplicate detection)
1171
+ const slot = attestation.payload.header.slotNumber;
1172
+ const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddCheckpointAttestation(attestation);
1135
1173
  this.logger.trace(`Validate propagated checkpoint attestation`, {
1136
1174
  added,
1137
1175
  alreadyExists,
1176
+ count,
1138
1177
  [Attributes.SLOT_NUMBER]: slot.toString(),
1139
1178
  [Attributes.P2P_ID]: peerId.toString()
1140
1179
  });
1141
- // Duplicate attestation received, no need to re-broadcast
1180
+ // Exact same attestation received, no need to re-broadcast
1142
1181
  if (alreadyExists) {
1143
1182
  return {
1144
1183
  result: TopicValidatorResult.Ignore,
1145
1184
  obj: attestation
1146
1185
  };
1147
1186
  }
1148
- // Could not add (cap reached), no need to re-broadcast
1187
+ // Could not add (cap reached for signer), no need to re-broadcast
1149
1188
  if (!added) {
1150
- this.logger.warn(`Dropping checkpoint attestation due to per-(slot, proposalId) attestation cap`, {
1189
+ this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1151
1190
  slot: slot.toString(),
1152
1191
  archive: attestation.archive.toString(),
1153
- source: peerId.toString()
1192
+ source: peerId.toString(),
1193
+ attester: attestation.getSender()?.toString(),
1194
+ count
1154
1195
  });
1155
1196
  return {
1156
1197
  result: TopicValidatorResult.Ignore,
1157
1198
  obj: attestation
1158
1199
  };
1159
1200
  }
1160
- // Attestation was added successfully
1201
+ // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
1202
+ // count is the number of attestations by this signer for this slot
1203
+ if (count === 2) {
1204
+ const attester = attestation.getSender();
1205
+ if (attester) {
1206
+ this.logger.warn(`Detected duplicate attestation (equivocation) at slot ${slot}`, {
1207
+ slot: slot.toString(),
1208
+ archive: attestation.archive.toString(),
1209
+ source: peerId.toString(),
1210
+ attester: attester.toString()
1211
+ });
1212
+ this.duplicateAttestationCallback?.({
1213
+ slot,
1214
+ attester
1215
+ });
1216
+ }
1217
+ }
1218
+ // Attestation was added successfully - accept it so other nodes can also detect the equivocation
1161
1219
  return {
1162
1220
  result: TopicValidatorResult.Accept,
1163
1221
  obj: attestation
@@ -1187,8 +1245,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1187
1245
  };
1188
1246
  }
1189
1247
  // Try to add the proposal: this handles existence check, cap check, and adding in one call
1190
- const { added, alreadyExists, totalForPosition } = await this.mempools.attestationPool.tryAddBlockProposal(block);
1191
- const isEquivocated = totalForPosition !== undefined && totalForPosition > 1;
1248
+ const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddBlockProposal(block);
1249
+ const isEquivocated = count !== undefined && count > 1;
1192
1250
  // Duplicate proposal received, no need to re-broadcast
1193
1251
  if (alreadyExists) {
1194
1252
  this.logger.debug(`Ignoring duplicate block proposal received`, {
@@ -1211,7 +1269,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1211
1269
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1212
1270
  ...block.toBlockInfo(),
1213
1271
  indexWithinCheckpoint: block.indexWithinCheckpoint,
1214
- totalForPosition,
1272
+ count,
1215
1273
  proposer: block.getSender()?.toString(),
1216
1274
  source: peerId.toString()
1217
1275
  });
@@ -1232,7 +1290,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1232
1290
  proposer: proposer?.toString()
1233
1291
  });
1234
1292
  // Invoke the duplicate callback on the first duplicate spotted only
1235
- if (proposer && totalForPosition === 2) {
1293
+ if (proposer && count === 2) {
1236
1294
  this.duplicateProposalCallback?.({
1237
1295
  slot: block.slotNumber,
1238
1296
  proposer,
@@ -1262,13 +1320,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1262
1320
  source: sender.toString(),
1263
1321
  ...block.toBlockInfo()
1264
1322
  });
1265
- // Mark the txs in this proposal as non-evictable
1266
- await this.mempools.txPool.markTxsAsNonEvictable(block.txHashes);
1323
+ // Mark the txs in this proposal as protected
1324
+ await this.mempools.txPool.protectTxs(block.txHashes, block.blockHeader);
1267
1325
  // Call the block received callback to validate the proposal.
1268
1326
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1269
1327
  const isValid = await this.blockReceivedCallback(block, sender);
1270
1328
  if (!isValid) {
1271
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1329
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1272
1330
  }
1273
1331
  }
1274
1332
  /**
@@ -1330,8 +1388,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1330
1388
  // Try to add the checkpoint proposal core: this handles existence check, cap check, and adding in one call
1331
1389
  const checkpointCore = checkpoint.toCore();
1332
1390
  const tryAddResult = await this.mempools.attestationPool.tryAddCheckpointProposal(checkpointCore);
1333
- const { added, alreadyExists, totalForPosition } = tryAddResult;
1334
- const isEquivocated = totalForPosition !== undefined && totalForPosition > 1;
1391
+ const { added, alreadyExists, count } = tryAddResult;
1392
+ const isEquivocated = count !== undefined && count > 1;
1335
1393
  // Duplicate proposal received, do not re-broadcast
1336
1394
  if (alreadyExists) {
1337
1395
  this.logger.debug(`Ignoring duplicate checkpoint proposal received`, {
@@ -1353,7 +1411,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1353
1411
  this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1354
1412
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1355
1413
  ...checkpoint.toCheckpointInfo(),
1356
- totalForPosition,
1414
+ count,
1357
1415
  source: peerId.toString()
1358
1416
  });
1359
1417
  return {
@@ -1375,7 +1433,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1375
1433
  proposer: proposer?.toString()
1376
1434
  });
1377
1435
  // Invoke the duplicate callback on the first duplicate spotted only
1378
- if (proposer && totalForPosition === 2) {
1436
+ if (proposer && count === 2) {
1379
1437
  this.duplicateProposalCallback?.({
1380
1438
  slot: checkpoint.slotNumber,
1381
1439
  proposer,
@@ -1586,33 +1644,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1586
1644
  }
1587
1645
  }
1588
1646
  createRequestedTxValidator() {
1589
- return createTxReqRespValidator(this.proofVerifier, {
1647
+ return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
1590
1648
  l1ChainId: this.config.l1ChainId,
1591
1649
  rollupVersion: this.config.rollupVersion
1592
1650
  });
1593
1651
  }
1594
- async validatePropagatedTx(tx, peerId) {
1595
- const currentBlockNumber = await this.archiver.getBlockNumber();
1596
- // We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
1597
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1598
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1599
- for (const validator of messageValidators){
1600
- const outcome = await this.runValidations(tx, validator);
1601
- if (outcome.allPassed) {
1602
- continue;
1603
- }
1604
- const { name } = outcome.failure;
1605
- let { severity } = outcome.failure;
1606
- // Double spend validator has a special case handler
1607
- if (name === 'doubleSpendValidator') {
1608
- const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block
1609
- severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
1610
- }
1611
- this.peerManager.penalizePeer(peerId, severity);
1612
- return false;
1613
- }
1614
- return true;
1615
- }
1616
1652
  async getGasFees(blockNumber) {
1617
1653
  if (blockNumber === this.feesCache?.blockNumber) {
1618
1654
  return this.feesCache.gasFees;
@@ -1639,38 +1675,35 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1639
1675
  peerScoring: this.peerManager
1640
1676
  };
1641
1677
  }
1642
- async validate(txs) {
1643
- const currentBlockNumber = await this.archiver.getBlockNumber();
1644
- // We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
1645
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1646
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1647
- await Promise.all(txs.map(async (tx)=>{
1648
- for (const validator of messageValidators){
1649
- const outcome = await this.runValidations(tx, validator);
1650
- if (!outcome.allPassed) {
1651
- throw new Error('Invalid tx detected', {
1652
- cause: {
1653
- outcome
1654
- }
1655
- });
1656
- }
1657
- }
1678
+ async validateTxsReceivedInBlockProposal(txs) {
1679
+ const validator = createTxValidatorForBlockProposalReceivedTxs(this.proofVerifier, {
1680
+ l1ChainId: this.config.l1ChainId,
1681
+ rollupVersion: this.config.rollupVersion
1682
+ }, this.logger.getBindings());
1683
+ const results = await Promise.all(txs.map(async (tx)=>{
1684
+ const result = await validator.validateTx(tx);
1685
+ return result.result !== 'invalid';
1658
1686
  }));
1687
+ if (results.some((value)=>value === false)) {
1688
+ throw new Error('Invalid tx detected');
1689
+ }
1659
1690
  }
1660
- /**
1661
- * Create message validators for the given block number and timestamp.
1662
- *
1663
- * Each validator is a pair of a validator and a severity.
1664
- * If a validator fails, the peer is penalized with the severity of the validator.
1665
- *
1666
- * @param currentBlockNumber - The current synced block number.
1667
- * @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
1668
- * @returns The message validators.
1669
- */ async createMessageValidators(currentBlockNumber, nextSlotTimestamp) {
1691
+ /** Creates the first stage (fast) validators for gossiped transactions. */ async createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp) {
1670
1692
  const gasFees = await this.getGasFees(currentBlockNumber);
1671
- const allowedInSetup = this.config.txPublicSetupAllowList ?? await getDefaultAllowedSetupFunctions();
1672
- const blockNumberInWhichTheTxIsConsideredToBeIncluded = BlockNumber(currentBlockNumber + 1);
1673
- return createTxMessageValidators(nextSlotTimestamp, blockNumberInWhichTheTxIsConsideredToBeIncluded, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, this.proofVerifier, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings());
1693
+ const allowedInSetup = [
1694
+ ...await getDefaultAllowedSetupFunctions(),
1695
+ ...this.config.txPublicSetupAllowListExtend ?? []
1696
+ ];
1697
+ const blockNumber = BlockNumber(currentBlockNumber + 1);
1698
+ const l1Constants = await this.archiver.getL1Constants();
1699
+ return createFirstStageTxValidationsForGossipedTransactions(nextSlotTimestamp, blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings(), {
1700
+ rollupManaLimit: l1Constants.rollupManaLimit,
1701
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1702
+ maxBlockDAGas: this.config.validateMaxDABlockGas
1703
+ });
1704
+ }
1705
+ /** Creates the second stage (expensive proof verification) validators for gossiped transactions. */ createSecondStageMessageValidators() {
1706
+ return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
1674
1707
  }
1675
1708
  /**
1676
1709
  * Run validations on a tx.
@@ -1688,8 +1721,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1688
1721
  });
1689
1722
  // A promise that resolves when all validations have been run
1690
1723
  const allValidations = await Promise.all(validationPromises);
1691
- const failed = allValidations.find((x)=>!x.isValid);
1692
- if (failed) {
1724
+ const failures = allValidations.filter((x)=>!x.isValid);
1725
+ if (failures.length > 0) {
1726
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1727
+ const failed = maxBy(failures, (f)=>PeerErrorSeverityByHarshness.indexOf(f.severity));
1693
1728
  return {
1694
1729
  allPassed: false,
1695
1730
  failure: {
@@ -1,7 +1,8 @@
1
1
  import { type Logger } from '@aztec/foundation/log';
2
2
  import { DateProvider } from '@aztec/foundation/timer';
3
- import { Tx, TxHash } from '@aztec/stdlib/tx';
3
+ import { Tx } from '@aztec/stdlib/tx';
4
4
  import type { PeerId } from '@libp2p/interface';
5
+ import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
5
6
  import { type BlockTxsSource } from '.././protocols/index.js';
6
7
  import type { BatchTxRequesterLibP2PService, BatchTxRequesterOptions } from './interface.js';
7
8
  export declare class BatchTxRequester {
@@ -21,7 +22,7 @@ export declare class BatchTxRequester {
21
22
  private readonly smartParallelWorkerCount;
22
23
  private readonly dumbParallelWorkerCount;
23
24
  private readonly txBatchSize;
24
- constructor(missingTxs: TxHash[], blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number, p2pService: BatchTxRequesterLibP2PService, logger?: Logger, dateProvider?: DateProvider, opts?: BatchTxRequesterOptions);
25
+ constructor(missingTxsTracker: IMissingTxsTracker, blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number, p2pService: BatchTxRequesterLibP2PService, logger?: Logger, dateProvider?: DateProvider, opts?: BatchTxRequesterOptions);
25
26
  run(): AsyncGenerator<Tx, Tx | undefined, unknown>;
26
27
  static collectAllTxs(generator: AsyncGenerator<Tx, Tx | undefined, unknown>): Promise<Tx[]>;
27
28
  private pinnedPeerRequester;
@@ -44,4 +45,4 @@ export declare class BatchTxRequester {
44
45
  private unlockSmartRequesterSemaphores;
45
46
  private sleepClampedToDeadline;
46
47
  }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdHhfcmVxdWVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvYmF0Y2hfdHhfcmVxdWVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxFQUFFLEVBQVcsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJaEQsT0FBTyxFQUFxQyxLQUFLLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUWpHLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLHVCQUF1QixFQUF5QixNQUFNLGdCQUFnQixDQUFDO0FBc0JwSCxxQkFBYSxnQkFBZ0I7SUFDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFxQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBUztJQUNuQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBZ0M7SUFDM0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQVM7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQWU7SUFDNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQTBCO0lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFrQjtJQUN4QyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBd0I7SUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQVM7SUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBYTtJQUNyRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBc0I7SUFDOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQTJCO0lBQ3ZELE9BQU8sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQVM7SUFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBUztJQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBUztJQUVyQyxZQUNFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFDcEIsY0FBYyxFQUFFLGNBQWMsRUFDOUIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLFVBQVUsRUFBRSw2QkFBNkIsRUFDekMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNmLFlBQVksQ0FBQyxFQUFFLFlBQVksRUFDM0IsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLEVBbUMvQjtJQUthLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBNkMvRDtJQUtELE9BQW9CLGFBQWEsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQVN2RztZQVVhLG1CQUFtQjtZQWtEbkIsYUFBYTtZQXlEYixjQUFjO1lBZ0RkLGNBQWM7WUF3Q2QsZUFBZTtZQWtGZixjQUFjO0lBbUM1QixPQUFPLENBQUMsMEJBQTBCO1lBaUJwQiw2QkFBNkI7WUFZN0IsaUJBQWlCO0lBcUQvQixPQUFPLENBQUMsbUJBQW1CO0lBa0MzQixPQUFPLENBQUMsb0JBQW9CO0lBTTVCLE9BQU8sQ0FBQywwQkFBMEI7SUFLbEMsT0FBTyxDQUFDLGNBQWM7SUFNdEIsT0FBTyxDQUFDLGdDQUFnQztJQWdCeEMsT0FBTyxDQUFDLHFCQUFxQjtJQXVCN0IsT0FBTyxDQUFDLGFBQWE7SUFhckIsT0FBTyxDQUFDLFVBQVU7SUFhbEIsT0FBTyxDQUFDLDhCQUE4QjtZQVV4QixzQkFBc0I7Q0FPckMifQ==
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdHhfcmVxdWVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvYmF0Y2hfdHhfcmVxdWVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxFQUFFLEVBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVyRixPQUFPLEVBQXFDLEtBQUssY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRakcsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsdUJBQXVCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7QUFzQnBILHFCQUFhLGdCQUFnQjtJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBaUI7SUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQXFCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFTO0lBQ25DLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFnQztJQUMzRCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBUztJQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBZTtJQUM1QyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBMEI7SUFDL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQWtCO0lBQ3hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUF3QjtJQUNwRCxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBUztJQUNsQyxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFhO0lBQ3JELE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFzQjtJQUM5QyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBMkI7SUFDdkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBUztJQUNsRCxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFTO0lBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFTO0lBRXJDLFlBQ0UsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQ3JDLGNBQWMsRUFBRSxjQUFjLEVBQzlCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixTQUFTLEVBQUUsTUFBTSxFQUNqQixVQUFVLEVBQUUsNkJBQTZCLEVBQ3pDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFDZixZQUFZLENBQUMsRUFBRSxZQUFZLEVBQzNCLElBQUksQ0FBQyxFQUFFLHVCQUF1QixFQWtDL0I7SUFLYSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQTZDL0Q7SUFLRCxPQUFvQixhQUFhLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FTdkc7WUFVYSxtQkFBbUI7WUFrRG5CLGFBQWE7WUF5RGIsY0FBYztZQWdEZCxjQUFjO1lBd0NkLGVBQWU7WUFrRmYsY0FBYztJQW1DNUIsT0FBTyxDQUFDLDBCQUEwQjtZQWlCcEIsNkJBQTZCO1lBWTdCLGlCQUFpQjtJQXFEL0IsT0FBTyxDQUFDLG1CQUFtQjtJQWtDM0IsT0FBTyxDQUFDLG9CQUFvQjtJQU01QixPQUFPLENBQUMsMEJBQTBCO0lBS2xDLE9BQU8sQ0FBQyxjQUFjO0lBTXRCLE9BQU8sQ0FBQyxnQ0FBZ0M7SUFnQnhDLE9BQU8sQ0FBQyxxQkFBcUI7SUF1QjdCLE9BQU8sQ0FBQyxhQUFhO0lBYXJCLE9BQU8sQ0FBQyxVQUFVO0lBYWxCLE9BQU8sQ0FBQyw4QkFBOEI7WUFVeEIsc0JBQXNCO0NBT3JDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,EAAE,EAAW,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EAmC/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CA6C/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAyDb,cAAc;YAgDd,cAAc;YAwCd,eAAe;YAkFf,cAAc;IAmC5B,OAAO,CAAC,0BAA0B;YAiBpB,6BAA6B;YAY7B,iBAAiB;IAqD/B,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gCAAgC;IAgBxC,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,8BAA8B;YAUxB,sBAAsB;CAOrC"}
1
+ {"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,EAAE,EAAmB,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAErF,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,iBAAiB,EAAE,kBAAkB,EACrC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EAkC/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CA6C/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAyDb,cAAc;YAgDd,cAAc;YAwCd,eAAe;YAkFf,cAAc;IAmC5B,OAAO,CAAC,0BAA0B;YAiBpB,6BAA6B;YAY7B,iBAAiB;IAqD/B,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gCAAgC;IAgBxC,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,8BAA8B;YAUxB,sBAAsB;CAOrC"}
@@ -11,7 +11,7 @@ import { ReqRespSubProtocol } from '.././interface.js';
11
11
  import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
12
12
  import { ReqRespStatus } from '.././status.js';
13
13
  import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD, DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT, DEFAULT_BATCH_TX_REQUESTER_SMART_PARALLEL_WORKER_COUNT, DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
14
- import { MissingTxMetadata, MissingTxMetadataCollection } from './missing_txs.js';
14
+ import { MissingTxMetadataCollection } from './missing_txs.js';
15
15
  import { PeerCollection } from './peer_collection.js';
16
16
  import { BatchRequestTxValidator } from './tx_validator.js';
17
17
  /*
@@ -47,7 +47,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
47
47
  smartParallelWorkerCount;
48
48
  dumbParallelWorkerCount;
49
49
  txBatchSize;
50
- constructor(missingTxs, blockTxsSource, pinnedPeer, timeoutMs, p2pService, logger, dateProvider, opts){
50
+ constructor(missingTxsTracker, blockTxsSource, pinnedPeer, timeoutMs, p2pService, logger, dateProvider, opts){
51
51
  this.blockTxsSource = blockTxsSource;
52
52
  this.pinnedPeer = pinnedPeer;
53
53
  this.timeoutMs = timeoutMs;
@@ -68,11 +68,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
68
68
  const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
69
69
  this.peers = new PeerCollection(initialPeers, this.pinnedPeer, this.dateProvider, badPeerThreshold, this.p2pService.peerScoring);
70
70
  }
71
- const entries = missingTxs.map((h)=>[
72
- h.toString(),
73
- new MissingTxMetadata(h)
74
- ]);
75
- this.txsMetadata = new MissingTxMetadataCollection(entries, this.txBatchSize);
71
+ this.txsMetadata = new MissingTxMetadataCollection(missingTxsTracker, this.txBatchSize);
76
72
  this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
77
73
  }
78
74
  /*
@@ -528,7 +524,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
528
524
  }
529
525
  /*
530
526
  * @returns true if all missing txs have been fetched */ fetchedAllTxs() {
531
- return Array.from(this.txsMetadata.values()).every((tx)=>tx.fetched);
527
+ return this.txsMetadata.getMissingTxHashes().size == 0;
532
528
  }
533
529
  /*
534
530
  * Checks if the BatchTxRequester should stop fetching missing txs
@@ -543,7 +539,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
543
539
  if (aborted) {
544
540
  this.unlockSmartRequesterSemaphores();
545
541
  }
546
- return aborted || this.txsMetadata.size === 0 || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
542
+ return aborted || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
547
543
  }
548
544
  /*
549
545
  * Helper function which unlocks all smart requester semaphores