15
15
//! call into the provided message handlers (probably a ChannelManager and P2PGossipSync) with
16
16
//! messages they should handle, and encoding/sending response messages.
17
17
18
+ use bitcoin:: blockdata:: constants:: ChainHash ;
18
19
use bitcoin:: secp256k1:: { self , Secp256k1 , SecretKey , PublicKey } ;
19
20
20
21
use crate :: sign:: { KeysManager , NodeSigner , Recipient } ;
@@ -273,6 +274,13 @@ impl ChannelMessageHandler for ErroringMessageHandler {
273
274
features
274
275
}
275
276
277
+ fn get_genesis_hashes ( & self ) -> Option < Vec < ChainHash > > {
278
+ // We don't enforce any chains upon peer connection for `ErroringMessageHandler` and leave it up
279
+ // to users of `ErroringMessageHandler` to make decisions on network compatiblility.
280
+ // There's not really any way to pull in specific networks here, and hardcoding can cause breakages.
281
+ None
282
+ }
283
+
276
284
fn handle_open_channel_v2 ( & self , their_node_id : & PublicKey , msg : & msgs:: OpenChannelV2 ) {
277
285
ErroringMessageHandler :: push_error ( self , their_node_id, msg. temporary_channel_id ) ;
278
286
}
@@ -1333,7 +1341,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1333
1341
peer. set_their_node_id ( their_node_id) ;
1334
1342
insert_node_id ! ( ) ;
1335
1343
let features = self . init_features ( & their_node_id) ;
1336
- let resp = msgs:: Init { features, networks : None , remote_network_address : filter_addresses ( peer. their_net_address . clone ( ) ) } ;
1344
+ let networks = self . message_handler . chan_handler . get_genesis_hashes ( ) ;
1345
+ let resp = msgs:: Init { features, networks, remote_network_address : filter_addresses ( peer. their_net_address . clone ( ) ) } ;
1337
1346
self . enqueue_message ( peer, & resp) ;
1338
1347
peer. awaiting_pong_timer_tick_intervals = 0 ;
1339
1348
} ,
@@ -1345,7 +1354,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1345
1354
peer. set_their_node_id ( their_node_id) ;
1346
1355
insert_node_id ! ( ) ;
1347
1356
let features = self . init_features ( & their_node_id) ;
1348
- let resp = msgs:: Init { features, networks : None , remote_network_address : filter_addresses ( peer. their_net_address . clone ( ) ) } ;
1357
+ let networks = self . message_handler . chan_handler . get_genesis_hashes ( ) ;
1358
+ let resp = msgs:: Init { features, networks, remote_network_address : filter_addresses ( peer. their_net_address . clone ( ) ) } ;
1349
1359
self . enqueue_message ( peer, & resp) ;
1350
1360
peer. awaiting_pong_timer_tick_intervals = 0 ;
1351
1361
} ,
@@ -1460,6 +1470,25 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1460
1470
1461
1471
// Need an Init as first message
1462
1472
if let wire:: Message :: Init ( msg) = message {
1473
+ // Check if we have any compatible chains if the `networks` field is specified.
1474
+ if let Some ( networks) = & msg. networks {
1475
+ if let Some ( our_chains) = self . message_handler . chan_handler . get_genesis_hashes ( ) {
1476
+ let mut have_compatible_chains = false ;
1477
+ ' our_chains: for our_chain in our_chains. iter ( ) {
1478
+ for their_chain in networks {
1479
+ if our_chain == their_chain {
1480
+ have_compatible_chains = true ;
1481
+ break ' our_chains;
1482
+ }
1483
+ }
1484
+ }
1485
+ if !have_compatible_chains {
1486
+ log_debug ! ( self . logger, "Peer does not support any of our supported chains" ) ;
1487
+ return Err ( PeerHandleError { } . into ( ) ) ;
1488
+ }
1489
+ }
1490
+ }
1491
+
1463
1492
let our_features = self . init_features ( & their_node_id) ;
1464
1493
if msg. features . requires_unknown_bits_from ( & our_features) {
1465
1494
log_debug ! ( self . logger, "Peer requires features unknown to us" ) ;
@@ -2459,6 +2488,8 @@ mod tests {
2459
2488
use crate :: ln:: msgs:: { LightningError , NetAddress } ;
2460
2489
use crate :: util:: test_utils;
2461
2490
2491
+ use bitcoin:: Network ;
2492
+ use bitcoin:: blockdata:: constants:: ChainHash ;
2462
2493
use bitcoin:: secp256k1:: { PublicKey , SecretKey } ;
2463
2494
2464
2495
use crate :: prelude:: * ;
@@ -2537,7 +2568,7 @@ mod tests {
2537
2568
} ;
2538
2569
cfgs. push (
2539
2570
PeerManagerCfg {
2540
- chan_handler : test_utils:: TestChannelMessageHandler :: new ( ) ,
2571
+ chan_handler : test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ,
2541
2572
logger : test_utils:: TestLogger :: new ( ) ,
2542
2573
routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2543
2574
custom_handler : TestCustomMessageHandler { features } ,
@@ -2549,7 +2580,7 @@ mod tests {
2549
2580
cfgs
2550
2581
}
2551
2582
2552
- fn create_incompatible_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2583
+ fn create_feature_incompatible_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2553
2584
let mut cfgs = Vec :: new ( ) ;
2554
2585
for i in 0 ..peer_count {
2555
2586
let node_secret = SecretKey :: from_slice ( & [ 42 + i as u8 ; 32 ] ) . unwrap ( ) ;
@@ -2560,7 +2591,27 @@ mod tests {
2560
2591
} ;
2561
2592
cfgs. push (
2562
2593
PeerManagerCfg {
2563
- chan_handler : test_utils:: TestChannelMessageHandler :: new ( ) ,
2594
+ chan_handler : test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ,
2595
+ logger : test_utils:: TestLogger :: new ( ) ,
2596
+ routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2597
+ custom_handler : TestCustomMessageHandler { features } ,
2598
+ node_signer : test_utils:: TestNodeSigner :: new ( node_secret) ,
2599
+ }
2600
+ ) ;
2601
+ }
2602
+
2603
+ cfgs
2604
+ }
2605
+
2606
+ fn create_chain_incompatible_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2607
+ let mut cfgs = Vec :: new ( ) ;
2608
+ for i in 0 ..peer_count {
2609
+ let node_secret = SecretKey :: from_slice ( & [ 42 + i as u8 ; 32 ] ) . unwrap ( ) ;
2610
+ let features = InitFeatures :: from_le_bytes ( vec ! [ 0u8 ; 33 ] ) ;
2611
+ let network = ChainHash :: from ( & [ i as u8 ; 32 ] [ ..] ) ;
2612
+ cfgs. push (
2613
+ PeerManagerCfg {
2614
+ chan_handler : test_utils:: TestChannelMessageHandler :: new ( network) ,
2564
2615
logger : test_utils:: TestLogger :: new ( ) ,
2565
2616
routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2566
2617
custom_handler : TestCustomMessageHandler { features } ,
@@ -2703,9 +2754,9 @@ mod tests {
2703
2754
}
2704
2755
2705
2756
#[ test]
2706
- fn test_incompatible_peers ( ) {
2757
+ fn test_feature_incompatible_peers ( ) {
2707
2758
let cfgs = create_peermgr_cfgs ( 2 ) ;
2708
- let incompatible_cfgs = create_incompatible_peermgr_cfgs ( 2 ) ;
2759
+ let incompatible_cfgs = create_feature_incompatible_peermgr_cfgs ( 2 ) ;
2709
2760
2710
2761
let peers = create_network ( 2 , & cfgs) ;
2711
2762
let incompatible_peers = create_network ( 2 , & incompatible_cfgs) ;
@@ -2738,6 +2789,42 @@ mod tests {
2738
2789
}
2739
2790
}
2740
2791
2792
+ #[ test]
2793
+ fn test_chain_incompatible_peers ( ) {
2794
+ let cfgs = create_peermgr_cfgs ( 2 ) ;
2795
+ let incompatible_cfgs = create_chain_incompatible_peermgr_cfgs ( 2 ) ;
2796
+
2797
+ let peers = create_network ( 2 , & cfgs) ;
2798
+ let incompatible_peers = create_network ( 2 , & incompatible_cfgs) ;
2799
+ let peer_pairs = [ ( & peers[ 0 ] , & incompatible_peers[ 0 ] ) , ( & incompatible_peers[ 1 ] , & peers[ 1 ] ) ] ;
2800
+ for ( peer_a, peer_b) in peer_pairs. iter ( ) {
2801
+ let id_a = peer_a. node_signer . get_node_id ( Recipient :: Node ) . unwrap ( ) ;
2802
+ let mut fd_a = FileDescriptor {
2803
+ fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2804
+ disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2805
+ } ;
2806
+ let addr_a = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1000 } ;
2807
+ let mut fd_b = FileDescriptor {
2808
+ fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2809
+ disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2810
+ } ;
2811
+ let addr_b = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1001 } ;
2812
+ let initial_data = peer_b. new_outbound_connection ( id_a, fd_b. clone ( ) , Some ( addr_a. clone ( ) ) ) . unwrap ( ) ;
2813
+ peer_a. new_inbound_connection ( fd_a. clone ( ) , Some ( addr_b. clone ( ) ) ) . unwrap ( ) ;
2814
+ assert_eq ! ( peer_a. read_event( & mut fd_a, & initial_data) . unwrap( ) , false ) ;
2815
+ peer_a. process_events ( ) ;
2816
+
2817
+ let a_data = fd_a. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2818
+ assert_eq ! ( peer_b. read_event( & mut fd_b, & a_data) . unwrap( ) , false ) ;
2819
+
2820
+ peer_b. process_events ( ) ;
2821
+ let b_data = fd_b. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2822
+
2823
+ // Should fail because of incompatible chains
2824
+ assert ! ( peer_a. read_event( & mut fd_a, & b_data) . is_err( ) ) ;
2825
+ }
2826
+ }
2827
+
2741
2828
#[ test]
2742
2829
fn test_disconnect_peer ( ) {
2743
2830
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
@@ -2762,8 +2849,8 @@ mod tests {
2762
2849
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
2763
2850
// push a message from one peer to another.
2764
2851
let cfgs = create_peermgr_cfgs ( 2 ) ;
2765
- let a_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ) ;
2766
- let b_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ) ;
2852
+ let a_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ;
2853
+ let b_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ;
2767
2854
let mut peers = create_network ( 2 , & cfgs) ;
2768
2855
let ( fd_a, mut fd_b) = establish_connection ( & peers[ 0 ] , & peers[ 1 ] ) ;
2769
2856
assert_eq ! ( peers[ 0 ] . peers. read( ) . unwrap( ) . len( ) , 1 ) ;
0 commit comments