@@ -226,7 +226,114 @@ describe('Discv5Service', () => {
226
226
await node2 . stop ( ) ;
227
227
} ) ;
228
228
229
- const createNode = async ( overrides : Partial < P2PConfig & IDiscv5CreateOptions > = { } ) => {
229
+ it ( 'should use trusted peers for discovery' , async ( ) => {
230
+ const node1 = await createNode ( { } , false ) ;
231
+ const trustedNode = await createNode ( { } , false ) ;
232
+ const trustedEnr = trustedNode . getEnr ( ) . encodeTxt ( ) ;
233
+
234
+ const node2 = await createNode (
235
+ {
236
+ trustedPeers : [ trustedEnr ] ,
237
+ privatePeers : [ ] ,
238
+ } ,
239
+ false ,
240
+ ) ;
241
+ const node3 = await createNode (
242
+ {
243
+ trustedPeers : [ trustedEnr ] ,
244
+ privatePeers : [ ] ,
245
+ } ,
246
+ false ,
247
+ ) ;
248
+
249
+ await startNodes ( node1 , node2 , node3 , trustedNode ) ;
250
+
251
+ expect ( node1 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
252
+ expect ( trustedNode . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
253
+
254
+ // Verify node2 and node3 are connected to the trusted peer
255
+ expect ( node2 . getAllPeers ( ) . length ) . toBe ( 1 ) ;
256
+ expect ( node3 . getAllPeers ( ) . length ) . toBe ( 1 ) ;
257
+ expect ( await getPeers ( node2 ) ) . toContain ( trustedNode . getPeerId ( ) . toString ( ) ) ;
258
+ expect ( await getPeers ( node3 ) ) . toContain ( trustedNode . getPeerId ( ) . toString ( ) ) ;
259
+
260
+ await Promise . all ( [
261
+ waitForPeers ( node2 , 2 ) ,
262
+ waitForPeers ( node3 , 2 ) ,
263
+ ( async ( ) => {
264
+ await sleep ( 2000 ) ; // wait for peer discovery to be able to start
265
+ for ( let i = 0 ; i < 5 ; i ++ ) {
266
+ await node1 . runRandomNodesQuery ( ) ;
267
+ await node2 . runRandomNodesQuery ( ) ;
268
+ await node3 . runRandomNodesQuery ( ) ;
269
+ await trustedNode . runRandomNodesQuery ( ) ;
270
+ await sleep ( 100 ) ;
271
+ }
272
+ } ) ( ) ,
273
+ ] ) ;
274
+
275
+ expect ( node1 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
276
+
277
+ // Verify node2 and node3 discovered each other through the trusted peer
278
+ const node2Peers = await getPeers ( node2 ) ;
279
+ expect ( node2Peers ) . toHaveLength ( 2 ) ;
280
+ expect ( node2Peers ) . toContain ( node3 . getPeerId ( ) . toString ( ) ) ;
281
+ const node3Peers = await getPeers ( node3 ) ;
282
+ expect ( node3Peers ) . toHaveLength ( 2 ) ;
283
+ expect ( node3Peers ) . toContain ( node2 . getPeerId ( ) . toString ( ) ) ;
284
+ const trustedNodePeers = await getPeers ( trustedNode ) ;
285
+ expect ( trustedNodePeers ) . toHaveLength ( 2 ) ;
286
+ expect ( trustedNodePeers ) . toContain ( node2 . getPeerId ( ) . toString ( ) ) ;
287
+ expect ( trustedNodePeers ) . toContain ( node3 . getPeerId ( ) . toString ( ) ) ;
288
+
289
+ await stopNodes ( node1 , node2 , node3 , trustedNode ) ;
290
+ } ) ;
291
+
292
+ it ( 'should not use private peers or peers marked as both trusted and private for discovery' , async ( ) => {
293
+ const node1 = await createNode ( { } , false ) ;
294
+ const privateNode = await createNode ( { } , false ) ;
295
+ const privateEnr = privateNode . getEnr ( ) . encodeTxt ( ) ;
296
+
297
+ const node2 = await createNode (
298
+ {
299
+ trustedPeers : [ ] ,
300
+ privatePeers : [ privateEnr ] ,
301
+ } ,
302
+ false ,
303
+ ) ;
304
+ const node3 = await createNode (
305
+ {
306
+ trustedPeers : [ privateEnr ] ,
307
+ privatePeers : [ privateEnr ] ,
308
+ } ,
309
+ false ,
310
+ ) ;
311
+
312
+ await startNodes ( node1 , node2 , node3 , privateNode ) ;
313
+
314
+ expect ( node1 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
315
+ expect ( node2 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
316
+ expect ( node3 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
317
+ expect ( privateNode . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
318
+
319
+ await sleep ( 2000 ) ; // wait for peer discovery to be able to start
320
+ for ( let i = 0 ; i < 3 ; i ++ ) {
321
+ await node1 . runRandomNodesQuery ( ) ;
322
+ await node2 . runRandomNodesQuery ( ) ;
323
+ await node3 . runRandomNodesQuery ( ) ;
324
+ await privateNode . runRandomNodesQuery ( ) ;
325
+ await sleep ( 100 ) ;
326
+ }
327
+
328
+ expect ( node1 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
329
+ expect ( node2 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
330
+ expect ( node3 . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
331
+ expect ( privateNode . getAllPeers ( ) ) . toHaveLength ( 0 ) ;
332
+
333
+ await stopNodes ( node1 , node2 , node3 , privateNode ) ;
334
+ } , 30_000 ) ;
335
+
336
+ const createNode = async ( overrides : Partial < P2PConfig & IDiscv5CreateOptions > = { } , useBootnode = true ) => {
230
337
const port = ++ basePort ;
231
338
const bootnodeAddr = bootNode . getENR ( ) . encodeTxt ( ) ;
232
339
const peerId = await createSecp256k1PeerId ( ) ;
@@ -235,7 +342,7 @@ describe('Discv5Service', () => {
235
342
...baseConfig ,
236
343
p2pIp : `127.0.0.1` ,
237
344
p2pPort : port ,
238
- bootstrapNodes : [ bootnodeAddr ] ,
345
+ bootstrapNodes : useBootnode ? [ bootnodeAddr ] : [ ] ,
239
346
blockCheckIntervalMS : 50 ,
240
347
peerCheckIntervalMS : 50 ,
241
348
p2pEnabled : true ,
0 commit comments