@aztec-labs/p2p 6.0.0-nightly.20260829

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 (607) hide show
  1. package/README.md +134 -0
  2. package/dest/bootstrap/bootstrap.d.ts +39 -0
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -0
  4. package/dest/bootstrap/bootstrap.js +152 -0
  5. package/dest/client/factory.d.ts +32 -0
  6. package/dest/client/factory.d.ts.map +1 -0
  7. package/dest/client/factory.js +125 -0
  8. package/dest/client/index.d.ts +4 -0
  9. package/dest/client/index.d.ts.map +1 -0
  10. package/dest/client/index.js +3 -0
  11. package/dest/client/interface.d.ts +223 -0
  12. package/dest/client/interface.d.ts.map +1 -0
  13. package/dest/client/interface.js +9 -0
  14. package/dest/client/p2p_client.d.ts +202 -0
  15. package/dest/client/p2p_client.d.ts.map +1 -0
  16. package/dest/client/p2p_client.js +1051 -0
  17. package/dest/config.d.ts +295 -0
  18. package/dest/config.d.ts.map +1 -0
  19. package/dest/config.js +458 -0
  20. package/dest/enr/generate-enr.d.ts +17 -0
  21. package/dest/enr/generate-enr.d.ts.map +1 -0
  22. package/dest/enr/generate-enr.js +52 -0
  23. package/dest/enr/index.d.ts +2 -0
  24. package/dest/enr/index.d.ts.map +1 -0
  25. package/dest/enr/index.js +1 -0
  26. package/dest/errors/attestation-pool.error.d.ts +7 -0
  27. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  28. package/dest/errors/attestation-pool.error.js +12 -0
  29. package/dest/errors/p2p-service.error.d.ts +9 -0
  30. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  31. package/dest/errors/p2p-service.error.js +10 -0
  32. package/dest/errors/reqresp.error.d.ts +21 -0
  33. package/dest/errors/reqresp.error.d.ts.map +1 -0
  34. package/dest/errors/reqresp.error.js +23 -0
  35. package/dest/errors/tx-pool.error.d.ts +8 -0
  36. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  37. package/dest/errors/tx-pool.error.js +9 -0
  38. package/dest/index.d.ts +11 -0
  39. package/dest/index.d.ts.map +1 -0
  40. package/dest/index.js +9 -0
  41. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +194 -0
  42. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
  43. package/dest/mem_pools/attestation_pool/attestation_pool.js +521 -0
  44. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  45. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  46. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +745 -0
  47. package/dest/mem_pools/attestation_pool/index.d.ts +2 -0
  48. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
  49. package/dest/mem_pools/attestation_pool/index.js +1 -0
  50. package/dest/mem_pools/attestation_pool/mocks.d.ts +242 -0
  51. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
  52. package/dest/mem_pools/attestation_pool/mocks.js +33 -0
  53. package/dest/mem_pools/index.d.ts +4 -0
  54. package/dest/mem_pools/index.d.ts.map +1 -0
  55. package/dest/mem_pools/index.js +1 -0
  56. package/dest/mem_pools/instrumentation.d.ts +41 -0
  57. package/dest/mem_pools/instrumentation.d.ts.map +1 -0
  58. package/dest/mem_pools/instrumentation.js +120 -0
  59. package/dest/mem_pools/interface.d.ts +10 -0
  60. package/dest/mem_pools/interface.d.ts.map +1 -0
  61. package/dest/mem_pools/interface.js +3 -0
  62. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  63. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  64. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  65. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +48 -0
  66. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +112 -0
  68. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  69. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  70. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +99 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +64 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +92 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +79 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  101. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  102. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  103. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  104. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  105. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  106. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  107. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +25 -0
  108. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  109. package/dest/mem_pools/tx_pool_v2/instrumentation.js +67 -0
  110. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
  111. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  112. package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  114. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  115. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  116. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  117. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +75 -0
  123. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  124. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +218 -0
  125. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +122 -0
  126. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  127. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1039 -0
  128. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +17 -0
  129. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
  130. package/dest/msg_validators/attestation_validator/attestation_validator.js +111 -0
  131. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
  132. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  133. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
  134. package/dest/msg_validators/attestation_validator/index.d.ts +3 -0
  135. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
  136. package/dest/msg_validators/attestation_validator/index.js +2 -0
  137. package/dest/msg_validators/index.d.ts +4 -0
  138. package/dest/msg_validators/index.d.ts.map +1 -0
  139. package/dest/msg_validators/index.js +3 -0
  140. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  141. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  142. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  143. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +16 -0
  144. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  146. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
  147. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  148. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
  149. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  150. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  151. package/dest/msg_validators/proposal_validator/index.js +3 -0
  152. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
  153. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
  155. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
  156. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
  157. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +25 -0
  158. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
  159. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  160. package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
  161. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  162. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  163. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  164. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  165. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  167. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +25 -0
  168. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
  169. package/dest/msg_validators/tx_validator/block_header_validator.js +27 -0
  170. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  171. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  173. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  174. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  175. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  176. package/dest/msg_validators/tx_validator/data_validator.d.ts +9 -0
  177. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
  178. package/dest/msg_validators/tx_validator/data_validator.js +114 -0
  179. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +21 -0
  180. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
  181. package/dest/msg_validators/tx_validator/double_spend_validator.js +36 -0
  182. package/dest/msg_validators/tx_validator/factory.d.ts +148 -0
  183. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  184. package/dest/msg_validators/tx_validator/factory.js +302 -0
  185. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  186. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  187. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  188. package/dest/msg_validators/tx_validator/gas_limits_validator.d.ts +73 -0
  189. package/dest/msg_validators/tx_validator/gas_limits_validator.d.ts.map +1 -0
  190. package/dest/msg_validators/tx_validator/gas_limits_validator.js +107 -0
  191. package/dest/msg_validators/tx_validator/gas_validator.d.ts +65 -0
  192. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  193. package/dest/msg_validators/tx_validator/gas_validator.js +107 -0
  194. package/dest/msg_validators/tx_validator/index.d.ts +20 -0
  195. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
  196. package/dest/msg_validators/tx_validator/index.js +19 -0
  197. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +15 -0
  198. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
  199. package/dest/msg_validators/tx_validator/metadata_validator.js +63 -0
  200. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  201. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  202. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  203. package/dest/msg_validators/tx_validator/phases_validator.d.ts +35 -0
  204. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  205. package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
  206. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  207. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  208. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  209. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  210. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  211. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  212. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
  213. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  214. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  215. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
  216. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  217. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  218. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +11 -0
  219. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
  220. package/dest/msg_validators/tx_validator/tx_proof_validator.js +28 -0
  221. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  222. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  223. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  224. package/dest/services/data_store.d.ts +27 -0
  225. package/dest/services/data_store.d.ts.map +1 -0
  226. package/dest/services/data_store.js +192 -0
  227. package/dest/services/discv5/discV5_service.d.ts +54 -0
  228. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  229. package/dest/services/discv5/discV5_service.js +337 -0
  230. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  231. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  232. package/dest/services/discv5/persisted_enr_store.js +145 -0
  233. package/dest/services/dummy_service.d.ts +150 -0
  234. package/dest/services/dummy_service.d.ts.map +1 -0
  235. package/dest/services/dummy_service.js +228 -0
  236. package/dest/services/encoding.d.ts +67 -0
  237. package/dest/services/encoding.d.ts.map +1 -0
  238. package/dest/services/encoding.js +152 -0
  239. package/dest/services/gossipsub/index.d.ts +3 -0
  240. package/dest/services/gossipsub/index.d.ts.map +1 -0
  241. package/dest/services/gossipsub/index.js +2 -0
  242. package/dest/services/gossipsub/scoring.d.ts +25 -0
  243. package/dest/services/gossipsub/scoring.d.ts.map +1 -0
  244. package/dest/services/gossipsub/scoring.js +27 -0
  245. package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
  246. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  247. package/dest/services/gossipsub/topic_score_params.js +336 -0
  248. package/dest/services/index.d.ts +8 -0
  249. package/dest/services/index.d.ts.map +1 -0
  250. package/dest/services/index.js +7 -0
  251. package/dest/services/libp2p/instrumentation.d.ts +25 -0
  252. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  253. package/dest/services/libp2p/instrumentation.js +143 -0
  254. package/dest/services/libp2p/libp2p_service.d.ts +250 -0
  255. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  256. package/dest/services/libp2p/libp2p_service.js +1983 -0
  257. package/dest/services/peer-manager/interface.d.ts +23 -0
  258. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  259. package/dest/services/peer-manager/interface.js +1 -0
  260. package/dest/services/peer-manager/metrics.d.ts +23 -0
  261. package/dest/services/peer-manager/metrics.d.ts.map +1 -0
  262. package/dest/services/peer-manager/metrics.js +71 -0
  263. package/dest/services/peer-manager/peer_manager.d.ts +202 -0
  264. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
  265. package/dest/services/peer-manager/peer_manager.js +1015 -0
  266. package/dest/services/peer-manager/peer_scoring.d.ts +65 -0
  267. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
  268. package/dest/services/peer-manager/peer_scoring.js +239 -0
  269. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
  270. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  271. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
  272. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  273. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  274. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  275. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  276. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  277. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  278. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  279. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  280. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  281. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  282. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  283. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  284. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  285. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  286. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  287. package/dest/services/reqresp/config.d.ts +30 -0
  288. package/dest/services/reqresp/config.d.ts.map +1 -0
  289. package/dest/services/reqresp/config.js +45 -0
  290. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +76 -0
  291. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
  292. package/dest/services/reqresp/connection-sampler/connection_sampler.js +251 -0
  293. package/dest/services/reqresp/constants.d.ts +12 -0
  294. package/dest/services/reqresp/constants.d.ts.map +1 -0
  295. package/dest/services/reqresp/constants.js +7 -0
  296. package/dest/services/reqresp/index.d.ts +7 -0
  297. package/dest/services/reqresp/index.d.ts.map +1 -0
  298. package/dest/services/reqresp/index.js +5 -0
  299. package/dest/services/reqresp/interface.d.ts +174 -0
  300. package/dest/services/reqresp/interface.d.ts.map +1 -0
  301. package/dest/services/reqresp/interface.js +107 -0
  302. package/dest/services/reqresp/metrics.d.ts +16 -0
  303. package/dest/services/reqresp/metrics.d.ts.map +1 -0
  304. package/dest/services/reqresp/metrics.js +50 -0
  305. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  306. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  307. package/dest/services/reqresp/protocols/auth.js +71 -0
  308. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +35 -0
  309. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  310. package/dest/services/reqresp/protocols/block_txs/bitvector.js +88 -0
  311. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
  312. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  313. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +60 -0
  314. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +75 -0
  315. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  316. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +139 -0
  317. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  318. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  319. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  320. package/dest/services/reqresp/protocols/goodbye.d.ts +49 -0
  321. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
  322. package/dest/services/reqresp/protocols/goodbye.js +87 -0
  323. package/dest/services/reqresp/protocols/index.d.ts +10 -0
  324. package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
  325. package/dest/services/reqresp/protocols/index.js +8 -0
  326. package/dest/services/reqresp/protocols/ping.d.ts +7 -0
  327. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
  328. package/dest/services/reqresp/protocols/ping.js +7 -0
  329. package/dest/services/reqresp/protocols/status.d.ts +42 -0
  330. package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
  331. package/dest/services/reqresp/protocols/status.js +78 -0
  332. package/dest/services/reqresp/protocols/tx.d.ts +29 -0
  333. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
  334. package/dest/services/reqresp/protocols/tx.js +66 -0
  335. package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
  336. package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
  337. package/dest/services/reqresp/rate-limiter/index.js +1 -0
  338. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +105 -0
  339. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
  340. package/dest/services/reqresp/rate-limiter/rate_limiter.js +194 -0
  341. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
  342. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
  343. package/dest/services/reqresp/rate-limiter/rate_limits.js +64 -0
  344. package/dest/services/reqresp/reqresp.d.ts +107 -0
  345. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  346. package/dest/services/reqresp/reqresp.js +887 -0
  347. package/dest/services/reqresp/status.d.ts +37 -0
  348. package/dest/services/reqresp/status.d.ts.map +1 -0
  349. package/dest/services/reqresp/status.js +58 -0
  350. package/dest/services/service.d.ts +168 -0
  351. package/dest/services/service.d.ts.map +1 -0
  352. package/dest/services/service.js +5 -0
  353. package/dest/services/tx_collection/config.d.ts +25 -0
  354. package/dest/services/tx_collection/config.d.ts.map +1 -0
  355. package/dest/services/tx_collection/config.js +59 -0
  356. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  357. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  358. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  359. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  360. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  361. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  362. package/dest/services/tx_collection/index.d.ts +4 -0
  363. package/dest/services/tx_collection/index.d.ts.map +1 -0
  364. package/dest/services/tx_collection/index.js +3 -0
  365. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  366. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  367. package/dest/services/tx_collection/instrumentation.js +30 -0
  368. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  369. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  370. package/dest/services/tx_collection/request_tracker.js +84 -0
  371. package/dest/services/tx_collection/tx_collection.d.ts +104 -0
  372. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  373. package/dest/services/tx_collection/tx_collection.js +356 -0
  374. package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
  375. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  376. package/dest/services/tx_collection/tx_collection_sink.js +108 -0
  377. package/dest/services/tx_collection/tx_source.d.ts +24 -0
  378. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  379. package/dest/services/tx_collection/tx_source.js +56 -0
  380. package/dest/services/tx_file_store/config.d.ts +16 -0
  381. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  382. package/dest/services/tx_file_store/config.js +22 -0
  383. package/dest/services/tx_file_store/index.d.ts +4 -0
  384. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  385. package/dest/services/tx_file_store/index.js +3 -0
  386. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  387. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  388. package/dest/services/tx_file_store/instrumentation.js +29 -0
  389. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  390. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  391. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  392. package/dest/services/tx_provider.d.ts +53 -0
  393. package/dest/services/tx_provider.d.ts.map +1 -0
  394. package/dest/services/tx_provider.js +223 -0
  395. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  396. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  397. package/dest/services/tx_provider_instrumentation.js +34 -0
  398. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
  399. package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
  400. package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
  401. package/dest/test-helpers/get-ports.d.ts +7 -0
  402. package/dest/test-helpers/get-ports.d.ts.map +1 -0
  403. package/dest/test-helpers/get-ports.js +8 -0
  404. package/dest/test-helpers/index.d.ts +9 -0
  405. package/dest/test-helpers/index.d.ts.map +1 -0
  406. package/dest/test-helpers/index.js +8 -0
  407. package/dest/test-helpers/make-enrs.d.ts +16 -0
  408. package/dest/test-helpers/make-enrs.d.ts.map +1 -0
  409. package/dest/test-helpers/make-enrs.js +31 -0
  410. package/dest/test-helpers/make-test-p2p-clients.d.ts +63 -0
  411. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
  412. package/dest/test-helpers/make-test-p2p-clients.js +140 -0
  413. package/dest/test-helpers/mock-pubsub.d.ts +109 -0
  414. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  415. package/dest/test-helpers/mock-pubsub.js +244 -0
  416. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  417. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  418. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  419. package/dest/test-helpers/reqresp-nodes.d.ts +68 -0
  420. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
  421. package/dest/test-helpers/reqresp-nodes.js +240 -0
  422. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  423. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  424. package/dest/test-helpers/test_tx_provider.js +44 -0
  425. package/dest/test-helpers/testbench-utils.d.ts +164 -0
  426. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  427. package/dest/test-helpers/testbench-utils.js +401 -0
  428. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -0
  429. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
  430. package/dest/testbench/p2p_client_testbench_worker.js +364 -0
  431. package/dest/testbench/parse_log_file.d.ts +2 -0
  432. package/dest/testbench/parse_log_file.d.ts.map +1 -0
  433. package/dest/testbench/parse_log_file.js +131 -0
  434. package/dest/testbench/testbench.d.ts +2 -0
  435. package/dest/testbench/testbench.d.ts.map +1 -0
  436. package/dest/testbench/testbench.js +62 -0
  437. package/dest/testbench/worker_client_manager.d.ts +102 -0
  438. package/dest/testbench/worker_client_manager.d.ts.map +1 -0
  439. package/dest/testbench/worker_client_manager.js +492 -0
  440. package/dest/types/index.d.ts +34 -0
  441. package/dest/types/index.d.ts.map +1 -0
  442. package/dest/types/index.js +30 -0
  443. package/dest/util.d.ts +66 -0
  444. package/dest/util.d.ts.map +1 -0
  445. package/dest/util.js +167 -0
  446. package/dest/versioning.d.ts +9 -0
  447. package/dest/versioning.d.ts.map +1 -0
  448. package/dest/versioning.js +17 -0
  449. package/package.json +131 -0
  450. package/src/bootstrap/bootstrap.ts +178 -0
  451. package/src/client/factory.ts +282 -0
  452. package/src/client/index.ts +3 -0
  453. package/src/client/interface.ts +264 -0
  454. package/src/client/p2p_client.ts +846 -0
  455. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  456. package/src/config.ts +787 -0
  457. package/src/enr/generate-enr.ts +71 -0
  458. package/src/enr/index.ts +1 -0
  459. package/src/errors/attestation-pool.error.ts +13 -0
  460. package/src/errors/p2p-service.error.ts +11 -0
  461. package/src/errors/reqresp.error.ts +29 -0
  462. package/src/errors/tx-pool.error.ts +12 -0
  463. package/src/index.ts +11 -0
  464. package/src/mem_pools/attestation_pool/attestation_pool.ts +648 -0
  465. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +896 -0
  466. package/src/mem_pools/attestation_pool/index.ts +9 -0
  467. package/src/mem_pools/attestation_pool/mocks.ts +56 -0
  468. package/src/mem_pools/index.ts +3 -0
  469. package/src/mem_pools/instrumentation.ts +160 -0
  470. package/src/mem_pools/interface.ts +10 -0
  471. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  472. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  473. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +130 -0
  474. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  475. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  476. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +120 -0
  477. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +126 -0
  478. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  479. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  480. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  481. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +72 -0
  482. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +99 -0
  483. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +90 -0
  484. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  485. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  486. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  487. package/src/mem_pools/tx_pool_v2/instrumentation.ts +96 -0
  488. package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
  489. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  490. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  491. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
  492. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +300 -0
  493. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1242 -0
  494. package/src/msg_validators/attestation_validator/README.md +49 -0
  495. package/src/msg_validators/attestation_validator/attestation_validator.ts +116 -0
  496. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +107 -0
  497. package/src/msg_validators/attestation_validator/index.ts +2 -0
  498. package/src/msg_validators/index.ts +3 -0
  499. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  500. package/src/msg_validators/proposal_validator/README.md +123 -0
  501. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +37 -0
  502. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
  503. package/src/msg_validators/proposal_validator/index.ts +3 -0
  504. package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
  505. package/src/msg_validators/tx_validator/README.md +137 -0
  506. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +24 -0
  507. package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
  508. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  509. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  510. package/src/msg_validators/tx_validator/block_header_validator.ts +38 -0
  511. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  512. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  513. package/src/msg_validators/tx_validator/data_validator.ts +173 -0
  514. package/src/msg_validators/tx_validator/double_spend_validator.ts +46 -0
  515. package/src/msg_validators/tx_validator/factory.ts +490 -0
  516. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  517. package/src/msg_validators/tx_validator/gas_limits_validator.ts +148 -0
  518. package/src/msg_validators/tx_validator/gas_validator.ts +149 -0
  519. package/src/msg_validators/tx_validator/index.ts +19 -0
  520. package/src/msg_validators/tx_validator/metadata_validator.ts +104 -0
  521. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  522. package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
  523. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  524. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  525. package/src/msg_validators/tx_validator/timestamp_validator.ts +61 -0
  526. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
  527. package/src/msg_validators/tx_validator/tx_proof_validator.ts +26 -0
  528. package/src/msg_validators/tx_validator/tx_validation_cache.ts +100 -0
  529. package/src/services/data_store.ts +229 -0
  530. package/src/services/discv5/discV5_service.ts +413 -0
  531. package/src/services/discv5/persisted_enr_store.ts +157 -0
  532. package/src/services/dummy_service.ts +320 -0
  533. package/src/services/encoding.ts +170 -0
  534. package/src/services/gossipsub/README.md +663 -0
  535. package/src/services/gossipsub/index.ts +2 -0
  536. package/src/services/gossipsub/scoring.ts +37 -0
  537. package/src/services/gossipsub/topic_score_params.ts +477 -0
  538. package/src/services/index.ts +7 -0
  539. package/src/services/libp2p/instrumentation.ts +147 -0
  540. package/src/services/libp2p/libp2p_service.ts +1972 -0
  541. package/src/services/peer-manager/interface.ts +28 -0
  542. package/src/services/peer-manager/metrics.ts +90 -0
  543. package/src/services/peer-manager/peer_manager.ts +1221 -0
  544. package/src/services/peer-manager/peer_scoring.ts +265 -0
  545. package/src/services/reqresp/README.md +194 -0
  546. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  547. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +659 -0
  548. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  549. package/src/services/reqresp/batch-tx-requester/interface.ts +60 -0
  550. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +167 -0
  551. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +248 -0
  552. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  553. package/src/services/reqresp/config.ts +69 -0
  554. package/src/services/reqresp/connection-sampler/connection_sampler.ts +287 -0
  555. package/src/services/reqresp/constants.ts +14 -0
  556. package/src/services/reqresp/index.ts +6 -0
  557. package/src/services/reqresp/interface.ts +241 -0
  558. package/src/services/reqresp/metrics.ts +68 -0
  559. package/src/services/reqresp/protocols/auth.ts +83 -0
  560. package/src/services/reqresp/protocols/block_txs/bitvector.ts +107 -0
  561. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +79 -0
  562. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +170 -0
  563. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  564. package/src/services/reqresp/protocols/goodbye.ts +102 -0
  565. package/src/services/reqresp/protocols/index.ts +9 -0
  566. package/src/services/reqresp/protocols/ping.ts +8 -0
  567. package/src/services/reqresp/protocols/status.ts +123 -0
  568. package/src/services/reqresp/protocols/tx.ts +76 -0
  569. package/src/services/reqresp/rate-limiter/index.ts +1 -0
  570. package/src/services/reqresp/rate-limiter/rate_limiter.ts +240 -0
  571. package/src/services/reqresp/rate-limiter/rate_limits.ts +65 -0
  572. package/src/services/reqresp/reqresp.ts +675 -0
  573. package/src/services/reqresp/status.ts +68 -0
  574. package/src/services/service.ts +219 -0
  575. package/src/services/tx_collection/config.ts +89 -0
  576. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  577. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  578. package/src/services/tx_collection/index.ts +3 -0
  579. package/src/services/tx_collection/instrumentation.ts +35 -0
  580. package/src/services/tx_collection/request_tracker.ts +127 -0
  581. package/src/services/tx_collection/tx_collection.ts +467 -0
  582. package/src/services/tx_collection/tx_collection_sink.ts +124 -0
  583. package/src/services/tx_collection/tx_source.ts +61 -0
  584. package/src/services/tx_file_store/config.ts +37 -0
  585. package/src/services/tx_file_store/index.ts +3 -0
  586. package/src/services/tx_file_store/instrumentation.ts +42 -0
  587. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  588. package/src/services/tx_provider.ts +237 -0
  589. package/src/services/tx_provider_instrumentation.ts +54 -0
  590. package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
  591. package/src/test-helpers/get-ports.ts +8 -0
  592. package/src/test-helpers/index.ts +8 -0
  593. package/src/test-helpers/make-enrs.ts +42 -0
  594. package/src/test-helpers/make-test-p2p-clients.ts +213 -0
  595. package/src/test-helpers/mock-pubsub.ts +325 -0
  596. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  597. package/src/test-helpers/reqresp-nodes.ts +327 -0
  598. package/src/test-helpers/test_tx_provider.ts +68 -0
  599. package/src/test-helpers/testbench-utils.ts +465 -0
  600. package/src/testbench/README.md +20 -0
  601. package/src/testbench/p2p_client_testbench_worker.ts +553 -0
  602. package/src/testbench/parse_log_file.ts +174 -0
  603. package/src/testbench/testbench.ts +66 -0
  604. package/src/testbench/worker_client_manager.ts +621 -0
  605. package/src/types/index.ts +38 -0
  606. package/src/util.ts +230 -0
  607. package/src/versioning.ts +26 -0
