@aztec/p2p 0.0.1-commit.6d63667d → 0.0.1-commit.71324e566

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 (469) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +11 -11
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +54 -16
  5. package/dest/client/interface.d.ts +54 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +41 -52
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +179 -226
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +21 -11
  11. package/dest/config.d.ts +133 -92
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +108 -39
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +106 -88
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +448 -3
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -2
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  35. package/dest/mem_pools/index.d.ts +3 -3
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/index.js +1 -1
  38. package/dest/mem_pools/instrumentation.d.ts +4 -2
  39. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  40. package/dest/mem_pools/instrumentation.js +16 -14
  41. package/dest/mem_pools/interface.d.ts +5 -5
  42. package/dest/mem_pools/interface.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  59. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
  63. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  64. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  69. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  70. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  72. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  73. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +30 -12
  79. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +78 -15
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +144 -19
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +364 -189
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  94. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -3
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  99. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  100. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  101. package/dest/msg_validators/clock_tolerance.js +54 -3
  102. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  103. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  104. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  105. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  106. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  108. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  109. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  111. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  112. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  114. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  115. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  117. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  118. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  120. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  121. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  122. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  124. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  125. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  126. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  127. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  128. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  130. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  131. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  133. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  134. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/factory.js +247 -60
  136. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  137. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  138. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  139. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  140. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/gas_validator.js +112 -43
  142. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  143. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  144. package/dest/msg_validators/tx_validator/index.js +2 -0
  145. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  146. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  147. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  148. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  149. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  150. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  151. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  152. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  153. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  154. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  155. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  157. package/dest/services/data_store.d.ts +1 -1
  158. package/dest/services/data_store.d.ts.map +1 -1
  159. package/dest/services/data_store.js +5 -5
  160. package/dest/services/dummy_service.d.ts +17 -6
  161. package/dest/services/dummy_service.d.ts.map +1 -1
  162. package/dest/services/dummy_service.js +16 -5
  163. package/dest/services/encoding.d.ts +7 -3
  164. package/dest/services/encoding.d.ts.map +1 -1
  165. package/dest/services/encoding.js +18 -11
  166. package/dest/services/gossipsub/index.d.ts +3 -0
  167. package/dest/services/gossipsub/index.d.ts.map +1 -0
  168. package/dest/services/gossipsub/index.js +2 -0
  169. package/dest/services/gossipsub/scoring.d.ts +21 -3
  170. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  171. package/dest/services/gossipsub/scoring.js +24 -7
  172. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  173. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  174. package/dest/services/gossipsub/topic_score_params.js +363 -0
  175. package/dest/services/libp2p/libp2p_service.d.ts +93 -51
  176. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  177. package/dest/services/libp2p/libp2p_service.js +547 -421
  178. package/dest/services/peer-manager/metrics.d.ts +3 -1
  179. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  180. package/dest/services/peer-manager/metrics.js +6 -0
  181. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  182. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  183. package/dest/services/peer-manager/peer_manager.js +39 -11
  184. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  185. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  186. package/dest/services/peer-manager/peer_scoring.js +57 -12
  187. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  188. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  189. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  190. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  191. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  192. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  193. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  194. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  195. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  196. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  197. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  198. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  199. package/dest/services/reqresp/config.d.ts +3 -3
  200. package/dest/services/reqresp/config.d.ts.map +1 -1
  201. package/dest/services/reqresp/interface.d.ts +23 -9
  202. package/dest/services/reqresp/interface.d.ts.map +1 -1
  203. package/dest/services/reqresp/interface.js +23 -10
  204. package/dest/services/reqresp/metrics.d.ts +1 -1
  205. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  206. package/dest/services/reqresp/metrics.js +0 -1
  207. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +4 -3
  208. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  209. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  210. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  211. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  212. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  213. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/index.js +0 -1
  215. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  216. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  217. package/dest/services/reqresp/protocols/tx.js +21 -3
  218. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  219. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  220. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  221. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  222. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  223. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  224. package/dest/services/reqresp/reqresp.d.ts +4 -2
  225. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  226. package/dest/services/reqresp/reqresp.js +40 -15
  227. package/dest/services/service.d.ts +43 -4
  228. package/dest/services/service.d.ts.map +1 -1
  229. package/dest/services/tx_collection/config.d.ts +19 -1
  230. package/dest/services/tx_collection/config.d.ts.map +1 -1
  231. package/dest/services/tx_collection/config.js +46 -0
  232. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -4
  233. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  234. package/dest/services/tx_collection/fast_tx_collection.js +80 -76
  235. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  236. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  237. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  238. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  239. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  240. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  241. package/dest/services/tx_collection/index.d.ts +2 -1
  242. package/dest/services/tx_collection/index.d.ts.map +1 -1
  243. package/dest/services/tx_collection/index.js +1 -0
  244. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  245. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  246. package/dest/services/tx_collection/instrumentation.js +2 -1
  247. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  248. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  249. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  250. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  251. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  252. package/dest/services/tx_collection/request_tracker.js +84 -0
  253. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  254. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  255. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  256. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  257. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  258. package/dest/services/tx_collection/tx_collection.js +75 -3
  259. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  260. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  261. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  262. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  263. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  264. package/dest/services/tx_collection/tx_source.js +26 -7
  265. package/dest/services/tx_file_store/config.d.ts +1 -3
  266. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  267. package/dest/services/tx_file_store/config.js +0 -4
  268. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  269. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  270. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  271. package/dest/services/tx_provider.d.ts +4 -4
  272. package/dest/services/tx_provider.d.ts.map +1 -1
  273. package/dest/services/tx_provider.js +9 -8
  274. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  275. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  276. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  277. package/dest/test-helpers/mock-pubsub.d.ts +40 -6
  278. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  279. package/dest/test-helpers/mock-pubsub.js +139 -13
  280. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  281. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  282. package/dest/test-helpers/reqresp-nodes.js +5 -5
  283. package/dest/test-helpers/testbench-utils.d.ts +43 -38
  284. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  285. package/dest/test-helpers/testbench-utils.js +150 -61
  286. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  287. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  288. package/dest/testbench/p2p_client_testbench_worker.js +80 -28
  289. package/dest/testbench/worker_client_manager.d.ts +10 -1
  290. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  291. package/dest/testbench/worker_client_manager.js +55 -3
  292. package/dest/util.d.ts +3 -3
  293. package/dest/util.d.ts.map +1 -1
  294. package/package.json +14 -14
  295. package/src/client/factory.ts +105 -29
  296. package/src/client/interface.ts +65 -35
  297. package/src/client/p2p_client.ts +216 -272
  298. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +34 -15
  299. package/src/config.ts +171 -45
  300. package/src/errors/p2p-service.error.ts +11 -0
  301. package/src/errors/tx-pool.error.ts +12 -0
  302. package/src/index.ts +1 -1
  303. package/src/mem_pools/attestation_pool/attestation_pool.ts +501 -91
  304. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  305. package/src/mem_pools/attestation_pool/index.ts +9 -2
  306. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  307. package/src/mem_pools/index.ts +2 -2
  308. package/src/mem_pools/instrumentation.ts +17 -13
  309. package/src/mem_pools/interface.ts +4 -4
  310. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  311. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  312. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  313. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  314. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  315. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  316. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  317. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  318. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  319. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  320. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  321. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  322. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  323. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  324. package/src/mem_pools/tx_pool_v2/interfaces.ts +32 -12
  325. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +209 -27
  326. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  327. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  328. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +410 -187
  329. package/src/msg_validators/attestation_validator/README.md +49 -0
  330. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  331. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +6 -3
  332. package/src/msg_validators/clock_tolerance.ts +72 -3
  333. package/src/msg_validators/proposal_validator/README.md +123 -0
  334. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  335. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  336. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  337. package/src/msg_validators/tx_validator/README.md +119 -0
  338. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  339. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  340. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  341. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  342. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  343. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  344. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  345. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  346. package/src/msg_validators/tx_validator/factory.ts +394 -78
  347. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  348. package/src/msg_validators/tx_validator/gas_validator.ts +145 -33
  349. package/src/msg_validators/tx_validator/index.ts +2 -0
  350. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  351. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  352. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  353. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  354. package/src/services/data_store.ts +5 -13
  355. package/src/services/dummy_service.ts +25 -7
  356. package/src/services/encoding.ts +18 -10
  357. package/src/services/gossipsub/README.md +641 -0
  358. package/src/services/gossipsub/index.ts +2 -0
  359. package/src/services/gossipsub/scoring.ts +29 -5
  360. package/src/services/gossipsub/topic_score_params.ts +519 -0
  361. package/src/services/libp2p/libp2p_service.ts +566 -460
  362. package/src/services/peer-manager/metrics.ts +7 -0
  363. package/src/services/peer-manager/peer_manager.ts +45 -11
  364. package/src/services/peer-manager/peer_scoring.ts +52 -5
  365. package/src/services/reqresp/README.md +229 -0
  366. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  367. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  368. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  369. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  370. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  371. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  372. package/src/services/reqresp/config.ts +2 -2
  373. package/src/services/reqresp/interface.ts +45 -10
  374. package/src/services/reqresp/metrics.ts +0 -1
  375. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -3
  376. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  377. package/src/services/reqresp/protocols/index.ts +0 -1
  378. package/src/services/reqresp/protocols/tx.ts +23 -3
  379. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  380. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  381. package/src/services/reqresp/reqresp.ts +53 -16
  382. package/src/services/service.ts +57 -3
  383. package/src/services/tx_collection/config.ts +68 -0
  384. package/src/services/tx_collection/fast_tx_collection.ts +83 -76
  385. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  386. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  387. package/src/services/tx_collection/index.ts +1 -0
  388. package/src/services/tx_collection/instrumentation.ts +7 -1
  389. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  390. package/src/services/tx_collection/request_tracker.ts +127 -0
  391. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  392. package/src/services/tx_collection/tx_collection.ts +114 -19
  393. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  394. package/src/services/tx_collection/tx_source.ts +28 -8
  395. package/src/services/tx_file_store/config.ts +0 -6
  396. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  397. package/src/services/tx_provider.ts +10 -9
  398. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  399. package/src/test-helpers/mock-pubsub.ts +177 -14
  400. package/src/test-helpers/reqresp-nodes.ts +7 -9
  401. package/src/test-helpers/testbench-utils.ts +157 -74
  402. package/src/testbench/p2p_client_testbench_worker.ts +91 -31
  403. package/src/testbench/worker_client_manager.ts +68 -6
  404. package/src/util.ts +8 -2
  405. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  406. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  407. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  408. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  409. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  410. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  411. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  412. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  413. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  414. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  415. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  416. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  417. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  418. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  419. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  420. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  421. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  422. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  423. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  424. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  425. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  426. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  427. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  428. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  429. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  430. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  431. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  432. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  433. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  434. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  435. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  436. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  437. package/dest/mem_pools/tx_pool/index.js +0 -2
  438. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  439. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  440. package/dest/mem_pools/tx_pool/priority.js +0 -15
  441. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  442. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  443. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  444. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  445. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  446. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  447. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  448. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  449. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  450. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  451. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  452. package/dest/services/reqresp/protocols/block.js +0 -32
  453. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  454. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  455. package/src/mem_pools/tx_pool/README.md +0 -270
  456. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  457. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  458. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  459. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  460. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  461. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  462. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  463. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  464. package/src/mem_pools/tx_pool/index.ts +0 -2
  465. package/src/mem_pools/tx_pool/priority.ts +0 -20
  466. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  467. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  468. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  469. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -0,0 +1,363 @@
