@aztec/p2p 0.0.1-commit.3f296a7d2 → 0.0.1-commit.42ee6df9b

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 (120) hide show
  1. package/dest/client/factory.d.ts +1 -1
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +5 -4
  4. package/dest/client/interface.d.ts +9 -2
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +3 -2
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +21 -8
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +14 -3
  10. package/dest/errors/p2p-service.error.d.ts +9 -0
  11. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  12. package/dest/errors/p2p-service.error.js +10 -0
  13. package/dest/index.d.ts +1 -2
  14. package/dest/index.d.ts.map +1 -1
  15. package/dest/index.js +0 -1
  16. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +1 -1
  17. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  18. package/dest/mem_pools/attestation_pool/attestation_pool.js +3 -2
  19. package/dest/mem_pools/index.d.ts +1 -2
  20. package/dest/mem_pools/index.d.ts.map +1 -1
  21. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +1 -1
  22. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  23. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +5 -1
  24. package/dest/services/dummy_service.d.ts +5 -3
  25. package/dest/services/dummy_service.d.ts.map +1 -1
  26. package/dest/services/dummy_service.js +5 -1
  27. package/dest/services/libp2p/libp2p_service.d.ts +11 -3
  28. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  29. package/dest/services/libp2p/libp2p_service.js +21 -6
  30. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  31. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  32. package/dest/services/peer-manager/peer_manager.js +18 -6
  33. package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
  34. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  35. package/dest/services/peer-manager/peer_scoring.js +28 -10
  36. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  37. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  38. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  39. package/dest/services/service.d.ts +5 -2
  40. package/dest/services/service.d.ts.map +1 -1
  41. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  42. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  43. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  44. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  45. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  46. package/dest/services/tx_collection/tx_source.js +9 -7
  47. package/dest/testbench/p2p_client_testbench_worker.js +41 -12
  48. package/dest/testbench/worker_client_manager.d.ts +1 -1
  49. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  50. package/dest/testbench/worker_client_manager.js +0 -1
  51. package/package.json +14 -14
  52. package/src/client/factory.ts +7 -2
  53. package/src/client/interface.ts +9 -1
  54. package/src/client/p2p_client.ts +23 -8
  55. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +15 -3
  56. package/src/errors/p2p-service.error.ts +11 -0
  57. package/src/index.ts +0 -1
  58. package/src/mem_pools/attestation_pool/attestation_pool.ts +4 -2
  59. package/src/mem_pools/index.ts +0 -3
  60. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +7 -1
  61. package/src/msg_validators/proposal_validator/README.md +1 -1
  62. package/src/services/dummy_service.ts +7 -2
  63. package/src/services/libp2p/libp2p_service.ts +29 -9
  64. package/src/services/peer-manager/peer_manager.ts +21 -6
  65. package/src/services/peer-manager/peer_scoring.ts +21 -5
  66. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  67. package/src/services/service.ts +6 -1
  68. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  69. package/src/services/tx_collection/tx_source.ts +8 -7
  70. package/src/testbench/p2p_client_testbench_worker.ts +40 -9
  71. package/src/testbench/worker_client_manager.ts +0 -1
  72. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  73. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  74. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  75. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  76. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  77. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  78. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  79. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  80. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  81. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  82. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  83. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  84. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  85. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  86. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  87. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  88. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  89. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  90. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  91. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  92. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  93. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  94. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  95. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  96. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  97. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  98. package/dest/mem_pools/tx_pool/index.js +0 -2
  99. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  100. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  101. package/dest/mem_pools/tx_pool/priority.js +0 -15
  102. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  103. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  104. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  105. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  106. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  107. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  108. package/src/mem_pools/tx_pool/README.md +0 -270
  109. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  110. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  111. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  112. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  113. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  114. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  115. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  116. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  117. package/src/mem_pools/tx_pool/index.ts +0 -2
  118. package/src/mem_pools/tx_pool/priority.ts +0 -20
  119. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  120. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
@@ -1,3 +1,4 @@
1
+ import { partitionAsync } from '@aztec/foundation/collection';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import { Timer } from '@aztec/foundation/timer';
3
4
  import { createReadOnlyFileStore } from '@aztec/stdlib/file-store';
@@ -7,15 +8,17 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
7
8
  fileStore;
8
9
  baseUrl;
9
10
  basePath;
11
+ txValidator;
10
12
  log;
11
13
  downloadsSuccess;
12
14
  downloadsFailed;
13
15
  downloadDuration;
14
16
  downloadSize;
