@aztec/p2p 0.42.0 → 0.44.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/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +8 -4
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +24 -21
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +2 -3
- package/dest/config.d.ts +9 -22
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +8 -9
- package/dest/service/discV5_service.d.ts +5 -2
- package/dest/service/discV5_service.d.ts.map +1 -1
- package/dest/service/discV5_service.js +38 -12
- package/dest/service/dummy_service.d.ts +4 -1
- package/dest/service/dummy_service.d.ts.map +1 -1
- package/dest/service/dummy_service.js +7 -1
- package/dest/service/libp2p_service.d.ts +5 -14
- package/dest/service/libp2p_service.d.ts.map +1 -1
- package/dest/service/libp2p_service.js +56 -97
- package/dest/service/peer_manager.d.ts +25 -3
- package/dest/service/peer_manager.d.ts.map +1 -1
- package/dest/service/peer_manager.js +152 -12
- package/dest/service/service.d.ts +12 -6
- package/dest/service/service.d.ts.map +1 -1
- package/dest/service/service.js +1 -1
- package/dest/tx_pool/aztec_kv_tx_pool.d.ts +2 -1
- package/dest/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/tx_pool/aztec_kv_tx_pool.js +11 -6
- package/dest/tx_pool/instrumentation.d.ts +23 -0
- package/dest/tx_pool/instrumentation.d.ts.map +1 -0
- package/dest/tx_pool/instrumentation.js +48 -0
- package/dest/tx_pool/memory_tx_pool.d.ts +3 -1
- package/dest/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/tx_pool/memory_tx_pool.js +6 -2
- package/dest/util.d.ts +21 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +59 -0
- package/package.json +15 -6
- package/src/bootstrap/bootstrap.ts +11 -5
- package/src/client/index.ts +28 -21
- package/src/client/p2p_client.ts +1 -2
- package/src/config.ts +19 -39
- package/src/service/discV5_service.ts +45 -15
- package/src/service/dummy_service.ts +10 -1
- package/src/service/libp2p_service.ts +60 -108
- package/src/service/peer_manager.ts +187 -12
- package/src/service/service.ts +14 -7
- package/src/tx_pool/aztec_kv_tx_pool.ts +12 -3
- package/src/tx_pool/instrumentation.ts +58 -0
- package/src/tx_pool/memory_tx_pool.ts +8 -1
- package/src/util.ts +62 -0
- package/dest/service/ip_query.d.ts +0 -2
- package/dest/service/ip_query.d.ts.map +0 -1
- package/dest/service/ip_query.js +0 -6
- package/dest/service/known_txs.d.ts +0 -31
- package/dest/service/known_txs.d.ts.map +0 -1
- package/dest/service/known_txs.js +0 -52
- package/src/service/ip_query.ts +0 -5
- package/src/service/known_txs.ts +0 -56
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
var _AztecKVTxPool_store, _AztecKVTxPool_txs, _AztecKVTxPool_log;
|
|
1
|
+
var _AztecKVTxPool_store, _AztecKVTxPool_txs, _AztecKVTxPool_log, _AztecKVTxPool_metrics;
|
|
2
2
|
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
3
|
import { Tx, TxHash } from '@aztec/circuit-types';
|
|
4
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { TxPoolInstrumentation } from './instrumentation.js';
|
|
5
6
|
/**
|
|
6
7
|
* In-memory implementation of the Transaction Pool.
|
|
7
8
|
*/
|
|
@@ -11,16 +12,18 @@ export class AztecKVTxPool {
|
|
|
11
12
|
* @param store - A KV store.
|
|
12
13
|
* @param log - A logger.
|
|
13
14
|
*/
|
|
14
|
-
constructor(store, log = createDebugLogger('aztec:tx_pool')) {
|
|
15
|
+
constructor(store, telemetry, log = createDebugLogger('aztec:tx_pool')) {
|
|
15
16
|
_AztecKVTxPool_store.set(this, void 0);
|
|
16
17
|
/**
|
|
17
18
|
* Our tx pool, stored as a Map in-memory, with K: tx hash and V: the transaction.
|
|
18
19
|
*/
|
|
19
20
|
_AztecKVTxPool_txs.set(this, void 0);
|
|
20
21
|
_AztecKVTxPool_log.set(this, void 0);
|
|
22
|
+
_AztecKVTxPool_metrics.set(this, void 0);
|
|
21
23
|
__classPrivateFieldSet(this, _AztecKVTxPool_txs, store.openMap('txs'), "f");
|
|
22
24
|
__classPrivateFieldSet(this, _AztecKVTxPool_store, store, "f");
|
|
23
25
|
__classPrivateFieldSet(this, _AztecKVTxPool_log, log, "f");
|
|
26
|
+
__classPrivateFieldSet(this, _AztecKVTxPool_metrics, new TxPoolInstrumentation(telemetry, 'AztecKVTxPool'), "f");
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Checks if a transaction exists in the pool and returns it.
|
|
@@ -36,8 +39,8 @@ export class AztecKVTxPool {
|
|
|
36
39
|
* @param txs - An array of txs to be added to the pool.
|
|
37
40
|
* @returns Empty promise.
|
|
38
41
|
*/
|
|
39
|
-
|
|
40
|
-
const txHashes =
|
|
42
|
+
addTxs(txs) {
|
|
43
|
+
const txHashes = txs.map(tx => tx.getTxHash());
|
|
41
44
|
return __classPrivateFieldGet(this, _AztecKVTxPool_store, "f").transaction(() => {
|
|
42
45
|
for (const [i, tx] of txs.entries()) {
|
|
43
46
|
const txHash = txHashes[i];
|
|
@@ -47,6 +50,7 @@ export class AztecKVTxPool {
|
|
|
47
50
|
});
|
|
48
51
|
void __classPrivateFieldGet(this, _AztecKVTxPool_txs, "f").set(txHash.toString(), tx.toBuffer());
|
|
49
52
|
}
|
|
53
|
+
__classPrivateFieldGet(this, _AztecKVTxPool_metrics, "f").recordTxs(txs);
|
|
50
54
|
});
|
|
51
55
|
}
|
|
52
56
|
/**
|
|
@@ -59,6 +63,7 @@ export class AztecKVTxPool {
|
|
|
59
63
|
for (const hash of txHashes) {
|
|
60
64
|
void __classPrivateFieldGet(this, _AztecKVTxPool_txs, "f").delete(hash.toString());
|
|
61
65
|
}
|
|
66
|
+
__classPrivateFieldGet(this, _AztecKVTxPool_metrics, "f").removeTxs(txHashes.length);
|
|
62
67
|
});
|
|
63
68
|
}
|
|
64
69
|
/**
|
|
@@ -84,5 +89,5 @@ export class AztecKVTxPool {
|
|
|
84
89
|
return __classPrivateFieldGet(this, _AztecKVTxPool_txs, "f").has(txHash.toString());
|
|
85
90
|
}
|
|
86
91
|
}
|
|
87
|
-
_AztecKVTxPool_store = new WeakMap(), _AztecKVTxPool_txs = new WeakMap(), _AztecKVTxPool_log = new WeakMap();
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
_AztecKVTxPool_store = new WeakMap(), _AztecKVTxPool_txs = new WeakMap(), _AztecKVTxPool_log = new WeakMap(), _AztecKVTxPool_metrics = new WeakMap();
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWNfa3ZfdHhfcG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF9wb29sL2F6dGVjX2t2X3R4X3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFZeEI7Ozs7T0FJRztJQUNILFlBQVksS0FBbUIsRUFBRSxTQUEwQixFQUFFLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7UUFoQnJHLHVDQUFxQjtRQUVyQjs7V0FFRztRQUNILHFDQUErQjtRQUUvQixxQ0FBYTtRQUViLHlDQUFnQztRQVE5Qix1QkFBQSxJQUFJLHNCQUFRLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQUEsQ0FBQztRQUNqQyx1QkFBQSxJQUFJLHdCQUFVLEtBQUssTUFBQSxDQUFDO1FBQ3BCLHVCQUFBLElBQUksc0JBQVEsR0FBRyxNQUFBLENBQUM7UUFDaEIsdUJBQUEsSUFBSSwwQkFBWSxJQUFJLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsTUFBQSxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLE1BQWM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsdUJBQUEsSUFBSSwwQkFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNoRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEdBQVM7UUFDckIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sdUJBQUEsSUFBSSw0QkFBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDbEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLHVCQUFBLElBQUksMEJBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFO29CQUN2RCxTQUFTLEVBQUUsa0JBQWtCO29CQUM3QixHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7aUJBQ1ksQ0FBQyxDQUFDO2dCQUVoQyxLQUFLLHVCQUFBLElBQUksMEJBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFFRCx1QkFBQSxJQUFJLDhCQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsUUFBa0I7UUFDakMsT0FBTyx1QkFBQSxJQUFJLDRCQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixLQUFLLHVCQUFBLElBQUksMEJBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUVELHVCQUFBLElBQUksOEJBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVM7UUFDZCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQUEsSUFBSSwwQkFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjO1FBQ25CLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBQSxJQUFJLDBCQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLHVCQUFBLElBQUksMEJBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Tx } from '@aztec/circuit-types';
|
|
2
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
|
+
/**
|
|
4
|
+
* Instrumentation class for the TxPool.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TxPoolInstrumentation {
|
|
7
|
+
/** The number of txs in the mempool */
|
|
8
|
+
private txInMempool;
|
|
9
|
+
/** Tracks tx size */
|
|
10
|
+
private txSize;
|
|
11
|
+
constructor(telemetry: TelemetryClient, name: string);
|
|
12
|
+
/**
|
|
13
|
+
* Updates the metrics with the new transactions.
|
|
14
|
+
* @param txs - The transactions to record
|
|
15
|
+
*/
|
|
16
|
+
recordTxs(txs: Tx[]): void;
|
|
17
|
+
/**
|
|
18
|
+
* Updates the metrics by removing transactions from the mempool.
|
|
19
|
+
* @param count - The number of transactions to remove from the mempool
|
|
20
|
+
*/
|
|
21
|
+
removeTxs(count?: number): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/tx_pool/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAA2B,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAE5G;;GAEG;AACH,qBAAa,qBAAqB;IAChC,uCAAuC;IACvC,OAAO,CAAC,WAAW,CAAgB;IACnC,qBAAqB;IACrB,OAAO,CAAC,MAAM,CAAY;gBAEd,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM;IAuBpD;;;OAGG;IACI,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE;IAQ1B;;;OAGG;IACI,SAAS,CAAC,KAAK,SAAI;CAM3B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Metrics } from '@aztec/telemetry-client';
|
|
2
|
+
/**
|
|
3
|
+
* Instrumentation class for the TxPool.
|
|
4
|
+
*/
|
|
5
|
+
export class TxPoolInstrumentation {
|
|
6
|
+
constructor(telemetry, name) {
|
|
7
|
+
const meter = telemetry.getMeter(name);
|
|
8
|
+
this.txInMempool = meter.createUpDownCounter(Metrics.MEMPOOL_TX_COUNT, {
|
|
9
|
+
description: 'The current number of transactions in the mempool',
|
|
10
|
+
});
|
|
11
|
+
this.txSize = meter.createHistogram(Metrics.MEMPOOL_TX_SIZE, {
|
|
12
|
+
unit: 'By',
|
|
13
|
+
description: 'The size of transactions in the mempool',
|
|
14
|
+
advice: {
|
|
15
|
+
explicitBucketBoundaries: [
|
|
16
|
+
5000, // 5KB
|
|
17
|
+
10000,
|
|
18
|
+
20000,
|
|
19
|
+
50000,
|
|
20
|
+
75000,
|
|
21
|
+
100000, // 100KB
|
|
22
|
+
200000,
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Updates the metrics with the new transactions.
|
|
29
|
+
* @param txs - The transactions to record
|
|
30
|
+
*/
|
|
31
|
+
recordTxs(txs) {
|
|
32
|
+
for (const tx of txs) {
|
|
33
|
+
this.txSize.record(tx.getSize());
|
|
34
|
+
}
|
|
35
|
+
this.txInMempool.add(txs.length);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Updates the metrics by removing transactions from the mempool.
|
|
39
|
+
* @param count - The number of transactions to remove from the mempool
|
|
40
|
+
*/
|
|
41
|
+
removeTxs(count = 1) {
|
|
42
|
+
if (count < 0) {
|
|
43
|
+
throw new Error('Count must be positive');
|
|
44
|
+
}
|
|
45
|
+
this.txInMempool.add(-1 * count);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3Bvb2wvaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBa0IsT0FBTyxFQUE0QyxNQUFNLHlCQUF5QixDQUFDO0FBRTVHOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQU1oQyxZQUFZLFNBQTBCLEVBQUUsSUFBWTtRQUNsRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyRSxXQUFXLEVBQUUsbURBQW1EO1NBQ2pFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO1lBQzNELElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFLHlDQUF5QztZQUN0RCxNQUFNLEVBQUU7Z0JBQ04sd0JBQXdCLEVBQUU7b0JBQ3hCLElBQUssRUFBRSxNQUFNO29CQUNiLEtBQU07b0JBQ04sS0FBTTtvQkFDTixLQUFNO29CQUNOLEtBQU07b0JBQ04sTUFBTyxFQUFFLFFBQVE7b0JBQ2pCLE1BQU87aUJBQ1I7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUMsR0FBUztRQUN4QixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIn0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Tx, TxHash } from '@aztec/circuit-types';
|
|
2
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
2
3
|
import { type TxPool } from './tx_pool.js';
|
|
3
4
|
/**
|
|
4
5
|
* In-memory implementation of the Transaction Pool.
|
|
@@ -9,11 +10,12 @@ export declare class InMemoryTxPool implements TxPool {
|
|
|
9
10
|
* Our tx pool, stored as a Map in-memory, with K: tx hash and V: the transaction.
|
|
10
11
|
*/
|
|
11
12
|
private txs;
|
|
13
|
+
private metrics;
|
|
12
14
|
/**
|
|
13
15
|
* Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
|
|
14
16
|
* @param log - A logger.
|
|
15
17
|
*/
|
|
16
|
-
constructor(log?: import("@aztec/foundation/log").Logger);
|
|
18
|
+
constructor(telemetry: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
17
19
|
/**
|
|
18
20
|
* Checks if a transaction exists in the pool and returns it.
|
|
19
21
|
* @param txHash - The generated tx hash.
|
|
@@ -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;
|
|
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,5 +1,6 @@
|
|
|
1
1
|
import { Tx, TxHash } from '@aztec/circuit-types';
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { TxPoolInstrumentation } from './instrumentation.js';
|
|
3
4
|
/**
|
|
4
5
|
* In-memory implementation of the Transaction Pool.
|
|
5
6
|
*/
|
|
@@ -8,9 +9,10 @@ export class InMemoryTxPool {
|
|
|
8
9
|
* Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
|
|
9
10
|
* @param log - A logger.
|
|
10
11
|
*/
|
|
11
|
-
constructor(log = createDebugLogger('aztec:tx_pool')) {
|
|
12
|
+
constructor(telemetry, log = createDebugLogger('aztec:tx_pool')) {
|
|
12
13
|
this.log = log;
|
|
13
14
|
this.txs = new Map();
|
|
15
|
+
this.metrics = new TxPoolInstrumentation(telemetry, 'InMemoryTxPool');
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
18
|
* Checks if a transaction exists in the pool and returns it.
|
|
@@ -27,6 +29,7 @@ export class InMemoryTxPool {
|
|
|
27
29
|
* @returns Empty promise.
|
|
28
30
|
*/
|
|
29
31
|
addTxs(txs) {
|
|
32
|
+
this.metrics.recordTxs(txs);
|
|
30
33
|
for (const tx of txs) {
|
|
31
34
|
const txHash = tx.getTxHash();
|
|
32
35
|
this.log.debug(`Adding tx with id ${txHash.toString()}`, {
|
|
@@ -43,6 +46,7 @@ export class InMemoryTxPool {
|
|
|
43
46
|
* @returns The number of transactions that was deleted from the pool.
|
|
44
47
|
*/
|
|
45
48
|
deleteTxs(txHashes) {
|
|
49
|
+
this.metrics.removeTxs(txHashes.length);
|
|
46
50
|
for (const txHash of txHashes) {
|
|
47
51
|
this.txs.delete(txHash.toBigInt());
|
|
48
52
|
}
|
|
@@ -71,4 +75,4 @@ export class InMemoryTxPool {
|
|
|
71
75
|
return this.txs.has(txHash.toBigInt());
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X3R4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfcG9vbC9tZW1vcnlfdHhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFRekI7OztPQUdHO0lBQ0gsWUFBWSxTQUEwQixFQUFVLE1BQU0saUJBQWlCLENBQUMsZUFBZSxDQUFDO1FBQXhDLFFBQUcsR0FBSCxHQUFHLENBQXFDO1FBQ3RGLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsTUFBYztRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxHQUFTO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHFCQUFxQixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRTtnQkFDdkQsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO2FBQ1ksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsUUFBa0I7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTO1FBQ2QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiJ9
|
package/dest/util.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts an address string to a multiaddr string.
|
|
3
|
+
* Example usage:
|
|
4
|
+
* const tcpAddr = '123.456.7.8:80' -> /ip4/123.456.7.8/tcp/80
|
|
5
|
+
* const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
|
|
6
|
+
* const dnsAddr = 'example.com:443' -> /dns4/example.com/tcp/443
|
|
7
|
+
* @param address - The address string to convert. Has to be in the format <addr>:<port>.
|
|
8
|
+
* @param protocol - The protocol to use in the multiaddr string.
|
|
9
|
+
* @returns A multiaddr compliant string.
|
|
10
|
+
*/
|
|
11
|
+
export declare function convertToMultiaddr(address: string, protocol: 'tcp' | 'udp'): string;
|
|
12
|
+
/**
|
|
13
|
+
* Splits an <address>:<port> string into its components.
|
|
14
|
+
* @returns The ip6 or ip4 address & port separately
|
|
15
|
+
*/
|
|
16
|
+
export declare function splitAddressPort(address: string, allowEmptyAddress: boolean): [string, string];
|
|
17
|
+
/**
|
|
18
|
+
* Queries the public IP address of the machine.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getPublicIp(): Promise<string>;
|
|
21
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAgBnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB9F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD"}
|
package/dest/util.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts an address string to a multiaddr string.
|
|
3
|
+
* Example usage:
|
|
4
|
+
* const tcpAddr = '123.456.7.8:80' -> /ip4/123.456.7.8/tcp/80
|
|
5
|
+
* const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
|
|
6
|
+
* const dnsAddr = 'example.com:443' -> /dns4/example.com/tcp/443
|
|
7
|
+
* @param address - The address string to convert. Has to be in the format <addr>:<port>.
|
|
8
|
+
* @param protocol - The protocol to use in the multiaddr string.
|
|
9
|
+
* @returns A multiaddr compliant string.
|
|
10
|
+
*/
|
|
11
|
+
export function convertToMultiaddr(address, protocol) {
|
|
12
|
+
const [addr, port] = splitAddressPort(address, false);
|
|
13
|
+
let multiaddrPrefix;
|
|
14
|
+
if (addr.includes(':')) {
|
|
15
|
+
// IPv6 address
|
|
16
|
+
multiaddrPrefix = 'ip6';
|
|
17
|
+
}
|
|
18
|
+
else if (addr.match(/^[\d.]+$/)) {
|
|
19
|
+
// IPv4 address
|
|
20
|
+
multiaddrPrefix = 'ip4';
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
throw new Error('Invalid address format. Expected an IPv4 or IPv6 address.');
|
|
24
|
+
}
|
|
25
|
+
return `/${multiaddrPrefix}/${addr}/${protocol}/${port}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Splits an <address>:<port> string into its components.
|
|
29
|
+
* @returns The ip6 or ip4 address & port separately
|
|
30
|
+
*/
|
|
31
|
+
export function splitAddressPort(address, allowEmptyAddress) {
|
|
32
|
+
let addr;
|
|
33
|
+
let port;
|
|
34
|
+
if (address.startsWith('[')) {
|
|
35
|
+
// IPv6 address enclosed in square brackets
|
|
36
|
+
const match = address.match(/^\[([^\]]+)\]:(\d+)$/);
|
|
37
|
+
if (!match) {
|
|
38
|
+
throw new Error(`Invalid IPv6 address format:${address}. Expected format: [<addr>]:<port>`);
|
|
39
|
+
}
|
|
40
|
+
[, addr, port] = match;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// IPv4 address
|
|
44
|
+
[addr, port] = address.split(':');
|
|
45
|
+
if ((!addr && !allowEmptyAddress) || !port) {
|
|
46
|
+
throw new Error(`Invalid address format: ${address}. Expected format: <addr>:<port>`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return [addr, port];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Queries the public IP address of the machine.
|
|
53
|
+
*/
|
|
54
|
+
export async function getPublicIp() {
|
|
55
|
+
const resp = await fetch('http://checkip.amazonaws.com/');
|
|
56
|
+
const text = await resp.text();
|
|
57
|
+
return text.trim();
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUFlLEVBQUUsUUFBdUI7SUFDekUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFdEQsSUFBSSxlQUF1QixDQUFDO0lBRTVCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLGVBQWU7UUFDZixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7U0FBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxlQUFlO1FBQ2YsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsT0FBTyxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLGlCQUEwQjtJQUMxRSxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLElBQVksQ0FBQztJQUVqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QiwyQ0FBMkM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLE9BQU8sb0NBQW9DLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztTQUFNLENBQUM7UUFDTixlQUFlO1FBQ2YsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVc7SUFDL0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMxRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.44.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -31,7 +31,15 @@
|
|
|
31
31
|
"rootDir": "./src",
|
|
32
32
|
"transform": {
|
|
33
33
|
"^.+\\.tsx?$": [
|
|
34
|
-
"@swc/jest"
|
|
34
|
+
"@swc/jest",
|
|
35
|
+
{
|
|
36
|
+
"jsc": {
|
|
37
|
+
"parser": {
|
|
38
|
+
"syntax": "typescript",
|
|
39
|
+
"decorators": true
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
35
43
|
]
|
|
36
44
|
},
|
|
37
45
|
"extensionsToTreatAsEsm": [
|
|
@@ -48,10 +56,11 @@
|
|
|
48
56
|
"testTimeout": 15000
|
|
49
57
|
},
|
|
50
58
|
"dependencies": {
|
|
51
|
-
"@aztec/circuit-types": "0.
|
|
52
|
-
"@aztec/circuits.js": "0.
|
|
53
|
-
"@aztec/foundation": "0.
|
|
54
|
-
"@aztec/kv-store": "0.
|
|
59
|
+
"@aztec/circuit-types": "0.44.0",
|
|
60
|
+
"@aztec/circuits.js": "0.44.0",
|
|
61
|
+
"@aztec/foundation": "0.44.0",
|
|
62
|
+
"@aztec/kv-store": "0.44.0",
|
|
63
|
+
"@aztec/telemetry-client": "0.44.0",
|
|
55
64
|
"@chainsafe/discv5": "9.0.0",
|
|
56
65
|
"@chainsafe/enr": "3.0.0",
|
|
57
66
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
@@ -8,13 +8,14 @@ import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
|
|
|
8
8
|
import { type P2PConfig } from '../config.js';
|
|
9
9
|
import { AZTEC_ENR_KEY, AZTEC_NET } from '../service/discV5_service.js';
|
|
10
10
|
import { createLibP2PPeerId } from '../service/index.js';
|
|
11
|
+
import { convertToMultiaddr } from '../util.js';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Required P2P config values for a bootstrap node.
|
|
14
15
|
*/
|
|
15
16
|
export type BootNodeConfig = Partial<P2PConfig> &
|
|
16
|
-
Pick<P2PConfig, '
|
|
17
|
-
Required<Pick<P2PConfig, '
|
|
17
|
+
Pick<P2PConfig, 'udpAnnounceAddress'> &
|
|
18
|
+
Required<Pick<P2PConfig, 'udpListenAddress'>>;
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* Encapsulates a 'Bootstrap' node, used for the purpose of assisting new joiners in acquiring peers.
|
|
@@ -31,13 +32,18 @@ export class BootstrapNode {
|
|
|
31
32
|
* @returns An empty promise.
|
|
32
33
|
*/
|
|
33
34
|
public async start(config: BootNodeConfig) {
|
|
34
|
-
const { peerIdPrivateKey,
|
|
35
|
+
const { peerIdPrivateKey, udpListenAddress, udpAnnounceAddress } = config;
|
|
35
36
|
const peerId = await createLibP2PPeerId(peerIdPrivateKey);
|
|
36
37
|
this.peerId = peerId;
|
|
37
38
|
const enr = SignableENR.createFromPeerId(peerId);
|
|
38
39
|
|
|
39
|
-
const listenAddrUdp = multiaddr(
|
|
40
|
-
|
|
40
|
+
const listenAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
|
|
41
|
+
|
|
42
|
+
if (!udpAnnounceAddress) {
|
|
43
|
+
throw new Error('You need to provide a UDP announce address.');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const publicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp'));
|
|
41
47
|
enr.setLocationMultiaddr(publicAddr);
|
|
42
48
|
enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
|
|
43
49
|
|
package/src/client/index.ts
CHANGED
|
@@ -4,10 +4,10 @@ import { type AztecKVStore } from '@aztec/kv-store';
|
|
|
4
4
|
import { P2PClient } from '../client/p2p_client.js';
|
|
5
5
|
import { type P2PConfig } from '../config.js';
|
|
6
6
|
import { DiscV5Service } from '../service/discV5_service.js';
|
|
7
|
-
import { DummyP2PService
|
|
7
|
+
import { DummyP2PService } from '../service/dummy_service.js';
|
|
8
8
|
import { LibP2PService, createLibP2PPeerId } from '../service/index.js';
|
|
9
|
-
import { getPublicIp } from '../service/ip_query.js';
|
|
10
9
|
import { type TxPool } from '../tx_pool/index.js';
|
|
10
|
+
import { getPublicIp, splitAddressPort } from '../util.js';
|
|
11
11
|
|
|
12
12
|
export * from './p2p_client.js';
|
|
13
13
|
|
|
@@ -17,44 +17,51 @@ export const createP2PClient = async (
|
|
|
17
17
|
txPool: TxPool,
|
|
18
18
|
l2BlockSource: L2BlockSource,
|
|
19
19
|
) => {
|
|
20
|
-
let discv5Service;
|
|
21
20
|
let p2pService;
|
|
22
21
|
|
|
23
22
|
if (config.p2pEnabled) {
|
|
24
|
-
// If
|
|
23
|
+
// If announceTcpAddress or announceUdpAddress are not provided, query for public IP if config allows
|
|
25
24
|
const {
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
tcpAnnounceAddress: configTcpAnnounceAddress,
|
|
26
|
+
udpAnnounceAddress: configUdpAnnounceAddress,
|
|
28
27
|
queryForIp,
|
|
29
28
|
} = config;
|
|
30
|
-
|
|
29
|
+
|
|
30
|
+
// create variable for re-use if needed
|
|
31
|
+
let publicIp;
|
|
32
|
+
|
|
33
|
+
// check if no announce IP was provided
|
|
34
|
+
const splitTcpAnnounceAddress = splitAddressPort(configTcpAnnounceAddress || '', true);
|
|
35
|
+
if (splitTcpAnnounceAddress.length == 2 && splitTcpAnnounceAddress[0] === '') {
|
|
31
36
|
if (queryForIp) {
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
config.
|
|
37
|
+
publicIp = await getPublicIp();
|
|
38
|
+
const tcpAnnounceAddress = `${publicIp}:${splitTcpAnnounceAddress[1]}`;
|
|
39
|
+
config.tcpAnnounceAddress = tcpAnnounceAddress;
|
|
35
40
|
} else {
|
|
36
|
-
throw new Error(
|
|
41
|
+
throw new Error(
|
|
42
|
+
`Invalid announceTcpAddress provided: ${configTcpAnnounceAddress}. Expected format: <addr>:<port>`,
|
|
43
|
+
);
|
|
37
44
|
}
|
|
38
45
|
}
|
|
39
46
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
const splitUdpAnnounceAddress = splitAddressPort(configUdpAnnounceAddress || '', true);
|
|
48
|
+
if (splitUdpAnnounceAddress.length == 2 && splitUdpAnnounceAddress[0] === '') {
|
|
49
|
+
// If announceUdpAddress is not provided, use announceTcpAddress
|
|
50
|
+
if (!queryForIp && config.tcpAnnounceAddress) {
|
|
51
|
+
config.udpAnnounceAddress = config.tcpAnnounceAddress;
|
|
44
52
|
} else if (queryForIp) {
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
config.
|
|
53
|
+
const udpPublicIp = publicIp || (await getPublicIp());
|
|
54
|
+
const udpAnnounceAddress = `${udpPublicIp}:${splitUdpAnnounceAddress[1]}`;
|
|
55
|
+
config.udpAnnounceAddress = udpAnnounceAddress;
|
|
48
56
|
}
|
|
49
57
|
}
|
|
50
58
|
|
|
51
59
|
// Create peer discovery service
|
|
52
60
|
const peerId = await createLibP2PPeerId(config.peerIdPrivateKey);
|
|
53
|
-
|
|
54
|
-
p2pService = await LibP2PService.new(config,
|
|
61
|
+
const discoveryService = new DiscV5Service(peerId, config);
|
|
62
|
+
p2pService = await LibP2PService.new(config, discoveryService, peerId, txPool, store);
|
|
55
63
|
} else {
|
|
56
64
|
p2pService = new DummyP2PService();
|
|
57
|
-
discv5Service = new DummyPeerDiscoveryService();
|
|
58
65
|
}
|
|
59
66
|
return new P2PClient(store, l2BlockSource, txPool, p2pService);
|
|
60
67
|
};
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -194,7 +194,7 @@ export class P2PClient implements P2P {
|
|
|
194
194
|
this.log.debug('Stopped block downloader');
|
|
195
195
|
await this.runningPromise;
|
|
196
196
|
this.setCurrentState(P2PClientState.STOPPED);
|
|
197
|
-
this.log.info('P2P client stopped
|
|
197
|
+
this.log.info('P2P client stopped.');
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
/**
|
|
@@ -278,7 +278,6 @@ export class P2PClient implements P2P {
|
|
|
278
278
|
for (const block of blocks) {
|
|
279
279
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
280
280
|
await this.txPool.deleteTxs(txHashes);
|
|
281
|
-
this.p2pService.settledTxs(txHashes);
|
|
282
281
|
}
|
|
283
282
|
}
|
|
284
283
|
|
package/src/config.ts
CHANGED
|
@@ -25,24 +25,24 @@ export interface P2PConfig {
|
|
|
25
25
|
p2pL2QueueSize: number;
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
* The
|
|
28
|
+
* The announce address for TCP.
|
|
29
29
|
*/
|
|
30
|
-
|
|
30
|
+
tcpAnnounceAddress?: string;
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* The
|
|
33
|
+
* The announce address for UDP.
|
|
34
34
|
*/
|
|
35
|
-
|
|
35
|
+
udpAnnounceAddress?: string;
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
|
-
* The
|
|
38
|
+
* The listen address for TCP.
|
|
39
39
|
*/
|
|
40
|
-
|
|
40
|
+
tcpListenAddress: string;
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
|
-
* The
|
|
43
|
+
* The listen address for UDP.
|
|
44
44
|
*/
|
|
45
|
-
|
|
45
|
+
udpListenAddress: string;
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* An optional peer id private key. If blank, will generate a random key.
|
|
@@ -59,22 +59,6 @@ export interface P2PConfig {
|
|
|
59
59
|
*/
|
|
60
60
|
transactionProtocol: string;
|
|
61
61
|
|
|
62
|
-
/**
|
|
63
|
-
* TCP Hostname to announce.
|
|
64
|
-
*/
|
|
65
|
-
announceTcpHostname?: string;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* UDP Hostname to announce.
|
|
69
|
-
* If not provided, will use the same hostname as TCP.
|
|
70
|
-
*/
|
|
71
|
-
announceUdpHostname?: string;
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Port to announce.
|
|
75
|
-
*/
|
|
76
|
-
announcePort?: number;
|
|
77
|
-
|
|
78
62
|
/**
|
|
79
63
|
* Whether to enable NAT from libp2p (ignored for bootstrap node).
|
|
80
64
|
*/
|
|
@@ -101,7 +85,7 @@ export interface P2PConfig {
|
|
|
101
85
|
txGossipVersion: SemVer;
|
|
102
86
|
|
|
103
87
|
/**
|
|
104
|
-
* If
|
|
88
|
+
* If announceUdpAddress or announceTcpAddress are not provided, query for the IP address of the machine. Default is false.
|
|
105
89
|
*/
|
|
106
90
|
queryForIp: boolean;
|
|
107
91
|
}
|
|
@@ -116,15 +100,12 @@ export function getP2PConfigEnvVars(): P2PConfig {
|
|
|
116
100
|
P2P_BLOCK_CHECK_INTERVAL_MS,
|
|
117
101
|
P2P_PEER_CHECK_INTERVAL_MS,
|
|
118
102
|
P2P_L2_BLOCK_QUEUE_SIZE,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
103
|
+
P2P_TCP_LISTEN_ADDR,
|
|
104
|
+
P2P_UDP_LISTEN_ADDR,
|
|
105
|
+
P2P_TCP_ANNOUNCE_ADDR,
|
|
106
|
+
P2P_UDP_ANNOUNCE_ADDR,
|
|
123
107
|
PEER_ID_PRIVATE_KEY,
|
|
124
108
|
BOOTSTRAP_NODES,
|
|
125
|
-
P2P_ANNOUNCE_TCP_HOSTNAME,
|
|
126
|
-
P2P_ANNOUNCE_UDP_HOSTNAME,
|
|
127
|
-
P2P_ANNOUNCE_PORT,
|
|
128
109
|
P2P_NAT_ENABLED,
|
|
129
110
|
P2P_MIN_PEERS,
|
|
130
111
|
P2P_MAX_PEERS,
|
|
@@ -133,21 +114,20 @@ export function getP2PConfigEnvVars(): P2PConfig {
|
|
|
133
114
|
P2P_TX_PROTOCOL,
|
|
134
115
|
P2P_QUERY_FOR_IP,
|
|
135
116
|
} = process.env;
|
|
117
|
+
// P2P listen & announce addresses passed in format: <IP_ADDRESS>:<PORT>
|
|
118
|
+
// P2P announce multiaddrs passed in format: /ip4/<IP_ADDRESS>/<protocol>/<PORT>
|
|
136
119
|
const envVars: P2PConfig = {
|
|
120
|
+
tcpAnnounceAddress: P2P_TCP_ANNOUNCE_ADDR,
|
|
121
|
+
udpAnnounceAddress: P2P_UDP_ANNOUNCE_ADDR,
|
|
122
|
+
tcpListenAddress: P2P_TCP_LISTEN_ADDR || '0.0.0.0:40400',
|
|
123
|
+
udpListenAddress: P2P_UDP_LISTEN_ADDR || '0.0.0.0:40400',
|
|
137
124
|
p2pEnabled: P2P_ENABLED === 'true',
|
|
138
125
|
p2pBlockCheckIntervalMS: P2P_BLOCK_CHECK_INTERVAL_MS ? +P2P_BLOCK_CHECK_INTERVAL_MS : 100,
|
|
139
126
|
p2pPeerCheckIntervalMS: P2P_PEER_CHECK_INTERVAL_MS ? +P2P_PEER_CHECK_INTERVAL_MS : 1000,
|
|
140
127
|
p2pL2QueueSize: P2P_L2_BLOCK_QUEUE_SIZE ? +P2P_L2_BLOCK_QUEUE_SIZE : 1000,
|
|
141
|
-
tcpListenPort: P2P_TCP_LISTEN_PORT ? +P2P_TCP_LISTEN_PORT : 40400,
|
|
142
|
-
tcpListenIp: P2P_TCP_LISTEN_IP ? P2P_TCP_LISTEN_IP : '0.0.0.0',
|
|
143
|
-
udpListenPort: P2P_UDP_LISTEN_PORT ? +P2P_UDP_LISTEN_PORT : 40400,
|
|
144
|
-
udpListenIp: P2P_UDP_LISTEN_IP ? P2P_UDP_LISTEN_IP : '0.0.0.0',
|
|
145
128
|
peerIdPrivateKey: PEER_ID_PRIVATE_KEY,
|
|
146
129
|
bootstrapNodes: BOOTSTRAP_NODES ? BOOTSTRAP_NODES.split(',') : [],
|
|
147
130
|
transactionProtocol: P2P_TX_PROTOCOL ? P2P_TX_PROTOCOL : '/aztec/0.1.0',
|
|
148
|
-
announceTcpHostname: P2P_ANNOUNCE_TCP_HOSTNAME,
|
|
149
|
-
announceUdpHostname: P2P_ANNOUNCE_UDP_HOSTNAME,
|
|
150
|
-
announcePort: P2P_ANNOUNCE_PORT ? +P2P_ANNOUNCE_PORT : undefined,
|
|
151
131
|
enableNat: P2P_NAT_ENABLED === 'true',
|
|
152
132
|
minPeerCount: P2P_MIN_PEERS ? +P2P_MIN_PEERS : 10,
|
|
153
133
|
maxPeerCount: P2P_MAX_PEERS ? +P2P_MAX_PEERS : 100,
|