@aztec/p2p 0.84.0 → 0.85.0

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 (79) hide show
  1. package/dest/bootstrap/bootstrap.js +1 -1
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +5 -2
  4. package/dest/client/p2p_client.d.ts +2 -0
  5. package/dest/client/p2p_client.d.ts.map +1 -1
  6. package/dest/client/p2p_client.js +4 -1
  7. package/dest/config.d.ts +15 -3
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +12 -1
  10. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +56 -2
  11. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  12. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +229 -16
  13. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  14. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  15. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  16. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  17. package/dest/msg_validators/tx_validator/block_header_validator.js +2 -2
  18. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  19. package/dest/msg_validators/tx_validator/data_validator.js +8 -8
  20. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  21. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -3
  22. package/dest/msg_validators/tx_validator/gas_validator.d.ts +2 -1
  23. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  24. package/dest/msg_validators/tx_validator/gas_validator.js +32 -5
  25. package/dest/msg_validators/tx_validator/index.d.ts +1 -0
  26. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  27. package/dest/msg_validators/tx_validator/index.js +1 -0
  28. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  29. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  30. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  31. package/dest/msg_validators/tx_validator/phases_validator.js +10 -2
  32. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  33. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  34. package/dest/services/discv5/discV5_service.d.ts +1 -2
  35. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  36. package/dest/services/discv5/discV5_service.js +6 -8
  37. package/dest/services/dummy_service.d.ts +2 -1
  38. package/dest/services/dummy_service.d.ts.map +1 -1
  39. package/dest/services/dummy_service.js +1 -1
  40. package/dest/services/libp2p/libp2p_service.d.ts +14 -8
  41. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  42. package/dest/services/libp2p/libp2p_service.js +2 -2
  43. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  44. package/dest/services/peer-manager/peer_manager.js +0 -1
  45. package/dest/services/service.d.ts +1 -1
  46. package/dest/services/service.d.ts.map +1 -1
  47. package/dest/testbench/p2p_client_testbench_worker.js +46 -16
  48. package/dest/testbench/parse_log_file.js +4 -4
  49. package/dest/testbench/testbench.js +1 -1
  50. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  51. package/dest/testbench/worker_client_manager.js +3 -2
  52. package/dest/util.d.ts +7 -3
  53. package/dest/util.d.ts.map +1 -1
  54. package/dest/util.js +44 -7
  55. package/package.json +12 -12
  56. package/src/bootstrap/bootstrap.ts +1 -1
  57. package/src/client/factory.ts +7 -2
  58. package/src/client/p2p_client.ts +6 -1
  59. package/src/config.ts +26 -2
  60. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +312 -27
  61. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  62. package/src/msg_validators/tx_validator/block_header_validator.ts +2 -2
  63. package/src/msg_validators/tx_validator/data_validator.ts +19 -8
  64. package/src/msg_validators/tx_validator/double_spend_validator.ts +10 -3
  65. package/src/msg_validators/tx_validator/gas_validator.ts +36 -6
  66. package/src/msg_validators/tx_validator/index.ts +1 -0
  67. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  68. package/src/msg_validators/tx_validator/phases_validator.ts +6 -1
  69. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -2
  70. package/src/services/discv5/discV5_service.ts +10 -8
  71. package/src/services/dummy_service.ts +2 -1
  72. package/src/services/libp2p/libp2p_service.ts +9 -9
  73. package/src/services/peer-manager/peer_manager.ts +1 -1
  74. package/src/services/service.ts +1 -1
  75. package/src/testbench/p2p_client_testbench_worker.ts +97 -16
  76. package/src/testbench/parse_log_file.ts +4 -4
  77. package/src/testbench/testbench.ts +1 -1
  78. package/src/testbench/worker_client_manager.ts +4 -2
  79. package/src/util.ts +57 -8
@@ -207,6 +207,8 @@ class WorkerClientManager {
207
207
  (_, ind) => ind !== clientIndex && ind < Math.min(this.peerEnrs.length, 10),
208
208
  );
209
209
 
210
+ this.logger.info(`Changing port for client ${clientIndex} to ${newPort} with other nodes `, otherNodes);
211
+
210
212
  const config = this.createClientConfig(clientIndex, newPort, otherNodes);
211
213
  const [childProcess, readySignal] = this.spawnWorkerProcess(config, clientIndex);
212
214
 
@@ -244,7 +246,7 @@ class WorkerClientManager {
244
246
  } catch (e) {
245
247
  this.logger.error(`Error force killing process ${index}:`, e);
246
248
  }
247
- }, 10000); // 10 second timeout for graceful exit
249
+ }, 5000); // 5 second timeout for graceful exit
248
250
 
249
251
  // Listen for process exit
250
252
  process.once('exit', () => {
@@ -294,7 +296,7 @@ class WorkerClientManager {
294
296
  }
295
297
  });
296
298
  resolve();
297
- }, 30000); // 30 second timeout for all processes
299
+ }, 10000); // 10 second timeout for all processes
298
300
  }),
299
301
  ]);
