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:: Network ;
19
+ use bitcoin:: blockdata:: constants:: ChainHash ;
18
20
use bitcoin:: secp256k1:: { self , Secp256k1 , SecretKey , PublicKey } ;
19
21
20
22
use crate :: sign:: { KeysManager , NodeSigner , Recipient } ;
@@ -273,6 +275,13 @@ impl ChannelMessageHandler for ErroringMessageHandler {
273
275
features
274
276
}
275
277
278
+ fn get_genesis_hash ( & self ) -> Option < ChainHash > {
279
+ // We don't enforce any chains upon peer connection for `ErroringMessageHandler` and leave it up
280
+ // to users of `ErroringMessageHandler` to make decisions on network compatiblility.
281
+ // There's not really any way to pull in specific networks here, and hardcoding can cause breakages.
282
+ None
283
+ }
284
+
276
285
fn handle_open_channel_v2 ( & self , their_node_id : & PublicKey , msg : & msgs:: OpenChannelV2 ) {
277
286
ErroringMessageHandler :: push_error ( self , their_node_id, msg. temporary_channel_id ) ;
278
287
}
@@ -1333,7 +1342,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1333
1342
peer. set_their_node_id ( their_node_id) ;
1334
1343
insert_node_id ! ( ) ;
1335
1344
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 ( ) ) } ;
1345
+ let networks = self . message_handler . chan_handler . get_genesis_hash ( ) . map ( |chain| vec ! [ chain] ) ;
1346
+ let resp = msgs:: Init { features, networks, remote_network_address : filter_addresses ( peer. their_net_address . clone ( ) ) } ;
1337
1347
self . enqueue_message ( peer, & resp) ;
1338
1348
peer. awaiting_pong_timer_tick_intervals = 0 ;
1339
1349
} ,
@@ -1345,7 +1355,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1345
1355
peer. set_their_node_id ( their_node_id) ;
1346
1356
insert_node_id ! ( ) ;
1347
1357
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 ( ) ) } ;
1358
+ let networks = self . message_handler . chan_handler . get_genesis_hash ( ) . map ( |chain| vec ! [ chain] ) ;
1359
+ let resp = msgs:: Init { features, networks, remote_network_address : filter_addresses ( peer. their_net_address . clone ( ) ) } ;
1349
1360
self . enqueue_message ( peer, & resp) ;
1350
1361
peer. awaiting_pong_timer_tick_intervals = 0 ;
1351
1362
} ,
@@ -1460,6 +1471,15 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1460
1471
1461
1472
// Need an Init as first message
1462
1473
if let wire:: Message :: Init ( msg) = message {
1474
+ if let Some ( networks) = & msg. networks {
1475
+ if let Some ( our_chain) = self . message_handler . chan_handler . get_genesis_hash ( ) {
1476
+ if !networks. contains ( & our_chain) {
1477
+ log_debug ! ( self . logger, "Peer does not support our chain ({})" , our_chain) ;
1478
+ return Err ( PeerHandleError { } . into ( ) ) ;
1479
+ }
1480
+ }
1481
+ }
1482
+
1463
1483
let our_features = self . init_features ( & their_node_id) ;
1464
1484
if msg. features . requires_unknown_bits_from ( & our_features) {
1465
1485
log_debug ! ( self . logger, "Peer requires features unknown to us" ) ;
@@ -2459,6 +2479,8 @@ mod tests {
2459
2479
use crate :: ln:: msgs:: { LightningError , NetAddress } ;
2460
2480
use crate :: util:: test_utils;
2461
2481
2482
+ use bitcoin:: Network ;
2483
+ use bitcoin:: blockdata:: constants:: ChainHash ;
2462
2484
use bitcoin:: secp256k1:: { PublicKey , SecretKey } ;
2463
2485
2464
2486
use crate :: prelude:: * ;
@@ -2537,7 +2559,7 @@ mod tests {
2537
2559
} ;
2538
2560
cfgs. push (
2539
2561
PeerManagerCfg {
2540
- chan_handler : test_utils:: TestChannelMessageHandler :: new ( ) ,
2562
+ chan_handler : test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ,
2541
2563
logger : test_utils:: TestLogger :: new ( ) ,
2542
2564
routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2543
2565
custom_handler : TestCustomMessageHandler { features } ,
@@ -2549,7 +2571,7 @@ mod tests {
2549
2571
cfgs
2550
2572
}
2551
2573
2552
- fn create_incompatible_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2574
+ fn create_feature_incompatible_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2553
2575
let mut cfgs = Vec :: new ( ) ;
2554
2576
for i in 0 ..peer_count {
2555
2577
let node_secret = SecretKey :: from_slice ( & [ 42 + i as u8 ; 32 ] ) . unwrap ( ) ;
@@ -2560,7 +2582,27 @@ mod tests {
2560
2582
} ;
2561
2583
cfgs. push (
2562
2584
PeerManagerCfg {
2563
- chan_handler : test_utils:: TestChannelMessageHandler :: new ( ) ,
2585
+ chan_handler : test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ,
2586
+ logger : test_utils:: TestLogger :: new ( ) ,
2587
+ routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2588
+ custom_handler : TestCustomMessageHandler { features } ,
2589
+ node_signer : test_utils:: TestNodeSigner :: new ( node_secret) ,
2590
+ }
2591
+ ) ;
2592
+ }
2593
+
2594
+ cfgs
2595
+ }
2596
+
2597
+ fn create_chain_incompatible_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2598
+ let mut cfgs = Vec :: new ( ) ;
2599
+ for i in 0 ..peer_count {
2600
+ let node_secret = SecretKey :: from_slice ( & [ 42 + i as u8 ; 32 ] ) . unwrap ( ) ;
2601
+ let features = InitFeatures :: from_le_bytes ( vec ! [ 0u8 ; 33 ] ) ;
2602
+ let network = ChainHash :: from ( & [ i as u8 ; 32 ] [ ..] ) ;
2603
+ cfgs. push (
2604
+ PeerManagerCfg {
2605
+ chan_handler : test_utils:: TestChannelMessageHandler :: new ( network) ,
2564
2606
logger : test_utils:: TestLogger :: new ( ) ,
2565
2607
routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2566
2608
custom_handler : TestCustomMessageHandler { features } ,
@@ -2703,9 +2745,9 @@ mod tests {
2703
2745
}
2704
2746
2705
2747
#[ test]
2706
- fn test_incompatible_peers ( ) {
2748
+ fn test_feature_incompatible_peers ( ) {
2707
2749
let cfgs = create_peermgr_cfgs ( 2 ) ;
2708
- let incompatible_cfgs = create_incompatible_peermgr_cfgs ( 2 ) ;
2750
+ let incompatible_cfgs = create_feature_incompatible_peermgr_cfgs ( 2 ) ;
2709
2751
2710
2752
let peers = create_network ( 2 , & cfgs) ;
2711
2753
let incompatible_peers = create_network ( 2 , & incompatible_cfgs) ;
@@ -2738,6 +2780,42 @@ mod tests {
2738
2780
}
2739
2781
}
2740
2782
2783
+ #[ test]
2784
+ fn test_chain_incompatible_peers ( ) {
2785
+ let cfgs = create_peermgr_cfgs ( 2 ) ;
2786
+ let incompatible_cfgs = create_chain_incompatible_peermgr_cfgs ( 2 ) ;
2787
+
2788
+ let peers = create_network ( 2 , & cfgs) ;
2789
+ let incompatible_peers = create_network ( 2 , & incompatible_cfgs) ;
2790
+ let peer_pairs = [ ( & peers[ 0 ] , & incompatible_peers[ 0 ] ) , ( & incompatible_peers[ 1 ] , & peers[ 1 ] ) ] ;
2791
+ for ( peer_a, peer_b) in peer_pairs. iter ( ) {
2792
+ let id_a = peer_a. node_signer . get_node_id ( Recipient :: Node ) . unwrap ( ) ;
2793
+ let mut fd_a = FileDescriptor {
2794
+ fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2795
+ disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2796
+ } ;
2797
+ let addr_a = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1000 } ;
2798
+ let mut fd_b = FileDescriptor {
2799
+ fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2800
+ disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2801
+ } ;
2802
+ let addr_b = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1001 } ;
2803
+ let initial_data = peer_b. new_outbound_connection ( id_a, fd_b. clone ( ) , Some ( addr_a. clone ( ) ) ) . unwrap ( ) ;
2804
+ peer_a. new_inbound_connection ( fd_a. clone ( ) , Some ( addr_b. clone ( ) ) ) . unwrap ( ) ;
2805
+ assert_eq ! ( peer_a. read_event( & mut fd_a, & initial_data) . unwrap( ) , false ) ;
2806
+ peer_a. process_events ( ) ;
2807
+
2808
+ let a_data = fd_a. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2809
+ assert_eq ! ( peer_b. read_event( & mut fd_b, & a_data) . unwrap( ) , false ) ;
2810
+
2811
+ peer_b. process_events ( ) ;
2812
+ let b_data = fd_b. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2813
+
2814
+ // Should fail because of incompatible chains
2815
+ assert ! ( peer_a. read_event( & mut fd_a, & b_data) . is_err( ) ) ;
2816
+ }
2817
+ }
2818
+
2741
2819
#[ test]
2742
2820
fn test_disconnect_peer ( ) {
2743
2821
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
@@ -2762,8 +2840,8 @@ mod tests {
2762
2840
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
2763
2841
// push a message from one peer to another.
2764
2842
let cfgs = create_peermgr_cfgs ( 2 ) ;
2765
- let a_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ) ;
2766
- let b_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ) ;
2843
+ let a_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ;
2844
+ let b_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ChainHash :: using_genesis_block ( Network :: Testnet ) ) ;
2767
2845
let mut peers = create_network ( 2 , & cfgs) ;
2768
2846
let ( fd_a, mut fd_b) = establish_connection ( & peers[ 0 ] , & peers[ 1 ] ) ;
2769
2847
assert_eq ! ( peers[ 0 ] . peers. read( ) . unwrap( ) . len( ) , 1 ) ;
0 commit comments