@aztec/p2p 0.66.0 → 0.67.1-devnet

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 (163) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +21 -9
  4. package/dest/client/index.d.ts +5 -4
  5. package/dest/client/index.d.ts.map +1 -1
  6. package/dest/client/index.js +18 -12
  7. package/dest/client/p2p_client.d.ts +13 -20
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +32 -15
  10. package/dest/config.d.ts +1 -1
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +2 -2
  13. package/dest/errors/reqresp.error.d.ts +12 -1
  14. package/dest/errors/reqresp.error.d.ts.map +1 -1
  15. package/dest/errors/reqresp.error.js +15 -2
  16. package/dest/index.d.ts +1 -1
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +2 -2
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +171 -0
  24. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -0
  25. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  26. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -0
  27. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +3 -3
  29. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  30. package/dest/mem_pools/instrumentation.js +2 -20
  31. package/dest/mem_pools/interface.d.ts +4 -3
  32. package/dest/mem_pools/interface.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +4 -4
  35. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool/memory_tx_pool.js +4 -4
  37. package/dest/mocks/index.d.ts +6 -6
  38. package/dest/mocks/index.d.ts.map +1 -1
  39. package/dest/mocks/index.js +9 -9
  40. package/dest/services/data_store.d.ts.map +1 -0
  41. package/dest/services/data_store.js +188 -0
  42. package/dest/{service → services/discv5}/discV5_service.d.ts +4 -2
  43. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  44. package/dest/services/discv5/discV5_service.js +144 -0
  45. package/dest/{service → services}/dummy_service.d.ts +3 -1
  46. package/dest/services/dummy_service.d.ts.map +1 -0
  47. package/dest/{service → services}/dummy_service.js +5 -1
  48. package/dest/{service → services}/encoding.d.ts +5 -0
  49. package/dest/services/encoding.d.ts.map +1 -0
  50. package/dest/services/encoding.js +65 -0
  51. package/dest/services/index.d.ts +3 -0
  52. package/dest/services/index.d.ts.map +1 -0
  53. package/dest/services/index.js +3 -0
  54. package/dest/{service → services/libp2p}/libp2p_service.d.ts +50 -11
  55. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  56. package/dest/services/libp2p/libp2p_service.js +573 -0
  57. package/dest/{service → services/peer-scoring}/peer_scoring.d.ts +5 -2
  58. package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
  59. package/dest/services/peer-scoring/peer_scoring.js +72 -0
  60. package/dest/{service → services}/peer_manager.d.ts +8 -3
  61. package/dest/services/peer_manager.d.ts.map +1 -0
  62. package/dest/services/peer_manager.js +230 -0
  63. package/dest/services/reqresp/config.d.ts.map +1 -0
  64. package/dest/{service → services}/reqresp/config.js +1 -1
  65. package/dest/services/reqresp/handlers.d.ts.map +1 -0
  66. package/dest/{service → services}/reqresp/handlers.js +1 -1
  67. package/dest/services/reqresp/index.d.ts.map +1 -0
  68. package/dest/{service → services}/reqresp/index.js +1 -1
  69. package/dest/services/reqresp/interface.d.ts.map +1 -0
  70. package/dest/{service → services}/reqresp/interface.js +1 -1
  71. package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
  72. package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
  73. package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
  74. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +2 -2
  75. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
  76. package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
  77. package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
  78. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  79. package/dest/{service → services}/reqresp/reqresp.js +69 -20
  80. package/dest/{service → services}/service.d.ts +2 -1
  81. package/dest/services/service.d.ts.map +1 -0
  82. package/dest/{service → services}/service.js +1 -1
  83. package/dest/tx_validator/aggregate_tx_validator.d.ts +1 -1
  84. package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  85. package/dest/tx_validator/aggregate_tx_validator.js +5 -3
  86. package/dest/tx_validator/data_validator.js +3 -3
  87. package/dest/tx_validator/double_spend_validator.d.ts +3 -2
  88. package/dest/tx_validator/double_spend_validator.d.ts.map +1 -1
  89. package/dest/tx_validator/double_spend_validator.js +8 -8
  90. package/dest/tx_validator/metadata_validator.js +3 -3
  91. package/dest/tx_validator/tx_proof_validator.js +3 -3
  92. package/package.json +12 -8
  93. package/src/bootstrap/bootstrap.ts +24 -10
  94. package/src/client/index.ts +44 -19
  95. package/src/client/p2p_client.ts +58 -36
  96. package/src/config.ts +1 -1
  97. package/src/errors/reqresp.error.ts +15 -1
  98. package/src/index.ts +1 -1
  99. package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
  100. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
  101. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
  102. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +2 -2
  103. package/src/mem_pools/instrumentation.ts +1 -21
  104. package/src/mem_pools/interface.ts +5 -3
  105. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +3 -3
  106. package/src/mem_pools/tx_pool/memory_tx_pool.ts +3 -3
  107. package/src/mocks/index.ts +14 -11
  108. package/src/{service → services/discv5}/discV5_service.ts +20 -15
  109. package/src/{service → services}/dummy_service.ts +6 -1
  110. package/src/{service → services}/encoding.ts +21 -3
  111. package/src/services/index.ts +2 -0
  112. package/src/{service → services/libp2p}/libp2p_service.ts +208 -96
  113. package/src/{service → services/peer-scoring}/peer_scoring.ts +9 -2
  114. package/src/{service → services}/peer_manager.ts +73 -24
  115. package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +1 -1
  116. package/src/{service → services}/reqresp/reqresp.ts +87 -21
  117. package/src/{service → services}/service.ts +3 -1
  118. package/src/tx_validator/aggregate_tx_validator.ts +5 -3
  119. package/src/tx_validator/data_validator.ts +2 -2
  120. package/src/tx_validator/double_spend_validator.ts +8 -10
  121. package/src/tx_validator/metadata_validator.ts +2 -2
  122. package/src/tx_validator/tx_proof_validator.ts +2 -2
  123. package/dest/service/data_store.d.ts.map +0 -1
  124. package/dest/service/data_store.js +0 -188
  125. package/dest/service/discV5_service.d.ts.map +0 -1
  126. package/dest/service/discV5_service.js +0 -141
  127. package/dest/service/dummy_service.d.ts.map +0 -1
  128. package/dest/service/encoding.d.ts.map +0 -1
  129. package/dest/service/encoding.js +0 -49
  130. package/dest/service/index.d.ts +0 -3
  131. package/dest/service/index.d.ts.map +0 -1
  132. package/dest/service/index.js +0 -3
  133. package/dest/service/libp2p_service.d.ts.map +0 -1
  134. package/dest/service/libp2p_service.js +0 -496
  135. package/dest/service/peer_manager.d.ts.map +0 -1
  136. package/dest/service/peer_manager.js +0 -176
  137. package/dest/service/peer_scoring.d.ts.map +0 -1
  138. package/dest/service/peer_scoring.js +0 -67
  139. package/dest/service/reqresp/config.d.ts.map +0 -1
  140. package/dest/service/reqresp/handlers.d.ts.map +0 -1
  141. package/dest/service/reqresp/index.d.ts.map +0 -1
  142. package/dest/service/reqresp/interface.d.ts.map +0 -1
  143. package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
  144. package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
  145. package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  146. package/dest/service/reqresp/reqresp.d.ts.map +0 -1
  147. package/dest/service/service.d.ts.map +0 -1
  148. package/src/service/index.ts +0 -2
  149. /package/dest/{service → services}/data_store.d.ts +0 -0
  150. /package/dest/{service → services}/reqresp/config.d.ts +0 -0
  151. /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
  152. /package/dest/{service → services}/reqresp/index.d.ts +0 -0
  153. /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
  154. /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
  155. /package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -0
  156. /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
  157. /package/src/{service → services}/data_store.ts +0 -0
  158. /package/src/{service → services}/reqresp/config.ts +0 -0
  159. /package/src/{service → services}/reqresp/handlers.ts +0 -0
  160. /package/src/{service → services}/reqresp/index.ts +0 -0
  161. /package/src/{service → services}/reqresp/interface.ts +0 -0
  162. /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
  163. /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