1
+ import { TopicType, createTopicString } from '@aztec/stdlib/p2p';
2
+ import { createCheckpointTimingModel } from '@aztec/stdlib/timetable';
3
+ import { createTopicScoreParams } from '@chainsafe/libp2p-gossipsub/score';
4
+ /**
5
+ * Calculates the number of blocks per slot based on timing parameters.
6
+ * Uses the shared calculation from @aztec/stdlib/timetable.
7
+ *
8
+ * @param slotDurationMs - L2 slot duration in milliseconds
9
+ * @param blockDurationMs - Duration per block in milliseconds (undefined = single block mode)
10
+ * @param opts - Shared checkpoint timing inputs used by the sequencer and validators
11
+ * @returns Number of blocks per slot
12
+ */ export function calculateBlocksPerSlot(slotDurationMs, blockDurationMs, opts) {
13
+ if (!opts) {
14
+ return createCheckpointTimingModel({
15
+ aztecSlotDuration: slotDurationMs / 1000,
16
+ blockDuration: blockDurationMs ? blockDurationMs / 1000 : undefined
17
+ }).calculateMaxBlocksPerSlot();
18
+ }
19
+ return createCheckpointTimingModel({
20
+ aztecSlotDuration: slotDurationMs / 1000,
21
+ ethereumSlotDuration: opts.ethereumSlotDuration,
22
+ blockDuration: blockDurationMs ? blockDurationMs / 1000 : undefined,
23
+ l1PublishingTime: opts.l1PublishingTime ?? opts.ethereumSlotDuration,
24
+ p2pPropagationTime: opts.p2pPropagationTime
25
+ }).calculateMaxBlocksPerSlot();
26
+ }
27
+ /**
28
+ * Determines the decay window in slots based on expected message frequency.
29
+ * Low-frequency topics need longer decay windows to accumulate meaningful counter values.
30
+ *
31
+ * @param expectedMessagesPerSlot - Expected messages per slot for this topic
32
+ * @returns Number of slots over which the counter should decay to ~1%
33
+ */ export function getDecayWindowSlots(expectedMessagesPerSlot) {
34
+ if (expectedMessagesPerSlot <= 1) {
35
+ return 5; // Low frequency: decay over 5 slots
36
+ } else if (expectedMessagesPerSlot <= 10) {
37
+ return 3; // Medium frequency: decay over 3 slots
38
+ } else {
39
+ return 2; // High frequency: decay over 2 slots
40
+ }
41
+ }
42
+ /**
43
+ * Computes the decay factor for exponential decay over a given window.
44
+ * After `heartbeatsInWindow` heartbeats, the counter decays to ~1% of its original value.
45
+ *
46
+ * @param heartbeatIntervalMs - Gossipsub heartbeat interval in milliseconds
47
+ * @param slotDurationMs - L2 slot duration in milliseconds
48
+ * @param decayWindowSlots - Number of slots over which to decay
49
+ * @returns Decay factor (0 < decay < 1), applied each heartbeat
50
+ */ export function computeDecay(heartbeatIntervalMs, slotDurationMs, decayWindowSlots) {
51
+ const heartbeatsPerSlot = slotDurationMs / heartbeatIntervalMs;
52
+ const heartbeatsInWindow = heartbeatsPerSlot * decayWindowSlots;
53
+ // Decay to 1% over the window: decay^heartbeatsInWindow = 0.01
54
+ // decay = 0.01^(1/heartbeatsInWindow)
55
+ return Math.pow(0.01, 1 / heartbeatsInWindow);
56
+ }
57
+ /**
58
+ * Computes the steady-state convergence value for a decaying counter.
59
+ * If messages arrive at a constant rate and decay is applied each heartbeat,
60
+ * the counter converges to: rate / (1 - decay)
61
+ *
62
+ * @param messagesPerHeartbeat - Expected messages per heartbeat
63
+ * @param decay - Decay factor applied each heartbeat
64
+ * @returns Convergence value (steady-state counter value)
65
+ */ export function computeConvergence(messagesPerHeartbeat, decay) {
66
+ return messagesPerHeartbeat / (1 - decay);
67
+ }
68
+ /**
69
+ * Computes a conservative threshold for mesh message deliveries.
70
+ * The threshold should be low enough to avoid penalizing honest peers with normal variance.
71
+ *
72
+ * @param convergence - Steady-state counter value
73
+ * @param conservativeFactor - Fraction of convergence to use as threshold (e.g., 0.3)
74
+ * @returns Threshold value
75
+ */ export function computeThreshold(convergence, conservativeFactor) {
76
+ return convergence * conservativeFactor;
77
+ }
78
+ /**
79
+ * Determines the effective expected block proposals per slot for scoring.
80
+ * Returns undefined if scoring should be disabled, or a positive number if enabled.
81
+ *
82
+ * @param blocksPerSlot - Number of blocks per slot from timetable
83
+ * @param expectedBlockProposalsPerSlot - Config override. 0 disables scoring, undefined falls back to blocksPerSlot - 1.
84
+ * @returns Positive number of expected block proposals, or undefined if scoring is disabled
85
+ */ export function getEffectiveBlockProposalsPerSlot(blocksPerSlot, expectedBlockProposalsPerSlot) {
86
+ if (expectedBlockProposalsPerSlot !== undefined) {
87
+ return expectedBlockProposalsPerSlot > 0 ? expectedBlockProposalsPerSlot : undefined;
88
+ }
89
+ // Fallback: In MBPS mode, N-1 block proposals per slot (last one bundled with checkpoint)
90
+ // In single block mode (blocksPerSlot=1), this is 0 → disabled
91
+ const fallback = Math.max(0, blocksPerSlot - 1);
92
+ return fallback > 0 ? fallback : undefined;
93
+ }
94
+ /**
95
+ * Gets the expected messages per slot for a given topic type.
96
+ *
97
+ * @param topicType - The topic type
98
+ * @param targetCommitteeSize - Target committee size
99
+ * @param blocksPerSlot - Number of blocks per slot
100
+ * @param expectedBlockProposalsPerSlot - Override for block proposals. 0 disables scoring, undefined falls back to blocksPerSlot - 1.
101
+ * @returns Expected messages per slot, or undefined if unpredictable
102
+ */ export function getExpectedMessagesPerSlot(topicType, targetCommitteeSize, blocksPerSlot, expectedBlockProposalsPerSlot) {
103
+ switch(topicType){
104
+ case TopicType.tx:
105
+ // Transactions are unpredictable - disable mesh message delivery scoring
106
+ return undefined;
107
+ case TopicType.block_proposal:
108
+ return getEffectiveBlockProposalsPerSlot(blocksPerSlot, expectedBlockProposalsPerSlot);
109
+ case TopicType.checkpoint_proposal:
110
+ // Exactly 1 checkpoint proposal per slot
111
+ return 1;
112
+ case TopicType.checkpoint_attestation:
113
+ // Each committee member sends one attestation per slot
114
+ return targetCommitteeSize;
115
+ default:
116
+ return undefined;
117
+ }
118
+ }
119
+ /** Conservative factor for threshold calculation (30% of convergence) */ const CONSERVATIVE_FACTOR = 0.3;
120
+ /** Number of slots over which invalid message penalty decays */ const INVALID_DECAY_WINDOW_SLOTS = 4;
121
+ /** Weight for invalid message deliveries penalty */ const INVALID_MESSAGE_WEIGHT = -20;
122
+ /** Mesh message deliveries window in milliseconds (5 seconds - balanced for TypeScript runtime) */ const MESH_DELIVERIES_WINDOW_MS = 5000;
123
+ /**
124
+ * Multiplier for activation time to provide extra grace period during network bootstrap.
125
+ * The activation timer starts from mesh join time, not from first message received.
126
+ * During bootstrap, peers may join before messages start flowing, so we need extra time.
127
+ */ const ACTIVATION_MULTIPLIER = 5;
128
+ // ============================================================================
129
+ // P1 (timeInMesh) Configuration
130
+ // ============================================================================
131
+ // P1 rewards peers for time spent in the mesh. Following Lodestar's approach,
132
+ // we normalize the score so that max P1 = MAX_P1_SCORE after P1_CAP_TIME_SECONDS.
133
+ //
134
+ // Formula: P1 = min(timeInMesh / quantum, cap) * weight
135
+ // - quantum = slotDurationMs (one increment per slot worth of time)
136
+ // - cap = P1_CAP_TIME_SECONDS / slotSeconds (number of slots to reach cap)
137
+ // - weight = MAX_P1_SCORE / cap
138
+ //
139
+ // This ensures: max P1 = cap * weight = MAX_P1_SCORE
140
+ /** Maximum P1 score contribution per topic */ export const MAX_P1_SCORE = 8;
141
+ /** Time in seconds to reach P1 cap (1 hour) */ const P1_CAP_TIME_SECONDS = 3600;
142
+ // ============================================================================
143
+ // P2 (firstMessageDeliveries) Configuration
144
+ // ============================================================================
145
+ // P2 rewards peers who deliver messages first. We normalize so max P2 = MAX_P2_SCORE.
146
+ // P2 uses a decaying counter, so we set the cap based on convergence and scale the weight.
147
+ //
148
+ // Formula: P2 = min(firstMessageDeliveries, cap) * weight
149
+ // - cap = convergence value for first deliveries
150
+ // - weight = MAX_P2_SCORE / cap
151
+ /** Maximum P2 score contribution per topic */ export const MAX_P2_SCORE = 25;
152
+ /** Decay window for first message deliveries in slots (fast decay) */ const P2_DECAY_WINDOW_SLOTS = 2;
153
+ // ============================================================================
154
+ // P3 (meshMessageDeliveries) Configuration
155
+ // ============================================================================
156
+ // P3 penalizes peers who under-deliver messages. For a peer to be pruned from
157
+ // the mesh, their topic score must be negative: P1 + P2 + P3 < 0
158
+ //
159
+ // Therefore, P3 max penalty must exceed (P1 + P2) to cause pruning:
160
+ // |P3| > P1 + P2
161
+ // |P3| > 8 + 25 = 33
162
+ //
163
+ // We set P3 max = -34 per topic (slightly more than P1+P2) to ensure pruning.
164
+ // The number of P3-enabled topics depends on config: by default 2 (checkpoint_proposal +
165
+ // checkpoint_attestation), or 3 if block proposal scoring is enabled via
166
+ // expectedBlockProposalsPerSlot. Total P3b after pruning = -68 (2 topics) or -102 (3 topics).
167
+ //
168
+ // With appSpecificWeight=10, ~20 HighTolerance errors (-40 app score) plus max P3b (-68 or -102)
169
+ // would not cross gossipThreshold (-500). This keeps non-contributors from being disconnected
170
+ // unless they also accrue app-level penalties.
171
+ //
172
+ // The weight formula ensures max penalty equals MAX_P3_PENALTY_PER_TOPIC:
173
+ // weight = MAX_P3_PENALTY_PER_TOPIC / threshold²
174
+ // When deficit = threshold: penalty = threshold² * weight = MAX_P3_PENALTY_PER_TOPIC
175
+ /** Maximum P3 penalty per topic (must exceed P1 + P2 to cause pruning) */ export const MAX_P3_PENALTY_PER_TOPIC = -(MAX_P1_SCORE + MAX_P2_SCORE + 1); // -34
176
+ /**
177
+ * Factory class for creating gossipsub topic scoring parameters.
178
+ * Computes shared values once and reuses them across all topics.
179
+ */ export class TopicScoreParamsFactory {
180
+ params;
181
+ /** Number of blocks per slot based on timetable configuration */ blocksPerSlot;
182
+ /** Decay factor for invalid message penalties (P4) */ invalidDecay;
183
+ /** Number of heartbeats per slot */ heartbeatsPerSlot;
184
+ /** P1: Time in mesh quantum (slot duration in ms - score increases by ~1 per slot) */ timeInMeshQuantum;
185
+ /** P1: Time in mesh cap (number of slots to reach max score) */ timeInMeshCap;
186
+ /** P1: Time in mesh weight (normalized so max P1 = MAX_P1_SCORE) */ timeInMeshWeight;
187
+ /** P2: First message deliveries decay factor */ firstMessageDeliveriesDecay;
188
+ /** P2: First message deliveries cap (convergence-based) */ firstMessageDeliveriesCap;
189
+ /** P2: First message deliveries weight (normalized so max P2 = MAX_P2_SCORE) */ firstMessageDeliveriesWeight;
190
+ /** Base parameters common to all topics */ baseParams;
191
+ constructor(params){
192
+ this.params = params;
193
+ const { slotDurationMs, heartbeatIntervalMs, blockDurationMs } = params;
194
+ // Compute values that are the same for all topics
195
+ this.blocksPerSlot = calculateBlocksPerSlot(slotDurationMs, blockDurationMs, {
196
+ ethereumSlotDuration: params.ethereumSlotDuration,
197
+ l1PublishingTime: params.l1PublishingTime,
198
+ p2pPropagationTime: params.p2pPropagationTime
199
+ });
200
+ this.heartbeatsPerSlot = slotDurationMs / heartbeatIntervalMs;
201
+ this.invalidDecay = computeDecay(heartbeatIntervalMs, slotDurationMs, INVALID_DECAY_WINDOW_SLOTS);
202
+ // P1: timeInMesh - Lodestar style slot-based normalization
203
+ // quantum = slot duration, so score increases by ~1 per slot of mesh membership
204
+ // cap = number of slots in P1_CAP_TIME_SECONDS (1 hour)
205
+ // weight = MAX_P1_SCORE / cap, so max P1 = cap * weight = MAX_P1_SCORE
206
+ const slotDurationSeconds = slotDurationMs / 1000;
207
+ this.timeInMeshQuantum = slotDurationMs;
208
+ this.timeInMeshCap = P1_CAP_TIME_SECONDS / slotDurationSeconds;
209
+ this.timeInMeshWeight = MAX_P1_SCORE / this.timeInMeshCap;
210
+ // P2: firstMessageDeliveries - convergence-based cap with normalized weight
211
+ // Uses fast decay (2 slots) so it rewards recent first deliveries
212
+ // cap = convergence at 1 first delivery per heartbeat (theoretical max rate)
213
+ // weight = MAX_P2_SCORE / cap, so max P2 = cap * weight = MAX_P2_SCORE
214
+ this.firstMessageDeliveriesDecay = computeDecay(heartbeatIntervalMs, slotDurationMs, P2_DECAY_WINDOW_SLOTS);
215
+ // Convergence for 1 message per heartbeat (generous estimate for first deliveries)
216
+ this.firstMessageDeliveriesCap = computeConvergence(1, this.firstMessageDeliveriesDecay);
217
+ this.firstMessageDeliveriesWeight = MAX_P2_SCORE / this.firstMessageDeliveriesCap;
218
+ // Base params are identical for all topics
219
+ this.baseParams = {
220
+ topicWeight: 1,
221
+ invalidMessageDeliveriesWeight: INVALID_MESSAGE_WEIGHT,
222
+ invalidMessageDeliveriesDecay: this.invalidDecay,
223
+ // P1: timeInMesh (same for all topics)
224
+ timeInMeshQuantum: this.timeInMeshQuantum,
225
+ timeInMeshCap: this.timeInMeshCap,
226
+ timeInMeshWeight: this.timeInMeshWeight,
227
+ // P2: firstMessageDeliveries (same for all topics)
228
+ firstMessageDeliveriesDecay: this.firstMessageDeliveriesDecay,
229
+ firstMessageDeliveriesCap: this.firstMessageDeliveriesCap,
230
+ firstMessageDeliveriesWeight: this.firstMessageDeliveriesWeight
231
+ };
232
+ }
233
+ /**
234
+ * Creates scoring parameters for topics with unpredictable or zero message rates.
235
+ * Disables P1, P2, P3, and P3b to avoid unbalanced positive score accumulation.
236
+ *
237
+ * Rationale: If P1/P2 were enabled without P3, the topic would contribute free
238
+ * positive scores that could offset penalties from other topics, preventing
239
+ * proper mesh pruning of non-contributing peers.
240
+ */ createDisabledP3Params() {
241
+ return createTopicScoreParams({
242
+ topicWeight: 1,
243
+ // P1: timeInMesh - disabled (no free positive scores)
244
+ timeInMeshQuantum: 1,
245
+ timeInMeshCap: 0,
246
+ timeInMeshWeight: 0,
247
+ // P2: firstMessageDeliveries - disabled
248
+ firstMessageDeliveriesDecay: 0.5,
249
+ firstMessageDeliveriesCap: 0,
250
+ firstMessageDeliveriesWeight: 0,
251
+ // P3: meshMessageDeliveries - disabled
252
+ meshMessageDeliveriesWeight: 0,
253
+ meshMessageDeliveriesDecay: 0.5,
254
+ meshMessageDeliveriesThreshold: 0,
255
+ meshMessageDeliveriesWindow: 0,
256
+ meshMessageDeliveriesActivation: 0,
257
+ meshMessageDeliveriesCap: 0,
258
+ // P3b: meshFailurePenalty - disabled
259
+ meshFailurePenaltyWeight: 0,
260
+ meshFailurePenaltyDecay: 0.5,
261
+ // P4: invalidMessageDeliveries - still enabled for attack detection
262
+ invalidMessageDeliveriesWeight: INVALID_MESSAGE_WEIGHT,
263
+ invalidMessageDeliveriesDecay: this.invalidDecay
264
+ });
265
+ }
266
+ /**
267
+ * Creates scoring parameters for topics with predictable message rates.
268
+ * Enables P1, P2, P3, and P3b for balanced scoring.
269
+ *
270
+ * The scoring is designed so that:
271
+ * - P1 + P2 max = 8 + 25 = 33 (positive rewards for good behavior)
272
+ * - P3 max = -34 (penalty exceeds P1+P2 to ensure pruning of non-contributors)
273
+ * - After pruning: P1 resets, P2 decays, P3b persists with slow decay
274
+ *
275
+ * @param expectedPerSlot - Expected messages per slot
276
+ */ createEnabledP3Params(expectedPerSlot) {
277
+ const { slotDurationMs, heartbeatIntervalMs } = this.params;
278
+ // Calculate decay based on message frequency
279
+ const decayWindowSlots = getDecayWindowSlots(expectedPerSlot);
280
+ const decay = computeDecay(heartbeatIntervalMs, slotDurationMs, decayWindowSlots);
281
+ // Calculate convergence and threshold
282
+ const messagesPerHeartbeat = expectedPerSlot / this.heartbeatsPerSlot;
283
+ const convergence = computeConvergence(messagesPerHeartbeat, decay);
284
+ const threshold = computeThreshold(convergence, CONSERVATIVE_FACTOR);
285
+ // Cap factor: higher for high-volume topics
286
+ const capFactor = expectedPerSlot > 10 ? 8 : 4;
287
+ // P3 Weight: scaled so max penalty = MAX_P3_PENALTY_PER_TOPIC (-34)
288
+ // When deficit = threshold (peer delivers nothing):
289
+ // penalty = deficit² × weight = threshold² × (MAX_P3_PENALTY_PER_TOPIC / threshold²) = MAX_P3_PENALTY_PER_TOPIC
290
+ const meshDeliveriesWeight = threshold > 0 ? MAX_P3_PENALTY_PER_TOPIC / (threshold * threshold) : 0;
291
+ // Activation time: use the decay window multiplied by ACTIVATION_MULTIPLIER for extra grace
292
+ // during network bootstrap. The timer starts from mesh join time, not from first message,
293
+ // so peers joining before messages flow need extra time to accumulate counter values.
294
+ const activationMs = slotDurationMs * decayWindowSlots * ACTIVATION_MULTIPLIER;
295
+ return createTopicScoreParams({
296
+ ...this.baseParams,
297
+ // P3: meshMessageDeliveries
298
+ meshMessageDeliveriesWeight: meshDeliveriesWeight,
299
+ meshMessageDeliveriesDecay: decay,
300
+ meshMessageDeliveriesThreshold: threshold,
301
+ meshMessageDeliveriesWindow: MESH_DELIVERIES_WINDOW_MS,
302
+ meshMessageDeliveriesActivation: activationMs,
303
+ meshMessageDeliveriesCap: Math.max(threshold * capFactor, 2),
304
+ // P3b: meshFailurePenalty (same weight and decay as P3)
305
+ meshFailurePenaltyWeight: meshDeliveriesWeight,
306
+ meshFailurePenaltyDecay: decay
307
+ });
308
+ }
309
+ /** Number of topics with P3 enabled, computed from config. Always 2 (checkpoint_proposal + checkpoint_attestation) plus optionally block_proposal. */ get numP3EnabledTopics() {
310
+ const blockProposalP3Enabled = getEffectiveBlockProposalsPerSlot(this.blocksPerSlot, this.params.expectedBlockProposalsPerSlot) !== undefined;
311
+ return blockProposalP3Enabled ? 3 : 2;
312
+ }
313
+ /** Total maximum P3b penalty across all topics after pruning, computed from config */ get totalMaxP3bPenalty() {
314
+ return MAX_P3_PENALTY_PER_TOPIC * this.numP3EnabledTopics;
315
+ }
316
+ /**
317
+ * Creates topic score parameters for a specific topic type.
318
+ *
319
+ * @param topicType - The topic type
320
+ * @returns TopicScoreParams for the topic
321
+ */ createForTopic(topicType) {
322
+ const expectedPerSlot = getExpectedMessagesPerSlot(topicType, this.params.targetCommitteeSize, this.blocksPerSlot, this.params.expectedBlockProposalsPerSlot);
323
+ // For unpredictable topics (tx) or topics with 0 expected messages, disable P3/P3b
324
+ if (expectedPerSlot === undefined || expectedPerSlot === 0) {
325
+ return this.createDisabledP3Params();
326
+ }
327
+ return this.createEnabledP3Params(expectedPerSlot);
328
+ }
329
+ /**
330
+ * Creates all topic score parameters for gossipsub configuration.
331
+ *
332
+ * @param protocolVersion - Protocol version string for topic naming
333
+ * @returns Record mapping topic strings to their score parameters
334
+ */ createAll(protocolVersion) {
335
+ const topics = {};
336
+ for (const topicType of Object.values(TopicType)){
337
+ const topicString = createTopicString(topicType, protocolVersion);
338
+ topics[topicString] = this.createForTopic(topicType);
339
+ }
340
+ return topics;
341
+ }
342
+ }
343
+ /**
344
+ * Creates topic score parameters for a specific topic type.
345
+ * Convenience function that creates a factory internally.
346
+ *
347
+ * @param topicType - The topic type
348
+ * @param params - Network parameters for scoring calculation
349
+ * @returns TopicScoreParams for the topic
350
+ */ export function createTopicScoreParamsForTopic(topicType, params) {
351
+ const factory = new TopicScoreParamsFactory(params);
352
+ return factory.createForTopic(topicType);
353
+ }
354
+ /**
355
+ * Creates all topic score parameters for gossipsub configuration.
356
+ *
357
+ * @param protocolVersion - Protocol version string for topic naming
358
+ * @param params - Network parameters for scoring calculation
359
+ * @returns Record mapping topic strings to their score parameters
360
+ */ export function createAllTopicScoreParams(protocolVersion, params) {
361
+ const factory = new TopicScoreParamsFactory(params);
362
+ return factory.createAll(protocolVersion);
363
+ }
@@ -1,42 +1,46 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
2
3
  import { type Logger } from '@aztec/foundation/log';