@@ -0,0 +1,663 @@
1
+ # Gossipsub Peer Scoring
2
+
3
+ This module configures gossipsub peer scoring parameters for the Aztec P2P network. Peer scoring helps maintain network health by rewarding well-behaving peers and penalizing misbehaving ones.
4
+
5
+ ## Overview
6
+
7
+ Gossipsub v1.1 introduces peer scoring to defend against various attacks and improve message propagation. Each peer accumulates a score based on their behavior, and peers with low scores may be pruned from the mesh or even disconnected.
8
+
9
+ For the full specification, see: https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#peer-scoring
10
+
11
+ ## Scoring Parameters
12
+
13
+ The peer score is computed as a weighted sum of topic-specific and application-specific scores:
14
+
15
+ ```
16
+ Score = TopicScore + AppSpecificScore + IPColocationPenalty + BehaviorPenalty
17
+ ```
18
+
19
+ ### Topic-Specific Parameters (P1-P4)
20
+
21
+ Each topic has its own scoring parameters:
22
+
23
+ | Parameter | Type | Description |
24
+ |-----------|------|-------------|
25
+ | **P1: timeInMesh** | Positive | Rewards peers for time spent in the mesh |
26
+ | **P2: firstMessageDeliveries** | Positive | Rewards peers who deliver messages first |
27
+ | **P3: meshMessageDeliveries** | Negative | Penalizes peers who under-deliver messages |
28
+ | **P3b: meshFailurePenalty** | Negative | Sticky penalty applied when pruned from mesh |
29
+ | **P4: invalidMessageDeliveries** | Negative | Penalizes peers who deliver invalid messages |
30
+
31
+ ### Our Configuration
32
+
33
+ We configure all parameters (P1-P4) with values calculated dynamically from network configuration:
34
+
35
+ | Parameter | Max Score | Configuration |
36
+ |-----------|-----------|---------------|
37
+ | P1: timeInMesh | +8 per topic | Slot-based, caps at 1 hour |
38
+ | P2: firstMessageDeliveries | +25 per topic | Convergence-based, fast decay |
39
+ | P3: meshMessageDeliveries | -34 per topic | Must exceed P1+P2 for pruning |
40
+ | P3b: meshFailurePenalty | -34 per topic | Sticky penalty after pruning |
41
+ | P4: invalidMessageDeliveries | -20 per message | Attack detection |
42
+
43
+ **Important:** P1 and P2 are only enabled on topics with P3 enabled. By default, P3 is enabled for checkpoint_proposal and checkpoint_attestation (2 topics). Block proposal scoring is controlled by `expectedBlockProposalsPerSlot` (current default: `0`, including when env var is unset, so disabled) - see [Block Proposals](#block-proposals-block_proposal) for details. The tx topic has all scoring disabled except P4, to prevent free positive score accumulation that would offset penalties from other topics.
44
+
45
+ ## Exponential Decay
46
+
47
+ All counters in gossipsub use exponential decay. Each heartbeat (default: 700ms), counters are multiplied by a decay factor:
48
+
49
+ ```
50
+ counter = counter * decay
51
+ ```
52
+
53
+ ### Multi-Slot Decay Windows
54
+
55
+ For low-frequency topics (like 1 message per 72-second slot), naive decay would cause counters to drop to near-zero before the next message arrives. Instead, we use **multi-slot decay windows**:
56
+
57
+ | Frequency | Decay Window |
58
+ |-----------|--------------|
59
+ | <= 1 msg/slot | 5 slots |
60
+ | 2-10 msg/slot | 3 slots |
61
+ | > 10 msg/slot | 2 slots |
62
+
63
+ ### Decay Factor Calculation
64
+
65
+ To decay to 1% of the original value over the decay window:
66
+
67
+ ```typescript
68
+ heartbeatsPerSlot = slotDurationMs / heartbeatIntervalMs
69
+ heartbeatsInWindow = heartbeatsPerSlot * decayWindowSlots
70
+ decay = 0.01 ^ (1 / heartbeatsInWindow)
71
+ ```
72
+
73
+ **Example** (72s slot, 700ms heartbeat, 5-slot decay window):
74
+ ```
75
+ heartbeatsPerSlot = 72000 / 700 ≈ 103
76
+ heartbeatsInWindow = 103 * 5 = 515
77
+ decay = 0.01^(1/515) ≈ 0.991
78
+ ```
79
+
80
+ ## Convergence and Thresholds
81
+
82
+ ### Convergence (Steady-State Value)
83
+
84
+ If messages arrive at a constant rate, the decaying counter converges to:
85
+
86
+ ```typescript
87
+ messagesPerHeartbeat = expectedPerSlot * (heartbeatMs / slotDurationMs)
88
+ convergence = messagesPerHeartbeat / (1 - decay)
89
+ ```
90
+
91
+ ### Threshold Calculation
92
+
93
+ The P3 threshold determines when penalties apply. We use a conservative threshold at 30% of convergence to avoid penalizing honest peers experiencing normal variance:
94
+
95
+ ```typescript
96
+ threshold = convergence * 0.3
97
+ ```
98
+
99
+ ## meshMessageDeliveriesWindow
100
+
101
+ This parameter determines how long after validating a message other peers can still receive credit for delivering it.
102
+
103
+ **How it works:**
104
+ 1. Peer A delivers a message first
105
+ 2. We validate the message
106
+ 3. Timer starts for `meshMessageDeliveriesWindow` duration (5 seconds)
107
+ 4. Any mesh peer delivering within this window gets credit
108
+
109
+ **Why 5 seconds?**
110
+
111
+ The [gossipsub v1.1 spec](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md) recommends this window be "small (in the order of milliseconds)" to prevent peers from gaming P3 scores by simply replaying messages back. A peer can echo a message within ~100ms, so a large window allows score inflation.
112
+
113
+ However, real-world implementations use significantly larger values due to practical constraints:
114
+ - **Prysm** (Go): 2 seconds - the go-libp2p default for low-latency Go runtime
115
+ - **Lodestar** (TypeScript): 12 seconds - accounts for JavaScript I/O lag
116
+ - **Ethereum spec proposal**: 400ms was proposed but rejected as "too tight"
117
+
118
+ We use **5 seconds** as a balanced middle ground because:
119
+ 1. **Runtime considerations**: Our implementation is TypeScript (like Lodestar), not Go (like Prysm). JavaScript has higher I/O latency due to single-threaded event loop and garbage collection pauses.
120
+ 2. **Network variance**: Even on healthy networks, message propagation can vary due to:
121
+ - Concurrent validation of multiple messages
122
+ - CPU-intensive proof verification
123
+ - Network congestion during high transaction volume
124
+ - Geographic distribution of validators
125
+ 3. **Conservative but not excessive**: 5s is 2.5× the Go default (allowing for JS overhead) but still well below Lodestar's 12s, maintaining reasonable protection against replay attacks.
126
+ 4. **Attack mitigation**: A 5s window still prevents score gaming - peers would need to consistently echo messages within 5s to maintain positive P3 scores, which requires them to stay connected and somewhat functional.
127
+
128
+ ## meshMessageDeliveriesActivation
129
+
130
+ This is the grace period before P3 penalties can be applied to a peer. During this time, the message delivery counter accumulates without any penalty.
131
+
132
+ **Why activation is 5× the decay window:**
133
+
134
+ We set activation time to **5× the decay window** (10-25 slots depending on topic frequency) because:
135
+
136
+ 1. **Timer starts at mesh join, not first message**: The activation countdown begins when a peer joins the mesh, not when they receive their first message. During network bootstrap, peers may join before any messages are flowing.
137
+
138
+ 2. **Bootstrap grace period**: When the network is starting up, message flow may be delayed. Peers need time for the network to stabilize and messages to start propagating.
139
+
140
+ 3. **Counter convergence**: The threshold is set at 30% of the *converged* counter value. If activation is too short, the counter hasn't approached convergence yet, and honest peers could be penalized unfairly.
141
+
142
+ 4. **Join timing variance**: Peers may join at any point during a slot. With longer activation time, even peers joining at an unlucky time will have accumulated enough messages before penalties start.
143
+
144
+ 5. **Ethereum precedent**: Ethereum's Lodestar implementation uses very long activation times (1-2 epochs ≈ 16-32 slots) for similar reasons.
145
+
146
+ | Topic | Decay Window | Activation Time (5×) |
147
+ |-------|--------------|----------------------|
148
+ | checkpoint_proposal | 5 slots (360s) | 25 slots (1800s / 30min) |
149
+ | block_proposal | 3 slots (216s) | 15 slots (1080s / 18min) |
150
+ | checkpoint_attestation | 2 slots (144s) | 10 slots (720s / 12min) |
151
+
152
+ ## P1: Time in Mesh (Positive Score)
153
+
154
+ P1 rewards peers for time spent in the mesh. We use Lodestar-style slot-based normalization:
155
+
156
+ ```typescript
157
+ timeInMeshQuantum = slotDurationMs // Score increases by ~1 per slot
158
+ timeInMeshCap = 3600 / slotDurationSeconds // Cap at 1 hour (50 slots for 72s slots)
159
+ timeInMeshWeight = MAX_P1_SCORE / cap // Normalized so max P1 = 8
160
+ ```
161
+
162
+ **Key properties:**
163
+ - Score increases gradually: ~1 per slot of mesh membership
164
+ - Caps at 1 hour: prevents runaway positive scores
165
+ - Resets on mesh leave: no credit carried after pruning
166
+
167
+ **Example (72s slots):**
168
+ - After 10 minutes in mesh: P1 ≈ 1.3
169
+ - After 30 minutes in mesh: P1 ≈ 4
170
+ - After 1 hour in mesh: P1 = 8 (max)
171
+
172
+ ## P2: First Message Deliveries (Positive Score)
173
+
174
+ P2 rewards peers who deliver messages first to us. We use convergence-based normalization:
175
+
176
+ ```typescript
177
+ firstMessageDeliveriesDecay = computeDecay(2 slots) // Fast decay
178
+ firstMessageDeliveriesCap = convergence(1 msg/heartbeat)
179
+ firstMessageDeliveriesWeight = MAX_P2_SCORE / cap // Normalized so max P2 = 25
180
+ ```
181
+
182
+ **Key properties:**
183
+ - Fast decay (2 slots): rewards recent behavior, not historical
184
+ - Caps at convergence: prevents score inflation from bursts
185
+ - Resets quickly after mesh leave: decays to near-zero over ~2 slots (e.g., ~144s with 72s slots)
186
+
187
+ ## P3 Weight Formula
188
+
189
+ The P3 weight is calculated to ensure the max penalty equals `MAX_P3_PENALTY_PER_TOPIC` (-34):
190
+
191
+ ```typescript
192
+ // Weight formula: max_penalty / threshold²
193
+ meshMessageDeliveriesWeight = MAX_P3_PENALTY_PER_TOPIC / (threshold * threshold)
194
+
195
+ // When peer delivers nothing (deficit = threshold):
196
+ // penalty = deficit² × weight = threshold² × (-34 / threshold²) = -34
197
+ ```
198
+
199
+ This ensures P3 max penalty (-34) exceeds P1 + P2 max (+33), causing mesh pruning.
200
+
201
+ ## Per-Topic Configuration
202
+
203
+ ### Topic Types and Expected Rates
204
+
205
+ | Topic | Expected/Slot | Decay Window | Notes |
206
+ |-------|--------------|--------------|-------|
207
+ | `tx` | Unpredictable | N/A | P3/P3b disabled |
208
+ | `block_proposal` | N-1 | 3 slots | N = blocks per slot |
209
+ | `checkpoint_proposal` | 1 | 5 slots | One per slot |
210
+ | `checkpoint_attestation` | C (~48) | 2 slots | C = committee size |
211
+
212
+ ### Transactions (tx)
213
+
214
+ Transactions are submitted unpredictably by users, so we cannot set meaningful delivery thresholds. **All scoring (P1, P2, P3, P3b) is disabled** for this topic except P4 (invalid message detection).
215
+
216
+ **Rationale:** If P1/P2 were enabled without P3, the tx topic would contribute free positive scores that could offset penalties from other topics, preventing proper mesh pruning of non-contributing peers.
217
+
218
+ ### Block Proposals (block_proposal)
219
+
220
+ Block proposal scoring is controlled by the `expectedBlockProposalsPerSlot` config (`SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT` env var):
221
+
222
+ | Config Value | Behavior |
223
+ |-------------|----------|
224
+ | `0` (current default) | Block proposal P3 scoring is **disabled** |
225
+ | Positive number | Uses the provided value as expected proposals per slot |
226
+ | `undefined` | Falls back to `blocksPerSlot - 1` (N-1 when the slot fits multiple blocks, 0 when it fits one) |
227
+
228
+ **Current behavior note:** In the current implementation, if `SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT` is not set, config mapping applies `0` by default (scoring disabled). The `undefined` fallback above is currently reachable only if the value is explicitly provided as `undefined` in code.
229
+
230
+ **Future intent:** Once throughput is stable, we may change env parsing/defaults so an unset env var resolves to `undefined` again (re-enabling automatic fallback to `blocksPerSlot - 1`).
231
+
232
+ **Why disabled by default?** Gossipsub expects N-1 block proposals per slot. When transaction throughput is low (as expected at launch), fewer blocks are actually built, causing peers to be incorrectly penalized for under-delivering block proposals. The default of 0 disables this scoring. Set to a positive value when throughput increases and block production is consistent.
233
+
234
+ When a slot fits multiple blocks, N-1 block proposals are gossiped per slot (the last block is bundled with the checkpoint). When the slot fits exactly one block, this is 0.
235
+
236
+ ### Checkpoint Proposals (checkpoint_proposal)
237
+
238
+ Exactly one checkpoint proposal per slot, containing the final block and proof commitments.
239
+
240
+ ### Checkpoint Attestations (checkpoint_attestation)
241
+
242
+ Each committee member sends one attestation per slot. With a target committee size of 48, we expect ~48 attestations per slot.
243
+
244
+ ### Topic Weights
245
+
246
+ All topics use equal weight (1). Block proposals contain transaction hashes, so transactions must propagate for block proposals to validate - making all message types equally important for network health.
247
+
248
+ ## Configuration Dependencies
249
+
250
+ The scoring parameters depend on:
251
+
252
+ | Parameter | Source | Default |
253
+ |-----------|--------|---------|
254
+ | `slotDuration` | L1RollupConstants | 72s |
255
+ | `targetCommitteeSize` | L1RollupConstants | 48 |
256
+ | `heartbeatInterval` | P2PConfig.gossipsubInterval | 700ms |
257
+ | `blockDurationMs` | P2PConfig.blockDurationMs | 3000ms |
258
+ | `expectedBlockProposalsPerSlot` | P2PConfig.expectedBlockProposalsPerSlot | 0 (disabled; current unset-env behavior) |
259
+
260
+ ## Invalid Message Handling (P4)
261
+
262
+ P4 penalizes peers who deliver invalid messages. All topics have this enabled with:
263
+ - Weight: -20
264
+ - Decay: Over 4 slots
265
+
266
+ Invalid messages include malformed data, invalid signatures, or messages failing validation.
267
+
268
+ ## Tuning Guidelines
269
+
270
+ ### Signs of Too-Strict Scoring
271
+
272
+ - Honest peers frequently pruned from mesh
273
+ - High peer churn
274
+ - Slow message propagation despite good network
275
+
276
+ **Solution:** Increase thresholds, use longer decay windows
277
+
278
+ ### Signs of Too-Lenient Scoring
279
+
280
+ - Slow or stalled message propagation
281
+ - Bad peers remaining in mesh too long
282
+ - Network vulnerable to eclipse attacks
283
+
284
+ **Solution:** Decrease thresholds, use shorter decay windows
285
+
286
+ ### Monitoring
287
+
288
+ Key metrics to monitor:
289
+ - Peer scores distribution
290
+ - P3 penalty frequency per topic
291
+ - Invalid message rate per peer
292
+ - Mesh membership stability
293
+
294
+ ## Code Structure
295
+
296
+ - `scoring.ts` - Global peer score thresholds
297
+ - `topic_score_params.ts` - Per-topic parameter calculation
298
+ - `index.ts` - Module exports
299
+
300
+ ## Global Score Thresholds
301
+
302
+ Gossipsub uses global thresholds to determine peer behavior based on total score:
303
+
304
+ | Threshold | Value | Effect |
305
+ |-----------|-------|--------|
306
+ | gossipThreshold | -500 | Below this, peer doesn't receive gossip |
307
+ | publishThreshold | -1000 | Below this, peer's messages aren't relayed |
308
+ | graylistThreshold | -2000 | Below this, all RPCs from peer are ignored |
309
+
310
+ ### Alignment with Application-Level Scoring
311
+
312
+ The thresholds are designed to align with Aztec's application-level peer scoring:
313
+
314
+ ```
315
+ Total Gossipsub Score = TopicScore + (AppScore × AppSpecificWeight)
316
+ ```
317
+
318
+ With `appSpecificWeight = 10` (topic score assumed ~0):
319
+
320
+ | App Score State | App Score | Gossipsub Contribution | Threshold Triggered |
321
+ |-----------------|-----------|------------------------|---------------------|
322
+ | Healthy | 0 to -49 | 0 to -490 | None |
323
+ | Disconnect | -50 | -500 | gossipThreshold |
324
+ | Ban | -100 | -1000 | publishThreshold |
325
+
326
+ This means (best-effort alignment):
327
+ - When a peer reaches **Disconnect** state, they generally stop receiving gossip
328
+ - When a peer reaches **Ban** state, their messages are generally not relayed
329
+ - **Graylist** requires ban-level score PLUS significant topic penalties (attacks)
330
+
331
+ **Important:** Positive topic scores (P1/P2) can temporarily offset app penalties, so alignment is not strict.
332
+ Conversely, if topic scores are low, a peer slightly above the disconnect threshold may still dip below `gossipThreshold`. This is acceptable and tends to recover quickly as topic scores accumulate.
333
+
334
+ ### Topic Score Contribution
335
+
336
+ Topic scores provide **burst response** to attacks, while app score provides **stable baseline**:
337
+
338
+ - P1 (time in mesh): Max +8 per topic (+16 default, +24 with block proposal scoring enabled)
339
+ - P2 (first deliveries): Max +25 per topic (+50 default, +75 with block proposal scoring, but decays fast)
340
+ - P3 (under-delivery): Max -34 per topic (-68 default with 2 topics, -102 with block proposal scoring enabled)
341
+ - P4 (invalid messages): -20 per invalid message, can spike to -2000+ during attacks
342
+
343
+ Example attack scenario:
344
+ - App score: -100 (banned) → -1000 gossipsub
345
+ - P4 burst (10 invalid messages): -2000 per topic
346
+ - **Total: -3000+** → Triggers graylistThreshold
347
+
348
+ The P4 penalty decays to 1% over 4 slots (~5 minutes), allowing recovery if the attack stops.
349
+
350
+ ## Non-Contributing Peers
351
+
352
+ ### How P3 Handles Under-Delivery
353
+
354
+ The P3 (meshMessageDeliveries) penalty applies when a peer's message delivery counter falls below the threshold. The penalty formula is:
355
+
356
+ ```
357
+ deficit = max(0, threshold - counter)
358
+ penalty = deficit² × weight
359
+ ```
360
+
361
+ Where `weight = MAX_P3_PENALTY_PER_TOPIC / (threshold × threshold)`. This design ensures:
362
+
363
+ ```
364
+ If counter = 0 (delivers nothing):
365
+ deficit = threshold
366
+ penalty = threshold² × (-34/threshold²) = -34 per topic
367
+ ```
368
+
369
+ ### Score Balance for Mesh Pruning
370
+
371
+ For a peer to be pruned from the mesh, their **topic score** must be negative. We balance P1/P2/P3 so that non-contributors get pruned:
372
+
373
+ | Scenario | P1 | P2 | P3 | Topic Score | Result |
374
+ |----------|----|----|-----|-------------|--------|
375
+ | Healthy peer (delivering) | +8 | +25 | 0 | +33 | In mesh |
376
+ | New peer (just joined) | +1 | +5 | 0 | +6 | In mesh |
377
+ | Non-contributor (1 hour in mesh) | +8 | 0 | -34 | **-26** | **Pruned** |
378
+ | Non-contributor (new) | +1 | 0 | -34 | **-33** | **Pruned** |
379
+
380
+ The key insight: **P3 max (-34) exceeds P1 + P2 max (+33)**, so even a peer that has been in the mesh for 1 hour will still be pruned if they stop delivering messages.
381
+
382
+ ### What Happens After Pruning
383
+
384
+ When a peer is pruned from the mesh:
385
+
386
+ 1. **P1 resets to 0**: The timeInMesh counter is cleared
387
+ 2. **P2 decays to 0**: Fast decay (2-slot window) makes it negligible over minutes
388
+ 3. **P3b captures the penalty**: The P3 deficit at prune time becomes P3b, which decays slowly
389
+
390
+ After pruning, the peer's score consists mainly of P3b:
391
+ - **Total P3b: -68** (default, 2 topics) or **-102** (with block proposal scoring enabled, 3 topics)
392
+ - **Recovery time**: P3b decays to ~1% over one decay window (2-5 slots = 2-6 minutes)
393
+ - **Grafting eligibility**: Peer can be grafted when score ≥ 0, but asymptotic decay means recovery is slow
394
+
395
+ ### Why Non-Contributors Aren't Disconnected
396
+
397
+ With P3b capped at -68 (default, 2 topics) or -102 (with block proposal scoring, 3 topics) after pruning:
398
+
399
+ | Threshold | Value | P3b Score | Triggered? |
400
+ |-----------|-------|-----------|------------|
401
+ | gossipThreshold | -500 | -68 (default) / -102 (block scoring on) | No |
402
+ | publishThreshold | -1000 | -68 (default) / -102 (block scoring on) | No |
403
+ | graylistThreshold | -2000 | -68 (default) / -102 (block scoring on) | No |
404
+
405
+ **A score of -68 or -102 is well above -500**, so non-contributing peers:
406
+ - Are pruned from mesh (good - stops them slowing propagation)
407
+ - Still receive gossip (can recover by reconnecting/restarting)
408
+ - Are NOT disconnected unless they also have application-level penalties
409
+
410
+ ### Design Philosophy
411
+
412
+ The system distinguishes between:
413
+
414
+ | Peer Type | Score Range | Effect |
415
+ |-----------|-------------|--------|
416
+ | **Productive** | ≥ 0 | Full mesh participation |
417
+ | **Unproductive** | -1 to -499 | Pruned from mesh, still receives gossip |
418
+ | **Misbehaving** | -500 to -999 | Stops receiving gossip (app: Disconnect) |
419
+ | **Malicious** | -1000 to -1999 | Cannot publish (app: Banned) |
420
+ | **Attacking** | ≤ -2000 | Graylisted, all RPCs ignored |
421
+
422
+ Note: These ranges are approximate; positive topic scores can shift a peer upward temporarily.
423
+
424
+ This is similar to Ethereum's approach: non-contributing peers are removed from the mesh (preventing them from slowing propagation) but not disconnected, as they might be starting up or experiencing temporary connectivity issues.
425
+
426
+ ### When Non-Contributors ARE Penalized
427
+
428
+ Non-contributors will trigger thresholds if they also:
429
+ 1. **Send invalid messages**: P4 penalty of -20 per invalid message accumulates quickly
430
+ 2. **Fail protocol validation**: Application penalties for deserialization errors, manipulation attempts
431
+ 3. **Violate rate limits**: Repeated per-peer limit hits accumulate application penalties
432
+
433
+ ## Application-Level Penalties
434
+
435
+ Beyond gossipsub's topic scoring, Aztec has application-level penalties for protocol violations:
436
+
437
+ ### Penalty Severities
438
+
439
+ | Severity | Points | Errors to Disconnect | Errors to Ban |
440
+ |----------|--------|----------------------|---------------|
441
+ | **HighToleranceError** | 2 | 25 | 50 |
442
+ | **MidToleranceError** | 10 | 5 | 10 |
443
+ | **LowToleranceError** | 50 | 1 | 2 |
444
+
445
+ ### What Triggers Each Severity
446
+
447
+ **HighToleranceError (2 points)** - Transient issues:
448
+ - Rate limit exceeded
449
+ - Failed responses (FAILURE/UNKNOWN status)
450
+ - Recent double spend attempts (within penalty window)
451
+
452
+ **MidToleranceError (10 points)** - Protocol violations:
453
+ - Block/checkpoint exceeds per-slot cap
454
+ - Response hash mismatches
455
+ - Duplicate transactions in response
456
+ - Unrequested transactions in response
457
+
458
+ **LowToleranceError (50 points)** - Serious violations:
459
+ - Message deserialization errors
460
+ - Invalid message manipulation attempts
461
+ - Block number/order mismatches
462
+ - Invalid transactions
463
+ - Badly formed requests
464
+ - Confirmed double spends
465
+
466
+ ### Score Decay
467
+
468
+ Application scores decay by 10% per minute (`decayFactor = 0.9`):
469
+ - Score -100 → -90 after 1 minute
470
+ - Score -100 → -35 after 10 minutes
471
+ - Score -100 → -12 after 20 minutes
472
+
473
+ This allows honest peers to recover from temporary issues — but only up to the ban threshold. Once a peer
474
+ crosses into the **Banned** state, decay no longer applies until the ban expires (see Ban Duration below).
475
+
476
+ ### Ban Duration
477
+
478
+ Once a peer's score drops below the ban threshold (`MIN_SCORE_BEFORE_BAN = -100`) the ban is held for a configurable
479
+ duration:
480
+
481
+ - The score the peer held when banned is recorded in memory alongside an expiry timestamp.
482
+ - While the ban is active, `getScore` returns the **ban score** regardless of decay, so the peer stays in the
483
+ `Banned` state for the full window and cannot decay its way out early.
484
+ - When the ban expires it is removed and the live (decayed) score takes over again, letting the peer recover.
485
+
486
+ The ban duration is controlled by `P2P_PEER_BAN_DURATION_SECONDS` (config field `peerBanDurationSeconds`), defaulting
487
+ to 24 hours. Bans are held in memory only (cleared on restart). This is independent of the gossipsub topic-score
488
+ decay (P4, P3b), which continues to decay as described above; only the application-level ban score is pinned.
489
+
490
+ ## Score Calculation Examples
491
+
492
+ ### Example 1: Honest Peer
493
+
494
+ ```
495
+ App score: 0
496
+ Topic P3: 0 (delivering messages)
497
+ Topic P4: 0 (no invalid messages)
498
+ ─────────────────────────────────
499
+ Total: 0 → Full participation ✓
500
+ ```
501
+
502
+ ### Example 2: Peer with Rate Limit Issues
503
+
504
+ ```
505
+ App score: -20 (10 HighToleranceErrors)
506
+ → Gossipsub contribution: -200
507
+ Topic P3: -1 (slightly under-delivering)
508
+ Topic P4: 0
509
+ ─────────────────────────────────
510
+ Total: -201 → Still receives gossip ✓
511
+ ```
512
+
513
+ ### Example 3: Validation Failure
514
+
515
+ ```
516
+ App score: -50 (1 LowToleranceError for invalid message)
517
+ → Gossipsub contribution: -500
518
+ Topic P3: 0
519
+ Topic P4: -20 (the invalid message)
520
+ ─────────────────────────────────
521
+ Total: -520 → Stops receiving gossip (gossipThreshold = -500)
522
+ → Application disconnects peer
523
+ ```
524
+
525
+ ### Example 4: Banned Peer
526
+
527
+ ```
528
+ App score: -100 (2 LowToleranceErrors)
529
+ → Gossipsub contribution: -1000
530
+ Topic P3: -2
531
+ Topic P4: -40 (2 invalid messages)
532
+ ─────────────────────────────────
533
+ Total: -1042 → Cannot publish (publishThreshold = -1000)
534
+ → Application bans peer
535
+ ```
536
+
537
+ ### Example 5: Active Attack (Burst of Invalid Messages)
538
+
539
+ ```
540
+ App score: -100 (banned)
541
+ → Gossipsub contribution: -1000
542
+ Topic P3: -3
543
+ Topic P4: -200 (10 invalid messages: 10 × -20)
544
+ ─────────────────────────────────
545
+ Total: -1203 → Cannot publish (publishThreshold = -1000)
546
+
547
+ If the attacker sends 100 invalid messages quickly:
548
+
549
+ Topic P4: -2000 (100 invalid messages: 100 × -20)
550
+ ─────────────────────────────────
551
+ Total: -3003 → Graylisted (graylistThreshold = -2000)
552
+ → All RPCs ignored
553
+ ```
554
+
555
+ ### Example 6: Recovery After Attack
556
+
557
+ ```
558
+ Initial state: Total score -3003
559
+
560
+ After 4 slots (~5 min):
561
+ P4 decays to 1%: -2000 → -20
562
+ App score pinned at ban floor: -1000
563
+ Total: -1023 → Still banned, but no longer graylisted
564
+
565
+ For the rest of the ban window (default 24h):
566
+ Topic scores (P4, P3b) keep decaying toward 0
567
+ App score stays pinned at the ban floor: -1000 contribution
568
+ Total: ~-1000 → Remains banned (cannot publish)
569
+
570
+ After the ban expires:
571
+ The ban is lifted; the live app score (now decayed toward 0) takes over
572
+ Total: recovers, peer can participate again
573
+ ```
574
+
575
+ Unlike topic scores, the application ban score does **not** decay-recover during the ban window — that is the
576
+ point of the ban duration (see above). A banned peer is held for the full `P2P_PEER_BAN_DURATION_SECONDS`.
577
+
578
+ ## Network Outage Analysis
579
+
580
+ What happens when a peer experiences a network outage and stops delivering messages?
581
+
582
+ ### During the Outage
583
+
584
+ While the peer is disconnected:
585
+
586
+ 1. **P3 penalty accumulates**: The message delivery counter decays toward 0, causing increasing P3 penalty
587
+ 2. **Max P3 penalty reached**: Once counter drops below threshold, penalty hits -34 per topic (-68 default, -102 with block proposal scoring)
588
+ 3. **Mesh pruning**: Topic score goes negative → peer is pruned from mesh
589
+ 4. **P3b captures penalty**: The P3 deficit at prune time becomes P3b (sticky penalty)
590
+
591
+ ### Outage Timeline
592
+
593
+ | Time | Event | Score Impact |
594
+ |------|-------|--------------|
595
+ | 0s | Outage begins | P3 = 0 |
596
+ | ~1 decay window (2-5 slots) | Counter decays below threshold | P3 starts decreasing |
597
+ | ~1-2 decay windows | Counter approaches 0 | P3 ≈ -34 per topic |
598
+ | ~1-2 decay windows | Peer pruned from mesh | P3b ≈ -34 per topic |
599
+ | Thereafter | P3b decays slowly | Recovery begins |
600
+
601
+ Note: If the peer just joined the mesh, P3 penalties only start after
602
+ `meshMessageDeliveriesActivation` (10-25 slots depending on topic frequency).
603
+
604
+ ### Key Insight: No Application Penalties
605
+
606
+ During a network outage, the peer:
607
+ - **Does NOT send invalid messages** → No P4 penalty
608
+ - **Does NOT violate protocols** → No application-level penalty
609
+ - **Only accumulates topic-level penalties** → Max -68 (default) or -102 (with block proposal scoring)
610
+
611
+ This is the crucial difference from malicious behavior:
612
+
613
+ | Scenario | App Score | Topic Score | Total | Threshold Hit |
614
+ |----------|-----------|-------------|-------|---------------|
615
+ | Network outage | 0 | -68 (default) / -102 (block scoring on) | -68 / -102 | None |
616
+ | Validation failure | -50 | -20 | -520 | gossipThreshold |
617
+ | Malicious peer | -100 | -2000+ | -2100+ | graylistThreshold |
618
+
619
+ ### Recovery After Outage
620
+
621
+ When the peer reconnects:
622
+
623
+ 1. **Peer re-joins mesh**: Can request graft (topic score must be > 0 for acceptance)
624
+ 2. **P3b decays**: To ~1% over decay window (2-5 slots depending on topic)
625
+ 3. **P1 restarts from 0**: timeInMesh counter begins accumulating
626
+ 4. **P2 restarts from 0**: firstMessageDeliveries counter begins accumulating
627
+
628
+ **Recovery timeline:**
629
+ - Immediate: Peer can attempt to re-graft
630
+ - ~3-5 minutes: P3b decays to near-zero
631
+ - ~10+ minutes: P1 builds up again (if staying in mesh)
632
+
633
+ ### Why This Design Works
634
+
635
+ The system correctly distinguishes between:
636
+
637
+ | Behavior | Treatment |
638
+ |----------|-----------|
639
+ | **Network issues** | Pruned from mesh (stops slowing propagation), can recover quickly |
640
+ | **Protocol violations** | Disconnected (gossipThreshold), must wait for app score decay |
641
+ | **Malicious activity** | Banned/graylisted, requires both app and topic score decay |
642
+
643
+ A peer experiencing network problems will:
644
+ - Be temporarily removed from mesh propagation (good for network health)
645
+ - NOT be disconnected or banned (they haven't misbehaved)
646
+ - Recover automatically when connectivity returns
647
+ - Retain their connections for recovery
648
+
649
+ This matches Ethereum's approach: **honest peers with temporary issues are inconvenienced but not punished**.
650
+
651
+ ### Rate Limiting During Outages
652
+
653
+ Note: Simply not sending messages does NOT trigger rate limit penalties. Rate limits apply to:
654
+ - **Per-peer rate limit exceeded** → HighToleranceError (2 points)
655
+ - **Other protocol violations** → MidToleranceError or LowToleranceError depending on severity
656
+
657
+ A peer that sends nothing receives no rate limit penalties. The only penalty for not delivering messages is P3, which is explicitly designed to be recoverable.
658
+
659
+ ## References
660
+
661
+ - [Gossipsub v1.1 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md)
662
+ - [Lighthouse Scoring Implementation](https://github.com/sigp/lighthouse/blob/stable/beacon_node/lighthouse_network/src/peer_manager/score.rs)
663
+ - [Lodestar Scoring Implementation](https://github.com/ChainSafe/lodestar/tree/unstable/packages/beacon-node/src/network/gossip)
@@ -0,0 +1,2 @@
1
+ export * from './scoring.js';
2
+ export * from './topic_score_params.js';