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

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 (239) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/client/factory.d.ts +1 -1
  4. package/dest/client/index.d.ts +1 -1
  5. package/dest/client/interface.d.ts +4 -2
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +8 -26
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +22 -16
  10. package/dest/config.d.ts +60 -54
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +11 -1
  13. package/dest/enr/generate-enr.d.ts +1 -1
  14. package/dest/enr/index.d.ts +1 -1
  15. package/dest/errors/attestation-pool.error.d.ts +7 -0
  16. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  17. package/dest/errors/attestation-pool.error.js +12 -0
  18. package/dest/errors/reqresp.error.d.ts +1 -1
  19. package/dest/errors/reqresp.error.d.ts.map +1 -1
  20. package/dest/index.d.ts +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +28 -6
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +33 -32
  26. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +13 -6
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +40 -17
  30. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +11 -6
  31. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +30 -8
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts +224 -3
  34. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/mocks.js +1 -1
  36. package/dest/mem_pools/index.d.ts +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts +3 -1
  38. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  39. package/dest/mem_pools/instrumentation.js +11 -2
  40. package/dest/mem_pools/interface.d.ts +1 -1
  41. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +4 -38
  42. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool/index.d.ts +1 -1
  44. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +4 -3
  45. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool/memory_tx_pool.js +1 -0
  47. package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
  48. package/dest/mem_pools/tx_pool/tx_pool.d.ts +4 -3
  49. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  51. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +5 -4
  53. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -3
  54. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  55. package/dest/msg_validators/attestation_validator/attestation_validator.js +11 -11
  56. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  57. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  58. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +67 -0
  59. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  60. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  61. package/dest/msg_validators/attestation_validator/index.js +1 -0
  62. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +1 -1
  63. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
  64. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -9
  65. package/dest/msg_validators/block_proposal_validator/index.d.ts +1 -1
  66. package/dest/msg_validators/index.d.ts +1 -1
  67. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  68. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  69. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  70. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  71. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  72. package/dest/msg_validators/tx_validator/archive_cache.d.ts +1 -1
  73. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  74. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
  75. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  77. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -1
  79. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  80. package/dest/msg_validators/tx_validator/factory.d.ts +3 -2
  81. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  82. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/index.d.ts +1 -1
  85. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  86. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/tx_validator/phases_validator.d.ts +1 -1
  88. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/tx_validator/phases_validator.js +3 -1
  90. package/dest/msg_validators/tx_validator/test_utils.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  92. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +1 -1
  94. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  96. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  97. package/dest/services/data_store.d.ts +1 -1
  98. package/dest/services/data_store.d.ts.map +1 -1
  99. package/dest/services/discv5/discV5_service.d.ts +1 -1
  100. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  101. package/dest/services/dummy_service.d.ts +1 -1
  102. package/dest/services/dummy_service.d.ts.map +1 -1
  103. package/dest/services/encoding.d.ts +1 -1
  104. package/dest/services/encoding.d.ts.map +1 -1
  105. package/dest/services/gossipsub/scoring.d.ts +1 -1
  106. package/dest/services/index.d.ts +1 -1
  107. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  108. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  109. package/dest/services/libp2p/instrumentation.js +9 -2
  110. package/dest/services/libp2p/libp2p_service.d.ts +11 -67
  111. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  112. package/dest/services/libp2p/libp2p_service.js +227 -57
  113. package/dest/services/peer-manager/interface.d.ts +1 -1
  114. package/dest/services/peer-manager/metrics.d.ts +3 -1
  115. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  116. package/dest/services/peer-manager/metrics.js +11 -0
  117. package/dest/services/peer-manager/peer_manager.d.ts +1 -32
  118. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  119. package/dest/services/peer-manager/peer_manager.js +2 -0
  120. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  121. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  122. package/dest/services/peer-manager/peer_scoring.js +40 -2
  123. package/dest/services/reqresp/config.d.ts +1 -1
  124. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +1 -1
  125. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  126. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -4
  127. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  128. package/dest/services/reqresp/index.d.ts +1 -1
  129. package/dest/services/reqresp/interface.d.ts +1 -1
  130. package/dest/services/reqresp/interface.d.ts.map +1 -1
  131. package/dest/services/reqresp/metrics.d.ts +1 -1
  132. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  133. package/dest/services/reqresp/protocols/auth.d.ts +1 -1
  134. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  135. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  136. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  137. package/dest/services/reqresp/protocols/block.js +2 -1
  138. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
  139. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  140. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  141. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +3 -5
  142. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  143. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  144. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  145. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  146. package/dest/services/reqresp/protocols/index.d.ts +1 -1
  147. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  148. package/dest/services/reqresp/protocols/status.d.ts +6 -5
  149. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  150. package/dest/services/reqresp/protocols/status.js +4 -3
  151. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  152. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  153. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
  154. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  155. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  156. package/dest/services/reqresp/reqresp.d.ts +1 -41
  157. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  158. package/dest/services/reqresp/status.d.ts +2 -2
  159. package/dest/services/reqresp/status.d.ts.map +1 -1
  160. package/dest/services/service.d.ts +1 -1
  161. package/dest/services/tx_collection/config.d.ts +1 -1
  162. package/dest/services/tx_collection/fast_tx_collection.d.ts +4 -9
  163. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  164. package/dest/services/tx_collection/index.d.ts +1 -1
  165. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  166. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  167. package/dest/services/tx_collection/slow_tx_collection.d.ts +4 -5
  168. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  169. package/dest/services/tx_collection/slow_tx_collection.js +2 -1
  170. package/dest/services/tx_collection/tx_collection.d.ts +9 -9
  171. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  172. package/dest/services/tx_collection/tx_collection.js +1 -1
  173. package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
  174. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  175. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  176. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  177. package/dest/services/tx_provider.d.ts +5 -4
  178. package/dest/services/tx_provider.d.ts.map +1 -1
  179. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  180. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  181. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  182. package/dest/test-helpers/get-ports.d.ts +1 -1
  183. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  184. package/dest/test-helpers/index.d.ts +1 -1
  185. package/dest/test-helpers/make-enrs.d.ts +1 -1
  186. package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
  187. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  188. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  189. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  190. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  191. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  192. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  193. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  194. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  195. package/dest/testbench/p2p_client_testbench_worker.js +11 -8
  196. package/dest/testbench/parse_log_file.d.ts +1 -1
  197. package/dest/testbench/testbench.d.ts +1 -1
  198. package/dest/testbench/worker_client_manager.d.ts +1 -1
  199. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  200. package/dest/types/index.d.ts +1 -1
  201. package/dest/util.d.ts +2 -1
  202. package/dest/util.d.ts.map +1 -1
  203. package/dest/util.js +11 -2
  204. package/dest/versioning.d.ts +1 -1
  205. package/package.json +19 -18
  206. package/src/client/interface.ts +4 -1
  207. package/src/client/p2p_client.ts +37 -29
  208. package/src/config.ts +18 -1
  209. package/src/errors/attestation-pool.error.ts +13 -0
  210. package/src/mem_pools/attestation_pool/attestation_pool.ts +29 -5
  211. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +45 -32
  212. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +65 -23
  213. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +50 -16
  214. package/src/mem_pools/attestation_pool/mocks.ts +1 -1
  215. package/src/mem_pools/instrumentation.ts +13 -0
  216. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +7 -6
  217. package/src/mem_pools/tx_pool/memory_tx_pool.ts +8 -6
  218. package/src/mem_pools/tx_pool/tx_pool.ts +3 -2
  219. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +5 -4
  220. package/src/msg_validators/attestation_validator/attestation_validator.ts +13 -15
  221. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +91 -0
  222. package/src/msg_validators/attestation_validator/index.ts +1 -0
  223. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +25 -9
  224. package/src/msg_validators/tx_validator/factory.ts +2 -1
  225. package/src/msg_validators/tx_validator/phases_validator.ts +3 -1
  226. package/src/msg_validators/tx_validator/timestamp_validator.ts +2 -1
  227. package/src/services/libp2p/instrumentation.ts +10 -1
  228. package/src/services/libp2p/libp2p_service.ts +255 -66
  229. package/src/services/peer-manager/metrics.ts +10 -0
  230. package/src/services/peer-manager/peer_manager.ts +2 -0
  231. package/src/services/peer-manager/peer_scoring.ts +46 -3
  232. package/src/services/reqresp/protocols/block.ts +2 -1
  233. package/src/services/reqresp/protocols/status.ts +9 -8
  234. package/src/services/tx_collection/fast_tx_collection.ts +3 -2
  235. package/src/services/tx_collection/slow_tx_collection.ts +5 -4
  236. package/src/services/tx_collection/tx_collection.ts +9 -8
  237. package/src/services/tx_provider.ts +4 -3
  238. package/src/testbench/p2p_client_testbench_worker.ts +8 -5
  239. package/src/util.ts +12 -2
