@aztec/p2p 0.35.1 → 0.37.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 +10 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +40 -59
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +16 -4
- package/dest/client/p2p_client.d.ts +1 -1
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/config.d.ts +17 -5
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +6 -3
- package/dest/service/discV5_service.d.ts +34 -0
- package/dest/service/discV5_service.d.ts.map +1 -0
- package/dest/service/discV5_service.js +95 -0
- package/dest/service/dummy_service.d.ts +23 -1
- package/dest/service/dummy_service.d.ts.map +1 -1
- package/dest/service/dummy_service.js +28 -1
- package/dest/service/known_txs.d.ts +1 -1
- package/dest/service/known_txs.d.ts.map +1 -1
- package/dest/service/libp2p_service.d.ts +12 -5
- package/dest/service/libp2p_service.d.ts.map +1 -1
- package/dest/service/libp2p_service.js +64 -24
- package/dest/service/peer_store.d.ts +18 -0
- package/dest/service/peer_store.d.ts.map +1 -0
- package/dest/service/peer_store.js +25 -0
- package/dest/service/service.d.ts +27 -1
- package/dest/service/service.d.ts.map +1 -1
- package/package.json +26 -14
- package/src/bootstrap/bootstrap.ts +52 -70
- package/src/client/index.ts +14 -3
- package/src/client/p2p_client.ts +1 -1
- package/src/config.ts +29 -8
- package/src/service/discV5_service.ts +122 -0
- package/src/service/dummy_service.ts +30 -1
- package/src/service/known_txs.ts +1 -1
- package/src/service/libp2p_service.ts +80 -35
- package/src/service/peer_store.ts +36 -0
- package/src/service/service.ts +31 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../src/service/libp2p_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../src/service/libp2p_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EAAsB,MAAM,EAAU,MAAM,mBAAmB,CAAC;AAE5E,OAAO,iBAAiB,CAAC;AAMzB,OAAO,EAAE,KAAK,MAAM,EAA4D,MAAM,QAAQ,CAAC;AAE/F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAYrE;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,mBAS3D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,UAExD;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,UAAU;IAI5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,MAAM;IAVhB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,aAAa,CAAsC;gBAEjD,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,oBAAoB,EAAE,oBAAoB,EAC1C,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,gBAAgB,GAAE,MAAM,EAAO,EAC/B,MAAM,yCAA4C;IAG5D;;;OAGG;IACU,KAAK;IAgDlB;;;OAGG;IACU,IAAI;IAQjB;;;;;OAKG;WACiB,GAAG,CACrB,MAAM,EAAE,SAAS,EACjB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY;IA0DrB;;;OAGG;IACI,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAIhC;;;OAGG;IACI,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;YAI7B,OAAO;YAsCP,kBAAkB;YAelB,oBAAoB;IAYlC,OAAO,CAAC,mBAAmB;YAYb,cAAc;YAiBd,uBAAuB;YAevB,qCAAqC;YAgBrC,kBAAkB;YAalB,iBAAiB;YASjB,aAAa;YAsBb,yBAAyB;YAazB,gCAAgC;YAShC,6BAA6B;YAW7B,oBAAoB;IAMlC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { ENR } from '@chainsafe/enr';
|
|
3
4
|
import { noise } from '@chainsafe/libp2p-noise';
|
|
4
5
|
import { yamux } from '@chainsafe/libp2p-yamux';
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
6
|
+
import { identify } from '@libp2p/identify';
|
|
7
|
+
import '@libp2p/kad-dht';
|
|
7
8
|
import { mplex } from '@libp2p/mplex';
|
|
9
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
8
10
|
import { createFromJSON, createSecp256k1PeerId, exportToProtobuf } from '@libp2p/peer-id-factory';
|
|
9
11
|
import { tcp } from '@libp2p/tcp';
|
|
10
12
|
import { pipe } from 'it-pipe';
|
|
11
13
|
import { createLibp2p } from 'libp2p';
|
|
12
|
-
import { identifyService } from 'libp2p/identify';
|
|
13
14
|
import { KnownTxLookup } from './known_txs.js';
|
|
15
|
+
import { AztecPeerDb } from './peer_store.js';
|
|
14
16
|
import { Messages, createGetTransactionsRequestMessage, createTransactionHashesMessage, createTransactionsMessage, decodeGetTransactionsRequestMessage, decodeTransactionHashesMessage, decodeTransactionsMessage, getEncodedMessage, } from './tx_messages.js';
|
|
15
17
|
/**
|
|
16
18
|
* Create a libp2p peer ID from the private key if provided, otherwise creates a new random ID.
|
|
@@ -39,11 +41,14 @@ export function exportLibP2PPeerIdToString(peerId) {
|
|
|
39
41
|
* Lib P2P implementation of the P2PService interface.
|
|
40
42
|
*/
|
|
41
43
|
export class LibP2PService {
|
|
42
|
-
constructor(config, node, protocolId, txPool, logger = createDebugLogger('aztec:libp2p_service')) {
|
|
44
|
+
constructor(config, node, peerDiscoveryService, peerStore, protocolId, txPool, bootstrapPeerIds = [], logger = createDebugLogger('aztec:libp2p_service')) {
|
|
43
45
|
this.config = config;
|
|
44
46
|
this.node = node;
|
|
47
|
+
this.peerDiscoveryService = peerDiscoveryService;
|
|
48
|
+
this.peerStore = peerStore;
|
|
45
49
|
this.protocolId = protocolId;
|
|
46
50
|
this.txPool = txPool;
|
|
51
|
+
this.bootstrapPeerIds = bootstrapPeerIds;
|
|
47
52
|
this.logger = logger;
|
|
48
53
|
this.jobQueue = new SerialQueue();
|
|
49
54
|
this.knownTxLookup = new KnownTxLookup();
|
|
@@ -53,7 +58,7 @@ export class LibP2PService {
|
|
|
53
58
|
* @returns An empty promise.
|
|
54
59
|
*/
|
|
55
60
|
async start() {
|
|
56
|
-
if (this.node.
|
|
61
|
+
if (this.node.status === 'started') {
|
|
57
62
|
throw new Error('P2P service already started');
|
|
58
63
|
}
|
|
59
64
|
const { enableNat, tcpListenIp, tcpListenPort, announceHostname, announcePort } = this.config;
|
|
@@ -64,6 +69,10 @@ export class LibP2PService {
|
|
|
64
69
|
if (enableNat) {
|
|
65
70
|
this.logger.info(`Enabling NAT in libp2p module`);
|
|
66
71
|
}
|
|
72
|
+
// handle discovered peers from external discovery service
|
|
73
|
+
this.peerDiscoveryService.on('peer:discovered', async (enr) => {
|
|
74
|
+
await this.addPeer(enr);
|
|
75
|
+
});
|
|
67
76
|
this.node.addEventListener('peer:discovery', evt => {
|
|
68
77
|
const peerId = evt.detail.id;
|
|
69
78
|
if (this.isBootstrapPeer(peerId)) {
|
|
@@ -84,10 +93,10 @@ export class LibP2PService {
|
|
|
84
93
|
}
|
|
85
94
|
});
|
|
86
95
|
this.jobQueue.start();
|
|
96
|
+
await this.peerDiscoveryService.start();
|
|
87
97
|
await this.node.start();
|
|
88
98
|
await this.node.handle(this.protocolId, (incoming) => this.jobQueue.put(() => Promise.resolve(this.handleProtocolDial(incoming))));
|
|
89
|
-
|
|
90
|
-
this.logger.info(`Started P2P client as ${await dht.getMode()} with Peer ID ${this.node.peerId.toString()}`);
|
|
99
|
+
this.logger.info(`Started P2P client with Peer ID ${this.node.peerId.toString()}`);
|
|
91
100
|
}
|
|
92
101
|
/**
|
|
93
102
|
* Stops the LibP2P service.
|
|
@@ -106,15 +115,13 @@ export class LibP2PService {
|
|
|
106
115
|
* @param txPool - The transaction pool to be accessed by the service.
|
|
107
116
|
* @returns The new service.
|
|
108
117
|
*/
|
|
109
|
-
static async new(config, txPool) {
|
|
110
|
-
const { tcpListenIp, tcpListenPort,
|
|
111
|
-
const peerId = await createLibP2PPeerId(peerIdPrivateKey);
|
|
118
|
+
static async new(config, peerDiscoveryService, peerId, txPool, store) {
|
|
119
|
+
const { tcpListenIp, tcpListenPort, minPeerCount, maxPeerCount } = config;
|
|
112
120
|
const opts = {
|
|
113
121
|
start: false,
|
|
114
122
|
peerId,
|
|
115
123
|
addresses: {
|
|
116
124
|
listen: [`/ip4/${tcpListenIp}/tcp/${tcpListenPort}`],
|
|
117
|
-
announce: announceHostname ? [`${announceHostname}/tcp/${announcePort ?? tcpListenPort}`] : [],
|
|
118
125
|
},
|
|
119
126
|
transports: [tcp()],
|
|
120
127
|
streamMuxers: [yamux(), mplex()],
|
|
@@ -123,19 +130,10 @@ export class LibP2PService {
|
|
|
123
130
|
minConnections: minPeerCount,
|
|
124
131
|
maxConnections: maxPeerCount,
|
|
125
132
|
},
|
|
126
|
-
peerDiscovery: [
|
|
127
|
-
bootstrap({
|
|
128
|
-
list: config.bootstrapNodes,
|
|
129
|
-
}),
|
|
130
|
-
],
|
|
131
133
|
};
|
|
132
134
|
const services = {
|
|
133
|
-
identify:
|
|
134
|
-
protocolPrefix: 'aztec',
|
|
135
|
-
}),
|
|
136
|
-
kadDHT: kadDHT({
|
|
135
|
+
identify: identify({
|
|
137
136
|
protocolPrefix: 'aztec',
|
|
138
|
-
clientMode: clientKADRouting,
|
|
139
137
|
}),
|
|
140
138
|
};
|
|
141
139
|
// The autonat service seems quite problematic in that using it seems to cause a lot of attempts
|
|
@@ -156,7 +154,14 @@ export class LibP2PService {
|
|
|
156
154
|
services,
|
|
157
155
|
});
|
|
158
156
|
const protocolId = config.transactionProtocol;
|
|
159
|
-
|
|
157
|
+
// Create an LMDB peer store
|
|
158
|
+
const peerDb = new AztecPeerDb(store);
|
|
159
|
+
// extract bootstrap node peer IDs
|
|
160
|
+
let bootstrapPeerIds = [];
|
|
161
|
+
if (config.bootstrapNodes.length) {
|
|
162
|
+
bootstrapPeerIds = await Promise.all(config.bootstrapNodes.map(bootnodeEnr => ENR.decodeTxt(bootnodeEnr).peerId()));
|
|
163
|
+
}
|
|
164
|
+
return new LibP2PService(config, node, peerDiscoveryService, peerDb, protocolId, txPool, bootstrapPeerIds);
|
|
160
165
|
}
|
|
161
166
|
/**
|
|
162
167
|
* Propagates the provided transaction to peers.
|
|
@@ -172,6 +177,41 @@ export class LibP2PService {
|
|
|
172
177
|
settledTxs(txHashes) {
|
|
173
178
|
this.knownTxLookup.handleSettledTxs(txHashes.map(x => x.toString()));
|
|
174
179
|
}
|
|
180
|
+
async addPeer(enr) {
|
|
181
|
+
const peerMultiAddr = await enr.getFullMultiaddr('tcp');
|
|
182
|
+
if (!peerMultiAddr) {
|
|
183
|
+
// No TCP address, can't connect
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const peerIdStr = peerMultiAddr.getPeerId();
|
|
187
|
+
if (!peerIdStr) {
|
|
188
|
+
this.logger.debug(`Peer ID not found in discovered node's multiaddr: ${peerMultiAddr}`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// check if peer is already known
|
|
192
|
+
const peerId = peerIdFromString(peerIdStr);
|
|
193
|
+
const hasPeer = await this.node.peerStore.has(peerId);
|
|
194
|
+
// add to peer store if not already known
|
|
195
|
+
if (!hasPeer) {
|
|
196
|
+
this.logger.info(`Discovered peer ${enr.peerId().toString()}. Adding to libp2p peer list`);
|
|
197
|
+
let stream;
|
|
198
|
+
try {
|
|
199
|
+
stream = await this.node.dialProtocol(peerMultiAddr, this.protocolId);
|
|
200
|
+
// dial successful, add to DB as well
|
|
201
|
+
if (!this.peerStore.getPeer(peerIdStr)) {
|
|
202
|
+
await this.peerStore.addPeer(peerIdStr, enr);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
this.logger.error(`Failed to dial peer ${peerIdStr}`, err);
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
if (stream) {
|
|
210
|
+
await stream.close();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
175
215
|
async handleProtocolDial(incomingStreamData) {
|
|
176
216
|
try {
|
|
177
217
|
const { message, peer } = await this.consumeInboundStream(incomingStreamData);
|
|
@@ -338,7 +378,7 @@ export class LibP2PService {
|
|
|
338
378
|
return this.node.getPeers().filter(peer => !this.isBootstrapPeer(peer));
|
|
339
379
|
}
|
|
340
380
|
isBootstrapPeer(peer) {
|
|
341
|
-
return this.
|
|
381
|
+
return this.bootstrapPeerIds.some(bootstrapPeer => bootstrapPeer.equals(peer));
|
|
342
382
|
}
|
|
343
383
|
}
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9saWJwMnBfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJOUMsT0FBTyxFQUFtQixNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUEyRCxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSWxELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLG1DQUFtQyxFQUNuQyw4QkFBOEIsRUFDOUIseUJBQXlCLEVBQ3pCLG1DQUFtQyxFQUNuQyw4QkFBOEIsRUFDOUIseUJBQXlCLEVBQ3pCLGlCQUFpQixHQUNsQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLFVBQW1CO0lB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
|
|
384
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9saWJwMnBfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHMUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzVDLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBMkQsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBSS9GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBRW5FLE9BQU8sRUFDTCxRQUFRLEVBQ1IsbUNBQW1DLEVBQ25DLDhCQUE4QixFQUM5Qix5QkFBeUIsRUFDekIsbUNBQW1DLEVBQ25DLDhCQUE4QixFQUM5Qix5QkFBeUIsRUFDekIsaUJBQWlCLEdBQ2xCLE1BQU0sa0JB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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AztecKVStore } from '@aztec/kv-store';
|
|
2
|
+
import type { ENR } from '@chainsafe/enr';
|
|
3
|
+
export interface AztecPeerStore {
|
|
4
|
+
addPeer(peerId: string, enr: ENR): Promise<void>;
|
|
5
|
+
removePeer(peerId: string): Promise<void>;
|
|
6
|
+
getPeer(peerId: string): ENR | undefined;
|
|
7
|
+
getAllPeers(): IterableIterator<ENR>;
|
|
8
|
+
}
|
|
9
|
+
export declare class AztecPeerDb implements AztecPeerStore {
|
|
10
|
+
#private;
|
|
11
|
+
private db;
|
|
12
|
+
constructor(db: AztecKVStore);
|
|
13
|
+
addPeer(peerId: string, enr: ENR): Promise<void>;
|
|
14
|
+
removePeer(peerId: string): Promise<void>;
|
|
15
|
+
getPeer(peerId: string): ENR | undefined;
|
|
16
|
+
getAllPeers(): IterableIterator<ENR>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=peer_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer_store.d.ts","sourceRoot":"","sources":["../../src/service/peer_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC;IACzC,WAAW,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;CACtC;AAED,qBAAa,WAAY,YAAW,cAAc;;IAGpC,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAI9B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAIvC,WAAW,IAAI,gBAAgB,CAAC,GAAG,CAAC;CAKtC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
var _AztecPeerDb_peers;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
export class AztecPeerDb {
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
_AztecPeerDb_peers.set(this, void 0);
|
|
7
|
+
__classPrivateFieldSet(this, _AztecPeerDb_peers, db.openMap('p2p_peers'), "f");
|
|
8
|
+
}
|
|
9
|
+
async addPeer(peerId, enr) {
|
|
10
|
+
void (await __classPrivateFieldGet(this, _AztecPeerDb_peers, "f").set(peerId, enr));
|
|
11
|
+
}
|
|
12
|
+
async removePeer(peerId) {
|
|
13
|
+
void (await __classPrivateFieldGet(this, _AztecPeerDb_peers, "f").delete(peerId));
|
|
14
|
+
}
|
|
15
|
+
getPeer(peerId) {
|
|
16
|
+
return __classPrivateFieldGet(this, _AztecPeerDb_peers, "f").get(peerId);
|
|
17
|
+
}
|
|
18
|
+
*getAllPeers() {
|
|
19
|
+
for (const enr of __classPrivateFieldGet(this, _AztecPeerDb_peers, "f").values()) {
|
|
20
|
+
yield enr;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
_AztecPeerDb_peers = new WeakMap();
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlL3BlZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSxNQUFNLE9BQU8sV0FBVztJQUd0QixZQUFvQixFQUFnQjtRQUFoQixPQUFFLEdBQUYsRUFBRSxDQUFjO1FBRnBDLHFDQUE4QjtRQUc1Qix1QkFBQSxJQUFJLHNCQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQUEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjLEVBQUUsR0FBUTtRQUNwQyxLQUFLLENBQUMsTUFBTSx1QkFBQSxJQUFJLDBCQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDN0IsS0FBSyxDQUFDLE1BQU0sdUJBQUEsSUFBSSwwQkFBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBYztRQUNwQixPQUFPLHVCQUFBLElBQUksMEJBQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELENBQUMsV0FBVztRQUNWLEtBQUssTUFBTSxHQUFHLElBQUksdUJBQUEsSUFBSSwwQkFBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDdkMsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import type { Tx, TxHash } from '@aztec/circuit-types';
|
|
3
|
+
import type { ENR } from '@chainsafe/enr';
|
|
4
|
+
import type EventEmitter from 'events';
|
|
2
5
|
/**
|
|
3
6
|
* The interface for a P2P service implementation.
|
|
4
7
|
*/
|
|
@@ -24,4 +27,27 @@ export interface P2PService {
|
|
|
24
27
|
*/
|
|
25
28
|
settledTxs(txHashes: TxHash[]): void;
|
|
26
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* The interface for a peer discovery service implementation.
|
|
32
|
+
*/
|
|
33
|
+
export interface PeerDiscoveryService extends EventEmitter {
|
|
34
|
+
/**
|
|
35
|
+
* Starts the service.
|
|
36
|
+
* */
|
|
37
|
+
start(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Stops the service.
|
|
40
|
+
* */
|
|
41
|
+
stop(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Gets all peers.
|
|
44
|
+
* @returns An array of peer ENRs.
|
|
45
|
+
*/
|
|
46
|
+
getAllPeers(): ENR[];
|
|
47
|
+
/**
|
|
48
|
+
* Event emitted when a new peer is discovered.
|
|
49
|
+
*/
|
|
50
|
+
on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
|
|
51
|
+
emit(event: 'peer:discovered', enr: ENR): boolean;
|
|
52
|
+
}
|
|
27
53
|
//# sourceMappingURL=service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service/service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service/service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;SAEK;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;SAEK;IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,IAAI,GAAG,EAAE,CAAC;IAErB;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;CACnD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -36,26 +36,38 @@
|
|
|
36
36
|
},
|
|
37
37
|
"extensionsToTreatAsEsm": [
|
|
38
38
|
".ts"
|
|
39
|
+
],
|
|
40
|
+
"reporters": [
|
|
41
|
+
[
|
|
42
|
+
"default",
|
|
43
|
+
{
|
|
44
|
+
"summaryThreshold": 9999
|
|
45
|
+
}
|
|
46
|
+
]
|
|
39
47
|
]
|
|
40
48
|
},
|
|
41
49
|
"dependencies": {
|
|
42
|
-
"@aztec/circuit-types": "0.
|
|
43
|
-
"@aztec/circuits.js": "0.
|
|
44
|
-
"@aztec/foundation": "0.
|
|
45
|
-
"@aztec/kv-store": "0.
|
|
46
|
-
"@chainsafe/
|
|
47
|
-
"@chainsafe/
|
|
50
|
+
"@aztec/circuit-types": "0.37.0",
|
|
51
|
+
"@aztec/circuits.js": "0.37.0",
|
|
52
|
+
"@aztec/foundation": "0.37.0",
|
|
53
|
+
"@aztec/kv-store": "0.37.0",
|
|
54
|
+
"@chainsafe/discv5": "^9.0.0",
|
|
55
|
+
"@chainsafe/enr": "^3.0.0",
|
|
56
|
+
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
57
|
+
"@chainsafe/libp2p-yamux": "^6.0.2",
|
|
48
58
|
"@libp2p/bootstrap": "^9.0.4",
|
|
49
|
-
"@libp2p/
|
|
59
|
+
"@libp2p/crypto": "^4.0.3",
|
|
60
|
+
"@libp2p/identify": "^1.0.15",
|
|
61
|
+
"@libp2p/interface": "^1.1.4",
|
|
50
62
|
"@libp2p/interface-libp2p": "^3.2.0",
|
|
51
|
-
"@libp2p/interface-peer-id": "^2.0.2",
|
|
52
63
|
"@libp2p/kad-dht": "^10.0.4",
|
|
53
|
-
"@libp2p/mplex": "^
|
|
54
|
-
"@libp2p/peer-id": "^
|
|
55
|
-
"@libp2p/peer-id-factory": "^
|
|
56
|
-
"@libp2p/tcp": "^
|
|
64
|
+
"@libp2p/mplex": "^10.0.16",
|
|
65
|
+
"@libp2p/peer-id": "^4.0.7",
|
|
66
|
+
"@libp2p/peer-id-factory": "^4.0.7",
|
|
67
|
+
"@libp2p/tcp": "^9.0.16",
|
|
68
|
+
"@multiformats/multiaddr": "^12.1.14",
|
|
57
69
|
"it-pipe": "^3.0.1",
|
|
58
|
-
"libp2p": "^
|
|
70
|
+
"libp2p": "^1.2.4",
|
|
59
71
|
"sha3": "^2.1.4",
|
|
60
72
|
"tslib": "^2.4.0"
|
|
61
73
|
},
|
|
@@ -1,99 +1,71 @@
|
|
|
1
1
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import type {
|
|
6
|
-
import {
|
|
7
|
-
import { mplex } from '@libp2p/mplex';
|
|
8
|
-
import { tcp } from '@libp2p/tcp';
|
|
9
|
-
import { type Libp2p, type Libp2pOptions, type ServiceFactoryMap, createLibp2p } from 'libp2p';
|
|
10
|
-
import { identifyService } from 'libp2p/identify';
|
|
11
|
-
import { format } from 'util';
|
|
3
|
+
import { Discv5, type Discv5EventEmitter } from '@chainsafe/discv5';
|
|
4
|
+
import { SignableENR } from '@chainsafe/enr';
|
|
5
|
+
import type { PeerId } from '@libp2p/interface';
|
|
6
|
+
import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
|
|
12
7
|
|
|
13
8
|
import { type P2PConfig } from '../config.js';
|
|
14
9
|
import { createLibP2PPeerId } from '../service/index.js';
|
|
15
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Required P2P config values for a bootstrap node.
|
|
13
|
+
*/
|
|
14
|
+
export type BootNodeConfig = Partial<P2PConfig> &
|
|
15
|
+
Pick<P2PConfig, 'announceHostname' | 'announcePort'> &
|
|
16
|
+
Required<Pick<P2PConfig, 'udpListenIp' | 'udpListenPort'>>;
|
|
17
|
+
|
|
16
18
|
/**
|
|
17
19
|
* Encapsulates a 'Bootstrap' node, used for the purpose of assisting new joiners in acquiring peers.
|
|
18
20
|
*/
|
|
19
21
|
export class BootstrapNode {
|
|
20
|
-
private node?:
|
|
22
|
+
private node?: Discv5 = undefined;
|
|
23
|
+
private peerId?: PeerId;
|
|
21
24
|
|
|
22
25
|
constructor(private logger = createDebugLogger('aztec:p2p_bootstrap')) {}
|
|
23
26
|
|
|
24
27
|
/**
|
|
25
28
|
* Starts the bootstrap node.
|
|
26
|
-
* @param config -
|
|
29
|
+
* @param config - A partial P2P configuration. No need for TCP values as well as aztec node specific values.
|
|
27
30
|
* @returns An empty promise.
|
|
28
31
|
*/
|
|
29
|
-
public async start(config:
|
|
30
|
-
const { peerIdPrivateKey,
|
|
31
|
-
config;
|
|
32
|
+
public async start(config: BootNodeConfig) {
|
|
33
|
+
const { peerIdPrivateKey, udpListenIp, udpListenPort, announceHostname, announcePort } = config;
|
|
32
34
|
const peerId = await createLibP2PPeerId(peerIdPrivateKey);
|
|
33
|
-
this.
|
|
34
|
-
|
|
35
|
-
announcePort ?? tcpListenPort
|
|
36
|
-
}`,
|
|
37
|
-
);
|
|
35
|
+
this.peerId = peerId;
|
|
36
|
+
const enr = SignableENR.createFromPeerId(peerId);
|
|
38
37
|
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
addresses: {
|
|
43
|
-
listen: [`/ip4/${tcpListenIp}/tcp/${tcpListenPort}`],
|
|
44
|
-
announce: announceHostname ? [`${announceHostname}/tcp/${announcePort ?? tcpListenPort}`] : [],
|
|
45
|
-
},
|
|
46
|
-
transports: [tcp()],
|
|
47
|
-
streamMuxers: [yamux(), mplex()],
|
|
48
|
-
connectionEncryption: [noise()],
|
|
49
|
-
connectionManager: {
|
|
50
|
-
minConnections: minPeerCount,
|
|
51
|
-
maxConnections: maxPeerCount,
|
|
52
|
-
},
|
|
53
|
-
};
|
|
38
|
+
const listenAddrUdp = multiaddr(`/ip4/${udpListenIp}/udp/${udpListenPort}`);
|
|
39
|
+
const publicAddr = multiaddr(`${announceHostname}/udp/${announcePort}`);
|
|
40
|
+
enr.setLocationMultiaddr(publicAddr);
|
|
54
41
|
|
|
55
|
-
|
|
56
|
-
identify: identifyService({
|
|
57
|
-
protocolPrefix: 'aztec',
|
|
58
|
-
}),
|
|
59
|
-
kadDHT: kadDHT({
|
|
60
|
-
protocolPrefix: 'aztec',
|
|
61
|
-
clientMode: false,
|
|
62
|
-
}),
|
|
63
|
-
// The autonat service seems quite problematic in that using it seems to cause a lot of attempts
|
|
64
|
-
// to dial ephemeral ports. I suspect that it works better if you can get the uPNPnat service to
|
|
65
|
-
// work as then you would have a permanent port to be dialled.
|
|
66
|
-
// Alas, I struggled to get this to work reliably either.
|
|
67
|
-
// autoNAT: autoNATService({
|
|
68
|
-
// protocolPrefix: 'aztec',
|
|
69
|
-
// }),
|
|
70
|
-
};
|
|
42
|
+
this.logger.info(`Starting bootstrap node ${peerId}, listening on ${listenAddrUdp.toString()}`);
|
|
71
43
|
|
|
72
|
-
this.node =
|
|
73
|
-
|
|
74
|
-
|
|
44
|
+
this.node = Discv5.create({
|
|
45
|
+
enr,
|
|
46
|
+
peerId,
|
|
47
|
+
bindAddrs: { ip4: listenAddrUdp },
|
|
48
|
+
config: {
|
|
49
|
+
lookupTimeout: 2000,
|
|
50
|
+
},
|
|
75
51
|
});
|
|
76
52
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// print out listening addresses
|
|
81
|
-
this.logger.info('Listening on addresses:');
|
|
82
|
-
this.node.getMultiaddrs().forEach(addr => {
|
|
83
|
-
this.logger.info(addr.toString());
|
|
53
|
+
(this.node as Discv5EventEmitter).on('multiaddrUpdated', (addr: Multiaddr) => {
|
|
54
|
+
this.logger.info('Advertised socket address updated', { addr: addr.toString() });
|
|
84
55
|
});
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
this.logger.verbose(
|
|
56
|
+
(this.node as Discv5EventEmitter).on('discovered', async (enr: SignableENR) => {
|
|
57
|
+
const addr = await enr.getFullMultiaddr('udp');
|
|
58
|
+
this.logger.verbose(`Discovered new peer, enr: ${enr.encodeTxt()}, addr: ${addr?.toString()}`);
|
|
88
59
|
});
|
|
89
60
|
|
|
90
|
-
|
|
91
|
-
this.
|
|
92
|
-
|
|
61
|
+
try {
|
|
62
|
+
await this.node.start();
|
|
63
|
+
this.logger.info('Discv5 started');
|
|
64
|
+
} catch (e) {
|
|
65
|
+
this.logger.error('Error starting Discv5', e);
|
|
66
|
+
}
|
|
93
67
|
|
|
94
|
-
this.
|
|
95
|
-
this.logger.verbose(format('Disconnected from %s', evt.detail.toString())); // Log connected peer
|
|
96
|
-
});
|
|
68
|
+
this.logger.info(`ENR: ${this.node?.enr.encodeTxt()}`);
|
|
97
69
|
}
|
|
98
70
|
|
|
99
71
|
/**
|
|
@@ -111,6 +83,16 @@ export class BootstrapNode {
|
|
|
111
83
|
* @returns The node's peer Id
|
|
112
84
|
*/
|
|
113
85
|
public getPeerId() {
|
|
114
|
-
|
|
86
|
+
if (!this.peerId) {
|
|
87
|
+
throw new Error('Node not started');
|
|
88
|
+
}
|
|
89
|
+
return this.peerId;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public getENR() {
|
|
93
|
+
if (!this.node) {
|
|
94
|
+
throw new Error('Node not started');
|
|
95
|
+
}
|
|
96
|
+
return this.node?.enr.toENR();
|
|
115
97
|
}
|
|
116
98
|
}
|
package/src/client/index.ts
CHANGED
|
@@ -3,8 +3,9 @@ import { type AztecKVStore } from '@aztec/kv-store';
|
|
|
3
3
|
|
|
4
4
|
import { P2PClient } from '../client/p2p_client.js';
|
|
5
5
|
import { type P2PConfig } from '../config.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { DiscV5Service } from '../service/discV5_service.js';
|
|
7
|
+
import { DummyP2PService, DummyPeerDiscoveryService } from '../service/dummy_service.js';
|
|
8
|
+
import { LibP2PService, createLibP2PPeerId } from '../service/index.js';
|
|
8
9
|
import { type TxPool } from '../tx_pool/index.js';
|
|
9
10
|
|
|
10
11
|
export * from './p2p_client.js';
|
|
@@ -15,6 +16,16 @@ export const createP2PClient = async (
|
|
|
15
16
|
txPool: TxPool,
|
|
16
17
|
l2BlockSource: L2BlockSource,
|
|
17
18
|
) => {
|
|
18
|
-
|
|
19
|
+
let discv5Service;
|
|
20
|
+
let p2pService;
|
|
21
|
+
if (config.p2pEnabled) {
|
|
22
|
+
// Create peer discovery service]
|
|
23
|
+
const peerId = await createLibP2PPeerId(config.peerIdPrivateKey);
|
|
24
|
+
discv5Service = new DiscV5Service(peerId, config);
|
|
25
|
+
p2pService = await LibP2PService.new(config, discv5Service, peerId, txPool, store);
|
|
26
|
+
} else {
|
|
27
|
+
p2pService = new DummyP2PService();
|
|
28
|
+
discv5Service = new DummyPeerDiscoveryService();
|
|
29
|
+
}
|
|
19
30
|
return new P2PClient(store, l2BlockSource, txPool, p2pService);
|
|
20
31
|
};
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
4
4
|
import { type AztecKVStore, type AztecSingleton } from '@aztec/kv-store';
|
|
5
5
|
|
|
6
6
|
import { getP2PConfigEnvVars } from '../config.js';
|
|
7
|
-
import {
|
|
7
|
+
import type { P2PService } from '../service/service.js';
|
|
8
8
|
import { type TxPool } from '../tx_pool/index.js';
|
|
9
9
|
|
|
10
10
|
/**
|