@aztec/p2p 0.7.2 → 0.7.4
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/.tsbuildinfo +1 -0
- package/dest/bootstrap/bootstrap.d.ts +26 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +92 -0
- package/dest/client/index.d.ts +5 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +8 -0
- package/dest/client/mocks.d.ts +51 -0
- package/dest/client/mocks.d.ts.map +1 -0
- package/dest/client/mocks.js +72 -0
- package/dest/client/p2p_client.d.ts +175 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +206 -0
- package/dest/client/p2p_client.test.d.ts +2 -0
- package/dest/client/p2p_client.test.d.ts.map +1 -0
- package/dest/client/p2p_client.test.js +58 -0
- package/dest/config.d.ts +67 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +25 -0
- package/dest/index.d.ts +6 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +6 -0
- package/dest/service/dummy_service.d.ts +28 -0
- package/dest/service/dummy_service.d.ts.map +1 -0
- package/dest/service/dummy_service.js +30 -0
- package/dest/service/index.d.ts +3 -0
- package/dest/service/index.d.ts.map +1 -0
- package/dest/service/index.js +3 -0
- package/dest/service/known_txs.d.ts +31 -0
- package/dest/service/known_txs.d.ts.map +1 -0
- package/dest/service/known_txs.js +52 -0
- package/dest/service/known_txs.test.d.ts +2 -0
- package/dest/service/known_txs.test.d.ts.map +1 -0
- package/dest/service/known_txs.test.js +34 -0
- package/dest/service/libp2p_service.d.ts +74 -0
- package/dest/service/libp2p_service.d.ts.map +1 -0
- package/dest/service/libp2p_service.js +335 -0
- package/dest/service/service.d.ts +27 -0
- package/dest/service/service.d.ts.map +1 -0
- package/dest/service/service.js +2 -0
- package/dest/service/tx_messages.d.ts +78 -0
- package/dest/service/tx_messages.d.ts.map +1 -0
- package/dest/service/tx_messages.js +191 -0
- package/dest/service/tx_messages.test.d.ts +2 -0
- package/dest/service/tx_messages.test.d.ts.map +1 -0
- package/dest/service/tx_messages.test.js +48 -0
- package/dest/tx_pool/index.d.ts +3 -0
- package/dest/tx_pool/index.d.ts.map +1 -0
- package/dest/tx_pool/index.js +3 -0
- package/dest/tx_pool/memory_tx_pool.d.ts +52 -0
- package/dest/tx_pool/memory_tx_pool.d.ts.map +1 -0
- package/dest/tx_pool/memory_tx_pool.js +70 -0
- package/dest/tx_pool/tx_pool.d.ts +39 -0
- package/dest/tx_pool/tx_pool.d.ts.map +1 -0
- package/dest/tx_pool/tx_pool.js +2 -0
- package/dest/tx_pool/tx_pool.test.d.ts +2 -0
- package/dest/tx_pool/tx_pool.test.d.ts.map +1 -0
- package/dest/tx_pool/tx_pool.test.js +20 -0
- package/package.json +4 -4
- package/Dockerfile +0 -17
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { EthAddress } from '@aztec/circuits.js';
|
|
2
|
+
import { L2Block } from '@aztec/types';
|
|
3
|
+
/**
|
|
4
|
+
* A mocked implementation of L2BlockSource to be used in p2p tests.
|
|
5
|
+
*/
|
|
6
|
+
export class MockBlockSource {
|
|
7
|
+
constructor(numBlocks = 100) {
|
|
8
|
+
this.numBlocks = numBlocks;
|
|
9
|
+
this.l2Blocks = [];
|
|
10
|
+
this.l2Txs = [];
|
|
11
|
+
for (let i = 0; i < this.numBlocks; i++) {
|
|
12
|
+
const block = L2Block.random(i);
|
|
13
|
+
this.l2Blocks.push(block);
|
|
14
|
+
this.l2Txs.push(...block.getTxs());
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Method to fetch the rollup contract address at the base-layer.
|
|
19
|
+
* @returns The rollup address.
|
|
20
|
+
*/
|
|
21
|
+
getRollupAddress() {
|
|
22
|
+
return Promise.resolve(EthAddress.random());
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Gets the number of the latest L2 block processed by the block source implementation.
|
|
26
|
+
* @returns In this mock instance, returns the number of L2 blocks that we've mocked.
|
|
27
|
+
*/
|
|
28
|
+
getBlockNumber() {
|
|
29
|
+
return Promise.resolve(this.l2Blocks.length - 1);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Gets an l2 block.
|
|
33
|
+
* @param number - The block number to return (inclusive).
|
|
34
|
+
* @returns The requested L2 block.
|
|
35
|
+
*/
|
|
36
|
+
getL2Block(number) {
|
|
37
|
+
return Promise.resolve(this.l2Blocks[number]);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Gets up to `limit` amount of L2 blocks starting from `from`.
|
|
41
|
+
* @param from - Number of the first block to return (inclusive).
|
|
42
|
+
* @param limit - The maximum number of blocks to return.
|
|
43
|
+
* @returns The requested mocked L2 blocks.
|
|
44
|
+
*/
|
|
45
|
+
getL2Blocks(from, limit) {
|
|
46
|
+
return Promise.resolve(this.l2Blocks.slice(from, from + limit));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Gets an l2 tx.
|
|
50
|
+
* @param txHash - The txHash of the l2 tx.
|
|
51
|
+
* @returns The requested L2 tx.
|
|
52
|
+
*/
|
|
53
|
+
getL2Tx(txHash) {
|
|
54
|
+
const l2Tx = this.l2Txs.find(tx => tx.txHash.equals(txHash));
|
|
55
|
+
return Promise.resolve(l2Tx);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Starts the block source. In this mock implementation, this is a noop.
|
|
59
|
+
* @returns A promise that signals the initialization of the l2 block source on compmletion.
|
|
60
|
+
*/
|
|
61
|
+
start() {
|
|
62
|
+
return Promise.resolve();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Stops the block source. In this mock implementation, this is a noop.
|
|
66
|
+
* @returns A promise that signals the l2 block source is now stopped.
|
|
67
|
+
*/
|
|
68
|
+
stop() {
|
|
69
|
+
return Promise.resolve();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L21vY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLGNBQWMsQ0FBQztBQUVwRTs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQW9CLFlBQVksR0FBRztRQUFmLGNBQVMsR0FBVCxTQUFTLENBQU07UUFIM0IsYUFBUSxHQUFjLEVBQUUsQ0FBQztRQUN6QixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBR3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksVUFBVSxDQUFDLE1BQWM7UUFDOUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDNUMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxNQUFjO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUs7UUFDVixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSTtRQUNULE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { L2BlockSource, Tx, TxHash } from '@aztec/types';
|
|
2
|
+
import { P2PService } from '../service/service.js';
|
|
3
|
+
import { TxPool } from '../tx_pool/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Enum defining the possible states of the p2p client.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum P2PClientState {
|
|
8
|
+
IDLE = 0,
|
|
9
|
+
SYNCHING = 1,
|
|
10
|
+
RUNNING = 2,
|
|
11
|
+
STOPPED = 3
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The synchronisation status of the P2P client.
|
|
15
|
+
*/
|
|
16
|
+
export interface P2PSyncState {
|
|
17
|
+
/**
|
|
18
|
+
* The current state of the p2p client.
|
|
19
|
+
*/
|
|
20
|
+
state: P2PClientState;
|
|
21
|
+
/**
|
|
22
|
+
* The block number that the p2p client is synced to.
|
|
23
|
+
*/
|
|
24
|
+
syncedToL2Block: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Interface of a P2P client.
|
|
28
|
+
**/
|
|
29
|
+
export interface P2P {
|
|
30
|
+
/**
|
|
31
|
+
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
|
32
|
+
* @param tx - The transaction.
|
|
33
|
+
**/
|
|
34
|
+
sendTx(tx: Tx): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Deletes 'txs' from the pool, given hashes.
|
|
37
|
+
* NOT used if we use sendTx as reconcileTxPool will handle this.
|
|
38
|
+
* @param txHashes - Hashes to check.
|
|
39
|
+
**/
|
|
40
|
+
deleteTxs(txHashes: TxHash[]): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Returns all transactions in the transaction pool.
|
|
43
|
+
* @returns An array of Txs.
|
|
44
|
+
*/
|
|
45
|
+
getTxs(): Promise<Tx[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Returns a transaction in the transaction pool by its hash.
|
|
48
|
+
* @param txHash - Hash of tx to return.
|
|
49
|
+
* @returns A single tx or undefined.
|
|
50
|
+
*/
|
|
51
|
+
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
52
|
+
/**
|
|
53
|
+
* Starts the p2p client.
|
|
54
|
+
* @returns A promise signalling the completion of the block sync.
|
|
55
|
+
*/
|
|
56
|
+
start(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Stops the p2p client.
|
|
59
|
+
* @returns A promise signalling the completion of the stop process.
|
|
60
|
+
*/
|
|
61
|
+
stop(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Indicates if the p2p client is ready for transaction submission.
|
|
64
|
+
* @returns A boolean flag indicating readiness.
|
|
65
|
+
*/
|
|
66
|
+
isReady(): Promise<boolean>;
|
|
67
|
+
/**
|
|
68
|
+
* Returns the current status of the p2p client.
|
|
69
|
+
*/
|
|
70
|
+
getStatus(): Promise<P2PSyncState>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The P2P client implementation.
|
|
74
|
+
*/
|
|
75
|
+
export declare class P2PClient implements P2P {
|
|
76
|
+
private l2BlockSource;
|
|
77
|
+
private txPool;
|
|
78
|
+
private p2pService;
|
|
79
|
+
private log;
|
|
80
|
+
/**
|
|
81
|
+
* L2 Block download that p2p client uses to stay in sync with latest blocks.
|
|
82
|
+
*/
|
|
83
|
+
private blockDownloader;
|
|
84
|
+
/**
|
|
85
|
+
* Property that indicates whether the client is running.
|
|
86
|
+
*/
|
|
87
|
+
private stopping;
|
|
88
|
+
/**
|
|
89
|
+
* The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped.
|
|
90
|
+
*/
|
|
91
|
+
private runningPromise;
|
|
92
|
+
/**
|
|
93
|
+
* Store the ID of the latest block the client has synced to.
|
|
94
|
+
*/
|
|
95
|
+
private currentL2BlockNum;
|
|
96
|
+
private currentState;
|
|
97
|
+
private syncPromise;
|
|
98
|
+
private latestBlockNumberAtStart;
|
|
99
|
+
private syncResolve?;
|
|
100
|
+
/**
|
|
101
|
+
* In-memory P2P client constructor.
|
|
102
|
+
* @param l2BlockSource - P2P client's source for fetching existing block data.
|
|
103
|
+
* @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation.
|
|
104
|
+
* @param p2pService - The concrete instance of p2p networking to use.
|
|
105
|
+
* @param log - A logger.
|
|
106
|
+
*/
|
|
107
|
+
constructor(l2BlockSource: L2BlockSource, txPool: TxPool, p2pService: P2PService, log?: import("@aztec/foundation/log").DebugLogger);
|
|
108
|
+
/**
|
|
109
|
+
* Starts the P2P client.
|
|
110
|
+
* @returns An empty promise signalling the synching process.
|
|
111
|
+
*/
|
|
112
|
+
start(): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Allows consumers to stop the instance of the P2P client.
|
|
115
|
+
* 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
|
|
116
|
+
*/
|
|
117
|
+
stop(): Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* Returns all transactions in the transaction pool.
|
|
120
|
+
* @returns An array of Txs.
|
|
121
|
+
*/
|
|
122
|
+
getTxs(): Promise<Tx[]>;
|
|
123
|
+
/**
|
|
124
|
+
* Returns a transaction in the transaction pool by its hash.
|
|
125
|
+
* @param txHash - Hash of the transaction to look for in the pool.
|
|
126
|
+
* @returns A single tx or undefined.
|
|
127
|
+
*/
|
|
128
|
+
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
129
|
+
/**
|
|
130
|
+
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
|
131
|
+
* @param tx - The tx to verify.
|
|
132
|
+
* @returns Empty promise.
|
|
133
|
+
**/
|
|
134
|
+
sendTx(tx: Tx): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Deletes the 'txs' from the pool.
|
|
137
|
+
* NOT used if we use sendTx as reconcileTxPool will handle this.
|
|
138
|
+
* @param txHashes - Hashes of the transactions to delete.
|
|
139
|
+
* @returns Empty promise.
|
|
140
|
+
**/
|
|
141
|
+
deleteTxs(txHashes: TxHash[]): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* Public function to check if the p2p client is fully synced and ready to receive txs.
|
|
144
|
+
* @returns True if the P2P client is ready to receive txs.
|
|
145
|
+
*/
|
|
146
|
+
isReady(): Promise<boolean>;
|
|
147
|
+
/**
|
|
148
|
+
* Public function to check the latest block number that the P2P client is synced to.
|
|
149
|
+
* @returns Block number of latest L2 Block we've synced with.
|
|
150
|
+
*/
|
|
151
|
+
getSyncedBlockNum(): number;
|
|
152
|
+
/**
|
|
153
|
+
* Method to check the status the p2p client.
|
|
154
|
+
* @returns Information about p2p client status: state & syncedToBlockNum.
|
|
155
|
+
*/
|
|
156
|
+
getStatus(): Promise<P2PSyncState>;
|
|
157
|
+
/**
|
|
158
|
+
* Internal method that uses the provided blocks to check against the client's tx pool.
|
|
159
|
+
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
160
|
+
* @returns Empty promise.
|
|
161
|
+
*/
|
|
162
|
+
private reconcileTxPool;
|
|
163
|
+
/**
|
|
164
|
+
* Method for processing new blocks.
|
|
165
|
+
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
166
|
+
* @returns Empty promise.
|
|
167
|
+
*/
|
|
168
|
+
private handleL2Blocks;
|
|
169
|
+
/**
|
|
170
|
+
* Method to set the value of the current state.
|
|
171
|
+
* @param newState - New state value.
|
|
172
|
+
*/
|
|
173
|
+
private setCurrentState;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=p2p_client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p2p_client.d.ts","sourceRoot":"","sources":["../../src/client/p2p_client.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGrG,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C;;GAEG;AACH,oBAAY,cAAc;IACxB,IAAI,IAAA;IACJ,QAAQ,IAAA;IACR,OAAO,IAAA;IACP,OAAO,IAAA;CACR;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,KAAK,EAAE,cAAc,CAAC;IACtB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;IAEI;AACJ,MAAM,WAAW,GAAG;IAClB;;;QAGI;IACJ,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;;;QAII;IACJ,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,MAAM,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAExB;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IAErD;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5B;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,SAAU,YAAW,GAAG;IAkCjC,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IApCb;;OAEG;IACH,OAAO,CAAC,eAAe,CAAoB;IAE3C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;IACH,OAAO,CAAC,cAAc,CAAiB;IAEvC;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAE9B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,wBAAwB,CAAM;IACtC,OAAO,CAAC,WAAW,CAAC,CAAyB;IAE7C;;;;;;OAMG;gBAEO,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,GAAG,8CAAiC;IAM9C;;;OAGG;IACU,KAAK;IAyClB;;;OAGG;IACU,IAAI;IASjB;;;OAGG;IACI,MAAM,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;IAI9B;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAIpD;;;;QAII;IACS,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C;;;;;QAKI;IACS,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD;;;OAGG;IACI,OAAO;IAId;;;OAGG;IACI,iBAAiB;IAIxB;;;OAGG;IACI,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAOzC;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;YACW,cAAc;IAgB5B;;;OAGG;IACH,OAAO,CAAC,eAAe;CAIxB"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { L2BlockContext, L2BlockDownloader } from '@aztec/types';
|
|
3
|
+
import { getP2PConfigEnvVars } from '../config.js';
|
|
4
|
+
/**
|
|
5
|
+
* Enum defining the possible states of the p2p client.
|
|
6
|
+
*/
|
|
7
|
+
export var P2PClientState;
|
|
8
|
+
(function (P2PClientState) {
|
|
9
|
+
P2PClientState[P2PClientState["IDLE"] = 0] = "IDLE";
|
|
10
|
+
P2PClientState[P2PClientState["SYNCHING"] = 1] = "SYNCHING";
|
|
11
|
+
P2PClientState[P2PClientState["RUNNING"] = 2] = "RUNNING";
|
|
12
|
+
P2PClientState[P2PClientState["STOPPED"] = 3] = "STOPPED";
|
|
13
|
+
})(P2PClientState || (P2PClientState = {}));
|
|
14
|
+
/**
|
|
15
|
+
* The P2P client implementation.
|
|
16
|
+
*/
|
|
17
|
+
export class P2PClient {
|
|
18
|
+
/**
|
|
19
|
+
* In-memory P2P client constructor.
|
|
20
|
+
* @param l2BlockSource - P2P client's source for fetching existing block data.
|
|
21
|
+
* @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation.
|
|
22
|
+
* @param p2pService - The concrete instance of p2p networking to use.
|
|
23
|
+
* @param log - A logger.
|
|
24
|
+
*/
|
|
25
|
+
constructor(l2BlockSource, txPool, p2pService, log = createDebugLogger('aztec:p2p')) {
|
|
26
|
+
this.l2BlockSource = l2BlockSource;
|
|
27
|
+
this.txPool = txPool;
|
|
28
|
+
this.p2pService = p2pService;
|
|
29
|
+
this.log = log;
|
|
30
|
+
/**
|
|
31
|
+
* Property that indicates whether the client is running.
|
|
32
|
+
*/
|
|
33
|
+
this.stopping = false;
|
|
34
|
+
/**
|
|
35
|
+
* Store the ID of the latest block the client has synced to.
|
|
36
|
+
*/
|
|
37
|
+
this.currentL2BlockNum = 0;
|
|
38
|
+
this.currentState = P2PClientState.IDLE;
|
|
39
|
+
this.syncPromise = Promise.resolve();
|
|
40
|
+
this.latestBlockNumberAtStart = -1;
|
|
41
|
+
this.syncResolve = undefined;
|
|
42
|
+
const { p2pBlockCheckIntervalMS: checkInterval, l2QueueSize } = getP2PConfigEnvVars();
|
|
43
|
+
this.blockDownloader = new L2BlockDownloader(l2BlockSource, l2QueueSize, checkInterval);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Starts the P2P client.
|
|
47
|
+
* @returns An empty promise signalling the synching process.
|
|
48
|
+
*/
|
|
49
|
+
async start() {
|
|
50
|
+
if (this.currentState === P2PClientState.STOPPED) {
|
|
51
|
+
throw new Error('P2P client already stopped');
|
|
52
|
+
}
|
|
53
|
+
if (this.currentState !== P2PClientState.IDLE) {
|
|
54
|
+
return this.syncPromise;
|
|
55
|
+
}
|
|
56
|
+
// get the current latest block number
|
|
57
|
+
this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockNumber();
|
|
58
|
+
const blockToDownloadFrom = this.currentL2BlockNum + 1;
|
|
59
|
+
// if there are blocks to be retrieved, go to a synching state
|
|
60
|
+
if (blockToDownloadFrom <= this.latestBlockNumberAtStart) {
|
|
61
|
+
this.setCurrentState(P2PClientState.SYNCHING);
|
|
62
|
+
this.syncPromise = new Promise(resolve => {
|
|
63
|
+
this.syncResolve = resolve;
|
|
64
|
+
});
|
|
65
|
+
this.log(`Starting sync from ${blockToDownloadFrom}, latest block ${this.latestBlockNumberAtStart}`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// if no blocks to be retrieved, go straight to running
|
|
69
|
+
this.setCurrentState(P2PClientState.RUNNING);
|
|
70
|
+
this.syncPromise = Promise.resolve();
|
|
71
|
+
await this.p2pService.start();
|
|
72
|
+
this.log(`Next block ${blockToDownloadFrom} already beyond latest block at ${this.latestBlockNumberAtStart}`);
|
|
73
|
+
}
|
|
74
|
+
// start looking for further blocks
|
|
75
|
+
const blockProcess = async () => {
|
|
76
|
+
while (!this.stopping) {
|
|
77
|
+
const blocks = await this.blockDownloader.getL2Blocks();
|
|
78
|
+
await this.handleL2Blocks(blocks);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
this.runningPromise = blockProcess();
|
|
82
|
+
this.blockDownloader.start(blockToDownloadFrom);
|
|
83
|
+
this.log(`Started block downloader from block ${blockToDownloadFrom}`);
|
|
84
|
+
return this.syncPromise;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Allows consumers to stop the instance of the P2P client.
|
|
88
|
+
* 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
|
|
89
|
+
*/
|
|
90
|
+
async stop() {
|
|
91
|
+
this.log('Stopping p2p client...');
|
|
92
|
+
this.stopping = true;
|
|
93
|
+
await this.p2pService.stop();
|
|
94
|
+
await this.blockDownloader.stop();
|
|
95
|
+
await this.runningPromise;
|
|
96
|
+
this.setCurrentState(P2PClientState.STOPPED);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Returns all transactions in the transaction pool.
|
|
100
|
+
* @returns An array of Txs.
|
|
101
|
+
*/
|
|
102
|
+
getTxs() {
|
|
103
|
+
return Promise.resolve(this.txPool.getAllTxs());
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns a transaction in the transaction pool by its hash.
|
|
107
|
+
* @param txHash - Hash of the transaction to look for in the pool.
|
|
108
|
+
* @returns A single tx or undefined.
|
|
109
|
+
*/
|
|
110
|
+
getTxByHash(txHash) {
|
|
111
|
+
return Promise.resolve(this.txPool.getTxByHash(txHash));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
|
115
|
+
* @param tx - The tx to verify.
|
|
116
|
+
* @returns Empty promise.
|
|
117
|
+
**/
|
|
118
|
+
async sendTx(tx) {
|
|
119
|
+
const ready = await this.isReady();
|
|
120
|
+
if (!ready) {
|
|
121
|
+
throw new Error('P2P client not ready');
|
|
122
|
+
}
|
|
123
|
+
await this.txPool.addTxs([tx]);
|
|
124
|
+
this.p2pService.propagateTx(tx);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Deletes the 'txs' from the pool.
|
|
128
|
+
* NOT used if we use sendTx as reconcileTxPool will handle this.
|
|
129
|
+
* @param txHashes - Hashes of the transactions to delete.
|
|
130
|
+
* @returns Empty promise.
|
|
131
|
+
**/
|
|
132
|
+
async deleteTxs(txHashes) {
|
|
133
|
+
const ready = await this.isReady();
|
|
134
|
+
if (!ready) {
|
|
135
|
+
throw new Error('P2P client not ready');
|
|
136
|
+
}
|
|
137
|
+
this.txPool.deleteTxs(txHashes);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Public function to check if the p2p client is fully synced and ready to receive txs.
|
|
141
|
+
* @returns True if the P2P client is ready to receive txs.
|
|
142
|
+
*/
|
|
143
|
+
isReady() {
|
|
144
|
+
return Promise.resolve(this.currentState === P2PClientState.RUNNING);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Public function to check the latest block number that the P2P client is synced to.
|
|
148
|
+
* @returns Block number of latest L2 Block we've synced with.
|
|
149
|
+
*/
|
|
150
|
+
getSyncedBlockNum() {
|
|
151
|
+
return this.currentL2BlockNum;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Method to check the status the p2p client.
|
|
155
|
+
* @returns Information about p2p client status: state & syncedToBlockNum.
|
|
156
|
+
*/
|
|
157
|
+
getStatus() {
|
|
158
|
+
return Promise.resolve({
|
|
159
|
+
state: this.currentState,
|
|
160
|
+
syncedToL2Block: this.currentL2BlockNum,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Internal method that uses the provided blocks to check against the client's tx pool.
|
|
165
|
+
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
166
|
+
* @returns Empty promise.
|
|
167
|
+
*/
|
|
168
|
+
reconcileTxPool(blocks) {
|
|
169
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
170
|
+
const blockContext = new L2BlockContext(blocks[i]);
|
|
171
|
+
const txHashes = blockContext.getTxHashes();
|
|
172
|
+
this.txPool.deleteTxs(txHashes);
|
|
173
|
+
this.p2pService.settledTxs(txHashes);
|
|
174
|
+
}
|
|
175
|
+
return Promise.resolve();
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Method for processing new blocks.
|
|
179
|
+
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
180
|
+
* @returns Empty promise.
|
|
181
|
+
*/
|
|
182
|
+
async handleL2Blocks(blocks) {
|
|
183
|
+
if (!blocks.length) {
|
|
184
|
+
return Promise.resolve();
|
|
185
|
+
}
|
|
186
|
+
await this.reconcileTxPool(blocks);
|
|
187
|
+
this.currentL2BlockNum = blocks[blocks.length - 1].number;
|
|
188
|
+
this.log(`Synched to block ${this.currentL2BlockNum}`);
|
|
189
|
+
if (this.currentState === P2PClientState.SYNCHING && this.currentL2BlockNum >= this.latestBlockNumberAtStart) {
|
|
190
|
+
this.setCurrentState(P2PClientState.RUNNING);
|
|
191
|
+
if (this.syncResolve !== undefined) {
|
|
192
|
+
this.syncResolve();
|
|
193
|
+
await this.p2pService.start();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Method to set the value of the current state.
|
|
199
|
+
* @param newState - New state value.
|
|
200
|
+
*/
|
|
201
|
+
setCurrentState(newState) {
|
|
202
|
+
this.currentState = newState;
|
|
203
|
+
this.log(`Moved to state ${P2PClientState[this.currentState]}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJwX2NsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvcDJwX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQVcsY0FBYyxFQUFFLGlCQUFpQixFQUE2QixNQUFNLGNBQWMsQ0FBQztBQUVyRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJbkQ7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCLG1EQUFJLENBQUE7SUFDSiwyREFBUSxDQUFBO0lBQ1IseURBQU8sQ0FBQTtJQUNQLHlEQUFPLENBQUE7QUFDVCxDQUFDLEVBTFcsY0FBYyxLQUFkLGNBQWMsUUFLekI7QUFzRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQTBCcEI7Ozs7OztPQU1HO0lBQ0gsWUFDVSxhQUE0QixFQUM1QixNQUFjLEVBQ2QsVUFBc0IsRUFDdEIsTUFBTSxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7UUFIcEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBaUM7UUEvQjlDOztXQUVHO1FBQ0ssYUFBUSxHQUFHLEtBQUssQ0FBQztRQU96Qjs7V0FFRztRQUNLLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUV0QixpQkFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDbkMsZ0JBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsNkJBQXdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsZ0JBQVcsR0FBZ0IsU0FBUyxDQUFDO1FBZTNDLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxhQUFhLEVBQUUsV0FBVyxF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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p2p_client.test.d.ts","sourceRoot":"","sources":["../../src/client/p2p_client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { mockTx } from '@aztec/types';
|
|
2
|
+
import { expect, jest } from '@jest/globals';
|
|
3
|
+
import { MockBlockSource } from './mocks.js';
|
|
4
|
+
import { P2PClient } from './p2p_client.js';
|
|
5
|
+
describe('In-Memory P2P Client', () => {
|
|
6
|
+
let txPool;
|
|
7
|
+
let blockSource;
|
|
8
|
+
let p2pService;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
txPool = {
|
|
11
|
+
addTxs: jest.fn(),
|
|
12
|
+
getTxByHash: jest.fn().mockReturnValue(undefined),
|
|
13
|
+
deleteTxs: jest.fn(),
|
|
14
|
+
getAllTxs: jest.fn().mockReturnValue([]),
|
|
15
|
+
getAllTxHashes: jest.fn().mockReturnValue([]),
|
|
16
|
+
hasTx: jest.fn().mockReturnValue(false),
|
|
17
|
+
};
|
|
18
|
+
p2pService = {
|
|
19
|
+
start: jest.fn(),
|
|
20
|
+
stop: jest.fn(),
|
|
21
|
+
propagateTx: jest.fn(),
|
|
22
|
+
settledTxs: jest.fn(),
|
|
23
|
+
};
|
|
24
|
+
blockSource = new MockBlockSource();
|
|
25
|
+
});
|
|
26
|
+
it('can start & stop', async () => {
|
|
27
|
+
const client = new P2PClient(blockSource, txPool, p2pService);
|
|
28
|
+
expect(await client.isReady()).toEqual(false);
|
|
29
|
+
await client.start();
|
|
30
|
+
expect(await client.isReady()).toEqual(true);
|
|
31
|
+
await client.stop();
|
|
32
|
+
expect(await client.isReady()).toEqual(false);
|
|
33
|
+
});
|
|
34
|
+
it('adds txs to pool', async () => {
|
|
35
|
+
const client = new P2PClient(blockSource, txPool, p2pService);
|
|
36
|
+
await client.start();
|
|
37
|
+
const tx1 = mockTx();
|
|
38
|
+
const tx2 = mockTx();
|
|
39
|
+
await client.sendTx(tx1);
|
|
40
|
+
await client.sendTx(tx2);
|
|
41
|
+
expect(txPool.addTxs).toHaveBeenCalledTimes(2);
|
|
42
|
+
await client.stop();
|
|
43
|
+
});
|
|
44
|
+
it('rejects txs after being stopped', async () => {
|
|
45
|
+
const client = new P2PClient(blockSource, txPool, p2pService);
|
|
46
|
+
await client.start();
|
|
47
|
+
const tx1 = mockTx();
|
|
48
|
+
const tx2 = mockTx();
|
|
49
|
+
await client.sendTx(tx1);
|
|
50
|
+
await client.sendTx(tx2);
|
|
51
|
+
expect(txPool.addTxs).toHaveBeenCalledTimes(2);
|
|
52
|
+
await client.stop();
|
|
53
|
+
const tx3 = mockTx();
|
|
54
|
+
await expect(client.sendTx(tx3)).rejects.toThrow();
|
|
55
|
+
expect(txPool.addTxs).toHaveBeenCalledTimes(2);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJwX2NsaWVudC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9wMnBfY2xpZW50LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFTNUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxJQUFJLE1BQXVCLENBQUM7SUFDNUIsSUFBSSxXQUEwQixDQUFDO0lBQy9CLElBQUksVUFBK0IsQ0FBQztJQUVwQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsTUFBTSxHQUFHO1lBQ1AsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO1lBQ2pELFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDN0MsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1NBQ3hDLENBQUM7UUFFRixVQUFVLEdBQUc7WUFDWCxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lB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
|
package/dest/config.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P2P client configuration values.
|
|
3
|
+
*/
|
|
4
|
+
export interface P2PConfig {
|
|
5
|
+
/**
|
|
6
|
+
* A flag dictating whether the P2P subsystem should be enabled.
|
|
7
|
+
*/
|
|
8
|
+
p2pEnabled: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* The frequency in which to check.
|
|
11
|
+
*/
|
|
12
|
+
p2pBlockCheckIntervalMS: number;
|
|
13
|
+
/**
|
|
14
|
+
* Size of queue of L2 blocks to store.
|
|
15
|
+
*/
|
|
16
|
+
l2QueueSize: number;
|
|
17
|
+
/**
|
|
18
|
+
* The tcp port on which the P2P service should listen for connections.
|
|
19
|
+
*/
|
|
20
|
+
tcpListenPort: number;
|
|
21
|
+
/**
|
|
22
|
+
* The tcp IP on which the P2P service should listen for connections.
|
|
23
|
+
*/
|
|
24
|
+
tcpListenIp: string;
|
|
25
|
+
/**
|
|
26
|
+
* An optional peer id private key. If blank, will generate a random key.
|
|
27
|
+
*/
|
|
28
|
+
peerIdPrivateKey?: string;
|
|
29
|
+
/**
|
|
30
|
+
* A list of bootstrap peers to connect to.
|
|
31
|
+
*/
|
|
32
|
+
bootstrapNodes: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Protocol identifier for transaction gossiping.
|
|
35
|
+
*/
|
|
36
|
+
transactionProtocol: string;
|
|
37
|
+
/**
|
|
38
|
+
* Hostname to announce.
|
|
39
|
+
*/
|
|
40
|
+
announceHostname?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Port to announce.
|
|
43
|
+
*/
|
|
44
|
+
announcePort?: number;
|
|
45
|
+
/**
|
|
46
|
+
* Optional specification to run as a server node.
|
|
47
|
+
*/
|
|
48
|
+
serverMode: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Whether to enable NAT from libp2p (ignored for bootstrap node).
|
|
51
|
+
*/
|
|
52
|
+
enableNat?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* The minimum number of peers (a peer count below this will cause the node to look for more peers)
|
|
55
|
+
*/
|
|
56
|
+
minPeerCount: number;
|
|
57
|
+
/**
|
|
58
|
+
* The maximum number of peers (a peer count above this will cause the node to refuse connection attempts)
|
|
59
|
+
*/
|
|
60
|
+
maxPeerCount: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Gets the config values for p2p client from environment variables.
|
|
64
|
+
* @returns The config values for p2p client.
|
|
65
|
+
*/
|
|
66
|
+
export declare function getP2PConfigEnvVars(): P2PConfig;
|
|
67
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,uBAAuB,EAAE,MAAM,CAAC;IAEhC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,CAiC/C"}
|
package/dest/config.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the config values for p2p client from environment variables.
|
|
3
|
+
* @returns The config values for p2p client.
|
|
4
|
+
*/
|
|
5
|
+
export function getP2PConfigEnvVars() {
|
|
6
|
+
const { P2P_ENABLED, P2P_BLOCK_CHECK_INTERVAL_MS, P2P_L2_BLOCK_QUEUE_SIZE, P2P_TCP_LISTEN_PORT, P2P_TCP_LISTEN_IP, PEER_ID_PRIVATE_KEY, BOOTSTRAP_NODES, P2P_ANNOUNCE_HOSTNAME, P2P_ANNOUNCE_PORT, P2P_SERVER, P2P_NAT_ENABLED, P2P_MIN_PEERS, P2P_MAX_PEERS, } = process.env;
|
|
7
|
+
const envVars = {
|
|
8
|
+
p2pEnabled: P2P_ENABLED === 'true',
|
|
9
|
+
p2pBlockCheckIntervalMS: P2P_BLOCK_CHECK_INTERVAL_MS ? +P2P_BLOCK_CHECK_INTERVAL_MS : 100,
|
|
10
|
+
l2QueueSize: P2P_L2_BLOCK_QUEUE_SIZE ? +P2P_L2_BLOCK_QUEUE_SIZE : 1000,
|
|
11
|
+
tcpListenPort: P2P_TCP_LISTEN_PORT ? +P2P_TCP_LISTEN_PORT : 0,
|
|
12
|
+
tcpListenIp: P2P_TCP_LISTEN_IP ? P2P_TCP_LISTEN_IP : '0.0.0.0',
|
|
13
|
+
peerIdPrivateKey: PEER_ID_PRIVATE_KEY,
|
|
14
|
+
bootstrapNodes: BOOTSTRAP_NODES ? BOOTSTRAP_NODES.split(',') : [],
|
|
15
|
+
transactionProtocol: '',
|
|
16
|
+
announceHostname: P2P_ANNOUNCE_HOSTNAME,
|
|
17
|
+
announcePort: P2P_ANNOUNCE_PORT ? +P2P_ANNOUNCE_PORT : undefined,
|
|
18
|
+
serverMode: P2P_SERVER === 'true',
|
|
19
|
+
enableNat: P2P_NAT_ENABLED === 'true',
|
|
20
|
+
minPeerCount: P2P_MIN_PEERS ? +P2P_MIN_PEERS : 10,
|
|
21
|
+
maxPeerCount: P2P_MAX_PEERS ? +P2P_MAX_PEERS : 100,
|
|
22
|
+
};
|
|
23
|
+
return envVars;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyRUE7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyxNQUFNLEVBQ0osV0FBVyxFQUNYLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLGVBQWUsRUFDZixhQUFhLEVBQ2IsYUFBYSxHQUNkLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNoQixNQUFNLE9BQU8sR0FBYztRQUN6QixVQUFVLEVBQUUsV0FBVyxLQUFLLE1BQU07UUFDbEMsdUJBQXVCLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLEdBQUc7UUFDekYsV0FBVyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ3RFLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzlELGdCQUFnQixFQUFFLG1CQUFtQjtRQUNyQyxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pFLG1CQUFtQixFQUFFLEVBQUU7UUFDdkIsZ0JBQWdCLEVBQUUscUJBQXFCO1FBQ3ZDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNoRSxVQUFVLEVBQUUsVUFBVSxLQUFLLE1BQU07UUFDakMsU0FBUyxFQUFFLGVBQWUsS0FBSyxNQUFNO1FBQ3JDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pELFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHO0tBQ25ELENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIn0=
|
package/dest/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
package/dest/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './client/index.js';
|
|
2
|
+
export * from './config.js';
|
|
3
|
+
export * from './tx_pool/index.js';
|
|
4
|
+
export * from './service/index.js';
|
|
5
|
+
export * from './bootstrap/bootstrap.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYywwQkFBMEIsQ0FBQyJ9
|