@aztec/p2p 0.67.1 → 0.68.1

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 (211) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +5 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +17 -15
  4. package/dest/client/factory.d.ts +19 -0
  5. package/dest/client/factory.d.ts.map +1 -0
  6. package/dest/client/factory.js +40 -0
  7. package/dest/client/index.d.ts +1 -15
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +2 -37
  10. package/dest/client/p2p_client.d.ts +6 -6
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +12 -11
  13. package/dest/config.d.ts +1 -1
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +3 -3
  16. package/dest/errors/reqresp.error.d.ts +12 -1
  17. package/dest/errors/reqresp.error.d.ts.map +1 -1
  18. package/dest/errors/reqresp.error.js +15 -2
  19. package/dest/index.d.ts +2 -2
  20. package/dest/index.d.ts.map +1 -1
  21. package/dest/index.js +3 -3
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +171 -0
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -0
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  29. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -0
  30. package/dest/mem_pools/interface.d.ts +4 -3
  31. package/dest/mem_pools/interface.d.ts.map +1 -1
  32. package/dest/mocks/index.d.ts +7 -6
  33. package/dest/mocks/index.d.ts.map +1 -1
  34. package/dest/mocks/index.js +8 -8
  35. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
  36. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
  37. package/dest/msg_validators/attestation_validator/attestation_validator.js +19 -0
  38. package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
  39. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
  40. package/dest/msg_validators/attestation_validator/index.js +2 -0
  41. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
  42. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
  43. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -0
  44. package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
  45. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
  46. package/dest/msg_validators/block_proposal_validator/index.js +2 -0
  47. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +8 -0
  48. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -0
  49. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +16 -0
  50. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +2 -0
  51. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +1 -0
  52. package/dest/msg_validators/epoch_proof_quote_validator/index.js +2 -0
  53. package/dest/msg_validators/index.d.ts +4 -0
  54. package/dest/msg_validators/index.d.ts.map +1 -0
  55. package/dest/msg_validators/index.js +4 -0
  56. package/dest/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.d.ts +1 -1
  57. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
  58. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +34 -0
  59. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
  60. package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.js +1 -1
  61. package/dest/{tx_validator → msg_validators/tx_validator}/double_spend_validator.d.ts +3 -2
  62. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
  63. package/dest/msg_validators/tx_validator/double_spend_validator.js +56 -0
  64. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
  65. package/dest/{tx_validator → msg_validators/tx_validator}/index.js +1 -1
  66. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
  67. package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.js +1 -1
  68. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
  69. package/dest/msg_validators/tx_validator/tx_proof_validator.js +29 -0
  70. package/dest/services/data_store.d.ts.map +1 -0
  71. package/dest/services/data_store.js +188 -0
  72. package/dest/{service → services/discv5}/discV5_service.d.ts +3 -9
  73. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  74. package/dest/services/discv5/discV5_service.js +139 -0
  75. package/dest/services/dummy_service.d.ts.map +1 -0
  76. package/dest/{service → services}/dummy_service.js +1 -1
  77. package/dest/{service → services}/encoding.d.ts +5 -0
  78. package/dest/services/encoding.d.ts.map +1 -0
  79. package/dest/services/encoding.js +65 -0
  80. package/dest/services/index.d.ts +3 -0
  81. package/dest/services/index.d.ts.map +1 -0
  82. package/dest/services/index.js +3 -0
  83. package/dest/services/libp2p/libp2p_service.d.ts +222 -0
  84. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  85. package/dest/services/libp2p/libp2p_service.js +697 -0
  86. package/dest/services/peer-scoring/peer_scoring.d.ts +25 -0
  87. package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
  88. package/dest/services/peer-scoring/peer_scoring.js +75 -0
  89. package/dest/services/peer_manager.d.ts +60 -0
  90. package/dest/services/peer_manager.d.ts.map +1 -0
  91. package/dest/services/peer_manager.js +358 -0
  92. package/dest/services/reqresp/config.d.ts.map +1 -0
  93. package/dest/{service → services}/reqresp/config.js +1 -1
  94. package/dest/services/reqresp/handlers.d.ts.map +1 -0
  95. package/dest/{service → services}/reqresp/handlers.js +1 -1
  96. package/dest/services/reqresp/index.d.ts.map +1 -0
  97. package/dest/{service → services}/reqresp/index.js +1 -1
  98. package/dest/services/reqresp/interface.d.ts.map +1 -0
  99. package/dest/{service → services}/reqresp/interface.js +1 -1
  100. package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
  101. package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
  102. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -5
  103. package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
  104. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +7 -2
  105. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
  106. package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
  107. package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
  108. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  109. package/dest/services/reqresp/reqresp.js +279 -0
  110. package/dest/services/service.d.ts.map +1 -0
  111. package/dest/{service → services}/service.js +1 -1
  112. package/dest/services/types.d.ts +38 -0
  113. package/dest/services/types.d.ts.map +1 -0
  114. package/dest/services/types.js +43 -0
  115. package/package.json +14 -11
  116. package/src/bootstrap/bootstrap.ts +25 -20
  117. package/src/client/factory.ts +97 -0
  118. package/src/client/index.ts +1 -73
  119. package/src/client/p2p_client.ts +28 -15
  120. package/src/config.ts +2 -2
  121. package/src/errors/reqresp.error.ts +15 -1
  122. package/src/index.ts +2 -2
  123. package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
  124. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
  125. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
  126. package/src/mem_pools/interface.ts +5 -3
  127. package/src/mocks/index.ts +16 -10
  128. package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -0
  129. package/src/msg_validators/attestation_validator/index.ts +1 -0
  130. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +29 -0
  131. package/src/msg_validators/block_proposal_validator/index.ts +1 -0
  132. package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +22 -0
  133. package/src/msg_validators/epoch_proof_quote_validator/index.ts +1 -0
  134. package/src/msg_validators/index.ts +3 -0
  135. package/src/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.ts +5 -3
  136. package/src/{tx_validator → msg_validators/tx_validator}/double_spend_validator.ts +6 -8
  137. package/src/{service → services/discv5}/discV5_service.ts +19 -23
  138. package/src/{service → services}/encoding.ts +21 -3
  139. package/src/services/index.ts +2 -0
  140. package/src/{service → services/libp2p}/libp2p_service.ts +350 -90
  141. package/src/{service → services/peer-scoring}/peer_scoring.ts +27 -23
  142. package/src/services/peer_manager.ts +422 -0
  143. package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +2 -1
  144. package/src/{service → services}/reqresp/reqresp.ts +86 -20
  145. package/src/services/types.ts +44 -0
  146. package/dest/service/data_store.d.ts.map +0 -1
  147. package/dest/service/data_store.js +0 -188
  148. package/dest/service/discV5_service.d.ts.map +0 -1
  149. package/dest/service/discV5_service.js +0 -144
  150. package/dest/service/dummy_service.d.ts.map +0 -1
  151. package/dest/service/encoding.d.ts.map +0 -1
  152. package/dest/service/encoding.js +0 -49
  153. package/dest/service/index.d.ts +0 -3
  154. package/dest/service/index.d.ts.map +0 -1
  155. package/dest/service/index.js +0 -3
  156. package/dest/service/libp2p_service.d.ts +0 -136
  157. package/dest/service/libp2p_service.d.ts.map +0 -1
  158. package/dest/service/libp2p_service.js +0 -500
  159. package/dest/service/peer_manager.d.ts +0 -33
  160. package/dest/service/peer_manager.d.ts.map +0 -1
  161. package/dest/service/peer_manager.js +0 -214
  162. package/dest/service/peer_scoring.d.ts +0 -35
  163. package/dest/service/peer_scoring.d.ts.map +0 -1
  164. package/dest/service/peer_scoring.js +0 -72
  165. package/dest/service/reqresp/config.d.ts.map +0 -1
  166. package/dest/service/reqresp/handlers.d.ts.map +0 -1
  167. package/dest/service/reqresp/index.d.ts.map +0 -1
  168. package/dest/service/reqresp/interface.d.ts.map +0 -1
  169. package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
  170. package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
  171. package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  172. package/dest/service/reqresp/reqresp.d.ts.map +0 -1
  173. package/dest/service/reqresp/reqresp.js +0 -230
  174. package/dest/service/service.d.ts.map +0 -1
  175. package/dest/tx_validator/aggregate_tx_validator.d.ts.map +0 -1
  176. package/dest/tx_validator/aggregate_tx_validator.js +0 -32
  177. package/dest/tx_validator/data_validator.d.ts.map +0 -1
  178. package/dest/tx_validator/double_spend_validator.d.ts.map +0 -1
  179. package/dest/tx_validator/double_spend_validator.js +0 -56
  180. package/dest/tx_validator/index.d.ts.map +0 -1
  181. package/dest/tx_validator/metadata_validator.d.ts.map +0 -1
  182. package/dest/tx_validator/tx_proof_validator.d.ts.map +0 -1
  183. package/dest/tx_validator/tx_proof_validator.js +0 -29
  184. package/src/service/index.ts +0 -2
  185. package/src/service/peer_manager.ts +0 -266
  186. /package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.d.ts +0 -0
  187. /package/dest/{tx_validator → msg_validators/tx_validator}/index.d.ts +0 -0
  188. /package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.d.ts +0 -0
  189. /package/dest/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.d.ts +0 -0
  190. /package/dest/{service → services}/data_store.d.ts +0 -0
  191. /package/dest/{service → services}/dummy_service.d.ts +0 -0
  192. /package/dest/{service → services}/reqresp/config.d.ts +0 -0
  193. /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
  194. /package/dest/{service → services}/reqresp/index.d.ts +0 -0
  195. /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
  196. /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
  197. /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
  198. /package/dest/{service → services}/service.d.ts +0 -0
  199. /package/src/{tx_validator → msg_validators/tx_validator}/data_validator.ts +0 -0
  200. /package/src/{tx_validator → msg_validators/tx_validator}/index.ts +0 -0
  201. /package/src/{tx_validator → msg_validators/tx_validator}/metadata_validator.ts +0 -0
  202. /package/src/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.ts +0 -0
  203. /package/src/{service → services}/data_store.ts +0 -0
  204. /package/src/{service → services}/dummy_service.ts +0 -0
  205. /package/src/{service → services}/reqresp/config.ts +0 -0
  206. /package/src/{service → services}/reqresp/handlers.ts +0 -0
  207. /package/src/{service → services}/reqresp/index.ts +0 -0
  208. /package/src/{service → services}/reqresp/interface.ts +0 -0
  209. /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
  210. /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
  211. /package/src/{service → services}/service.ts +0 -0