300
302
  } catch (error) {
package/src/util.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { AztecAsyncKVStore } from '@aztec/kv-store';
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
2
3
  import type { DataStoreConfig } from '@aztec/kv-store/config';
3
4
 
4
5
  import type { GossipSub } from '@chainsafe/libp2p-gossipsub';
@@ -7,10 +8,14 @@ import type { PeerId, PrivateKey } from '@libp2p/interface';
7
8
  import type { ConnectionManager } from '@libp2p/interface-internal';
8
9
  import { createFromPrivKey } from '@libp2p/peer-id-factory';
9
10
  import { resolve } from 'dns/promises';
11
+ import { promises as fs } from 'fs';
10
12
  import type { Libp2p } from 'libp2p';
13
+ import path from 'path';
11
14
 
12
15
  import type { P2PConfig } from './config.js';
13
16
 
17
+ const PEER_ID_DATA_DIR_FILE = 'p2p-private-key';
18
+
14
19
  export interface PubSubLibp2p extends Libp2p {
15
20
  services: {
16
21
  pubsub: GossipSub;
@@ -93,29 +98,73 @@ export async function configureP2PClientAddresses(
93
98
  * Get the peer id private key
94
99
  *
95
100
  * 1. Check if we have a peer id private key in the config
96
- * 2. If not, check we have a peer id private key persisted in the node
97
- * 3. If not, create a new one, then persist it in the node
101
+ * 2. If not, check if we have a peer id private key persisted in a file
102
+ * 3. If no file path or data directory is provided, check if we have a peer id private key in the node's store
103
+ * 4. If not, create a new one, then persist it in a file if a file path or data directory is provided or in the node's store otherwise
98
104
  *
99
105
  */
100
106
  export async function getPeerIdPrivateKey(
101
- config: { peerIdPrivateKey?: string },
107
+ config: { peerIdPrivateKey?: string; peerIdPrivateKeyPath?: string; dataDirectory?: string },
102
108
  store: AztecAsyncKVStore,
109
+ logger: Logger,
103
110
  ): Promise<string> {
104
- const peerIdPrivateKeySingleton = store.openSingleton<string>('peerIdPrivateKey');
111
+ const peerIdPrivateKeyFilePath =
112
+ config.peerIdPrivateKeyPath ??
113
+ (config.dataDirectory ? path.join(config.dataDirectory, PEER_ID_DATA_DIR_FILE) : undefined);
114
+ let peerIdPrivateKeySingleton: AztecAsyncSingleton<string> | undefined;
115
+
116
+ const writePrivateKeyToFile = async (filePath: string, privateKey: string) => {
117
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
118
+ await fs.writeFile(filePath, privateKey);
119
+ };
120
+
121
+ // If the peerIdPrivateKey is provided in the config, we use it and persist it in either a file or the node's store
105
122
  if (config.peerIdPrivateKey) {
106
- await peerIdPrivateKeySingleton.set(config.peerIdPrivateKey);
123
+ if (peerIdPrivateKeyFilePath) {
124
+ await writePrivateKeyToFile(peerIdPrivateKeyFilePath, config.peerIdPrivateKey);
125
+ } else {
126
+ peerIdPrivateKeySingleton = store.openSingleton<string>('peerIdPrivateKey');
127
+ await peerIdPrivateKeySingleton.set(config.peerIdPrivateKey);
128
+ }
107
129
  return config.peerIdPrivateKey;
108
130
  }
109
131
 
110
- const storedPeerIdPrivateKey = await peerIdPrivateKeySingleton.getAsync();
132
+ // Check to see if we have a peer id private key stored in a file or the node's store
133
+ let storedPeerIdPrivateKey: string | undefined;
134
+ const privateKeyFileExists =
135
+ peerIdPrivateKeyFilePath &&
136
+ (await fs
137
+ .access(peerIdPrivateKeyFilePath)
138
+ .then(() => true)
139
+ .catch(() => false));
140
+ if (peerIdPrivateKeyFilePath && privateKeyFileExists) {
141
+ await fs.access(peerIdPrivateKeyFilePath);
142
+ storedPeerIdPrivateKey = await fs.readFile(peerIdPrivateKeyFilePath, 'utf8');
143
+ } else {
144
+ peerIdPrivateKeySingleton = store.openSingleton<string>('peerIdPrivateKey');
145
+ storedPeerIdPrivateKey = await peerIdPrivateKeySingleton.getAsync();
146
+ }
111
147
  if (storedPeerIdPrivateKey) {
148
+ if (peerIdPrivateKeyFilePath && !privateKeyFileExists) {
149
+ logger.verbose(`Peer ID private key found in the node's store, persisting it to ${peerIdPrivateKeyFilePath}`);
150
+ await writePrivateKeyToFile(peerIdPrivateKeyFilePath, storedPeerIdPrivateKey);
151
+ }
112
152
  return storedPeerIdPrivateKey;
113
153
  }
114
154
 
155
+ // Generate and persist a new private key
115
156
  const newPeerIdPrivateKey = await generateKeyPair('secp256k1');
116
157
  const privateKeyString = Buffer.from(marshalPrivateKey(newPeerIdPrivateKey)).toString('hex');
158
+ if (peerIdPrivateKeyFilePath) {
159
+ logger.verbose(`Creating new peer ID private key and persisting it to ${peerIdPrivateKeyFilePath}`);
160
+ await writePrivateKeyToFile(peerIdPrivateKeyFilePath, privateKeyString);
161
+ } else {
162
+ logger.warn(
163
+ 'Creating new peer ID private key and persisting it to the lmdb store. Key will be lost on rollup upgrade, specify the peer id private key path and restart the node to persist the peer id private key to a file',
164
+ );
165
+ await peerIdPrivateKeySingleton!.set(privateKeyString);
166
+ }
117
167
 
118
- await peerIdPrivateKeySingleton.set(privateKeyString);
119
168
  return privateKeyString;
120
169
  }
121
170