3
4
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
4
5
  import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
5
6
  import type { ContractDataSource } from '@aztec/stdlib/contract';
6
7
  import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
7
- import { BlockProposal, CheckpointAttestation, CheckpointProposal, type Gossipable, P2PClientType, type ValidationResult as P2PValidationResult, TopicType } from '@aztec/stdlib/p2p';
8
- import { Tx } from '@aztec/stdlib/tx';
8
+ import { BlockProposal, CheckpointAttestation, CheckpointProposal, type CheckpointProposalCore, type Gossipable, PeerErrorSeverity, TopicType } from '@aztec/stdlib/p2p';
9
+ import { Tx, type TxValidator } from '@aztec/stdlib/tx';
10
+ import type { UInt64 } from '@aztec/stdlib/types';
9
11
  import { type TelemetryClient, WithTracer } from '@aztec/telemetry-client';
10
12
  import { type Message, type PeerId, TopicValidatorResult } from '@libp2p/interface';
11
13
  import { ENR } from '@nethermindeth/enr';
12
14
  import type { P2PConfig } from '../../config.js';
13
- import type { MemPools } from '../../mem_pools/index.js';
15
+ import type { MemPools } from '../../mem_pools/interface.js';
16
+ import { type TransactionValidator } from '../../msg_validators/tx_validator/factory.js';
14
17
  import { type PubSubLibp2p } from '../../util.js';
