@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.
- package/dest/client/index.d.ts +1 -1
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +2 -2
- package/dest/client/p2p_client.d.ts +49 -21
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +111 -36
- package/dest/tx_pool/aztec_kv_tx_pool.d.ts +4 -6
- package/dest/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/tx_pool/aztec_kv_tx_pool.js +47 -16
- package/dest/tx_pool/memory_tx_pool.d.ts +6 -6
- package/dest/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/tx_pool/memory_tx_pool.js +36 -11
- package/dest/tx_pool/tx_pool.d.ts +19 -4
- package/dest/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/tx_pool/tx_pool_test_suite.js +16 -4
- package/package.json +6 -6
- package/src/client/index.ts +1 -1
- package/src/client/p2p_client.ts +134 -48
- package/src/tx_pool/aztec_kv_tx_pool.ts +49 -15
- package/src/tx_pool/memory_tx_pool.ts +42 -11
- package/src/tx_pool/tx_pool.ts +22 -4
- package/src/tx_pool/tx_pool_test_suite.ts +18 -3
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
*
|
|
34
|
-
* @
|
|
35
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
22
|
-
expect(
|
|
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,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF90ZXN0X3N1aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3Bvb2wvdHhfcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQXVCO0lBQ3BELElBQUksSUFBWSxDQUFDO0lBRWpCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFckIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxNQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6QyxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUVyQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "0.
|
|
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.
|
|
60
|
-
"@aztec/circuits.js": "0.
|
|
61
|
-
"@aztec/foundation": "0.
|
|
62
|
-
"@aztec/kv-store": "0.
|
|
63
|
-
"@aztec/telemetry-client": "0.
|
|
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",
|
package/src/client/index.ts
CHANGED
|
@@ -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
|
) => {
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -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():
|
|
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):
|
|
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
|
-
|
|
94
|
-
*/
|
|
95
|
-
private blockDownloader: L2BlockDownloader;
|
|
99
|
+
/** L2 block download to stay in sync with latest blocks. */
|
|
100
|
+
private latestBlockDownloader: L2BlockDownloader;
|
|
96
101
|
|
|
97
|
-
/**
|
|
98
|
-
|
|
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
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
this.
|
|
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
|
|
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
|
|
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 (
|
|
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 ${
|
|
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
|
|
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
|
-
|
|
177
|
-
await this.handleL2Blocks(blocks);
|
|
192
|
+
await this.provenBlockDownloader.getBlocks(1).then(this.handleProvenL2Blocks.bind(this));
|
|
178
193
|
}
|
|
179
194
|
};
|
|
180
|
-
|
|
181
|
-
this.
|
|
182
|
-
this.
|
|
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.
|
|
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():
|
|
208
|
-
|
|
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):
|
|
217
|
-
return
|
|
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
|
|
261
|
-
return this.
|
|
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.
|
|
321
|
+
syncedToL2Block: this.getSyncedLatestBlockNum(),
|
|
272
322
|
} as P2PSyncState);
|
|
273
323
|
}
|
|
274
324
|
|
|
275
325
|
/**
|
|
276
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
|
354
|
+
private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
|
|
293
355
|
if (!blocks.length) {
|
|
294
356
|
return Promise.resolve();
|
|
295
357
|
}
|
|
296
|
-
await this.
|
|
358
|
+
await this.markTxsAsMinedFromBlocks(blocks);
|
|
297
359
|
const lastBlockNum = blocks[blocks.length - 1].number;
|
|
298
|
-
await this.
|
|
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
|
-
|
|
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();
|