@@ -1,3 +1,4 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { Fr } from '@aztec/foundation/fields';
2
3
  import { toArray } from '@aztec/foundation/iterable';
3
4
  import { type Logger, createLogger } from '@aztec/foundation/log';
@@ -37,7 +38,7 @@ export class AztecKVTxPool extends (EventEmitter as new () => TypedEventEmitter<
37
38
  txPoolOverflowFactor: number = 1;
38
39
 
39
40
  /** Index from tx hash to the block number in which they were mined, filtered by mined txs. */
40
- #minedTxHashToBlock: AztecAsyncMap<string, number>;
41
+ #minedTxHashToBlock: AztecAsyncMap<string, BlockNumber>;
41
42
 
42
43
  /** Index from tx priority (stored as hex) to its tx hash, filtered by pending txs. */
43
44
  #pendingTxPriorityToHash: AztecAsyncMultiMap<string, string>;
@@ -49,10 +50,10 @@ export class AztecKVTxPool extends (EventEmitter as new () => TypedEventEmitter<
49
50
  #pendingTxHashToHeaderHash: AztecAsyncMap<string, string>;
50
51
 
51
52
  /** Map from tx hash to the block number it was originally mined in (for soft-deleted txs). */
52
- #deletedMinedTxHashes: AztecAsyncMap<string, number>;
53
+ #deletedMinedTxHashes: AztecAsyncMap<string, BlockNumber>;
53
54
 
54
55
  /** MultiMap from block number to deleted mined tx hashes for efficient cleanup. */
55
- #blockToDeletedMinedTxHash: AztecAsyncMultiMap<number, string>;
56
+ #blockToDeletedMinedTxHash: AztecAsyncMultiMap<BlockNumber, string>;
56
57
 
57
58
  /** The cumulative tx size in bytes that the pending txs in the pool take up. */
58
59
  #pendingTxSize: AztecAsyncSingleton<number>;
@@ -222,7 +223,7 @@ export class AztecKVTxPool extends (EventEmitter as new () => TypedEventEmitter<
222
223
  return vals.map(TxHash.fromString);
223
224
  }
224
225
 
225
- public async getMinedTxHashes(): Promise<[TxHash, number][]> {
226
+ public async getMinedTxHashes(): Promise<[TxHash, BlockNumber][]> {
226
227
  const vals = await toArray(this.#minedTxHashToBlock.entriesAsync());
227
228
  return vals.map(([txHash, blockNumber]) => [TxHash.fromString(txHash), blockNumber]);
228
229
  }
@@ -441,10 +442,10 @@ export class AztecKVTxPool extends (EventEmitter as new () => TypedEventEmitter<
441
442
  * @param blockNumber - Block number threshold. Deleted mined txs from this block or earlier will be permanently deleted.
442
443
  * @returns The number of transactions permanently deleted.
443
444
  */
444
- public async cleanupDeletedMinedTxs(blockNumber: number): Promise<number> {
445
+ public async cleanupDeletedMinedTxs(blockNumber: BlockNumber): Promise<number> {
445
446
  let deletedCount = 0;
446
447
  const txHashesToDelete: string[] = [];
447
- const blocksToDelete: number[] = [];
448
+ const blocksToDelete: BlockNumber[] = [];
448
449
 
449
450
  await this.#store.transactionAsync(async () => {
450
451
  // Iterate through all entries and check block numbers
@@ -1,3 +1,4 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import type { TypedEventEmitter } from '@aztec/foundation/types';
3
4
  import type { TxAddedToPoolStats } from '@aztec/stdlib/stats';
@@ -18,10 +19,11 @@ export class InMemoryTxPool extends (EventEmitter as new () => TypedEventEmitter
18
19
  * Our tx pool, stored as a Map in-memory, with K: tx hash and V: the transaction.
19
20
  */
20
21
  private txs: Map<bigint, Tx>;
21
- private minedTxs: Map<bigint, number>;
22
+ private minedTxs: Map<bigint, BlockNumber>;
22
23
  private pendingTxs: Set<bigint>;
23
- private deletedMinedTxHashes: Map<bigint, number>;
24
- private blockToDeletedMinedTxHash: Map<number, Set<bigint>>;
24
+ private deletedMinedTxHashes: Map<bigint, BlockNumber>;
25
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
26
+ private blockToDeletedMinedTxHash: Map<BlockNumber, Set<bigint>>;
25
27
 
26
28
  private metrics: PoolInstrumentation<Tx>;
27
29
 
@@ -108,7 +110,7 @@ export class InMemoryTxPool extends (EventEmitter as new () => TypedEventEmitter
108
110
  });
109
111
  }
110
112
 
111
- public getMinedTxHashes(): Promise<[TxHash, number][]> {
113
+ public getMinedTxHashes(): Promise<[TxHash, BlockNumber][]> {
112
114
  return Promise.resolve(
113
115
  Array.from(this.minedTxs.entries()).map(([txHash, blockNumber]) => [TxHash.fromBigInt(txHash), blockNumber]),
114
116
  );
@@ -253,9 +255,9 @@ export class InMemoryTxPool extends (EventEmitter as new () => TypedEventEmitter
253
255
  * @param blockNumber - Block number threshold. Deleted mined txs from this block or earlier will be permanently deleted.
254
256
  * @returns The number of transactions permanently deleted.
255
257
  */
256
- public cleanupDeletedMinedTxs(blockNumber: number): Promise<number> {
258
+ public cleanupDeletedMinedTxs(blockNumber: BlockNumber): Promise<number> {
257
259
  let deletedCount = 0;
258
- const blocksToDelete: number[] = [];
260
+ const blocksToDelete: BlockNumber[] = [];
259
261
 
260
262
  // Find all blocks up to the specified block number
261
263
  for (const [block, txHashes] of this.blockToDeletedMinedTxHash.entries()) {
@@ -1,3 +1,4 @@
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import type { TypedEventEmitter } from '@aztec/foundation/types';
2
3
  import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
3
4
 
@@ -102,7 +103,7 @@ export interface TxPool extends TypedEventEmitter<TxPoolEvents> {
102
103
  * Gets the hashes of mined transactions currently in the tx pool.
103
104
  * @returns An array of mined transaction hashes found in the tx pool.
104
105
  */
105
- getMinedTxHashes(): Promise<[tx: TxHash, blockNumber: number][]>;
106
+ getMinedTxHashes(): Promise<[tx: TxHash, blockNumber: BlockNumber][]>;
106
107
 
107
108
  /**
108
109
  * Returns whether the given tx hash is flagged as pending, mined, or deleted.
@@ -131,5 +132,5 @@ export interface TxPool extends TypedEventEmitter<TxPoolEvents> {
131
132
  * @param blockNumber - Block number threshold. Deleted mined txs from this block or earlier will be permanently deleted.
132
133
  * @returns The number of transactions permanently deleted.
133
134
  */
134
- cleanupDeletedMinedTxs(blockNumber: number): Promise<number>;
135
+ cleanupDeletedMinedTxs(blockNumber: BlockNumber): Promise<number>;
135
136
  }
@@ -1,3 +1,4 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { unfreeze } from '@aztec/foundation/types';
2
3
  import { GasFees } from '@aztec/stdlib/gas';
3
4
  import { mockTx } from '@aztec/stdlib/testing';
@@ -13,7 +14,7 @@ export function describeTxPool(getTxPool: () => TxPool) {
13
14
  let pool: TxPool;
14
15
 
15
16
  const minedBlockHeader = BlockHeader.empty({
16
- globalVariables: GlobalVariables.empty({ blockNumber: 1, timestamp: 0n }),
17
+ globalVariables: GlobalVariables.empty({ blockNumber: BlockNumber(1), timestamp: 0n }),
17
18
  });
18
19
 
19
20
  beforeEach(() => {
@@ -261,7 +262,7 @@ export function describeTxPool(getTxPool: () => TxPool) {
261
262
  await pool.deleteTxs([txs[0].getTxHash(), txs[1].getTxHash()]);
262
263
 
263
264
  // Clean up deleted mined txs from block 1 and earlier
264
- const deletedCount = await pool.cleanupDeletedMinedTxs(1);
265
+ const deletedCount = await pool.cleanupDeletedMinedTxs(BlockNumber(1));
265
266
 
266
267
  // Verify old transactions are permanently deleted
267
268
  expect(deletedCount).toBe(2);
@@ -276,7 +277,7 @@ export function describeTxPool(getTxPool: () => TxPool) {
276
277
 
277
278
  // Mark as mined in block 2
278
279
  const laterBlockHeader = BlockHeader.empty({
279
- globalVariables: GlobalVariables.empty({ blockNumber: 2, timestamp: 0n }),
280
+ globalVariables: GlobalVariables.empty({ blockNumber: BlockNumber(2), timestamp: 0n }),
280
281
  });
281
282
  await pool.markAsMined([txs[0].getTxHash()], laterBlockHeader);
282
283
 
@@ -284,7 +285,7 @@ export function describeTxPool(getTxPool: () => TxPool) {
284
285
  await pool.deleteTxs([txs[0].getTxHash()]);
285
286
 
286
287
  // Try to clean up with block 1 (before the mined block)
287
- const deletedCount = await pool.cleanupDeletedMinedTxs(1);
288
+ const deletedCount = await pool.cleanupDeletedMinedTxs(BlockNumber(1));
288
289
 
289
290
  // Verify no transactions were cleaned up
290
291
  expect(deletedCount).toBe(0);
@@ -4,8 +4,8 @@ import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { type BlockAttestation, type P2PValidator, PeerErrorSeverity } from '@aztec/stdlib/p2p';
5
5
 
6
6
  export class AttestationValidator implements P2PValidator<BlockAttestation> {
7
- private epochCache: EpochCacheInterface;
8
- private logger: Logger;
7
+ protected epochCache: EpochCacheInterface;
8
+ protected logger: Logger;
9
9
 
10
10
  constructor(epochCache: EpochCacheInterface) {
11
11
  this.epochCache = epochCache;
@@ -13,47 +13,45 @@ export class AttestationValidator implements P2PValidator<BlockAttestation> {
13
13
  }
14
14
 
15
15
  async validate(message: BlockAttestation): Promise<PeerErrorSeverity | undefined> {
16
- const slotNumberBigInt = message.payload.header.slotNumber.toBigInt();
16
+ const slotNumber = message.payload.header.slotNumber;
17
17
 
18
18
  try {
19
19
  const { currentProposer, nextProposer, currentSlot, nextSlot } =
20
20
  await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
21
21
 
22
- if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
23
- this.logger.warn(
24
- `Attestation slot ${slotNumberBigInt} is not current (${currentSlot}) or next (${nextSlot}) slot`,
25
- );
22
+ if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
23
+ this.logger.warn(`Attestation slot ${slotNumber} is not current (${currentSlot}) or next (${nextSlot}) slot`);
26
24
  return PeerErrorSeverity.HighToleranceError;
27
25
  }
28
26
 
29
27
  // Verify the signature is valid
30
28
  const attester = message.getSender();
31
29
  if (attester === undefined) {
32
- this.logger.warn(`Invalid signature in attestation for slot ${slotNumberBigInt}`);
30
+ this.logger.warn(`Invalid signature in attestation for slot ${slotNumber}`);
33
31
  return PeerErrorSeverity.LowToleranceError;
34
32
  }
35
33
 
36
34
  // Verify the attester is in the committee for this slot
37
- if (!(await this.epochCache.isInCommittee(slotNumberBigInt, attester))) {
38
- this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${slotNumberBigInt}`);
35
+ if (!(await this.epochCache.isInCommittee(slotNumber, attester))) {
36
+ this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${slotNumber}`);
39
37
  return PeerErrorSeverity.HighToleranceError;
40
38
  }
41
39
 
42
40
  // Verify the proposer signature matches the expected proposer for this slot
43
41
  const proposer = message.getProposer();
44
- const expectedProposer = slotNumberBigInt === currentSlot ? currentProposer : nextProposer;
42
+ const expectedProposer = slotNumber === currentSlot ? currentProposer : nextProposer;
45
43
  if (!expectedProposer) {
46
- this.logger.warn(`No proposer defined for slot ${slotNumberBigInt}`);
44
+ this.logger.warn(`No proposer defined for slot ${slotNumber}`);
47
45
  return PeerErrorSeverity.HighToleranceError;
48
46
  }
49
47
  if (!proposer) {
50
- this.logger.warn(`Invalid proposer signature in attestation for slot ${slotNumberBigInt}`);
48
+ this.logger.warn(`Invalid proposer signature in attestation for slot ${slotNumber}`);
51
49
  return PeerErrorSeverity.LowToleranceError;
52
50
  }
53
51
  if (!proposer.equals(expectedProposer)) {
54
52
  this.logger.warn(
55
53
  `Proposer signature mismatch in attestation. ` +
56
- `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${slotNumberBigInt}`,
54
+ `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${slotNumber}`,
57
55
  );
58
56
  return PeerErrorSeverity.HighToleranceError;
59
57
  }
@@ -62,7 +60,7 @@ export class AttestationValidator implements P2PValidator<BlockAttestation> {
62
60
  } catch (e) {
63
61
  // People shouldn't be sending us attestations if the committee doesn't exist
64
62
  if (e instanceof NoCommitteeError) {
65
- this.logger.warn(`No committee exists for attestation for slot ${slotNumberBigInt}`);
63
+ this.logger.warn(`No committee exists for attestation for slot ${slotNumber}`);
66
64
  return PeerErrorSeverity.LowToleranceError;
67
65
  }
68
66
  throw e;
@@ -0,0 +1,91 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type BlockAttestation, PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ import { Attributes, Metrics, type TelemetryClient, ValueType } from '@aztec/telemetry-client';
4
+
5
+ import type { AttestationPool } from '../../mem_pools/attestation_pool/attestation_pool.js';
6
+ import { AttestationValidator } from './attestation_validator.js';
7
+
8
+ /**
9
+ * FishermanAttestationValidator extends the base AttestationValidator to add
10
+ * additional validation for fisherman nodes: verifying that attestations sign
11
+ * the same payload as the original proposal.
12
+ * Invalid attestations are rejected (not propagated), but peer penalization is
13
+ * handled by LibP2PService based on the fishermanMode config to ensure a better
14
+ * view of the network.
15
+ */
16
+ export class FishermanAttestationValidator extends AttestationValidator {
17
+ private invalidAttestationCounter;
18
+
19
+ constructor(
20
+ epochCache: EpochCacheInterface,
21
+ private attestationPool: AttestationPool,
22
+ telemetryClient: TelemetryClient,
23
+ ) {
24
+ super(epochCache);
25
+ this.logger = this.logger.createChild('[FISHERMAN]');
26
+
27
+ const meter = telemetryClient.getMeter('FishermanAttestationValidator');
28
+ this.invalidAttestationCounter = meter.createUpDownCounter(Metrics.VALIDATOR_INVALID_ATTESTATION_RECEIVED_COUNT, {
29
+ description: 'The number of invalid attestations received',
30
+ valueType: ValueType.INT,
31
+ });
32
+ }
33
+
34
+ override async validate(message: BlockAttestation): Promise<PeerErrorSeverity | undefined> {
35
+ // First run the standard validation
36
+ const baseValidationResult = await super.validate(message);
37
+ if (baseValidationResult !== undefined) {
38
+ // Track base validation failures (invalid signature, wrong committee, etc.)
39
+ this.invalidAttestationCounter.add(1, {
40
+ [Attributes.ERROR_TYPE]: 'base_validation_failed',
41
+ });
42
+ return baseValidationResult;
43
+ }
44
+
45
+ // fisherman validation: verify attestation payload matches proposal payload
46
+ const slotNumberBigInt = message.payload.header.slotNumber;
47
+ const attester = message.getSender();
48
+ const proposer = message.getProposer();
49
+
50
+ if (!attester || !proposer) {
51
+ return undefined;
52
+ }
53
+
54
+ const proposalId = message.archive.toString();
55
+ const proposal = await this.attestationPool.getBlockProposal(proposalId);
56
+
57
+ if (proposal) {
58
+ // Compare the attestation payload with the proposal payload
59
+ if (!message.payload.equals(proposal.payload)) {
60
+ this.logger.error(
61
+ `Attestation payload mismatch for slot ${slotNumberBigInt}! ` +
62
+ `Attester ${attester.toString()} signed different data than the proposal.`,
63
+ {
64
+ slot: slotNumberBigInt.toString(),
65
+ attester: attester.toString(),
66
+ proposer: proposer.toString(),
67
+ proposalArchive: proposal.archive.toString(),
68
+ attestationArchive: message.archive.toString(),
69
+ proposalHeader: proposal.payload.header.hash().toString(),
70
+ attestationHeader: message.payload.header.hash().toString(),
71
+ },
72
+ );
73
+
74
+ // Track invalid attestation metric
75
+ this.invalidAttestationCounter.add(1, {
76
+ [Attributes.ERROR_TYPE]: 'payload_mismatch',
77
+ });
78
+
79
+ // Return error to reject the message, but LibP2PService won't penalize in fisherman mode
80
+ return PeerErrorSeverity.LowToleranceError;
81
+ }
82
+ } else {
83
+ // We might receive attestations before proposals in some cases
84
+ this.logger.debug(
85
+ `Received attestation for slot ${slotNumberBigInt} but proposal not found yet. ` + `Proposal ID: ${proposalId}`,
86
+ );
87
+ }
88
+
89
+ return undefined;
90
+ }
91
+ }
@@ -1 +1,2 @@
1
1
  export * from './attestation_validator.js';
2
+ export * from './fisherman_attestation_validator.js';
@@ -24,26 +24,42 @@ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
24
24
  }
25
25
 
26
26
  // Check if transactions are permitted when the proposal contains transaction hashes
27
- if (!this.txsPermitted && block.txHashes.length > 0) {
27
+ const embeddedTxCount = block.txs?.length ?? 0;
28
+ if (!this.txsPermitted && (block.txHashes.length > 0 || embeddedTxCount > 0)) {
28
29
  this.logger.debug(
29
30
  `Penalizing peer for block proposal with ${block.txHashes.length} transaction(s) when transactions are not permitted`,
30
31
  );
31
32
  return PeerErrorSeverity.MidToleranceError;
32
33
  }
33
34
 
35
+ // If there are embedded txs, they must be listed in txHashes; if there are no txHashes, there must be no txs
36
+ const hashSet = new Set(block.txHashes.map(h => h.toString()));
37
+ const missingTxHashes =
38
+ embeddedTxCount > 0
39
+ ? block.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
40
+ : [];
41
+ if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
42
+ this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
43
+ embeddedTxCount,
44
+ txHashesLength: block.txHashes.length,
45
+ missingTxHashes,
46
+ });
47
+ return PeerErrorSeverity.MidToleranceError;
48
+ }
49
+
34
50
  const { currentProposer, nextProposer, currentSlot, nextSlot } =
35
51
  await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
36
52
 
37
53
  // Check that the attestation is for the current or next slot
38
- const slotNumberBigInt = block.payload.header.slotNumber.toBigInt();
39
- if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
40
- this.logger.debug(`Penalizing peer for invalid slot number ${slotNumberBigInt}`, { currentSlot, nextSlot });
54
+ const slotNumber = block.payload.header.slotNumber;
55
+ if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
56
+ this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, { currentSlot, nextSlot });
41
57
  return PeerErrorSeverity.HighToleranceError;
42
58
  }
43
59
 
44
60
  // Check that the block proposal is from the current or next proposer
45
- if (slotNumberBigInt === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
46
- this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumberBigInt}`, {
61
+ if (slotNumber === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
62
+ this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
47
63
  currentProposer,
48
64
  nextProposer,
49
65
  proposer: proposer.toString(),
@@ -51,8 +67,8 @@ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
51
67
  return PeerErrorSeverity.MidToleranceError;
52
68
  }
53
69
 
54
- if (slotNumberBigInt === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
55
- this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumberBigInt}`, {
70
+ if (slotNumber === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
71
+ this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumber}`, {
56
72
  currentProposer,
57
73
  nextProposer,
58
74
  proposer: proposer.toString(),
@@ -64,7 +80,7 @@ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
64
80
  if (!(await Promise.all(block.txs?.map(tx => tx.validateTxHash()) ?? [])).every(v => v)) {
65
81
  this.logger.warn(`Penalizing peer for invalid tx hashes in block proposal`, {
66
82
  proposer,
67
- slotNumber: slotNumberBigInt,
83
+ slotNumber,
68
84
  });
69
85
  return PeerErrorSeverity.LowToleranceError;
70
86
  }
@@ -1,3 +1,4 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { Fr } from '@aztec/foundation/fields';
2
3
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
3
4
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
@@ -33,7 +34,7 @@ export interface MessageValidator {
33
34
 
34
35
  export function createTxMessageValidators(
35
36
  timestamp: UInt64,
36
- blockNumber: number,
37
+ blockNumber: BlockNumber,
37
38
  worldStateSynchronizer: WorldStateSynchronizer,
38
39
  gasFees: GasFees,
39
40
  l1ChainId: number,
@@ -26,10 +26,12 @@ export class PhasesTxValidator implements TxValidator<Tx> {
26
26
  }
27
27
 
28
28
  async validateTx(tx: Tx): Promise<TxValidationResult> {
29
+ this.contractsDB.createCheckpoint();
29
30
  try {
30
31
  // TODO(@spalladino): We add this just to handle public authwit-check calls during setup
31
32
  // which are needed for public FPC flows, but fail if the account contract hasnt been deployed yet,
32
33
  // which is what we're trying to do as part of the current txs.
34
+ // We only need to create/revert checkpoint here because of this addNewContracts call.
33
35
  await this.contractsDB.addNewContracts(tx);
34
36
 
35
37
  if (!tx.data.forPublic) {
@@ -58,7 +60,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
58
60
  this.#log.error(`Error validating phases for tx`, err);
59
61
  return { result: 'invalid', reason: [TX_ERROR_DURING_VALIDATION] };
60
62
  } finally {
61
- this.contractsDB.clearContractsForTx();
63
+ this.contractsDB.revertCheckpoint();
62
64
  }
63
65
  }
64
66
 
@@ -1,3 +1,4 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import {
3
4
  type AnyTx,
@@ -17,7 +18,7 @@ export class TimestampTxValidator<T extends AnyTx> implements TxValidator<T> {
17
18
  // being built.
18
19
  timestamp: UInt64;
19
20
  // Block number in which the tx is considered to be included.
20
- blockNumber: number;
21
+ blockNumber: BlockNumber;
21
22
  },
22
23
  ) {}
23
24
 
@@ -17,6 +17,7 @@ export class P2PInstrumentation {
17
17
  private messageValidationDuration: Histogram;
18
18
  private messagePrevalidationCount: UpDownCounter;
19
19
  private messageLatency: Histogram;
20
+ private txReceivedCount: UpDownCounter;
20
21
 
21
22
  private aggLatencyHisto = new Map<TopicType, RecordableHistogram>();
22
23
  private aggValidationHisto = new Map<TopicType, RecordableHistogram>();
@@ -44,6 +45,10 @@ export class P2PInstrumentation {
44
45
  valueType: ValueType.INT,
45
46
  });
46
47
 
48
+ this.txReceivedCount = meter.createUpDownCounter(Metrics.P2P_GOSSIP_TX_RECEIVED_COUNT, {
49
+ description: 'The number of txs received from the p2p network',
50
+ });
51
+
47
52
  this.aggLatencyMetrics = {
48
53
  avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_AVG, {
49
54
  valueType: ValueType.DOUBLE,
@@ -119,6 +124,10 @@ export class P2PInstrumentation {
119
124
  validationHistogram.record(Math.max(ms, 1));
120
125
  }
121
126
 
127
+ public incrementTxReceived(count: number) {
128
+ this.txReceivedCount.add(count);
129
+ }
130
+
122
131
  public incMessagePrevalidationStatus(passed: boolean, topicName: TopicType | undefined) {
123
132
  this.messagePrevalidationCount.add(1, { [Attributes.TOPIC_NAME]: topicName, [Attributes.OK]: passed });
124
133
  }
@@ -129,7 +138,7 @@ export class P2PInstrumentation {
129
138
 
130
139
  let latencyHistogram = this.aggLatencyHisto.get(topicName);
131
140
  if (!latencyHistogram) {
132
- latencyHistogram = createHistogram({ min: 1, max: 24 * 60 * 60 * 1000 }); // 24hrs
141
+ latencyHistogram = createHistogram({ min: 1, max: 60 * 1000 }); // Max: 1 minute
133
142
  this.aggLatencyHisto.set(topicName, latencyHistogram);
134
143
  }
135
144