15
18
  import type { PeerManagerInterface } from '../peer-manager/interface.js';
16
19
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
17
20
  import type { P2PReqRespConfig } from '../reqresp/config.js';
18
- import { type ReqRespInterface, type ReqRespResponse, ReqRespSubProtocol, type ReqRespSubProtocolHandler, type ReqRespSubProtocolValidators, type SubProtocolMap } from '../reqresp/index.js';
19
- import { AuthRequest, StatusMessage } from '../reqresp/index.js';
20
- import type { P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PService, PeerDiscoveryService } from '../service.js';
21
- type ReceivedMessageValidationResult<T> = {
21
+ import { AuthRequest, BlockTxsRequest, BlockTxsResponse, type ReqRespInterface, type ReqRespResponse, ReqRespSubProtocol, type ReqRespSubProtocolHandler, type ReqRespSubProtocolValidators, StatusMessage, type SubProtocolMap } from '../reqresp/index.js';
22
+ import type { P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PDuplicateAttestationCallback, P2PService, PeerDiscoveryService } from '../service.js';
23
+ type ReceivedMessageValidationResult<T, M = undefined> = {
22
24
  obj: T;
23
25
  result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>;
26
+ metadata?: M;
24
27
  } | {
25
- obj?: undefined;
28
+ obj?: T;
26
29
  result: TopicValidatorResult.Reject;
30
+ metadata?: M;
31
+ severity: PeerErrorSeverity;
27
32
  };
28
33
  /**
29
34
  * Lib P2P implementation of the P2PService interface.
30
35
  */
31
- export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends WithTracer implements P2PService {
32
- private clientType;
36
+ export declare class LibP2PService extends WithTracer implements P2PService {
33
37
  private config;
34
38
  protected node: PubSubLibp2p;
35
39
  private peerDiscoveryService;
36
40
  private reqresp;
37
- private peerManager;
41
+ protected peerManager: PeerManagerInterface;
38
42
  protected mempools: MemPools;
39
- private archiver;
43
+ protected archiver: L2BlockSource & ContractDataSource;
40
44
  private epochCache;
41
45
  private proofVerifier;
42
46
  private worldStateSynchronizer;
@@ -48,6 +52,10 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
48
52
  private protocolVersion;
49
53
  private topicStrings;
50
54
  private feesCache;
55
+ /** Callback invoked when a duplicate proposal is detected (triggers slashing). */
56
+ private duplicateProposalCallback?;
57
+ /** Callback invoked when a duplicate attestation is detected (triggers slashing). */
58
+ private duplicateAttestationCallback?;
51
59
  /**
52
60
  * Callback for when a block is received from a peer.
53
61
  * @param block - The block received from the peer.
@@ -59,12 +67,18 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
59
67
  * @param checkpoint - The checkpoint proposal received from the peer.
60
68
  * @returns The attestations for the checkpoint, if any.
61
69
  */
62
- private checkpointReceivedCallback;
70
+ private allNodesCheckpointReceivedCallback;
71
+ /**
72
+ * Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
73
+ * @param checkpoint - The checkpoint proposal received from the peer.
74
+ * @returns The attestations for the checkpoint, if any.
75
+ */
76
+ private validatorCheckpointReceivedCallback;
63
77
  private gossipSubEventHandler;
64
78
  private instrumentation;
65
79
  private telemetry;
66
80
  protected logger: Logger;
67
- constructor(clientType: T, config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, reqresp: ReqRespInterface, peerManager: PeerManagerInterface, mempools: MemPools, archiver: L2BlockSource & ContractDataSource, epochCache: EpochCacheInterface, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, telemetry: TelemetryClient, logger?: Logger);
81
+ constructor(config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, reqresp: ReqRespInterface, peerManager: PeerManagerInterface, mempools: MemPools, archiver: L2BlockSource & ContractDataSource, epochCache: EpochCacheInterface, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, telemetry: TelemetryClient, logger?: Logger);
68
82
  updateConfig(config: Partial<P2PReqRespConfig>): void;
69
83
  /**
70
84
  * Creates an instance of the LibP2P service.
@@ -72,7 +86,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
72
86
  * @param txPool - The transaction pool to be accessed by the service.
73
87
  * @returns The new service.
74
88
  */
75
- static new<T extends P2PClientType>(clientType: T, config: P2PConfig, peerId: PeerId, deps: {
89
+ static new(config: P2PConfig, peerId: PeerId, deps: {
76
90
  mempools: MemPools;
77
91
  l2BlockSource: L2BlockSource & ContractDataSource;
78
92
  epochCache: EpochCacheInterface;
@@ -82,7 +96,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
82
96
  telemetry: TelemetryClient;
83
97
  logger: Logger;
84
98
  packageVersion: string;
85
- }): Promise<LibP2PService<T>>;
99
+ }): Promise<LibP2PService>;
86
100
  /**
87
101
  * Starts the LibP2P service.
88
102
  * @returns An empty promise.
@@ -96,6 +110,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
96
110
  addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler, validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol]): Promise<void>;
97
111
  registerThisValidatorAddresses(address: EthAddress[]): void;
98
112
  getPeers(includePending?: boolean): PeerInfo[];
113
+ getGossipMeshPeerCount(topicType: TopicType): number;
99
114
  private handleGossipSubEvent;
100
115
  /**
101
116
  * Send a batch of requests to peers, and return the responses
@@ -111,7 +126,24 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
111
126
  */
112
127
  getEnr(): ENR | undefined;
113
128
  registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
114
- registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
129
+ registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
130
+ registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
131
+ notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void>;
132
+ /**
133
+ * Registers a callback to be invoked when a duplicate proposal is detected.
134
+ * This callback is triggered on the first duplicate (when count goes from 1 to 2).
135
+ */
136
+ registerDuplicateProposalCallback(callback: (info: {
137
+ slot: SlotNumber;
138
+ proposer: EthAddress;
139
+ type: 'checkpoint' | 'block';
140
+ }) => void): void;
141
+ /**
142
+ * Registers a callback to be invoked when a duplicate attestation is detected.
143
+ * A validator signing attestations for different proposals at the same slot.
144
+ * This callback is triggered on the first duplicate (when count goes from 1 to 2).
145
+ */
146
+ registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
115
147
  /**
116
148
  * Subscribes to a topic.
117
149
  * @param topic - The topic to subscribe to.
@@ -141,58 +173,68 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
141
173
  * @param data - The message data
142
174
  */
143
175
  protected handleNewGossipMessage(msg: Message, msgId: string, source: PeerId): Promise<void>;
144
- protected validateReceivedMessage<T>(validationFunc: () => Promise<ReceivedMessageValidationResult<T>>, msgId: string, source: PeerId, topicType: TopicType): Promise<ReceivedMessageValidationResult<T>>;
176
+ protected validateReceivedMessage<T, M = undefined>(validationFunc: () => Promise<ReceivedMessageValidationResult<T, M>>, msgId: string, source: PeerId, topicType: TopicType): Promise<ReceivedMessageValidationResult<T, M>>;
177
+ private tryDeserialize;
145
178
  protected handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId): Promise<void>;
146
179
  private processCheckpointAttestationFromPeer;
147
- private processBlockFromPeer;
148
- private processValidBlockProposal;
149
- private handleGossipedCheckpointProposal;
150
- private processValidCheckpointProposal;
180
+ /** Validates a checkpoint attestation and adds it to the pool. Penalizes the peer if validation fails. */
181
+ protected validateAndStoreCheckpointAttestation(peerId: PeerId, attestation: CheckpointAttestation): Promise<ReceivedMessageValidationResult<CheckpointAttestation>>;
182
+ protected processBlockFromPeer(payloadData: Buffer, msgId: string, source: PeerId): Promise<void>;
183
+ /** Validates a block proposal. Triggers a penalization to the peer that sent it if invalid. Adds to the mempool if valid. */
184
+ protected validateAndStoreBlockProposal(peerId: PeerId, block: BlockProposal): Promise<ReceivedMessageValidationResult<BlockProposal, {
185
+ isEquivocated: boolean;
186
+ }>>;
187
+ protected processValidBlockProposal(block: BlockProposal, sender: PeerId): Promise<void>;
188
+ /**
189
+ * Handle a gossiped checkpoint proposal.
190
+ * Validates and processes the checkpoint proposal, then triggers the callback for attestation.
191
+ */
192
+ protected handleGossipedCheckpointProposal(payloadData: Buffer, msgId: string, source: PeerId): Promise<void>;
193
+ /**
194
+ * Validates a checkpoint proposal. Penalizes peer if validation fails. Adds the checkpoint and
195
+ * its last block (if present) to the mempool if valid. Triggers equivocation detection on both.
196
+ */
197
+ protected validateAndStoreCheckpointProposal(peerId: PeerId, checkpoint: CheckpointProposal): Promise<ReceivedMessageValidationResult<CheckpointProposal, {
198
+ isEquivocated: boolean;
199
+ processBlock: boolean;
200
+ }>>;
201
+ /**
202
+ * Process a validated checkpoint proposal.
203
+ * Note: The proposal was already added to the pool by tryAddCheckpointProposal in handleGossipedCheckpointProposal.
204
+ */
205
+ protected processValidCheckpointProposal(checkpoint: CheckpointProposalCore, sender: PeerId): Promise<void>;
151
206
  /**
152
207
  * Propagates provided message to peers.
153
208
  * @param message - The message to propagate.
154
209
  */
155
210
  propagate<T extends Gossipable>(message: T): Promise<void>;
156
- private validateRequestedBlockTxs;
211
+ /**
212
+ * Validate the requested block transactions. Allow partial returns.
213
+ * @param request - The block transactions request.
214
+ * @param response - The block transactions response.
215
+ * @param peerId - The ID of the peer that made the request.
216
+ * @returns True if the requested block transactions are valid, false otherwise.
217
+ */
218
+ protected validateRequestedBlockTxs(request: BlockTxsRequest, response: BlockTxsResponse, peerId: PeerId): Promise<boolean>;
157
219
  private validateRequestedTxs;
158
- private validateRequestedBlock;
159
- private validateRequestedTx;
160
- private createRequestedTxValidator;
161
- private validatePropagatedTx;
220
+ protected validateRequestedTx(tx: Tx, peerId: PeerId, txValidator: TxValidator, requested?: Set<`0x${string}`>): Promise<void>;
221
+ protected createRequestedTxValidator(): TxValidator;
162
222
  private getGasFees;
163
223
  /**
164
224
  * Get the BatchTxRequesterLibP2PService dependencies for creating BatchTxRequester instances
165
225
  */
166
226
  getBatchTxRequesterService(): BatchTxRequesterLibP2PService;
167
- validate(txs: Tx[]): Promise<void>;
168
- private createMessageValidators;
227
+ validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
228
+ /** Creates the first stage (fast) validators for gossiped transactions. */
229
+ protected createFirstStageMessageValidators(currentBlockNumber: BlockNumber, nextSlotTimestamp: UInt64): Promise<Record<string, TransactionValidator>>;
230
+ /** Creates the second stage (expensive proof verification) validators for gossiped transactions. */
231
+ protected createSecondStageMessageValidators(): Record<string, TransactionValidator>;
169
232
  private runValidations;
170
233
  private handleDoubleSpendFailure;
171
- /**
172
- * Validate a checkpoint attestation.
173
- *
174
- * @param attestation - The checkpoint attestation to validate.
175
- * @returns True if the checkpoint attestation is valid, false otherwise.
176
- */
177
- validateCheckpointAttestation(peerId: PeerId, attestation: CheckpointAttestation): Promise<P2PValidationResult>;
178
- /**
179
- * Validate a block proposal.
180
- *
181
- * @param block - The block proposal to validate.
182
- * @returns True if the block proposal is valid, false otherwise.
183
- */
184
- validateBlockProposal(peerId: PeerId, block: BlockProposal): Promise<P2PValidationResult>;
185
- /**
186
- * Validate a checkpoint proposal.
187
- *
188
- * @param checkpoint - The checkpoint proposal to validate.
189
- * @returns True if the checkpoint proposal is valid, false otherwise.
190
- */
191
- validateCheckpointProposal(peerId: PeerId, checkpoint: CheckpointProposal): Promise<P2PValidationResult>;
192
234
  getPeerScore(peerId: PeerId): number;
193
235
  handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
194
236
  private sendToPeers;
195
237
  private stopLibP2P;
196
238
  }
197
239
  export {};
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9saWJwMnAvbGlicDJwX3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUk5RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQTZDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0YsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQVcsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRSxPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2SCxPQUFPLEVBQ0wsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixrQkFBa0IsRUFFbEIsS0FBSyxVQUFVLEVBQ2YsYUFBYSxFQUViLEtBQUssZ0JBQWdCLElBQUksbUJBQW1CLEVBRTVDLFNBQVMsRUFJVixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxFQUFFLEVBQTBELE1BQU0sa0JBQWtCLENBQUM7QUFHOUYsT0FBTyxFQUlMLEtBQUssZUFBZSxFQUNwQixVQUFVLEVBRVgsTUFBTSx5QkFBeUIsQ0FBQztBQWNqQyxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQTRCLEtBQUssTUFBTSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJOUcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3pDLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFFBQVEs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
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9saWJwMnAvbGlicDJwX3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUE2QyxNQUFNLHVCQUF1QixDQUFDO0FBRy9GLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFakUsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkgsT0FBTyxFQUNMLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLEtBQUssc0JBQXNCLEVBQzNCLEtBQUssVUFBVSxFQUVmLGlCQUFpQixFQUVqQixTQUFTLEVBSVYsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQixPQUFPLEVBQUUsRUFBRSxFQUF3QyxLQUFLLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlGLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFJTCxLQUFLLGVBQWUsRUFDcEIsVUFBVSxFQUVYLE1BQU0seUJBQXlCLENBQUM7QUFjakMsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUE0QixLQUFLLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSTlH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