@@ -0,0 +1,97 @@
1
+ import {
2
+ type ClientProtocolCircuitVerifier,
3
+ type L2BlockSource,
4
+ P2PClientType,
5
+ type WorldStateSynchronizer,
6
+ } from '@aztec/circuit-types';
7
+ import { type EpochCache } from '@aztec/epoch-cache';
8
+ import { createLogger } from '@aztec/foundation/log';
9
+ import { type AztecKVStore } from '@aztec/kv-store';
10
+ import { type DataStoreConfig } from '@aztec/kv-store/config';
11
+ import { createStore } from '@aztec/kv-store/lmdb';
12
+ import { type TelemetryClient } from '@aztec/telemetry-client';
13
+ import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
14
+
15
+ import { P2PClient } from '../client/p2p_client.js';
16
+ import { type P2PConfig } from '../config.js';
17
+ import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
18
+ import { InMemoryAttestationPool } from '../mem_pools/attestation_pool/memory_attestation_pool.js';
19
+ import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
20
+ import { MemoryEpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js';
21
+ import { type MemPools } from '../mem_pools/interface.js';
22
+ import { AztecKVTxPool, type TxPool } from '../mem_pools/tx_pool/index.js';
23
+ import { DiscV5Service } from '../services/discv5/discV5_service.js';
24
+ import { DummyP2PService } from '../services/dummy_service.js';
25
+ import { LibP2PService } from '../services/index.js';
26
+ import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
27
+
28
+ type P2PClientDeps<T extends P2PClientType> = {
29
+ txPool?: TxPool;
30
+ store?: AztecKVStore;
31
+ attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
32
+ epochProofQuotePool?: EpochProofQuotePool;
33
+ };
34
+
35
+ export const createP2PClient = async <T extends P2PClientType>(
36
+ clientType: T,
37
+ _config: P2PConfig & DataStoreConfig,
38
+ l2BlockSource: L2BlockSource,
39
+ proofVerifier: ClientProtocolCircuitVerifier,
40
+ worldStateSynchronizer: WorldStateSynchronizer,
41
+ epochCache: EpochCache,
42
+ telemetry: TelemetryClient = new NoopTelemetryClient(),
43
+ deps: P2PClientDeps<T> = {},
44
+ ) => {
45
+ let config = { ..._config };
46
+ const logger = createLogger('p2p');
47
+ const store = deps.store ?? (await createStore('p2p', config, createLogger('p2p:lmdb')));
48
+
49
+ const mempools: MemPools<T> = {
50
+ txPool: deps.txPool ?? new AztecKVTxPool(store, telemetry),
51
+ epochProofQuotePool: deps.epochProofQuotePool ?? new MemoryEpochProofQuotePool(telemetry),
52
+ attestationPool:
53
+ clientType === P2PClientType.Full
54
+ ? ((deps.attestationPool ?? new InMemoryAttestationPool(telemetry)) as T extends P2PClientType.Full
55
+ ? AttestationPool
56
+ : undefined)
57
+ : undefined,
58
+ };
59
+
60
+ let p2pService;
61
+
62
+ if (_config.p2pEnabled) {
63
+ logger.verbose('P2P is enabled. Using LibP2P service.');
64
+ config = await configureP2PClientAddresses(_config);
65
+
66
+ // Create peer discovery service
67
+ const peerIdPrivateKey = await getPeerIdPrivateKey(config, store);
68
+ const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
69
+ const discoveryService = new DiscV5Service(peerId, config, telemetry);
70
+
71
+ p2pService = await LibP2PService.new<T>(
72
+ clientType,
73
+ config,
74
+ discoveryService,
75
+ peerId,
76
+ mempools,
77
+ l2BlockSource,
78
+ epochCache,
79
+ proofVerifier,
80
+ worldStateSynchronizer,
81
+ store,
82
+ telemetry,
83
+ );
84
+ } else {
85
+ logger.verbose('P2P is disabled. Using dummy P2P service');
86
+ p2pService = new DummyP2PService();
87
+ }
88
+ return new P2PClient(
89
+ clientType,
90
+ store,
91
+ l2BlockSource,
92
+ mempools,
93
+ p2pService,
94
+ config.keepProvenTxsInPoolFor,
95
+ telemetry,
96
+ );
97
+ };
@@ -1,74 +1,2 @@
1
- import type { ClientProtocolCircuitVerifier, L2BlockSource, WorldStateSynchronizer } from '@aztec/circuit-types';
2
- import { createLogger } from '@aztec/foundation/log';
3
- import { type AztecKVStore } from '@aztec/kv-store';
4
- import { type DataStoreConfig } from '@aztec/kv-store/config';
5
- import { createStore } from '@aztec/kv-store/lmdb';
6
- import { type TelemetryClient } from '@aztec/telemetry-client';
7
- import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
8
-
9
- import { P2PClient } from '../client/p2p_client.js';
10
- import { type P2PConfig } from '../config.js';
11
- import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
12
- import { InMemoryAttestationPool } from '../mem_pools/attestation_pool/memory_attestation_pool.js';
13
- import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
14
- import { MemoryEpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js';
15
- import { type MemPools } from '../mem_pools/interface.js';
16
- import { AztecKVTxPool, type TxPool } from '../mem_pools/tx_pool/index.js';
17
- import { DiscV5Service } from '../service/discV5_service.js';
18
- import { DummyP2PService } from '../service/dummy_service.js';
19
- import { LibP2PService } from '../service/index.js';
20
- import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
21
-
22
1
  export * from './p2p_client.js';
23
-
24
- export const createP2PClient = async (
25
- _config: P2PConfig & DataStoreConfig,
26
- l2BlockSource: L2BlockSource,
27
- proofVerifier: ClientProtocolCircuitVerifier,
28
- worldStateSynchronizer: WorldStateSynchronizer,
29
- telemetry: TelemetryClient = new NoopTelemetryClient(),
30
- deps: {
31
- txPool?: TxPool;
32
- store?: AztecKVStore;
33
- attestationPool?: AttestationPool;
34
- epochProofQuotePool?: EpochProofQuotePool;
35
- } = {},
36
- ) => {
37
- let config = { ..._config };
38
- const logger = createLogger('p2p');
39
- const store = deps.store ?? (await createStore('p2p', config, createLogger('p2p:lmdb')));
40
-
41
- const mempools: MemPools = {
42
- txPool: deps.txPool ?? new AztecKVTxPool(store, telemetry),
43
- attestationPool: deps.attestationPool ?? new InMemoryAttestationPool(telemetry),
44
- epochProofQuotePool: deps.epochProofQuotePool ?? new MemoryEpochProofQuotePool(telemetry),
45
- };
46
-
47
- let p2pService;
48
-
49
- if (_config.p2pEnabled) {
50
- logger.verbose('P2P is enabled. Using LibP2P service.');
51
- config = await configureP2PClientAddresses(_config);
52
-
53
- // Create peer discovery service
54
- const peerIdPrivateKey = await getPeerIdPrivateKey(config, store);
55
- const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
56
- const discoveryService = new DiscV5Service(peerId, config, telemetry);
57
-
58
- p2pService = await LibP2PService.new(
59
- config,
60
- discoveryService,
61
- peerId,
62
- mempools,
63
- l2BlockSource,
64
- proofVerifier,
65
- worldStateSynchronizer,
66
- store,
67
- telemetry,
68
- );
69
- } else {
70
- logger.verbose('P2P is disabled. Using dummy P2P service');
71
- p2pService = new DummyP2PService();
72
- }
73
- return new P2PClient(store, l2BlockSource, mempools, p2pService, config.keepProvenTxsInPoolFor, telemetry);
74
- };
2
+ export * from './factory.js';
@@ -5,10 +5,10 @@ import {
5
5
  type L2Block,
6
6
  type L2BlockId,
7
7
  type L2BlockSource,
8
- L2BlockStream,
9
8
  type L2BlockStreamEvent,
10
9
  type L2Tips,
11
10
  type P2PApi,
11
+ type P2PClientType,
12
12
  type PeerInfo,
13
13
  type Tx,
14
14
  type TxHash,
@@ -16,7 +16,13 @@ import {
16
16
  import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js/constants';
17
17
  import { createLogger } from '@aztec/foundation/log';
18
18
  import { type AztecKVStore, type AztecMap, type AztecSingleton } from '@aztec/kv-store';
19
- import { Attributes, type TelemetryClient, WithTracer, trackSpan } from '@aztec/telemetry-client';
19
+ import {
20
+ Attributes,
21
+ type TelemetryClient,
22
+ TraceableL2BlockStream,
23
+ WithTracer,
24
+ trackSpan,
25
+ } from '@aztec/telemetry-client';
20
26
  import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
21
27
 
22
28
  import { type ENR } from '@chainsafe/enr';
@@ -26,8 +32,8 @@ import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_
26
32
  import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
27
33
  import { type MemPools } from '../mem_pools/interface.js';
28
34
  import { type TxPool } from '../mem_pools/tx_pool/index.js';
29
- import { TX_REQ_PROTOCOL } from '../service/reqresp/interface.js';
30
- import type { P2PService } from '../service/service.js';
35
+ import { TX_REQ_PROTOCOL } from '../services/reqresp/interface.js';
36
+ import type { P2PService } from '../services/service.js';
31
37
 
32
38
  /**
33
39
  * Enum defining the possible states of the p2p client.
@@ -56,7 +62,7 @@ export interface P2PSyncState {
56
62
  /**
57
63
  * Interface of a P2P client.
58
64
  **/
59
- export interface P2P extends P2PApi {
65
+ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApi<T> & {
60
66
  /**
61
67
  * Broadcasts a block proposal to other peers.
62
68
  *
@@ -166,12 +172,15 @@ export interface P2P extends P2PApi {
166
172
 
167
173
  /** Identifies a p2p client. */
168
174
  isP2PClient(): true;
169
- }
175
+ };
170
176
 
171
177
  /**
172
178
  * The P2P client implementation.
173
179
  */
174
- export class P2PClient extends WithTracer implements P2P {
180
+ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
181
+ extends WithTracer
182
+ implements P2P, P2P<P2PClientType.Prover>
183
+ {
175
184
  /** Property that indicates whether the client is running. */
176
185
  private stopping = false;
177
186
 
@@ -189,7 +198,7 @@ export class P2PClient extends WithTracer implements P2P {
189
198
  private synchedProvenBlockNumber: AztecSingleton<number>;
190
199
 
191
200
  private txPool: TxPool;
192
- private attestationPool: AttestationPool;
201
+ private attestationPool: T extends P2PClientType.Full ? AttestationPool : undefined;
193
202
  private epochProofQuotePool: EpochProofQuotePool;
194
203
 
195
204
  /** How many slots to keep attestations for. */
@@ -207,9 +216,10 @@ export class P2PClient extends WithTracer implements P2P {
207
216
  * @param log - A logger.
208
217
  */
209
218
  constructor(
219
+ clientType: T,
210
220
  store: AztecKVStore,
211
221
  private l2BlockSource: L2BlockSource,
212
- mempools: MemPools,
222
+ mempools: MemPools<T>,
213
223
  private p2pService: P2PService,
214
224
  private keepProvenTxsFor: number,
215
225
  telemetry: TelemetryClient = new NoopTelemetryClient(),
@@ -221,7 +231,9 @@ export class P2PClient extends WithTracer implements P2P {
221
231
 
222
232
  this.keepAttestationsInPoolFor = keepAttestationsInPoolFor;
223
233
 
224
- this.blockStream = new L2BlockStream(l2BlockSource, this, this, createLogger('p2p:block_stream'), {
234
+ const tracer = telemetry.getTracer('P2PL2BlockStream');
235
+ const logger = createLogger('p2p:l2-block-stream');
236
+ this.blockStream = new TraceableL2BlockStream(l2BlockSource, this, this, tracer, 'P2PL2BlockStream', logger, {
225
237
  batchSize: blockRequestBatchSize,
226
238
  pollIntervalMS: blockCheckIntervalMS,
227
239
  });
@@ -231,8 +243,8 @@ export class P2PClient extends WithTracer implements P2P {
231
243
  this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
232
244
 
233
245
  this.txPool = mempools.txPool;
234
- this.attestationPool = mempools.attestationPool;
235
246
  this.epochProofQuotePool = mempools.epochProofQuotePool;
247
+ this.attestationPool = mempools.attestationPool!;
236
248
  }
237
249
 
238
250
  public isP2PClient(): true {
@@ -399,7 +411,7 @@ export class P2PClient extends WithTracer implements P2P {
399
411
  }
400
412
 
401
413
  public getAttestationsForSlot(slot: bigint, proposalId: string): Promise<BlockAttestation[]> {
402
- return Promise.resolve(this.attestationPool.getAttestationsForSlot(slot, proposalId));
414
+ return Promise.resolve(this.attestationPool?.getAttestationsForSlot(slot, proposalId) ?? []);
403
415
  }
404
416
 
405
417
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
@@ -644,16 +656,17 @@ export class P2PClient extends WithTracer implements P2P {
644
656
  // We delete attestations older than the last block slot minus the number of slots we want to keep in the pool.
645
657
  const lastBlockSlotMinusKeepAttestationsInPoolFor = lastBlockSlot - BigInt(this.keepAttestationsInPoolFor);
646
658
  if (lastBlockSlotMinusKeepAttestationsInPoolFor >= BigInt(INITIAL_L2_BLOCK_NUM)) {
647
- await this.attestationPool.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor);
659
+ await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor);
648
660
  }
649
661
 
650
- await this.synchedProvenBlockNumber.set(lastBlockNum);
651
- this.log.debug(`Synched to proven block ${lastBlockNum}`);
652
662
  const provenEpochNumber = await this.l2BlockSource.getProvenL2EpochNumber();
653
663
  if (provenEpochNumber !== undefined) {
654
664
  this.epochProofQuotePool.deleteQuotesToEpoch(BigInt(provenEpochNumber));
655
665
  }
656
666
 
667
+ await this.synchedProvenBlockNumber.set(lastBlockNum);
668
+ this.log.debug(`Synched to proven block ${lastBlockNum}`);
669
+
657
670
  await this.startServiceIfSynched();
658
671
  }
659
672
 
package/src/config.ts CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  } from '@aztec/foundation/config';
9
9
  import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
10
10
 
11
- import { type P2PReqRespConfig, p2pReqRespConfigMappings } from './service/reqresp/config.js';
11
+ import { type P2PReqRespConfig, p2pReqRespConfigMappings } from './services/reqresp/config.js';
12
12
 
13
13
  /**
14
14
  * P2P client configuration values.
@@ -170,7 +170,7 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
170
170
  peerCheckIntervalMS: {
171
171
  env: 'P2P_PEER_CHECK_INTERVAL_MS',
172
172
  description: 'The frequency in which to check for new peers.',
173
- ...numberConfigHelper(1_000),
173
+ ...numberConfigHelper(30_000),
174
174
  },
175
175
  l2QueueSize: {
176
176
  env: 'P2P_L2_QUEUE_SIZE',
@@ -3,7 +3,7 @@
3
3
  * This error will be thrown when a request to a specific peer times out.
4
4
  * @category Errors
5
5
  */
6
- export class IndiviualReqRespTimeoutError extends Error {
6
+ export class IndividualReqRespTimeoutError extends Error {
7
7
  constructor() {
8
8
  super(`Request to peer timed out`);
9
9
  }
@@ -19,3 +19,17 @@ export class CollectiveReqRespTimeoutError extends Error {
19
19
  super(`Request to all peers timed out`);
20
20
  }
21
21
  }
22
+
23
+ /** Invalid response error
24
+ *
25
+ * This error will be thrown when a response is received that is not valid.
26
+ *
27
+ * This error does not need to be punished as message validators will handle punishing invalid
28
+ * requests
29
+ * @category Errors
30
+ */
31
+ export class InvalidResponseError extends Error {
32
+ constructor() {
33
+ super(`Invalid response received`);
34
+ }
35
+ }
package/src/index.ts CHANGED
@@ -3,6 +3,6 @@ export * from './bootstrap/bootstrap.js';
3
3
  export * from './client/index.js';
4
4
  export * from './config.js';
5
5
  export * from './mem_pools/epoch_proof_quote_pool/index.js';
6
- export * from './service/index.js';
6
+ export * from './services/index.js';
7
7
  export * from './mem_pools/tx_pool/index.js';
8
- export * from './tx_validator/index.js';
8
+ export * from './msg_validators/index.js';
@@ -39,6 +39,16 @@ export interface AttestationPool {
39
39
  */
40
40
  deleteAttestationsForSlot(slot: bigint): Promise<void>;
41
41
 
42
+ /**
43
+ * Delete Attestations for slot and proposal
44
+ *
45
+ * Removes all attestations associated with a slot and proposal
46
+ *
47
+ * @param slot - The slot to delete.
48
+ * @param proposalId - The proposal to delete.
49
+ */
50
+ deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void>;
51
+
42
52
  /**
43
53
  * Get Attestations for slot
44
54
  *
@@ -0,0 +1,237 @@
1
+ import { type BlockAttestation, TxHash } from '@aztec/circuit-types';
2
+ import { Secp256k1Signer } from '@aztec/foundation/crypto';
3
+ import { Fr } from '@aztec/foundation/fields';
4
+
5
+ import { jest } from '@jest/globals';
6
+ import { type MockProxy, mock } from 'jest-mock-extended';
7
+
8
+ import { type PoolInstrumentation } from '../instrumentation.js';
9
+ import { type AttestationPool } from './attestation_pool.js';
10
+ import { mockAttestation } from './mocks.js';
11
+
12
+ const NUMBER_OF_SIGNERS_PER_TEST = 4;
13
+
14
+ export function describeAttestationPool(getAttestationPool: () => AttestationPool) {
15
+ let ap: AttestationPool;
16
+ let signers: Secp256k1Signer[];
17
+
18
+ // Check that metrics are recorded correctly
19
+ let metricsMock: MockProxy<PoolInstrumentation<BlockAttestation>>;
20
+
21
+ beforeEach(() => {
22
+ ap = getAttestationPool();
23
+ signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
24
+
25
+ metricsMock = mock<PoolInstrumentation<BlockAttestation>>();
26
+ // Can i overwrite this like this??
27
+ (ap as any).metrics = metricsMock;
28
+ });
29
+
30
+ const createAttestationsForSlot = (slotNumber: number) => {
31
+ const archive = Fr.random();
32
+ return signers.map(signer => mockAttestation(signer, slotNumber, archive));
33
+ };
34
+
35
+ // We compare buffers as the objects can have cached values attached to them which are not serialised
36
+ // using array containing as the kv store does not respect insertion order
37
+ const compareAttestations = (a1: BlockAttestation[], a2: BlockAttestation[]) => {
38
+ const a1Buffer = a1.map(attestation => attestation.toBuffer());
39
+ const a2Buffer = a2.map(attestation => attestation.toBuffer());
40
+ expect(a1Buffer.length).toBe(a2Buffer.length);
41
+ expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
42
+ };
43
+
44
+ it('should add attestations to pool', async () => {
45
+ const slotNumber = 420;
46
+ const archive = Fr.random();
47
+ const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
48
+
49
+ await ap.addAttestations(attestations);
50
+
51
+ // Check metrics have been updated.
52
+ expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length);
53
+
54
+ const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString());
55
+
56
+ expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
57
+
58
+ compareAttestations(retreivedAttestations, attestations);
59
+
60
+ // Delete by slot
61
+ await ap.deleteAttestationsForSlot(BigInt(slotNumber));
62
+
63
+ expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length);
64
+
65
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString());
66
+ expect(retreivedAttestationsAfterDelete.length).toBe(0);
67
+ });
68
+
69
+ it('Should handle duplicate proposals in a slot', async () => {
70
+ const slotNumber = 420;
71
+ const archive = Fr.random();
72
+ const txs = [0, 1, 2, 3, 4, 5].map(() => TxHash.random());
73
+
74
+ // Use the same signer for all attestations
75
+ const attestations: BlockAttestation[] = [];
76
+ const signer = signers[0];
77
+ for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
78
+ attestations.push(mockAttestation(signer, slotNumber, archive, txs));
79
+ }
80
+
81
+ await ap.addAttestations(attestations);
82
+
83
+ const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString());
84
+ expect(retreivedAttestations.length).toBe(1);
85
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
86
+ expect(retreivedAttestations[0].payload.txHashes).toEqual(txs);
87
+ expect(retreivedAttestations[0].getSender().toString()).toEqual(signer.address.toString());
88
+ });
89
+
90
+ it('Should store attestations by differing slot', async () => {
91
+ const slotNumbers = [1, 2, 3, 4];
92
+ const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i]));
93
+
94
+ await ap.addAttestations(attestations);
95
+
96
+ for (const attestation of attestations) {
97
+ const slot = attestation.payload.header.globalVariables.slotNumber;
98
+ const archive = attestation.archive.toString();
99
+
100
+ const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), archive);
101
+ expect(retreivedAttestations.length).toBe(1);
102
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
103
+ expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot);
104
+ }
105
+ });
106
+
107
+ it('Should store attestations by differing slot and archive', async () => {
108
+ const slotNumbers = [1, 1, 2, 3];
109
+ const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()];
110
+ const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i]));
111
+
112
+ await ap.addAttestations(attestations);
113
+
114
+ for (const attestation of attestations) {
115
+ const slot = attestation.payload.header.globalVariables.slotNumber;
116
+ const proposalId = attestation.archive.toString();
117
+
118
+ const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), proposalId);
119
+ expect(retreivedAttestations.length).toBe(1);
120
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
121
+ expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot);
122
+ }
123
+ });
124
+
125
+ it('Should delete attestations', async () => {
126
+ const slotNumber = 420;
127
+ const archive = Fr.random();
128
+ const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
129
+ const proposalId = attestations[0].archive.toString();
130
+
131
+ await ap.addAttestations(attestations);
132
+
133
+ expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length);
134
+
135
+ const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
136
+ expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
137
+ compareAttestations(retreivedAttestations, attestations);
138
+
139
+ await ap.deleteAttestations(attestations);
140
+
141
+ expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length);
142
+
143
+ const gottenAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
144
+ expect(gottenAfterDelete.length).toBe(0);
145
+ });
146
+
147
+ it('Should blanket delete attestations per slot', async () => {
148
+ const slotNumber = 420;
149
+ const archive = Fr.random();
150
+ const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive)));
151
+ const proposalId = attestations[0].archive.toString();
152
+
153
+ await ap.addAttestations(attestations);
154
+
155
+ const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
156
+ expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
157
+ compareAttestations(retreivedAttestations, attestations);
158
+
159
+ await ap.deleteAttestationsForSlot(BigInt(slotNumber));
160
+
161
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
162
+ expect(retreivedAttestationsAfterDelete.length).toBe(0);
163
+ });
164
+
165
+ it('Should blanket delete attestations per slot and proposal', async () => {
166
+ const slotNumber = 420;
167
+ const archive = Fr.random();
168
+ const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
169
+ const proposalId = attestations[0].archive.toString();
170
+
171
+ // Add another set of attestations with a different proposalId, yet the same slot
172
+ const archive2 = Fr.random();
173
+ const attestations2 = signers.map(signer => mockAttestation(signer, slotNumber, archive2));
174
+ const proposalId2 = attestations2[0].archive.toString();
175
+
176
+ await ap.addAttestations(attestations);
177
+ await ap.addAttestations(attestations2);
178
+
179
+ expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length);
180
+ expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations2.length);
181
+
182
+ const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
183
+ expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
184
+ compareAttestations(retreivedAttestations, attestations);
185
+
186
+ await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
187
+
188
+ expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length);
189
+
190
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
191
+ expect(retreivedAttestationsAfterDelete.length).toBe(0);
192
+
193
+ const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlot(
194
+ BigInt(slotNumber),
195
+ proposalId2,
196
+ );
197
+ expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
198
+ compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
199
+ });
200
+
201
+ it('Should blanket delete attestations per slot and proposal (does not perform db ops if there are no attestations)', async () => {
202
+ const slotNumber = 420;
203
+ const proposalId = 'proposalId';
204
+
205
+ const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
206
+ expect(retreivedAttestations.length).toBe(0);
207
+
208
+ await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
209
+
210
+ expect(metricsMock.recordRemovedObjects).toHaveBeenCalledTimes(0);
211
+ });
212
+
213
+ it('Should delete attestations older than a given slot', async () => {
214
+ const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
215
+ const attestations = slotNumbers.map(slotNumber => createAttestationsForSlot(slotNumber)).flat();
216
+ const proposalId = attestations[0].archive.toString();
217
+
218
+ await ap.addAttestations(attestations);
219
+
220
+ const attestationsForSlot1 = await ap.getAttestationsForSlot(BigInt(1), proposalId);
221
+ expect(attestationsForSlot1.length).toBe(signers.length);
222
+
223
+ const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
224
+
225
+ await ap.deleteAttestationsOlderThan(BigInt(73));
226
+
227
+ const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlot(BigInt(1), proposalId);
228
+ expect(attestationsForSlot1AfterDelete.length).toBe(0);
229
+
230
+ expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
231
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1));
232
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2));
233
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3));
234
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69));
235
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72));
236
+ });
237
+ }