2
2
use super :: node_record:: NodeRecord ;
3
3
use super :: node_record:: NodeRecordInner ;
4
4
use crate :: neighborhood:: dot_graph:: {
5
- render_dot_graph, DotRenderable , EdgeRenderable , NodeRenderable ,
5
+ render_dot_graph, DotRenderable , EdgeRenderable , NodeRenderable , NodeRenderableInner ,
6
6
} ;
7
7
use crate :: neighborhood:: neighborhood_database:: NeighborhoodDatabase ;
8
8
use crate :: neighborhood:: AccessibleGossipRecord ;
9
9
use crate :: sub_lib:: cryptde:: { CryptDE , CryptData , PlainData , PublicKey } ;
10
10
use crate :: sub_lib:: data_version:: DataVersion ;
11
11
use crate :: sub_lib:: hopper:: MessageType ;
12
12
use crate :: sub_lib:: node_addr:: NodeAddr ;
13
+ use pretty_hex:: PrettyHex ;
13
14
use serde_derive:: { Deserialize , Serialize } ;
14
15
use std:: collections:: HashSet ;
15
16
use std:: convert:: { TryFrom , TryInto } ;
16
17
use std:: fmt:: Debug ;
17
18
use std:: fmt:: Error ;
18
19
use std:: fmt:: Formatter ;
19
20
use std:: iter:: FromIterator ;
20
- use std:: net:: IpAddr ;
21
+ use std:: net:: { IpAddr , SocketAddr } ;
21
22
22
23
#[ derive( Clone , PartialEq , Eq , Serialize , Deserialize ) ]
23
24
pub struct GossipNodeRecord {
@@ -82,7 +83,6 @@ impl From<NodeRecord> for GossipNodeRecord {
82
83
}
83
84
84
85
impl GossipNodeRecord {
85
- // TODO - should we use a json serializer to make this?
86
86
fn to_human_readable ( & self ) -> String {
87
87
let mut human_readable = String :: new ( ) ;
88
88
human_readable. push_str ( "\n GossipNodeRecord {" ) ;
@@ -104,8 +104,14 @@ impl GossipNodeRecord {
104
104
Err ( _e) => human_readable. push_str ( "\n \t inner: <non-deserializable>" ) ,
105
105
} ;
106
106
human_readable. push_str ( & format ! ( "\n \t node_addr_opt: {:?}," , self . node_addr_opt) ) ;
107
- human_readable. push_str ( & format ! ( "\n \t signed_data: {:?}," , self . signed_data) ) ;
108
- human_readable. push_str ( & format ! ( "\n \t signature: {:?}," , self . signature) ) ;
107
+ human_readable. push_str ( & format ! (
108
+ "\n \t signed_data:\n {:?}" ,
109
+ self . signed_data. as_slice( ) . hex_dump( )
110
+ ) ) ;
111
+ human_readable. push_str ( & format ! (
112
+ "\n \t signature:\n {:?}" ,
113
+ self . signature. as_slice( ) . hex_dump( )
114
+ ) ) ;
109
115
human_readable. push_str ( "\n }" ) ;
110
116
human_readable
111
117
}
@@ -221,6 +227,16 @@ impl From<IpAddr> for DotGossipEndpoint {
221
227
}
222
228
}
223
229
230
+ // Produces incomplete representation
231
+ impl From < SocketAddr > for DotGossipEndpoint {
232
+ fn from ( input : SocketAddr ) -> Self {
233
+ DotGossipEndpoint {
234
+ public_key : PublicKey :: new ( b"" ) ,
235
+ node_addr_opt : Some ( NodeAddr :: new ( & input. ip ( ) , & vec ! [ input. port( ) ] ) ) ,
236
+ }
237
+ }
238
+ }
239
+
224
240
struct SrcDestRenderable {
225
241
name : String ,
226
242
prefix : String ,
@@ -338,7 +354,11 @@ impl Gossip {
338
354
} )
339
355
} ) ;
340
356
node_renderables. push ( NodeRenderable {
341
- version : Some ( nri. version ) ,
357
+ inner : Some ( NodeRenderableInner {
358
+ version : nri. version ,
359
+ accepts_connections : nri. accepts_connections ,
360
+ routes_data : nri. routes_data ,
361
+ } ) ,
342
362
public_key : nri. public_key . clone ( ) ,
343
363
node_addr : addr. clone ( ) ,
344
364
known_source : nri. public_key == source. public_key ,
@@ -348,7 +368,7 @@ impl Gossip {
348
368
} ) ;
349
369
mentioned. difference ( & present) . for_each ( |k| {
350
370
node_renderables. push ( NodeRenderable {
351
- version : None ,
371
+ inner : None ,
352
372
public_key : k. clone ( ) ,
353
373
node_addr : None ,
354
374
known_source : false ,
@@ -399,7 +419,7 @@ impl<'a> GossipBuilder<'a> {
399
419
None => panic ! ( "GossipBuilder cannot add a nonexistent Node" ) ,
400
420
Some ( node_record_ref) => {
401
421
let mut gnr = GossipNodeRecord :: from ( node_record_ref. clone ( ) ) ;
402
- if !reveal_node_addr {
422
+ if !reveal_node_addr || !node_record_ref . accepts_connections ( ) {
403
423
gnr. node_addr_opt = None
404
424
}
405
425
self . gossip . node_records . push ( gnr) ;
@@ -419,6 +439,7 @@ impl<'a> GossipBuilder<'a> {
419
439
mod tests {
420
440
use super :: super :: gossip:: GossipBuilder ;
421
441
use super :: super :: neighborhood_test_utils:: make_node_record;
442
+ use super :: super :: neighborhood_test_utils:: make_node_record_f;
422
443
use super :: * ;
423
444
use crate :: neighborhood:: neighborhood_test_utils:: db_from_node;
424
445
use crate :: test_utils:: { assert_string_contains, vec_to_btset} ;
@@ -463,8 +484,12 @@ mod tests {
463
484
464
485
#[ test]
465
486
fn adding_node_with_no_addr_and_reveal_results_in_node_with_no_addr ( ) {
466
- let node = make_node_record ( 1234 , false ) ;
467
- let mut db = db_from_node ( & node) ;
487
+ let node = make_node_record_f ( 1234 , false , false , true ) ;
488
+ let mut db: NeighborhoodDatabase = db_from_node ( & node) ;
489
+ db. node_by_key_mut ( node. public_key ( ) )
490
+ . unwrap ( )
491
+ . inner
492
+ . accepts_connections = true ;
468
493
let gossip_node = & db. add_node ( make_node_record ( 2345 , false ) ) . unwrap ( ) ;
469
494
let builder = GossipBuilder :: new ( & db) ;
470
495
@@ -476,8 +501,12 @@ mod tests {
476
501
477
502
#[ test]
478
503
fn adding_node_with_no_addr_and_no_reveal_results_in_node_with_no_addr ( ) {
479
- let node = make_node_record ( 1234 , false ) ;
480
- let db = db_from_node ( & node) ;
504
+ let node = make_node_record_f ( 1234 , false , false , true ) ;
505
+ let mut db: NeighborhoodDatabase = db_from_node ( & node) ;
506
+ db. node_by_key_mut ( node. public_key ( ) )
507
+ . unwrap ( )
508
+ . inner
509
+ . accepts_connections = true ;
481
510
let builder = GossipBuilder :: new ( & db) ;
482
511
483
512
let builder = builder. node ( node. public_key ( ) , false ) ;
@@ -486,6 +515,22 @@ mod tests {
486
515
assert_eq ! ( gossip. node_records. remove( 0 ) . node_addr_opt, None )
487
516
}
488
517
518
+ #[ test]
519
+ fn adding_node_that_doesnt_accept_with_addr_and_reveal_results_in_node_with_no_addr ( ) {
520
+ let node: NodeRecord = make_node_record ( 1234 , true ) ;
521
+ let mut db: NeighborhoodDatabase = db_from_node ( & node) ;
522
+ db. node_by_key_mut ( node. public_key ( ) )
523
+ . unwrap ( )
524
+ . inner
525
+ . accepts_connections = false ;
526
+ let builder = GossipBuilder :: new ( & db) ;
527
+
528
+ let builder = builder. node ( node. public_key ( ) , true ) ;
529
+
530
+ let mut gossip = builder. build ( ) ;
531
+ assert_eq ! ( gossip. node_records. remove( 0 ) . node_addr_opt, None )
532
+ }
533
+
489
534
#[ test]
490
535
fn gossip_node_record_keeps_all_half_neighbors ( ) {
491
536
let mut this_node = make_node_record ( 1234 , true ) ;
@@ -564,8 +609,28 @@ mod tests {
564
609
"\n GossipNodeRecord {{{}{}{}{}\n }}" ,
565
610
"\n \t inner: NodeRecordInner {\n \t \t public_key: AQIDBA,\n \t \t node_addr_opt: Some(1.2.3.4:[1234]),\n \t \t earning_wallet: Wallet { kind: Address(0x546900db8d6e0937497133d1ae6fdf5f4b75bcd0) },\n \t \t rate_pack: RatePack { routing_byte_rate: 1235, routing_service_rate: 1236, exit_byte_rate: 1237, exit_service_rate: 1238 },\n \t \t neighbors: [],\n \t \t version: 2,\n \t }," ,
566
611
"\n \t node_addr_opt: Some(1.2.3.4:[1234])," ,
567
- "\n \t signed_data: PlainData { data: [166, 108, 100, 97, 116, 97, 95, 118, 101, 114, 115, 105, 111, 110, 131, 0, 0, 0, 106, 112, 117, 98, 108, 105, 99, 95, 107, 101, 121, 68, 1, 2, 3, 4, 110, 101, 97, 114, 110, 105, 110, 103, 95, 119, 97, 108, 108, 101, 116, 161, 103, 97, 100, 100, 114, 101, 115, 115, 148, 24, 84, 24, 105, 0, 24, 219, 24, 141, 24, 110, 9, 24, 55, 24, 73, 24, 113, 24, 51, 24, 209, 24, 174, 24, 111, 24, 223, 24, 95, 24, 75, 24, 117, 24, 188, 24, 208, 105, 114, 97, 116, 101, 95, 112, 97, 99, 107, 164, 113, 114, 111, 117, 116, 105, 110, 103, 95, 98, 121, 116, 101, 95, 114, 97, 116, 101, 25, 4, 211, 116, 114, 111, 117, 116, 105, 110, 103, 95, 115, 101, 114, 118, 105, 99, 101, 95, 114, 97, 116, 101, 25, 4, 212, 110, 101, 120, 105, 116, 95, 98, 121, 116, 101, 95, 114, 97, 116, 101, 25, 4, 213, 113, 101, 120, 105, 116, 95, 115, 101, 114, 118, 105, 99, 101, 95, 114, 97, 116, 101, 25, 4, 214, 105, 110, 101, 105, 103, 104, 98, 111, 114, 115, 128, 103, 118, 101, 114, 115, 105, 111, 110, 2] }," ,
568
- "\n \t signature: CryptData { data: [1, 2, 3, 4, 13, 203, 98, 91, 91, 124, 75, 12, 242, 126, 76, 106, 236, 12, 26, 1, 199, 218, 114, 177] },"
612
+ "\n \t signed_data:
613
+ Length: 246 (0xf6) bytes
614
+ 0000: a8 6c 64 61 74 61 5f 76 65 72 73 69 6f 6e 83 00 .ldata_version..
615
+ 0010: 10 00 6a 70 75 62 6c 69 63 5f 6b 65 79 44 01 02 ..jpublic_keyD..
616
+ 0020: 03 04 6e 65 61 72 6e 69 6e 67 5f 77 61 6c 6c 65 ..nearning_walle
617
+ 0030: 74 a1 67 61 64 64 72 65 73 73 94 18 54 18 69 00 t.gaddress..T.i.
618
+ 0040: 18 db 18 8d 18 6e 09 18 37 18 49 18 71 18 33 18 .....n..7.I.q.3.
619
+ 0050: d1 18 ae 18 6f 18 df 18 5f 18 4b 18 75 18 bc 18 ....o..._.K.u...
620
+ 0060: d0 69 72 61 74 65 5f 70 61 63 6b a4 71 72 6f 75 .irate_pack.qrou
621
+ 0070: 74 69 6e 67 5f 62 79 74 65 5f 72 61 74 65 19 04 ting_byte_rate..
622
+ 0080: d3 74 72 6f 75 74 69 6e 67 5f 73 65 72 76 69 63 .trouting_servic
623
+ 0090: 65 5f 72 61 74 65 19 04 d4 6e 65 78 69 74 5f 62 e_rate...nexit_b
624
+ 00a0: 79 74 65 5f 72 61 74 65 19 04 d5 71 65 78 69 74 yte_rate...qexit
625
+ 00b0: 5f 73 65 72 76 69 63 65 5f 72 61 74 65 19 04 d6 _service_rate...
626
+ 00c0: 69 6e 65 69 67 68 62 6f 72 73 80 73 61 63 63 65 ineighbors.sacce
627
+ 00d0: 70 74 73 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 f5 pts_connections.
628
+ 00e0: 6b 72 6f 75 74 65 73 5f 64 61 74 61 f5 67 76 65 kroutes_data.gve
629
+ 00f0: 72 73 69 6f 6e 02 rsion." ,
630
+ "\n \t signature:
631
+ Length: 24 (0x18) bytes
632
+ 0000: 01 02 03 04 67 5b 38 53 63 59 ad a8 3d e1 d5 96 ....g[8ScY..=...
633
+ 0010: 89 59 88 be 09 86 64 ae .Y....d." ,
569
634
) ;
570
635
571
636
assert_eq ! ( result, expected) ;
@@ -585,11 +650,15 @@ mod tests {
585
650
"\n GossipNodeRecord {{{}{}{}{}\n }}" ,
586
651
"\n \t inner: <non-deserializable>" ,
587
652
"\n \t node_addr_opt: None," ,
588
- "\n \t signed_data: PlainData { data: [1, 2, 3, 4] }," ,
589
- "\n \t signature: CryptData { data: [4, 3, 2, 1] },"
653
+ "\n \t signed_data:
654
+ Length: 4 (0x4) bytes
655
+ 0000: 01 02 03 04 ...." ,
656
+ "\n \t signature:
657
+ Length: 4 (0x4) bytes
658
+ 0000: 04 03 02 01 ...." ,
590
659
) ;
591
660
592
- assert_eq ! ( expected , result ) ;
661
+ assert_eq ! ( result , expected ) ;
593
662
}
594
663
595
664
#[ test]
@@ -623,14 +692,14 @@ mod tests {
623
692
let result = gossip. to_dot_graph ( & source_node, & target_node) ;
624
693
625
694
assert_string_contains ( & result, "digraph db { " ) ;
626
- assert_string_contains ( & result, "\" AwQFBg\" [label=\" v0\\ nAwQFBg\" ]; " ) ;
695
+ assert_string_contains ( & result, "\" AwQFBg\" [label=\" AR v0\\ nAwQFBg\" ]; " ) ;
627
696
assert_string_contains (
628
697
& result,
629
- "\" QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo\" [label=\" v1\\ nQUJDREVG\\ n1.2.3.4:1234\" ] [style=filled]; " ,
698
+ "\" QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo\" [label=\" AR v1\\ nQUJDREVG\\ n1.2.3.4:1234\" ] [style=filled]; " ,
630
699
) ;
631
700
assert_string_contains (
632
701
& result,
633
- "\" WllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkE\" [label=\" v0\\ nWllYV1ZV\\ n2.3.4.5:2345\" ] [shape=box]; " ,
702
+ "\" WllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkE\" [label=\" AR v0\\ nWllYV1ZV\\ n2.3.4.5:2345\" ] [shape=box]; " ,
634
703
) ;
635
704
assert_string_contains (
636
705
& result,
0 commit comments