@aztec/p2p 0.46.6 → 0.47.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.
@@ -10,12 +10,18 @@ export declare class InMemoryTxPool implements TxPool {
10
10
  * Our tx pool, stored as a Map in-memory, with K: tx hash and V: the transaction.
11
11
  */
12
12
  private txs;
13
+ private minedTxs;
14
+ private pendingTxs;
13
15
  private metrics;
14
16
  /**
15
17
  * Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
16
18
  * @param log - A logger.
17
19
  */
18
20
  constructor(telemetry: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
21
+ markAsMined(txHashes: TxHash[]): Promise<void>;
22
+ getPendingTxHashes(): TxHash[];
23
+ getMinedTxHashes(): TxHash[];
24
+ getTxStatus(txHash: TxHash): 'pending' | 'mined' | undefined;
19
25
  /**
20
26
  * Checks if a transaction exists in the pool and returns it.
21
27
  * @param txHash - The generated tx hash.
@@ -44,11 +50,5 @@ export declare class InMemoryTxPool implements TxPool {
44
50
  * @returns An array of transaction hashes found in the tx pool.
45
51
  */
46
52
  getAllTxHashes(): TxHash[];
47
- /**
48
- * Returns a boolean indicating if the transaction is present in the pool.
49
- * @param txHash - The hash of the transaction to be queried.
50
- * @returns True if the transaction present, false otherwise.
51
- */
52
- hasTx(txHash: TxHash): boolean;
53
53
  }
54
54
  //# sourceMappingURL=memory_tx_pool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory_tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/memory_tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,cAAe,YAAW,MAAM;IAYH,OAAO,CAAC,GAAG;IAXnD;;OAEG;IACH,OAAO,CAAC,GAAG,CAAkB;IAE7B,OAAO,CAAC,OAAO,CAAwB;IAEvC;;;OAGG;gBACS,SAAS,EAAE,eAAe,EAAU,GAAG,yCAAqC;IAKxF;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS;IAKlD;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC;;;;OAIG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD;;;OAGG;IACI,SAAS,IAAI,EAAE,EAAE;IAIxB;;;OAGG;IACI,cAAc,IAAI,MAAM,EAAE;IAIjC;;;;OAIG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGtC"}
1
+ {"version":3,"file":"memory_tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/memory_tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,cAAe,YAAW,MAAM;IAcH,OAAO,CAAC,GAAG;IAbnD;;OAEG;IACH,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO,CAAC,OAAO,CAAwB;IAEvC;;;OAGG;gBACS,SAAS,EAAE,eAAe,EAAU,GAAG,yCAAqC;IAOjF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C,kBAAkB,IAAI,MAAM,EAAE;IAI9B,gBAAgB,IAAI,MAAM,EAAE;IAI5B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS;IAWnE;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS;IAKlD;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvC;;;;OAIG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD;;;OAGG;IACI,SAAS,IAAI,EAAE,EAAE;IAIxB;;;OAGG;IACI,cAAc,IAAI,MAAM,EAAE;CAGlC"}
@@ -12,8 +12,34 @@ export class InMemoryTxPool {
12
12
  constructor(telemetry, log = createDebugLogger('aztec:tx_pool')) {
13
13
  this.log = log;
14
14
  this.txs = new Map();
15
+ this.minedTxs = new Set();
16
+ this.pendingTxs = new Set();
15
17
  this.metrics = new TxPoolInstrumentation(telemetry, 'InMemoryTxPool');
16
18
  }
19
+ markAsMined(txHashes) {
20
+ const keys = txHashes.map(x => x.toBigInt());
21
+ for (const key of keys) {
22
+ this.minedTxs.add(key);
23
+ this.pendingTxs.delete(key);
24
+ }
25
+ return Promise.resolve();
26
+ }
27
+ getPendingTxHashes() {
28
+ return Array.from(this.pendingTxs).map(x => TxHash.fromBigInt(x));
29
+ }
30
+ getMinedTxHashes() {
31
+ return Array.from(this.minedTxs).map(x => TxHash.fromBigInt(x));
32
+ }
33
+ getTxStatus(txHash) {
34
+ const key = txHash.toBigInt();
35
+ if (this.pendingTxs.has(key)) {
36
+ return 'pending';
37
+ }
38
+ if (this.minedTxs.has(key)) {
39
+ return 'mined';
40
+ }
41
+ return undefined;
42
+ }
17
43
  /**
18
44
  * Checks if a transaction exists in the pool and returns it.
19
45
  * @param txHash - The generated tx hash.
@@ -36,7 +62,11 @@ export class InMemoryTxPool {
36
62
  eventName: 'tx-added-to-pool',
37
63
  ...tx.getStats(),
38
64
  });
39
- this.txs.set(txHash.toBigInt(), tx);
65
+ const key = txHash.toBigInt();
66
+ this.txs.set(key, tx);
67
+ if (!this.minedTxs.has(key)) {
68
+ this.pendingTxs.add(key);
69
+ }
40
70
  }
41
71
  return Promise.resolve();
42
72
  }
@@ -48,7 +78,10 @@ export class InMemoryTxPool {
48
78
  deleteTxs(txHashes) {
49
79
  this.metrics.removeTxs(txHashes.length);
50
80
  for (const txHash of txHashes) {
51
- this.txs.delete(txHash.toBigInt());
81
+ const key = txHash.toBigInt();
82
+ this.txs.delete(key);
83
+ this.pendingTxs.delete(key);
84
+ this.minedTxs.delete(key);
52
85
  }
53
86
  return Promise.resolve();
54
87
  }
@@ -66,13 +99,5 @@ export class InMemoryTxPool {
66
99
  getAllTxHashes() {
67
100
  return Array.from(this.txs.keys()).map(x => TxHash.fromBigInt(x));
68
101
  }
69
- /**
70
- * Returns a boolean indicating if the transaction is present in the pool.
71
- * @param txHash - The hash of the transaction to be queried.
72
- * @returns True if the transaction present, false otherwise.
73
- */
74
- hasTx(txHash) {
75
- return this.txs.has(txHash.toBigInt());
76
- }
77
102
  }
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X3R4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfcG9vbC9tZW1vcnlfdHhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFRekI7OztPQUdHO0lBQ0gsWUFBWSxTQUEwQixFQUFVLE1BQU0saUJBQWlCLENBQUMsZUFBZSxDQUFDO1FBQXhDLFFBQUcsR0FBSCxHQUFHLENBQXFDO1FBQ3RGLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsTUFBYztRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxHQUFTO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHFCQUFxQixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRTtnQkFDdkQsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO2FBQ1ksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsUUFBa0I7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTO1FBQ2QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiJ9
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X3R4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfcG9vbC9tZW1vcnlfdHhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFVekI7OztPQUdHO0lBQ0gsWUFBWSxTQUEwQixFQUFVLE1BQU0saUJBQWlCLENBQUMsZUFBZSxDQUFDO1FBQXhDLFFBQUcsR0FBSCxHQUFHLENBQXFDO1FBQ3RGLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU0sV0FBVyxDQUFDLFFBQWtCO1FBQ25DLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM3QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFP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
@@ -14,6 +14,11 @@ export interface TxPool {
14
14
  * @returns The transaction, if found, 'undefined' otherwise.
15
15
  */
16
16
  getTxByHash(txHash: TxHash): Tx | undefined;
17
+ /**
18
+ * Marks the set of txs as mined, as opposed to pending.
19
+ * @param txHashes - Hashes of the txs to flag as mined.
20
+ */
21
+ markAsMined(txHashes: TxHash[]): Promise<void>;
17
22
  /**
18
23
  * Deletes transactions from the pool. Tx hashes that are not present are ignored.
19
24
  * @param txHashes - An array of tx hashes to be removed from the tx pool.
@@ -30,10 +35,20 @@ export interface TxPool {
30
35
  */
31
36
  getAllTxHashes(): TxHash[];
32
37
  /**
33
- * Returns a boolean indicating if the transaction is present in the pool.
34
- * @param txHash - The hash of the transaction to be queried.
35
- * @returns True if the transaction present, false otherwise.
38
+ * Gets the hashes of pending transactions currently in the tx pool.
39
+ * @returns An array of pending transaction hashes found in the tx pool.
40
+ */
41
+ getPendingTxHashes(): TxHash[];
42
+ /**
43
+ * Gets the hashes of mined transactions currently in the tx pool.
44
+ * @returns An array of mined transaction hashes found in the tx pool.
45
+ */
46
+ getMinedTxHashes(): TxHash[];
47
+ /**
48
+ * Returns whether the given tx hash is flagged as pending or mined.
49
+ * @param txHash - Hash of the tx to query.
50
+ * @returns Pending or mined depending on its status, or undefined if not found.
36
51
  */
37
- hasTx(txHash: TxHash): boolean;
52
+ getTxStatus(txHash: TxHash): 'pending' | 'mined' | undefined;
38
53
  }
39
54
  //# sourceMappingURL=tx_pool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS,CAAC;IAE5C;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,SAAS,IAAI,EAAE,EAAE,CAAC;IAElB;;;OAGG;IACH,cAAc,IAAI,MAAM,EAAE,CAAC;IAE3B;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC"}
1
+ {"version":3,"file":"tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS,CAAC;IAE5C;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,SAAS,IAAI,EAAE,EAAE,CAAC;IAElB;;;OAGG;IACH,cAAc,IAAI,MAAM,EAAE,CAAC;IAE3B;;;OAGG;IACH,kBAAkB,IAAI,MAAM,EAAE,CAAC;IAE/B;;;OAGG;IACH,gBAAgB,IAAI,MAAM,EAAE,CAAC;IAE7B;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CAC9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"tx_pool_test_suite.d.ts","sourceRoot":"","sources":["../../src/tx_pool/tx_pool_test_suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,MAAM,QAgDrD"}
1
+ {"version":3,"file":"tx_pool_test_suite.d.ts","sourceRoot":"","sources":["../../src/tx_pool/tx_pool_test_suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,MAAM,QA+DrD"}
@@ -8,18 +8,30 @@ export function describeTxPool(getTxPool) {
8
8
  beforeEach(() => {
9
9
  pool = getTxPool();
10
10
  });
11
- it('Adds txs to the pool', async () => {
11
+ it('Adds txs to the pool as pending', async () => {
12
12
  const tx1 = mockTx();
13
13
  await pool.addTxs([tx1]);
14
14
  const poolTx = pool.getTxByHash(tx1.getTxHash());
15
15
  expect(poolTx.getTxHash()).toEqual(tx1.getTxHash());
16
+ expect(pool.getTxStatus(tx1.getTxHash())).toEqual('pending');
17
+ expect(pool.getPendingTxHashes()).toEqual([tx1.getTxHash()]);
16
18
  });
17
19
  it('Removes txs from the pool', async () => {
18
20
  const tx1 = mockTx();
19
21
  await pool.addTxs([tx1]);
20
22
  await pool.deleteTxs([tx1.getTxHash()]);
21
- const poolTx = pool.getTxByHash(tx1.getTxHash());
22
- expect(poolTx).toBeFalsy();
23
+ expect(pool.getTxByHash(tx1.getTxHash())).toBeFalsy();
24
+ expect(pool.getTxStatus(tx1.getTxHash())).toBeUndefined();
25
+ });
26
+ it('Marks txs as mined', async () => {
27
+ const tx1 = mockTx(1);
28
+ const tx2 = mockTx(2);
29
+ await pool.addTxs([tx1, tx2]);
30
+ await pool.markAsMined([tx1.getTxHash()]);
31
+ expect(pool.getTxByHash(tx1.getTxHash())).toEqual(tx1);
32
+ expect(pool.getTxStatus(tx1.getTxHash())).toEqual('mined');
33
+ expect(pool.getMinedTxHashes()).toEqual([tx1.getTxHash()]);
34
+ expect(pool.getPendingTxHashes()).toEqual([tx2.getTxHash()]);
23
35
  });
24
36
  it('Returns all transactions in the pool', async () => {
25
37
  const tx1 = mockTx(1);
@@ -40,4 +52,4 @@ export function describeTxPool(getTxPool) {
40
52
  expect(poolTxHashes).toEqual(expect.arrayContaining([tx1.getTxHash(), tx2.getTxHash(), tx3.getTxHash()]));
41
53
  });
42
54
  }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF90ZXN0X3N1aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3Bvb2wvdHhfcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQXVCO0lBQ3BELElBQUksSUFBWSxDQUFDO0lBRWpCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFckIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxNQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFckIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNoRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFbkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIn0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF90ZXN0X3N1aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3Bvb2wvdHhfcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQXVCO0lBQ3BELElBQUksSUFBWSxDQUFDO0lBRWpCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFckIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxNQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6QyxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/p2p",
3
- "version": "0.46.6",
3
+ "version": "0.47.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -56,11 +56,11 @@
56
56
  "testTimeout": 15000
57
57
  },
58
58
  "dependencies": {
59
- "@aztec/circuit-types": "0.46.6",
60
- "@aztec/circuits.js": "0.46.6",
61
- "@aztec/foundation": "0.46.6",
62
- "@aztec/kv-store": "0.46.6",
63
- "@aztec/telemetry-client": "0.46.6",
59
+ "@aztec/circuit-types": "0.47.0",
60
+ "@aztec/circuits.js": "0.47.0",
61
+ "@aztec/foundation": "0.47.0",
62
+ "@aztec/kv-store": "0.47.0",
63
+ "@aztec/telemetry-client": "0.47.0",
64
64
  "@chainsafe/discv5": "9.0.0",
65
65
  "@chainsafe/enr": "3.0.0",
66
66
  "@chainsafe/libp2p-gossipsub": "13.0.0",
@@ -12,8 +12,8 @@ import { getPublicIp, splitAddressPort } from '../util.js';
12
12
  export * from './p2p_client.js';
13
13
 
14
14
  export const createP2PClient = async (
15
- store: AztecKVStore,
16
15
  config: P2PConfig,
16
+ store: AztecKVStore,
17
17
  txPool: TxPool,
18
18
  l2BlockSource: L2BlockSource,
19
19
  ) => {
@@ -52,14 +52,21 @@ export interface P2P {
52
52
  * Returns all transactions in the transaction pool.
53
53
  * @returns An array of Txs.
54
54
  */
55
- getTxs(): Promise<Tx[]>;
55
+ getTxs(filter: 'all' | 'pending' | 'mined'): Tx[];
56
56
 
57
57
  /**
58
58
  * Returns a transaction in the transaction pool by its hash.
59
59
  * @param txHash - Hash of tx to return.
60
60
  * @returns A single tx or undefined.
61
61
  */
62
- getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
62
+ getTxByHash(txHash: TxHash): Tx | undefined;
63
+
64
+ /**
65
+ * Returns whether the given tx hash is flagged as pending or mined.
66
+ * @param txHash - Hash of the tx to query.
67
+ * @returns Pending or mined depending on its status, or undefined if not found.
68
+ */
69
+ getTxStatus(txHash: TxHash): 'pending' | 'mined' | undefined;
63
70
 
64
71
  /**
65
72
  * Starts the p2p client.
@@ -89,26 +96,26 @@ export interface P2P {
89
96
  * The P2P client implementation.
90
97
  */
91
98
  export class P2PClient implements P2P {
92
- /**
93
- * L2 Block download that p2p client uses to stay in sync with latest blocks.
94
- */
95
- private blockDownloader: L2BlockDownloader;
99
+ /** L2 block download to stay in sync with latest blocks. */
100
+ private latestBlockDownloader: L2BlockDownloader;
96
101
 
97
- /**
98
- * Property that indicates whether the client is running.
99
- */
102
+ /** L2 block download to stay in sync with proven blocks. */
103
+ private provenBlockDownloader: L2BlockDownloader;
104
+
105
+ /** Property that indicates whether the client is running. */
100
106
  private stopping = false;
101
107
 
102
- /**
103
- * The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped.
104
- */
108
+ /** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */
105
109
  private runningPromise!: Promise<void>;
106
110
 
107
111
  private currentState = P2PClientState.IDLE;
108
112
  private syncPromise = Promise.resolve();
109
- private latestBlockNumberAtStart = -1;
110
113
  private syncResolve?: () => void = undefined;
111
- private synchedBlockNumber: AztecSingleton<number>;
114
+ private latestBlockNumberAtStart = -1;
115
+ private provenBlockNumberAtStart = -1;
116
+
117
+ private synchedLatestBlockNumber: AztecSingleton<number>;
118
+ private synchedProvenBlockNumber: AztecSingleton<number>;
112
119
 
113
120
  /**
114
121
  * In-memory P2P client constructor.
@@ -126,11 +133,15 @@ export class P2PClient implements P2P {
126
133
  private log = createDebugLogger('aztec:p2p'),
127
134
  ) {
128
135
  const { p2pBlockCheckIntervalMS: checkInterval, p2pL2QueueSize } = getP2PConfigEnvVars();
129
- this.blockDownloader = new L2BlockDownloader(l2BlockSource, {
130
- maxQueueSize: p2pL2QueueSize,
131
- pollIntervalMS: checkInterval,
132
- });
133
- this.synchedBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
136
+ const l2DownloaderOpts = { maxQueueSize: p2pL2QueueSize, pollIntervalMS: checkInterval };
137
+ // TODO(palla/prover-node): This effectively downloads blocks twice from the archiver, which is an issue
138
+ // if the archiver is remote. We should refactor this so the downloader keeps a single queue and handles
139
+ // latest/proven metadata, as well as block reorgs.
140
+ this.latestBlockDownloader = new L2BlockDownloader(l2BlockSource, l2DownloaderOpts);
141
+ this.provenBlockDownloader = new L2BlockDownloader(l2BlockSource, { ...l2DownloaderOpts, proven: true });
142
+
143
+ this.synchedLatestBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
144
+ this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
134
145
  }
135
146
 
136
147
  /**
@@ -145,41 +156,47 @@ export class P2PClient implements P2P {
145
156
  return this.syncPromise;
146
157
  }
147
158
 
148
- // get the current latest block number
159
+ // get the current latest block numbers
149
160
  this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockNumber();
161
+ this.provenBlockNumberAtStart = await this.l2BlockSource.getProvenBlockNumber();
150
162
 
151
- const blockToDownloadFrom = this.getSyncedBlockNum() + 1;
163
+ const syncedLatestBlock = this.getSyncedLatestBlockNum() + 1;
164
+ const syncedProvenBlock = this.getSyncedProvenBlockNum() + 1;
152
165
 
153
166
  // if there are blocks to be retrieved, go to a synching state
154
- if (blockToDownloadFrom <= this.latestBlockNumberAtStart) {
167
+ if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart) {
155
168
  this.setCurrentState(P2PClientState.SYNCHING);
156
169
  this.syncPromise = new Promise(resolve => {
157
170
  this.syncResolve = resolve;
158
171
  });
159
- this.log.verbose(`Starting sync from ${blockToDownloadFrom}, latest block ${this.latestBlockNumberAtStart}`);
172
+ this.log.verbose(`Starting sync from ${syncedLatestBlock} (last proven ${syncedProvenBlock})`);
160
173
  } else {
161
174
  // if no blocks to be retrieved, go straight to running
162
175
  this.setCurrentState(P2PClientState.RUNNING);
163
176
  this.syncPromise = Promise.resolve();
164
177
  await this.p2pService.start();
165
- this.log.verbose(
166
- `Next block ${blockToDownloadFrom} already beyond latest block at ${this.latestBlockNumberAtStart}`,
167
- );
178
+ this.log.verbose(`Block ${syncedLatestBlock} (proven ${syncedProvenBlock}) already beyond current block`);
168
179
  }
169
180
 
170
181
  // publish any txs in TxPool after its doing initial sync
171
182
  this.syncPromise = this.syncPromise.then(() => this.publishStoredTxs());
172
183
 
173
184
  // start looking for further blocks
174
- const blockProcess = async () => {
185
+ const processLatest = async () => {
186
+ while (!this.stopping) {
187
+ await this.latestBlockDownloader.getBlocks(1).then(this.handleLatestL2Blocks.bind(this));
188
+ }
189
+ };
190
+ const processProven = async () => {
175
191
  while (!this.stopping) {
176
- const blocks = await this.blockDownloader.getBlocks();
177
- await this.handleL2Blocks(blocks);
192
+ await this.provenBlockDownloader.getBlocks(1).then(this.handleProvenL2Blocks.bind(this));
178
193
  }
179
194
  };
180
- this.runningPromise = blockProcess();
181
- this.blockDownloader.start(blockToDownloadFrom);
182
- this.log.verbose(`Started block downloader from block ${blockToDownloadFrom}`);
195
+
196
+ this.runningPromise = Promise.all([processLatest(), processProven()]).then(() => {});
197
+ this.latestBlockDownloader.start(syncedLatestBlock);
198
+ this.provenBlockDownloader.start(syncedLatestBlock);
199
+ this.log.verbose(`Started block downloader from block ${syncedLatestBlock}`);
183
200
 
184
201
  return this.syncPromise;
185
202
  }
@@ -193,7 +210,8 @@ export class P2PClient implements P2P {
193
210
  this.stopping = true;
194
211
  await this.p2pService.stop();
195
212
  this.log.debug('Stopped p2p service');
196
- await this.blockDownloader.stop();
213
+ await this.latestBlockDownloader.stop();
214
+ await this.provenBlockDownloader.stop();
197
215
  this.log.debug('Stopped block downloader');
198
216
  await this.runningPromise;
199
217
  this.setCurrentState(P2PClientState.STOPPED);
@@ -204,8 +222,23 @@ export class P2PClient implements P2P {
204
222
  * Returns all transactions in the transaction pool.
205
223
  * @returns An array of Txs.
206
224
  */
207
- public getTxs(): Promise<Tx[]> {
208
- return Promise.resolve(this.txPool.getAllTxs());
225
+ public getTxs(filter: 'all' | 'pending' | 'mined'): Tx[] {
226
+ if (filter === 'all') {
227
+ return this.txPool.getAllTxs();
228
+ } else if (filter === 'mined') {
229
+ return this.txPool
230
+ .getMinedTxHashes()
231
+ .map(txHash => this.txPool.getTxByHash(txHash))
232
+ .filter((tx): tx is Tx => !!tx);
233
+ } else if (filter === 'pending') {
234
+ return this.txPool
235
+ .getPendingTxHashes()
236
+ .map(txHash => this.txPool.getTxByHash(txHash))
237
+ .filter((tx): tx is Tx => !!tx);
238
+ } else {
239
+ const _: never = filter;
240
+ throw new Error(`Unknown filter ${filter}`);
241
+ }
209
242
  }
210
243
 
211
244
  /**
@@ -213,8 +246,8 @@ export class P2PClient implements P2P {
213
246
  * @param txHash - Hash of the transaction to look for in the pool.
214
247
  * @returns A single tx or undefined.
215
248
  */
216
- getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
217
- return Promise.resolve(this.txPool.getTxByHash(txHash));
249
+ getTxByHash(txHash: TxHash): Tx | undefined {
250
+ return this.txPool.getTxByHash(txHash);
218
251
  }
219
252
 
220
253
  /**
@@ -231,6 +264,15 @@ export class P2PClient implements P2P {
231
264
  this.p2pService.propagateTx(tx);
232
265
  }
233
266
 
267
+ /**
268
+ * Returns whether the given tx hash is flagged as pending or mined.
269
+ * @param txHash - Hash of the tx to query.
270
+ * @returns Pending or mined depending on its status, or undefined if not found.
271
+ */
272
+ public getTxStatus(txHash: TxHash): 'pending' | 'mined' | undefined {
273
+ return this.txPool.getTxStatus(txHash);
274
+ }
275
+
234
276
  /**
235
277
  * Deletes the 'txs' from the pool.
236
278
  * NOT used if we use sendTx as reconcileTxPool will handle this.
@@ -257,8 +299,16 @@ export class P2PClient implements P2P {
257
299
  * Public function to check the latest block number that the P2P client is synced to.
258
300
  * @returns Block number of latest L2 Block we've synced with.
259
301
  */
260
- public getSyncedBlockNum() {
261
- return this.synchedBlockNumber.get() ?? INITIAL_L2_BLOCK_NUM - 1;
302
+ public getSyncedLatestBlockNum() {
303
+ return this.synchedLatestBlockNumber.get() ?? INITIAL_L2_BLOCK_NUM - 1;
304
+ }
305
+
306
+ /**
307
+ * Public function to check the latest proven block number that the P2P client is synced to.
308
+ * @returns Block number of latest proven L2 Block we've synced with.
309
+ */
310
+ public getSyncedProvenBlockNum() {
311
+ return this.synchedProvenBlockNumber.get() ?? INITIAL_L2_BLOCK_NUM - 1;
262
312
  }
263
313
 
264
314
  /**
@@ -268,16 +318,28 @@ export class P2PClient implements P2P {
268
318
  public getStatus(): Promise<P2PSyncState> {
269
319
  return Promise.resolve({
270
320
  state: this.currentState,
271
- syncedToL2Block: this.getSyncedBlockNum(),
321
+ syncedToL2Block: this.getSyncedLatestBlockNum(),
272
322
  } as P2PSyncState);
273
323
  }
274
324
 
275
325
  /**
276
- * Internal method that uses the provided blocks to check against the client's tx pool.
326
+ * Mark all txs from these blocks as mined.
327
+ * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
328
+ * @returns Empty promise.
329
+ */
330
+ private async markTxsAsMinedFromBlocks(blocks: L2Block[]): Promise<void> {
331
+ for (const block of blocks) {
332
+ const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
333
+ await this.txPool.markAsMined(txHashes);
334
+ }
335
+ }
336
+
337
+ /**
338
+ * Deletes txs from these blocks.
277
339
  * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
278
340
  * @returns Empty promise.
279
341
  */
280
- private async reconcileTxPool(blocks: L2Block[]): Promise<void> {
342
+ private async deleteTxsFromBlocks(blocks: L2Block[]): Promise<void> {
281
343
  for (const block of blocks) {
282
344
  const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
283
345
  await this.txPool.deleteTxs(txHashes);
@@ -285,20 +347,44 @@ export class P2PClient implements P2P {
285
347
  }
286
348
 
287
349
  /**
288
- * Method for processing new blocks.
350
+ * Handles new mined blocks by marking the txs in them as mined.
289
351
  * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
290
352
  * @returns Empty promise.
291
353
  */
292
- private async handleL2Blocks(blocks: L2Block[]): Promise<void> {
354
+ private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
293
355
  if (!blocks.length) {
294
356
  return Promise.resolve();
295
357
  }
296
- await this.reconcileTxPool(blocks);
358
+ await this.markTxsAsMinedFromBlocks(blocks);
297
359
  const lastBlockNum = blocks[blocks.length - 1].number;
298
- await this.synchedBlockNumber.set(lastBlockNum);
299
- this.log.debug(`Synched to block ${lastBlockNum}`);
360
+ await this.synchedLatestBlockNumber.set(lastBlockNum);
361
+ this.log.debug(`Synched to latest block ${lastBlockNum}`);
362
+ await this.startServiceIfSynched();
363
+ }
364
+
365
+ /**
366
+ * Handles new proven blocks by deleting the txs in them.
367
+ * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
368
+ * @returns Empty promise.
369
+ */
370
+ private async handleProvenL2Blocks(blocks: L2Block[]): Promise<void> {
371
+ if (!blocks.length) {
372
+ return Promise.resolve();
373
+ }
374
+ await this.deleteTxsFromBlocks(blocks);
375
+ const lastBlockNum = blocks[blocks.length - 1].number;
376
+ await this.synchedProvenBlockNumber.set(lastBlockNum);
377
+ this.log.debug(`Synched to proven block ${lastBlockNum}`);
378
+ await this.startServiceIfSynched();
379
+ }
300
380
 
301
- if (this.currentState === P2PClientState.SYNCHING && lastBlockNum >= this.latestBlockNumberAtStart) {
381
+ private async startServiceIfSynched() {
382
+ if (
383
+ this.currentState === P2PClientState.SYNCHING &&
384
+ this.getSyncedLatestBlockNum() >= this.latestBlockNumberAtStart &&
385
+ this.getSyncedProvenBlockNum() >= this.provenBlockNumberAtStart
386
+ ) {
387
+ this.log.debug(`Synched to blocks at start`);
302
388
  this.setCurrentState(P2PClientState.RUNNING);
303
389
  if (this.syncResolve !== undefined) {
304
390
  this.syncResolve();