@@ -0,0 +1,153 @@
1
+ import { BlockAttestation } from '@aztec/circuit-types';
2
+ import { Fr } from '@aztec/foundation/fields';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+ import { type AztecKVStore, type AztecMapWithSize, type AztecMultiMap } from '@aztec/kv-store';
5
+ import { type TelemetryClient } from '@aztec/telemetry-client';
6
+
7
+ import { PoolInstrumentation, PoolName } from '../instrumentation.js';
8
+ import { type AttestationPool } from './attestation_pool.js';
9
+
10
+ export class KvAttestationPool implements AttestationPool {
11
+ private metrics: PoolInstrumentation<BlockAttestation>;
12
+
13
+ // Index of all proposal ids in a slot
14
+ private attestations: AztecMultiMap<string, string>;
15
+
16
+ constructor(
17
+ private store: AztecKVStore,
18
+ telemetry: TelemetryClient,
19
+ private log = createLogger('aztec:attestation_pool'),
20
+ ) {
21
+ this.attestations = store.openMultiMap('attestations');
22
+ this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL);
23
+ }
24
+
25
+ private getProposalMapKey(slot: string, proposalId: string): string {
26
+ return `proposal-${slot}-${proposalId}`;
27
+ }
28
+
29
+ /**
30
+ * Get the proposal map for a given slot and proposalId
31
+ *
32
+ * Essentially a nested mapping of address -> attestation
33
+ *
34
+ * @param slot - The slot to get the proposal map for
35
+ * @param proposalId - The proposalId to get the map for
36
+ * @returns The proposal map
37
+ */
38
+ private getProposalMap(slot: string, proposalId: string): AztecMapWithSize<string, Buffer> {
39
+ const mapKey = this.getProposalMapKey(slot, proposalId);
40
+ return this.store.openMapWithSize(mapKey);
41
+ }
42
+
43
+ public async addAttestations(attestations: BlockAttestation[]): Promise<void> {
44
+ for (const attestation of attestations) {
45
+ const slotNumber = attestation.payload.header.globalVariables.slotNumber.toString();
46
+ const proposalId = attestation.archive.toString();
47
+ const address = attestation.getSender().toString();
48
+
49
+ // Index the proposalId in the slot map
50
+ await this.attestations.set(slotNumber, proposalId);
51
+
52
+ // Store the actual attestation in the proposal map
53
+ const proposalMap = this.getProposalMap(slotNumber, proposalId);
54
+ await proposalMap.set(address, attestation.toBuffer());
55
+
56
+ this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`);
57
+ }
58
+
59
+ this.metrics.recordAddedObjects(attestations.length);
60
+ }
61
+
62
+ public getAttestationsForSlot(slot: bigint, proposalId: string): Promise<BlockAttestation[]> {
63
+ const slotNumber = new Fr(slot).toString();
64
+ const proposalMap = this.getProposalMap(slotNumber, proposalId);
65
+ const attestations = proposalMap.values();
66
+ const attestationsArray = Array.from(attestations).map(attestation => BlockAttestation.fromBuffer(attestation));
67
+ return Promise.resolve(attestationsArray);
68
+ }
69
+
70
+ public async deleteAttestationsOlderThan(oldestSlot: bigint): Promise<void> {
71
+ const olderThan = [];
72
+
73
+ const slots = this.attestations.keys();
74
+ for (const slot of slots) {
75
+ if (BigInt(slot) < oldestSlot) {
76
+ olderThan.push(slot);
77
+ }
78
+ }
79
+
80
+ await Promise.all(olderThan.map(oldSlot => this.deleteAttestationsForSlot(BigInt(oldSlot))));
81
+ return Promise.resolve();
82
+ }
83
+
84
+ public async deleteAttestationsForSlot(slot: bigint): Promise<void> {
85
+ const deletionPromises = [];
86
+
87
+ const slotString = new Fr(slot).toString();
88
+ let numberOfAttestations = 0;
89
+ const proposalIds = this.attestations.getValues(slotString);
90
+
91
+ if (proposalIds) {
92
+ for (const proposalId of proposalIds) {
93
+ const proposalMap = this.getProposalMap(slotString, proposalId);
94
+ numberOfAttestations += proposalMap.size();
95
+ deletionPromises.push(proposalMap.clear());
96
+ }
97
+ }
98
+
99
+ await Promise.all(deletionPromises);
100
+
101
+ this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
102
+ this.metrics.recordRemovedObjects(numberOfAttestations);
103
+ return Promise.resolve();
104
+ }
105
+
106
+ public async deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void> {
107
+ const deletionPromises = [];
108
+
109
+ const slotString = new Fr(slot).toString();
110
+ const exists = this.attestations.get(slotString);
111
+
112
+ if (exists) {
113
+ // Remove the proposalId from the slot index
114
+ deletionPromises.push(this.attestations.deleteValue(slotString, proposalId));
115
+
116
+ // Delete all attestations for the proposalId
117
+ const proposalMap = this.getProposalMap(slotString, proposalId);
118
+ const numberOfAttestations = proposalMap.size();
119
+ deletionPromises.push(proposalMap.clear());
120
+
121
+ this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
122
+ this.metrics.recordRemovedObjects(numberOfAttestations);
123
+ }
124
+
125
+ await Promise.all(deletionPromises);
126
+ return Promise.resolve();
127
+ }
128
+
129
+ public async deleteAttestations(attestations: BlockAttestation[]): Promise<void> {
130
+ const deletionPromises = [];
131
+
132
+ for (const attestation of attestations) {
133
+ const slotNumber = attestation.payload.header.globalVariables.slotNumber.toString();
134
+ const proposalId = attestation.archive.toString();
135
+ const proposalMap = this.getProposalMap(slotNumber, proposalId);
136
+
137
+ if (proposalMap) {
138
+ const address = attestation.getSender().toString();
139
+ deletionPromises.push(proposalMap.delete(address));
140
+ this.log.debug(`Deleted attestation for slot ${slotNumber} from ${address}`);
141
+ }
142
+
143
+ if (proposalMap.size() === 0) {
144
+ deletionPromises.push(this.attestations.deleteValue(slotNumber, proposalId));
145
+ }
146
+ }
147
+
148
+ await Promise.all(deletionPromises);
149
+
150
+ this.metrics.recordRemovedObjects(attestations.length);
151
+ return Promise.resolve();
152
+ }
153
+ }
@@ -1,5 +1,5 @@
1
1
  import { type BlockAttestation } from '@aztec/circuit-types';
2
- import { createDebugLogger } from '@aztec/foundation/log';
2
+ import { createLogger } from '@aztec/foundation/log';
3
3
  import { type TelemetryClient } from '@aztec/telemetry-client';
4
4
 
5
5
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
@@ -10,7 +10,7 @@ export class InMemoryAttestationPool implements AttestationPool {
10
10
 
11
11
  private attestations: Map</*slot=*/ bigint, Map</*proposalId*/ string, Map</*address=*/ string, BlockAttestation>>>;
12
12
 
13
- constructor(telemetry: TelemetryClient, private log = createDebugLogger('aztec:attestation_pool')) {
13
+ constructor(telemetry: TelemetryClient, private log = createLogger('p2p:attestation_pool')) {
14
14
  this.attestations = new Map();
15
15
  this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL);
16
16
  }
@@ -72,32 +72,12 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
72
72
  this.objectSize = meter.createHistogram(metricsLabels.objectSize, {
73
73
  unit: 'By',
74
74
  description: 'The size of transactions in the mempool',
75
- advice: {
76
- explicitBucketBoundaries: [
77
- 5_000, // 5KB
78
- 10_000,
79
- 20_000,
80
- 50_000,
81
- 75_000,
82
- 100_000, // 100KB
83
- 200_000,
84
- ],
85
- },
86
75
  });
87
76
 
88
77
  this.dbMetrics = new LmdbMetrics(
89
78
  meter,
90
79
  {
91
- name: Metrics.MEMPOOL_DB_MAP_SIZE,
92
- description: 'Database map size for the Tx mempool',
93
- },
94
- {
95
- name: Metrics.MEMPOOL_DB_USED_SIZE,
96
- description: 'Database used size for the Tx mempool',
97
- },
98
- {
99
- name: Metrics.MEMPOOL_DB_NUM_ITEMS,
100
- description: 'Num items in database for the Tx mempool',
80
+ [Attributes.DB_DATA_TYPE]: 'tx-pool',
101
81
  },
102
82
  dbStats,
103
83
  );
@@ -1,3 +1,5 @@
1
+ import { type P2PClientType } from '@aztec/circuit-types';
2
+
1
3
  import { type AttestationPool } from './attestation_pool/attestation_pool.js';
2
4
  import { type EpochProofQuotePool } from './epoch_proof_quote_pool/epoch_proof_quote_pool.js';
3
5
  import { type TxPool } from './tx_pool/tx_pool.js';
@@ -5,8 +7,8 @@ import { type TxPool } from './tx_pool/tx_pool.js';
5
7
  /**
6
8
  * A interface the combines all mempools
7
9
  */
8
- export interface MemPools {
10
+ export type MemPools<T extends P2PClientType = P2PClientType.Full> = {
9
11
  txPool: TxPool;
10
- attestationPool: AttestationPool;
12
+ attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
11
13
  epochProofQuotePool: EpochProofQuotePool;
12
- }
14
+ };
@@ -1,6 +1,6 @@
1
1
  import { Tx, TxHash } from '@aztec/circuit-types';
2
2
  import { type TxAddedToPoolStats } from '@aztec/circuit-types/stats';
3
- import { type Logger, createDebugLogger } from '@aztec/foundation/log';
3
+ import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { type AztecKVStore, type AztecMap, type AztecSet } from '@aztec/kv-store';
5
5
  import { type TelemetryClient } from '@aztec/telemetry-client';
6
6
 
@@ -30,7 +30,7 @@ export class AztecKVTxPool implements TxPool {
30
30
  * @param store - A KV store.
31
31
  * @param log - A logger.
32
32
  */
33
- constructor(store: AztecKVStore, telemetry: TelemetryClient, log = createDebugLogger('aztec:tx_pool')) {
33
+ constructor(store: AztecKVStore, telemetry: TelemetryClient, log = createLogger('p2p:tx_pool')) {
34
34
  this.#txs = store.openMap('txs');
35
35
  this.#minedTxs = store.openMap('minedTxs');
36
36
  this.#pendingTxs = store.openSet('pendingTxs');
@@ -125,7 +125,7 @@ export class AztecKVTxPool implements TxPool {
125
125
  let pendingCount = 0;
126
126
  for (const [i, tx] of txs.entries()) {
127
127
  const txHash = txHashes[i];
128
- this.#log.info(`Adding tx with id ${txHash.toString()}`, {
128
+ this.#log.verbose(`Adding tx ${txHash.toString()} to pool`, {
129
129
  eventName: 'tx-added-to-pool',
130
130
  ...tx.getStats(),
131
131
  } satisfies TxAddedToPoolStats);
@@ -1,6 +1,6 @@
1
1
  import { Tx, TxHash } from '@aztec/circuit-types';
2
2
  import { type TxAddedToPoolStats } from '@aztec/circuit-types/stats';
3
- import { createDebugLogger } from '@aztec/foundation/log';
3
+ import { createLogger } from '@aztec/foundation/log';
4
4
  import { type TelemetryClient } from '@aztec/telemetry-client';
5
5
 
6
6
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
@@ -23,7 +23,7 @@ export class InMemoryTxPool implements TxPool {
23
23
  * Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
24
24
  * @param log - A logger.
25
25
  */
26
- constructor(telemetry: TelemetryClient, private log = createDebugLogger('aztec:tx_pool')) {
26
+ constructor(telemetry: TelemetryClient, private log = createLogger('p2p:tx_pool')) {
27
27
  this.txs = new Map<bigint, Tx>();
28
28
  this.minedTxs = new Map();
29
29
  this.pendingTxs = new Set();
@@ -105,7 +105,7 @@ export class InMemoryTxPool implements TxPool {
105
105
  let pending = 0;
106
106
  for (const tx of txs) {
107
107
  const txHash = tx.getTxHash();
108
- this.log.debug(`Adding tx with id ${txHash.toString()}`, {
108
+ this.log.verbose(`Adding tx ${txHash.toString()} to pool`, {
109
109
  eventName: 'tx-added-to-pool',
110
110
  ...tx.getStats(),
111
111
  } satisfies TxAddedToPoolStats);
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  type ClientProtocolCircuitVerifier,
3
3
  type L2BlockSource,
4
+ type P2PClientType,
4
5
  type Tx,
5
6
  type WorldStateSynchronizer,
6
7
  } from '@aztec/circuit-types';
7
8
  import { type DataStoreConfig } from '@aztec/kv-store/config';
8
- import { openTmpStore } from '@aztec/kv-store/utils';
9
+ import { openTmpStore } from '@aztec/kv-store/lmdb';
9
10
  import { type TelemetryClient } from '@aztec/telemetry-client';
10
11
  import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
11
12
 
@@ -23,11 +24,11 @@ import { type Libp2p, type Libp2pOptions, createLibp2p } from 'libp2p';
23
24
  import { BootstrapNode } from '../bootstrap/bootstrap.js';
24
25
  import { type BootnodeConfig, type P2PConfig } from '../config.js';
25
26
  import { type MemPools } from '../mem_pools/interface.js';
26
- import { DiscV5Service } from '../service/discV5_service.js';
27
- import { LibP2PService } from '../service/libp2p_service.js';
28
- import { type PeerManager } from '../service/peer_manager.js';
29
- import { type P2PReqRespConfig } from '../service/reqresp/config.js';
30
- import { pingHandler, statusHandler } from '../service/reqresp/handlers.js';
27
+ import { DiscV5Service } from '../services/discv5/discV5_service.js';
28
+ import { LibP2PService } from '../services/libp2p/libp2p_service.js';
29
+ import { type PeerManager } from '../services/peer_manager.js';
30
+ import { type P2PReqRespConfig } from '../services/reqresp/config.js';
31
+ import { pingHandler, statusHandler } from '../services/reqresp/handlers.js';
31
32
  import {
32
33
  PING_PROTOCOL,
33
34
  type ReqRespSubProtocolHandlers,
@@ -35,8 +36,8 @@ import {
35
36
  STATUS_PROTOCOL,
36
37
  TX_REQ_PROTOCOL,
37
38
  noopValidator,
38
- } from '../service/reqresp/interface.js';
39
- import { ReqResp } from '../service/reqresp/reqresp.js';
39
+ } from '../services/reqresp/interface.js';
40
+ import { ReqResp } from '../services/reqresp/reqresp.js';
40
41
  import { type PubSubLibp2p } from '../util.js';
41
42
 
42
43
  /**
@@ -95,11 +96,12 @@ export async function createLibp2pNode(
95
96
  *
96
97
  *
97
98
  */
98
- export async function createTestLibP2PService(
99
+ export async function createTestLibP2PService<T extends P2PClientType>(
100
+ clientType: T,
99
101
  boostrapAddrs: string[] = [],
100
102
  l2BlockSource: L2BlockSource,
101
103
  worldStateSynchronizer: WorldStateSynchronizer,
102
- mempools: MemPools,
104
+ mempools: MemPools<T>,
103
105
  telemetry: TelemetryClient,
104
106
  port: number = 0,
105
107
  peerId?: PeerId,
@@ -123,7 +125,8 @@ export async function createTestLibP2PService(
123
125
  // No bootstrap nodes provided as the libp2p service will register them in the constructor
124
126
  const p2pNode = await createLibp2pNode([], peerId, port, /*enable gossip */ true, /**start */ false);
125
127
 
126
- return new LibP2PService(
128
+ return new LibP2PService<T>(
129
+ clientType,
127
130
  config,
128
131
  p2pNode as PubSubLibp2p,
129
132
  discoveryService,
@@ -1,16 +1,16 @@
1
- import { createDebugLogger } from '@aztec/foundation/log';
1
+ import { createLogger } from '@aztec/foundation/log';
2
2
  import { sleep } from '@aztec/foundation/sleep';
3
3
  import { OtelMetricsAdapter, type TelemetryClient } from '@aztec/telemetry-client';
4
4
 
5
5
  import { Discv5, type Discv5EventEmitter } from '@chainsafe/discv5';
6
6
  import { ENR, SignableENR } from '@chainsafe/enr';
7
7
  import type { PeerId } from '@libp2p/interface';
8
- import { multiaddr } from '@multiformats/multiaddr';
8
+ import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
9
9
  import EventEmitter from 'events';
10
10
 
11
- import type { P2PConfig } from '../config.js';
12
- import { convertToMultiaddr } from '../util.js';
13
- import { type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
11
+ import type { P2PConfig } from '../../config.js';
12
+ import { convertToMultiaddr } from '../../util.js';
13
+ import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
14
14
 
15
15
  export const AZTEC_ENR_KEY = 'aztec_network';
16
16
 
@@ -35,6 +35,9 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
35
35
  /** This instance's ENR */
36
36
  private enr: SignableENR;
37
37
 
38
+ /** UDP listen addr */
39
+ private listenMultiAddrUdp: Multiaddr;
40
+
38
41
  private currentState = PeerDiscoveryState.STOPPED;
39
42
 
40
43
  private bootstrapNodes: string[];
@@ -46,7 +49,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
46
49
  private peerId: PeerId,
47
50
  config: P2PConfig,
48
51
  telemetry: TelemetryClient,
49
- private logger = createDebugLogger('aztec:discv5_service'),
52
+ private logger = createLogger('p2p:discv5_service'),
50
53
  ) {
51
54
  super();
52
55
  const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config;
@@ -66,7 +69,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
66
69
  `${convertToMultiaddr(udpAnnounceAddress || tcpAnnounceAddress, 'udp')}/p2p/${peerId.toString()}`,
67
70
  );
68
71
 
69
- const listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
72
+ this.listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
70
73
 
71
74
  // set location multiaddr in ENR record
72
75
  this.enr.setLocationMultiaddr(multiAddrUdp);
@@ -76,7 +79,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
76
79
  this.discv5 = Discv5.create({
77
80
  enr: this.enr,
78
81
  peerId,
79
- bindAddrs: { ip4: listenMultiAddrUdp },
82
+ bindAddrs: { ip4: this.listenMultiAddrUdp },
80
83
  config: {
81
84
  lookupTimeout: 2000,
82
85
  requestTimeout: 2000,
@@ -85,14 +88,11 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
85
88
  metricsRegistry,
86
89
  });
87
90
 
88
- this.logger.info(`ENR NodeId: ${this.enr.nodeId}`);
89
- this.logger.info(`ENR UDP: ${multiAddrUdp.toString()}`);
90
-
91
91
  (this.discv5 as Discv5EventEmitter).on('discovered', (enr: ENR) => this.onDiscovered(enr));
92
92
  (this.discv5 as Discv5EventEmitter).on('enrAdded', async (enr: ENR) => {
93
93
  const multiAddrTcp = await enr.getFullMultiaddr('tcp');
94
94
  const multiAddrUdp = await enr.getFullMultiaddr('udp');
95
- this.logger.debug(`ENR multiaddr: ${multiAddrTcp?.toString()}, ${multiAddrUdp?.toString()}`);
95
+ this.logger.debug(`Added ENR ${enr.encodeTxt()}`, { multiAddrTcp, multiAddrUdp, nodeId: enr.nodeId });
96
96
  this.onDiscovered(enr);
97
97
  });
98
98
  }
@@ -101,18 +101,23 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
101
101
  if (this.currentState === PeerDiscoveryState.RUNNING) {
102
102
  throw new Error('DiscV5Service already started');
103
103
  }
104
- this.logger.info('Starting DiscV5');
104
+ this.logger.debug('Starting DiscV5');
105
105
  await this.discv5.start();
106
106
  this.startTime = Date.now();
107
107
 
108
- this.logger.info('DiscV5 started');
108
+ this.logger.info(`DiscV5 service started`, {
109
+ nodeId: this.enr.nodeId,
110
+ peerId: this.peerId,
111
+ enrUdp: await this.enr.getFullMultiaddr('udp'),
112
+ enrTcp: await this.enr.getFullMultiaddr('tcp'),
113
+ });
109
114
  this.currentState = PeerDiscoveryState.RUNNING;
110
115
 
111
116
  // Add bootnode ENR if provided
112
117
  if (this.bootstrapNodes?.length) {
113
118
  // Do this conversion once since it involves an async function call
114
119
  this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodes.map(enr => ENR.decodeTxt(enr).peerId()));
115
- this.logger.info(`Adding bootstrap ENRs: ${this.bootstrapNodes.join(', ')}`);
120
+ this.logger.info(`Adding bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
116
121
  try {
117
122
  this.bootstrapNodes.forEach(enr => {
118
123
  this.discv5.addEnr(enr);
@@ -1,4 +1,4 @@
1
- import type { BlockAttestation, BlockProposal, Gossipable, TxHash } from '@aztec/circuit-types';
1
+ import type { BlockAttestation, BlockProposal, Gossipable, PeerInfo, TxHash } from '@aztec/circuit-types';
2
2
 
3
3
  import type { PeerId } from '@libp2p/interface';
4
4
  import EventEmitter from 'events';
@@ -10,6 +10,11 @@ import { type P2PService, type PeerDiscoveryService, PeerDiscoveryState } from '
10
10
  * A dummy implementation of the P2P Service.
11
11
  */
12
12
  export class DummyP2PService implements P2PService {
13
+ /** Returns an empty array for peers. */
14
+ getPeers(): PeerInfo[] {
15
+ return [];
16
+ }
17
+
13
18
  /**
14
19
  * Starts the dummy implementation.
15
20
  * @returns A resolved promise.
@@ -49,13 +49,31 @@ export function getMsgIdFn(message: Message) {
49
49
  return sha256(Buffer.concat(vec)).subarray(0, 20);
50
50
  }
51
51
 
52
+ /**
53
+ * Snappy transform for libp2p gossipsub
54
+ */
52
55
  export class SnappyTransform implements DataTransform {
56
+ // Topic string included to satisfy DataTransform interface
53
57
  inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
54
- const uncompressed = Buffer.from(uncompressSync(Buffer.from(data), { asBuffer: true }));
55
- return new Uint8Array(uncompressed);
58
+ return this.inboundTransformNoTopic(Buffer.from(data));
59
+ }
60
+
61
+ public inboundTransformNoTopic(data: Buffer): Buffer {
62
+ if (data.length === 0) {
63
+ return data;
64
+ }
65
+ return Buffer.from(uncompressSync(data, { asBuffer: true }));
56
66
  }
57
67
 
68
+ // Topic string included to satisfy DataTransform interface
58
69
  outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
59
- return new Uint8Array(compressSync(Buffer.from(data)));
70
+ return this.outboundTransformNoTopic(Buffer.from(data));
71
+ }
72
+
73
+ public outboundTransformNoTopic(data: Buffer): Buffer {
74
+ if (data.length === 0) {
75
+ return data;
76
+ }
77
+ return Buffer.from(compressSync(data));
60
78
  }
61
79
  }
@@ -0,0 +1,2 @@
1
+ export * from './service.js';
2
+ export * from './libp2p/libp2p_service.js';