15
- constructor(fileStore, baseUrl, basePath, log, telemetry){
17
+ constructor(fileStore, baseUrl, basePath, txValidator, log, telemetry){
16
18
  this.fileStore = fileStore;
17
19
  this.baseUrl = baseUrl;
18
20
  this.basePath = basePath;
21
+ this.txValidator = txValidator;
19
22
  this.log = log;
20
23
  const meter = telemetry.getMeter('file-store-tx-source');
21
24
  this.downloadsSuccess = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_SUCCESS);
@@ -30,14 +33,14 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
30
33
  * @param log - Optional logger.
31
34
  * @param telemetry - Optional telemetry client.
32
35
  * @returns The FileStoreTxSource instance, or undefined if creation fails.
33
- */ static async create(url, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
36
+ */ static async create(url, basePath, txValidator, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
34
37
  try {
35
38
  const fileStore = await createReadOnlyFileStore(url, log);
36
39
  if (!fileStore) {
37
40
  log.warn(`Failed to create file store for URL: ${url}`);
38
41
  return undefined;
39
42
  }
40
- return new FileStoreTxSource(fileStore, url, basePath, log, telemetry);
43
+ return new FileStoreTxSource(fileStore, url, basePath, txValidator, log, telemetry);
41
44
  } catch (err) {
42
45
  log.warn(`Error creating file store for URL: ${url}`, {
43
46
  error: err
@@ -49,31 +52,38 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
49
52
  return `file-store:${this.baseUrl}`;
50
53
  }
51
54
  async getTxsByHash(txHashes) {
52
- const invalidTxHashes = [];
55
+ const results = await Promise.all(txHashes.map(async (txHash)=>{
56
+ const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
57
+ const timer = new Timer();
58
+ try {
59
+ const buffer = await this.fileStore.read(path);
60
+ const tx = Tx.fromBuffer(buffer);
61
+ return {
62
+ tx,
63
+ downloadDuration: timer.ms(),
64
+ downloadSize: buffer.length
65
+ };
66
+ } catch {
67
+ this.downloadsFailed.add(1);
68
+ return undefined;
69
+ }
70
+ }));
71
+ const txs = results.filter((tx)=>tx !== undefined);
72
+ const [validTxs, invalidTxs] = await partitionAsync(txs, async ({ tx, downloadDuration, downloadSize })=>{
73
+ const valid = await this.txValidator.validateTx(tx);
74
+ if (valid.result === 'valid') {
75
+ this.downloadsSuccess.add(1);
76
+ this.downloadDuration.record(Math.ceil(downloadDuration));
77
+ this.downloadSize.record(downloadSize);
78
+ return true;
79
+ } else {
80
+ this.downloadsFailed.add(1);
81
+ return false;
82
+ }
83
+ });
53
84
  return {
54
- validTxs: (await Promise.all(txHashes.map(async (txHash)=>{
55
- const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
56
- const timer = new Timer();
57
- try {
58
- const buffer = await this.fileStore.read(path);
59
- const tx = Tx.fromBuffer(buffer);
60
- if (await tx.validateTxHash() && txHash.equals(tx.txHash)) {
61
- this.downloadsSuccess.add(1);
62
- this.downloadDuration.record(Math.ceil(timer.ms()));
63
- this.downloadSize.record(buffer.length);
64
- return tx;
65
- } else {
66
- invalidTxHashes.push(tx.txHash.toString());
67
- this.downloadsFailed.add(1);
68
- return undefined;
69
- }
70
- } catch {
71
- // Tx not found or error reading - return undefined
72
- this.downloadsFailed.add(1);
73
- return undefined;
74
- }
75
- }))).filter((tx)=>tx !== undefined),
76
- invalidTxHashes: invalidTxHashes
85
+ validTxs: validTxs.map(({ tx })=>tx),
86
+ invalidTxHashes: invalidTxs.map(({ tx })=>tx.getTxHash().toString())
77
87
  };
78
88
  }
79
89
  }
@@ -84,7 +94,7 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
84
94
  * @param log - Optional logger.
85
95
  * @param telemetry - Optional telemetry client.
86
96
  * @returns Array of successfully created FileStoreTxSource instances.
87
- */ export async function createFileStoreTxSources(urls, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
88
- const sources = await Promise.all(urls.map((url)=>FileStoreTxSource.create(url, basePath, log, telemetry)));
97
+ */ export async function createFileStoreTxSources(urls, basePath, txValidator, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
98
+ const sources = await Promise.all(urls.map((url)=>FileStoreTxSource.create(url, basePath, txValidator, log, telemetry)));
89
99
  return sources.filter((s)=>s !== undefined);
90
100
  }
@@ -1,6 +1,6 @@
1
1
  import type { ChainConfig } from '@aztec/stdlib/config';
2
2
  import { type AztecNode } from '@aztec/stdlib/interfaces/client';
3
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
3
+ import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
4
4
  import { type ComponentsVersions } from '@aztec/stdlib/versioning';
5
5
  export type TxSourceCollectionResult = {
6
6
  validTxs: Tx[];
@@ -12,12 +12,13 @@ export interface TxSource {
12
12
  }
13
13
  export declare class NodeRpcTxSource implements TxSource {
14
14
  private readonly client;
15
+ private readonly txValidator;
15
16
  private readonly info;
16
- constructor(client: Pick<AztecNode, 'getTxsByHash'>, info: string);
17
- static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource;
17
+ constructor(client: Pick<AztecNode, 'getTxsByHash'>, txValidator: TxValidator, info: string);
18
+ static fromUrl(nodeUrl: string, txValidator: TxValidator, versions: ComponentsVersions): NodeRpcTxSource;
18
19
  getInfo(): string;
19
20
  getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
20
21
  private verifyTxs;
21
22
  }
22
- export declare function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig): NodeRpcTxSource[];
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxrQkFBa0IsRUFBbUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRyxNQUFNLE1BQU0sd0JBQXdCLEdBQUc7SUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUE7Q0FBRSxDQUFDO0FBRXJGLE1BQU0sV0FBVyxRQUFRO0lBQ3ZCLE9BQU8sSUFBSSxNQUFNLENBQUM7SUFDbEIsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztDQUNyRTtBQUVELHFCQUFhLGVBQWdCLFlBQVcsUUFBUTtJQUU1QyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBRnZCLFlBQ21CLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUN2QyxJQUFJLEVBQUUsTUFBTSxFQUMzQjtJQUVKLE9BQWMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixHQUFHLGVBQWUsQ0FHcEY7SUFFTSxPQUFPLFdBRWI7SUFFWSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUUvRTtZQUVhLFNBQVM7Q0FnQnhCO0FBRUQsd0JBQWdCLHNCQUFzQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxxQkFHOUUifQ==
23
+ export declare function createNodeRpcTxSources(urls: string[], txValidator: TxValidator, chainConfig: ChainConfig): NodeRpcTxSource[];
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQW1DLE1BQU0sMEJBQTBCLENBQUM7QUFHcEcsTUFBTSxNQUFNLHdCQUF3QixHQUFHO0lBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFBO0NBQUUsQ0FBQztBQUVyRixNQUFNLFdBQVcsUUFBUTtJQUN2QixPQUFPLElBQUksTUFBTSxDQUFDO0lBQ2xCLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7Q0FDckU7QUFFRCxxQkFBYSxlQUFnQixZQUFXLFFBQVE7SUFFNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVztJQUM1QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFIdkIsWUFDbUIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQ3ZDLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLElBQUksRUFBRSxNQUFNLEVBQzNCO0lBRUosT0FBYyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsR0FBRyxlQUFlLENBRzlHO0lBRU0sT0FBTyxXQUViO0lBRVksWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FFL0U7WUFFYSxTQUFTO0NBZ0J4QjtBQUVELHdCQUFnQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxxQkFHeEcifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,wBAAwB,GAAG;IAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACrE;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,IAAI,EAAE,MAAM,EAC3B;IAEJ,OAAc,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAGpF;IAEM,OAAO,WAEb;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAE/E;YAEa,SAAS;CAgBxB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,qBAG9E"}
1
+ {"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,wBAAwB,GAAG;IAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACrE;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHvB,YACmB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,MAAM,EAC3B;IAEJ,OAAc,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAG9G;IAEM,OAAO,WAEb;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAE/E;YAEa,SAAS;CAgBxB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,qBAGxG"}
@@ -5,18 +5,20 @@ import { getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
5
5
  import { makeTracedFetch } from '@aztec/telemetry-client';
6
6
  export class NodeRpcTxSource {
7
7
  client;
8
+ txValidator;
8
9
  info;
9
- constructor(client, info){
10
+ constructor(client, txValidator, info){
10
11
  this.client = client;
12
+ this.txValidator = txValidator;
11
13
  this.info = info;
12
14
  }
13
- static fromUrl(nodeUrl, versions) {
15
+ static fromUrl(nodeUrl, txValidator, versions) {
14
16
  const client = createAztecNodeClient(nodeUrl, versions, makeTracedFetch([
15
17
  1,
16
18
  2,
17
19
  3
18
20
  ], false));
19
- return new NodeRpcTxSource(client, nodeUrl);
21
+ return new NodeRpcTxSource(client, txValidator, nodeUrl);
20
22
  }
21
23
  getInfo() {
22
24
  return this.info;
@@ -29,8 +31,8 @@ export class NodeRpcTxSource {
29
31
  const validTxs = [];
30
32
  const invalidTxHashes = [];
31
33
  await Promise.all(txs.map(async (tx)=>{
32
- const isValid = await tx.validateTxHash();
33
- if (isValid) {
34
+ const validation = await this.txValidator.validateTx(tx);
35
+ if (validation.result === 'valid') {
34
36
  validTxs.push(tx);
35
37
  } else {
36
38
  invalidTxHashes.push(tx.getTxHash().toString());
@@ -42,7 +44,7 @@ export class NodeRpcTxSource {
42
44
  };
43
45
  }
44
46
  }
45
- export function createNodeRpcTxSources(urls, chainConfig) {
47
+ export function createNodeRpcTxSources(urls, txValidator, chainConfig) {
46
48
  const versions = getComponentsVersionsFromConfig(chainConfig, protocolContractsHash, getVKTreeRoot());
47
- return urls.map((url)=>NodeRpcTxSource.fromUrl(url, versions));
49
+ return urls.map((url)=>NodeRpcTxSource.fromUrl(url, txValidator, versions));
48
50
  }
@@ -188,6 +188,35 @@ let workerAttestationPool = null;
188
188
  let workerConfig = null;
189
189
  let workerLogger = null;
190
190
  let kvStore = null;
191
+ async function stopWorker() {
192
+ try {
193
+ if (workerClient) {
194
+ await workerClient.stop();
195
+ workerClient = null;
196
+ }
197
+ } catch (e) {
198
+ workerLogger?.error('Error stopping worker client', e);
199
+ }
200
+ try {
201
+ if (kvStore?.close) {
202
+ await kvStore.close();
203
+ kvStore = null;
204
+ }
205
+ } catch (e) {
206
+ workerLogger?.error('Error closing kv store', e);
207
+ }
208
+ }
209
+ function gracefulExit(code = 0) {
210
+ try {
211
+ if (process.connected) {
212
+ process.disconnect();
213
+ }
214
+ } catch {
215
+ // IPC channel already closed
216
+ }
217
+ // Safety fallback if lingering handles prevent the event loop from draining
218
+ setTimeout(()=>process.exit(code), 5000).unref();
219
+ }
191
220
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
192
221
  process.on('message', async (msg)=>{
193
222
  const { type, config: rawConfig, clientIndex } = msg;
@@ -238,13 +267,8 @@ process.on('message', async (msg)=>{
238
267
  const cmd = msg;
239
268
  switch(cmd.type){
240
269
  case 'STOP':
241
- if (workerClient) {
242
- await workerClient.stop();
243
- }
244
- if (kvStore?.close) {
245
- await kvStore.close();
246
- }
247
- process.exit(0);
270
+ await stopWorker();
271
+ gracefulExit(0);
248
272
  break;
249
273
  case 'SEND_TX':
250
274
  if (workerClient) {
@@ -293,10 +317,15 @@ process.on('message', async (msg)=>{
293
317
  }
294
318
  }
295
319
  } catch (err) {
296
- process.send({
297
- type: 'ERROR',
298
- error: err.message
299
- });
300
- process.exit(1);
320
+ try {
321
+ process.send({
322
+ type: 'ERROR',
323
+ error: err.message
324
+ });
325
+ } catch {
326
+ // IPC channel may be closed
327
+ }
328
+ await stopWorker();
329
+ gracefulExit(1);
301
330
  }
302
331
  });
@@ -95,4 +95,4 @@ declare class WorkerClientManager {
95
95
  export { WorkerClientManager, testChainConfig };
96
96
  export type { DistributionPattern, CollectorType } from './p2p_client_testbench_worker.js';
97
97
  export { COLLECTOR_DISPLAY_NAMES } from './p2p_client_testbench_worker.js';
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyX2NsaWVudF9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3dvcmtlcl9jbGllbnRfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUtuRSxPQUFPLEtBQUssRUFHVixhQUFhLEVBQ2IsbUJBQW1CLEVBQ3BCLE1BQU0sa0NBQWtDLENBQUM7QUFRMUMsUUFBQSxNQUFNLGVBQWUsRUFBRSxXQU10QixDQUFDO0FBRUYsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztJQUNsQyxhQUFhLEVBQUUsYUFBYSxDQUFDO0lBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDZjtBQUVELE1BQU0sV0FBVyxzQkFBc0I7SUFDckMsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7SUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQztJQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUNqQixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEI7QUFFRCxjQUFNLG1CQUFtQjtJQUNoQixTQUFTLEVBQUUsWUFBWSxFQUFFLENBQU07SUFDL0IsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDakMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQ3hCLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBTTtJQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBcUI7SUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBUztJQUN2QixPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUd4RDtJQUVELE9BQU8sU0FLTjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBb0IxQjs7O09BR0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBa0cxQjs7Ozs7OztPQU9HO0lBQ0csaUJBQWlCLENBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLE9BQU8sR0FBRTtRQUNQLGFBQWEsQ0FBQyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNuQixZQUFZLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDbEIscUJBK0RQO0lBRUQsNEJBQTRCLFNBRTNCO0lBRUQsa0NBQWtDLFdBRWpDO0lBRUQ7Ozs7O09BS0c7SUFDRyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkE4Q3BEO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsZ0JBQWdCO0lBcUN4Qjs7T0FFRztJQUNHLE9BQU8sa0JBZ0NaO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0csbUJBQW1CLENBQUMsTUFBTSxFQUFFLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQXVFekY7SUFFRCxPQUFPLENBQUMsaUJBQWlCO0lBa0N6QixPQUFPLENBQUMsa0JBQWtCO0NBaUMzQjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNoRCxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUMifQ==
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyX2NsaWVudF9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3dvcmtlcl9jbGllbnRfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUtuRSxPQUFPLEtBQUssRUFHVixhQUFhLEVBQ2IsbUJBQW1CLEVBQ3BCLE1BQU0sa0NBQWtDLENBQUM7QUFRMUMsUUFBQSxNQUFNLGVBQWUsRUFBRSxXQU10QixDQUFDO0FBRUYsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztJQUNsQyxhQUFhLEVBQUUsYUFBYSxDQUFDO0lBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDZjtBQUVELE1BQU0sV0FBVyxzQkFBc0I7SUFDckMsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7SUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQztJQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUNqQixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEI7QUFFRCxjQUFNLG1CQUFtQjtJQUNoQixTQUFTLEVBQUUsWUFBWSxFQUFFLENBQU07SUFDL0IsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDakMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQ3hCLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBTTtJQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBcUI7SUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBUztJQUN2QixPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUd4RDtJQUVELE9BQU8sU0FJTjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBb0IxQjs7O09BR0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBa0cxQjs7Ozs7OztPQU9HO0lBQ0csaUJBQWlCLENBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLE9BQU8sR0FBRTtRQUNQLGFBQWEsQ0FBQyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNuQixZQUFZLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDbEIscUJBK0RQO0lBRUQsNEJBQTRCLFNBRTNCO0lBRUQsa0NBQWtDLFdBRWpDO0lBRUQ7Ozs7O09BS0c7SUFDRyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkE4Q3BEO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsZ0JBQWdCO0lBcUN4Qjs7T0FFRztJQUNHLE9BQU8sa0JBZ0NaO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0csbUJBQW1CLENBQUMsTUFBTSxFQUFFLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQXVFekY7SUFFRCxPQUFPLENBQUMsaUJBQWlCO0lBa0N6QixPQUFPLENBQUMsa0JBQWtCO0NBaUMzQjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNoRCxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAKxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAKnE,OAAO,KAAK,EAGV,aAAa,EACb,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAQ1C,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,SAKN;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;;;;;;OAOG;IACG,iBAAiB,CACrB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KAClB,qBA+DP;IAED,4BAA4B,SAE3B;IAED,kCAAkC,WAEjC;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBA8CpD;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACG,OAAO,kBAgCZ;IAED;;;;;;;;;OASG;IACG,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuEzF;IAED,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;CAiC3B;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAKxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAKnE,OAAO,KAAK,EAGV,aAAa,EACb,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAQ1C,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,SAIN;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;;;;;;OAOG;IACG,iBAAiB,CACrB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KAClB,qBA+DP;IAED,4BAA4B,SAE3B;IAED,kCAAkC,WAEjC;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBA8CpD;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACG,OAAO,kBAgCZ;IAED;;;;;;;;;OASG;IACG,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuEzF;IAED,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;CAiC3B;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -37,7 +37,6 @@ class WorkerClientManager {
37
37
  destroy() {
38
38
  this.cleanup().catch((error)=>{
39
39
  this.logger.error('Failed to cleanup worker client manager', error);
40
- process.exit(1);
41
40
  });
42
41
  }
43
42
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/p2p",
3
- "version": "0.0.1-commit.3f296a7d2",
3
+ "version": "0.0.1-commit.42ee6df9b",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -67,17 +67,17 @@
67
67
  ]
68
68
  },
69
69
  "dependencies": {
70
- "@aztec/constants": "0.0.1-commit.3f296a7d2",
71
- "@aztec/epoch-cache": "0.0.1-commit.3f296a7d2",
72
- "@aztec/ethereum": "0.0.1-commit.3f296a7d2",
73
- "@aztec/foundation": "0.0.1-commit.3f296a7d2",
74
- "@aztec/kv-store": "0.0.1-commit.3f296a7d2",
75
- "@aztec/noir-contracts.js": "0.0.1-commit.3f296a7d2",
76
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.3f296a7d2",
77
- "@aztec/protocol-contracts": "0.0.1-commit.3f296a7d2",
78
- "@aztec/simulator": "0.0.1-commit.3f296a7d2",
79
- "@aztec/stdlib": "0.0.1-commit.3f296a7d2",
80
- "@aztec/telemetry-client": "0.0.1-commit.3f296a7d2",
70
+ "@aztec/constants": "0.0.1-commit.42ee6df9b",
71
+ "@aztec/epoch-cache": "0.0.1-commit.42ee6df9b",
72
+ "@aztec/ethereum": "0.0.1-commit.42ee6df9b",
73
+ "@aztec/foundation": "0.0.1-commit.42ee6df9b",
74
+ "@aztec/kv-store": "0.0.1-commit.42ee6df9b",
75
+ "@aztec/noir-contracts.js": "0.0.1-commit.42ee6df9b",
76
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.42ee6df9b",
77
+ "@aztec/protocol-contracts": "0.0.1-commit.42ee6df9b",
78
+ "@aztec/simulator": "0.0.1-commit.42ee6df9b",
79
+ "@aztec/stdlib": "0.0.1-commit.42ee6df9b",
80
+ "@aztec/telemetry-client": "0.0.1-commit.42ee6df9b",
81
81
  "@chainsafe/libp2p-gossipsub": "13.0.0",
82
82
  "@chainsafe/libp2p-noise": "^15.0.0",
83
83
  "@chainsafe/libp2p-yamux": "^6.0.2",
@@ -104,8 +104,8 @@
104
104
  "xxhash-wasm": "^1.1.0"
105
105
  },
106
106
  "devDependencies": {
107
- "@aztec/archiver": "0.0.1-commit.3f296a7d2",
108
- "@aztec/world-state": "0.0.1-commit.3f296a7d2",
107
+ "@aztec/archiver": "0.0.1-commit.42ee6df9b",
108
+ "@aztec/world-state": "0.0.1-commit.42ee6df9b",
109
109
  "@jest/globals": "^30.0.0",
110
110
  "@types/jest": "^30.0.0",
111
111
  "@types/node": "^22.15.17",
@@ -19,6 +19,7 @@ import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
19
19
  import { AztecKVTxPoolV2 } from '../mem_pools/tx_pool_v2/tx_pool_v2.js';
20
20
  import {
21
21
  createCheckAllowedSetupCalls,
22
+ createTxValidatorForReqResponseReceivedTxs,
22
23
  createTxValidatorForTransactionsEnteringPendingTxPool,
23
24
  getDefaultAllowedSetupFunctions,
24
25
  } from '../msg_validators/index.js';
@@ -148,9 +149,12 @@ export async function createP2PClient(
148
149
  telemetry,
149
150
  );
150
151
 
152
+ const txValidatorForTxCollection = createTxValidatorForReqResponseReceivedTxs(proofVerifier, config);
151
153
  const nodeSources = [
152
- ...createNodeRpcTxSources(config.txCollectionNodeRpcUrls, config),
153
- ...(deps.rpcTxProviders ?? []).map((node, i) => new NodeRpcTxSource(node, `node-rpc-provider-${i}`)),
154
+ ...createNodeRpcTxSources(config.txCollectionNodeRpcUrls, txValidatorForTxCollection, config),
155
+ ...(deps.rpcTxProviders ?? []).map(
156
+ (node, i) => new NodeRpcTxSource(node, txValidatorForTxCollection, `node-rpc-provider-${i}`),
157
+ ),
154
158
  ...(deps.txCollectionNodeSources ?? []),
155
159
  ];
156
160
  if (nodeSources.length > 0) {
@@ -162,6 +166,7 @@ export async function createP2PClient(
162
166
  const fileStoreSources = await createFileStoreTxSources(
163
167
  config.txCollectionFileStoreUrls,
164
168
  txFileStoreBasePath,
169
+ txValidatorForTxCollection,
165
170
  logger.createChild('file-store-tx-source'),
166
171
  telemetry,
167
172
  );
@@ -82,7 +82,15 @@ export type P2P = P2PClient & {
82
82
  *
83
83
  * @param handler - A function taking a received checkpoint proposal and producing attestations
84
84
  */
85
- registerCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
85
+ registerValidatorCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
86
+
87
+ /**
88
+ * Registers a callback that runs for ALL nodes (not just validators) when a checkpoint proposal is received.
89
+ * Used to set the proposed checkpoint number on the archiver so the sequencer can build on top of it.
90
+ *
91
+ * @param handler - A function taking a received checkpoint proposal
92
+ */
93
+ registerAllNodesCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
86
94
 
87
95
  /**
88
96
  * Registers a callback invoked when a duplicate proposal is detected (equivocation).
@@ -357,6 +357,8 @@ export class P2PClient extends WithTracer implements P2P {
357
357
  // Store our own last-block proposal so we can respond to req/resp requests for it.
358
358
  await this.attestationPool.tryAddBlockProposal(blockProposal);
359
359
  }
360
+ // Gossipsub doesn't deliver own messages, so fire the all-nodes handler locally
361
+ await this.p2pService.notifyOwnCheckpointProposal(proposal.toCore());
360
362
  return this.p2pService.propagate(proposal);
361
363
  }
362
364
 
@@ -388,8 +390,12 @@ export class P2PClient extends WithTracer implements P2P {
388
390
  this.p2pService.registerBlockReceivedCallback(handler);
389
391
  }
390
392
 
391
- public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
392
- this.p2pService.registerCheckpointReceivedCallback(handler);
393
+ public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
394
+ this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
395
+ }
396
+
397
+ public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
398
+ this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
393
399
  }
394
400
 
395
401
  public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
@@ -696,14 +702,23 @@ export class P2PClient extends WithTracer implements P2P {
696
702
 
697
703
  /** Checks if the slot has changed and calls prepareForSlot if so. */
698
704
  private async maybeCallPrepareForSlot(): Promise<void> {
699
- // If we have a pending checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
700
- // Knowledege of pending checkpoints is in the PR above
701
- const { targetSlot } = this.epochCache.getTargetAndNextSlot();
702
- if (targetSlot <= this.lastSlotProcessed) {
705
+ // If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
706
+ const l2Tips = await this.l2Tips.getL2Tips();
707
+ const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
708
+
709
+ let slot;
710
+ if (this.epochCache.isProposerPipeliningEnabled() && hasProposedCheckpoint) {
711
+ const { targetSlot } = this.epochCache.getTargetAndNextSlot();
712
+ slot = targetSlot;
713
+ } else {
714
+ const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
715
+ slot = currentSlot;
716
+ }
717
+ if (slot <= this.lastSlotProcessed) {
703
718
  return;
704
719
  }
705
- this.lastSlotProcessed = targetSlot;
706
- await this.txPool.prepareForSlot(targetSlot);
720
+ this.lastSlotProcessed = slot;
721
+ await this.txPool.prepareForSlot(slot);
707
722
  }
708
723
 
709
724
  private async startServiceIfSynched() {
@@ -259,9 +259,20 @@ async function stopClient() {
259
259
  attestationPool = undefined;
260
260
  }
261
261
 
262
+ function gracefulExit(code: number = 0) {
263
+ try {
264
+ if (process.connected) {
265
+ process.disconnect();
266
+ }
267
+ } catch {
268
+ // IPC channel already closed
269
+ }
270
+ setTimeout(() => process.exit(code), 5000).unref();
271
+ }
272
+
262
273
  process.on('disconnect', () => {
263
274
  ipcDisconnected = true;
264
- void stopClient().finally(() => process.exit(0));
275
+ void stopClient();
265
276
  });
266
277
 
267
278
  process.on('error', err => {
@@ -325,7 +336,7 @@ process.on('message', (msg: WorkerCommand) => {
325
336
  case 'STOP': {
326
337
  await stopClient();
327
338
  await sendMessage({ type: 'STOPPED', requestId });
328
- process.exit(0);
339
+ gracefulExit(0);
329
340
  break;
330
341
  }
331
342
  default: {
@@ -336,7 +347,8 @@ process.on('message', (msg: WorkerCommand) => {
336
347
  } catch (err: any) {
337
348
  await sendMessage({ type: 'ERROR', requestId, error: err?.message ?? String(err) });
338
349
  if (msg.type === 'START') {
339
- process.exit(1);
350
+ await stopClient();
351
+ gracefulExit(1);
340
352
  }
341
353
  }
342
354
  })();
@@ -0,0 +1,11 @@
1
+ /** Checkpoint Proposal Received Callback Not Registered Error
2
+ *
3
+ * Error triggered if the allNodesCheckpointReceivedCallback is not registered
4
+ * @category Errors
5
+ */
6
+ export class CheckpointProposalReceivedCallbackNotRegisteredError extends Error {
7
+ constructor() {
8
+ super('FATAL (allNodesCheckpointReceivedCallback): All nodes should register a checkpoint proposal handler');
9
+ this.name = 'CheckpointProposalReceivedCallbackNotRegisteredError';
10
+ }
11
+ }
package/src/index.ts CHANGED
@@ -6,7 +6,6 @@ export * from './client/index.js';
6
6
  export * from './enr/index.js';
7
7
  export * from './config.js';
8
8
  export * from './mem_pools/attestation_pool/index.js';
9
- export * from './mem_pools/tx_pool/index.js';
10
9
  export * from './mem_pools/tx_pool_v2/index.js';
11
10
  export * from './msg_validators/index.js';
12
11
  export * from './services/index.js';
@@ -278,7 +278,7 @@ export class AttestationPool {
278
278
  * @returns Result indicating whether the proposal was added and duplicate detection info
279
279
  */
280
280
  public async tryAddCheckpointProposal(proposal: CheckpointProposalCore): Promise<TryAddResult> {
281
- return await this.store.transactionAsync(async () => {
281
+ const result = await this.store.transactionAsync(async () => {
282
282
  const proposalId = proposal.archive.toString();
283
283
 
284
284
  // Check if already exists
@@ -304,6 +304,8 @@ export class AttestationPool {
304
304
 
305
305
  return { added: true, alreadyExists: false, count: count + 1 };
306
306
  });
307
+
308
+ return result;
307
309
  }
308
310
 
309
311
  /** Internal method - must be called within a transaction. */
@@ -345,7 +347,7 @@ export class AttestationPool {
345
347
  await this.store.transactionAsync(async () => {
346
348
  for (const attestation of attestations) {
347
349
  const slotNumber = attestation.payload.header.slotNumber;
348
- const proposalId = attestation.archive;
350
+ const proposalId = attestation.archive.toString();
349
351
  const sender = attestation.getSender();
350
352
 
351
353
  // Skip attestations with invalid signatures
@@ -1,6 +1,3 @@
1
1
  export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
2
2
  export { type MemPools } from './interface.js';
3
- // Old TxPool exports - kept temporarily for external consumers
4
- export { type TxPool } from './tx_pool/tx_pool.js';
5
- // New TxPoolV2 exports
6
3
  export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
@@ -1,3 +1,4 @@
1
+ import { minBigint } from '@aztec/foundation/bigint';
1
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
@@ -6,7 +7,6 @@ import { Gas } from '@aztec/stdlib/gas';
6
7
  import { type Tx, TxHash } from '@aztec/stdlib/tx';
7
8
 
8
9
  import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
9
- import { getTxPriorityFee } from '../tx_pool/priority.js';
10
10
  import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
11
11
 
12
12
  /** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
@@ -335,3 +335,9 @@ export function stubTxMetaData(
335
335
  data: stubTxMetaValidationData({ expirationTimestamp }),
336
336
  };
337
337
  }
338
+
339
+ /** Returns the priority fee for a tx, based on the L2 priority fee capped by the max fee per gas. */
340
+ function getTxPriorityFee(tx: Tx): bigint {
341
+ const { maxPriorityFeesPerGas: priorityFees, maxFeesPerGas } = tx.getGasSettings();
342
+ return minBigint(maxFeesPerGas.feePerL2Gas, priorityFees.feePerL2Gas);
343
+ }
@@ -53,7 +53,7 @@ Only runs on validator nodes. Non-validator nodes use a default handler that tri
53
53
 
54
54
  **Escape hatch**: during escape hatch periods (`isEscapeHatchOpenAtSlot`), re-execution and slashing are both disabled, and the proposal is rejected locally.
55
55
 
56
- **Conditional re-execution**: rules 22-24 only run when at least one condition is true: `fishermanMode` enabled, `slashBroadcastedInvalidBlockPenalty > 0` with `validatorReexecute`, committee membership with `validatorReexecute`, `alwaysReexecuteBlockProposals`, or `blobClient.canUpload()`.
56
+ **Conditional re-execution**: rules 22-24 only run when at least one condition is true: `fishermanMode` enabled, `slashBroadcastedInvalidBlockPenalty > 0`, committee membership, `alwaysReexecuteBlockProposals`, or `blobClient.canUpload()`.
57
57
 
58
58
  **Slashing**: only `state_mismatch` and `failed_txs` trigger on-chain slashing (`OffenseType.BROADCASTED_INVALID_BLOCK_PROPOSAL`, gated by `slashBroadcastedInvalidBlockPenalty > 0`). Unknown errors during re-execution do NOT slash.
59
59
 
@@ -1,6 +1,6 @@
1
1
  import type { EthAddress } from '@aztec/foundation/eth-address';
2
2
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
3
- import type { Gossipable, PeerErrorSeverity, TopicType } from '@aztec/stdlib/p2p';
3
+ import type { CheckpointProposalCore, Gossipable, PeerErrorSeverity, TopicType } from '@aztec/stdlib/p2p';
4
4
  import { Tx, TxHash } from '@aztec/stdlib/tx';
5
5
 
6
6
  import type { PeerId } from '@libp2p/interface';
@@ -86,7 +86,12 @@ export class DummyP2PService implements P2PService {
86
86
  /**
87
87
  * Register a callback into the validator client for when a checkpoint proposal is received
88
88
  */
89
- public registerCheckpointReceivedCallback(_callback: P2PCheckpointReceivedCallback) {}
89
+ public registerValidatorCheckpointReceivedCallback(_callback: P2PCheckpointReceivedCallback) {}
90
+ public registerAllNodesCheckpointReceivedCallback(_callback: P2PCheckpointReceivedCallback) {}
91
+
92
+ public notifyOwnCheckpointProposal(_checkpoint: CheckpointProposalCore): Promise<void> {
93
+ return Promise.resolve();
94
+ }
90
95
 
91
96
  /**
92
97
  * Register a callback for when a duplicate proposal is detected