@@ -19,10 +19,12 @@ use crate::ln::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret};
1919use crate :: ln:: channelmanager:: { AChannelManager , ChainParameters , ChannelManager , ChannelManagerReadArgs , RAACommitmentOrder , PaymentSendFailure , RecipientOnionFields , PaymentId , MIN_CLTV_EXPIRY_DELTA } ;
2020use crate :: ln:: features:: InitFeatures ;
2121use crate :: ln:: msgs;
22- use crate :: ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
22+ use crate :: ln:: msgs:: { ChannelMessageHandler , OnionMessageHandler , RoutingMessageHandler } ;
23+ use crate :: ln:: peer_handler:: IgnoringMessageHandler ;
24+ use crate :: onion_message:: OnionMessenger ;
2325use crate :: routing:: gossip:: { P2PGossipSync , NetworkGraph , NetworkUpdate } ;
2426use crate :: routing:: router:: { self , PaymentParameters , Route , RouteParameters } ;
25- use crate :: sign:: EntropySource ;
27+ use crate :: sign:: { EntropySource , RandomBytes } ;
2628use crate :: util:: config:: { UserConfig , MaxDustHTLCExposure } ;
2729use crate :: util:: errors:: APIError ;
2830#[ cfg( test) ]
@@ -47,6 +49,7 @@ use alloc::rc::Rc;
4749use core:: cell:: RefCell ;
4850use core:: iter:: repeat;
4951use core:: mem;
52+ use core:: ops:: Deref ;
5053use crate :: io;
5154use crate :: prelude:: * ;
5255use crate :: sync:: { Arc , Mutex , LockTestExt , RwLock } ;
@@ -388,6 +391,7 @@ pub struct NodeCfg<'a> {
388391 pub tx_broadcaster : & ' a test_utils:: TestBroadcaster ,
389392 pub fee_estimator : & ' a test_utils:: TestFeeEstimator ,
390393 pub router : test_utils:: TestRouter < ' a > ,
394+ pub message_router : test_utils:: TestMessageRouter < ' a > ,
391395 pub chain_monitor : test_utils:: TestChainMonitor < ' a > ,
392396 pub keys_manager : & ' a test_utils:: TestKeysInterface ,
393397 pub logger : & ' a test_utils:: TestLogger ,
@@ -407,6 +411,26 @@ type TestChannelManager<'node_cfg, 'chan_mon_cfg> = ChannelManager<
407411 & ' chan_mon_cfg test_utils:: TestLogger ,
408412> ;
409413
414+ type TestOnionMessenger < ' chan_man , ' node_cfg , ' chan_mon_cfg > = OnionMessenger <
415+ DedicatedEntropy ,
416+ & ' node_cfg test_utils:: TestKeysInterface ,
417+ & ' chan_mon_cfg test_utils:: TestLogger ,
418+ & ' node_cfg test_utils:: TestMessageRouter < ' chan_mon_cfg > ,
419+ & ' chan_man TestChannelManager < ' node_cfg , ' chan_mon_cfg > ,
420+ IgnoringMessageHandler ,
421+ > ;
422+
423+ /// For use with [`OnionMessenger`] otherwise `test_restored_packages_retry` will fail. This is
424+ /// because that test uses older serialized data produced by calling [`EntropySource`] in a specific
425+ /// manner. Using the same [`EntropySource`] with [`OnionMessenger`] would introduce another call,
426+ /// causing the produced data to no longer match.
427+ pub struct DedicatedEntropy ( RandomBytes ) ;
428+
429+ impl Deref for DedicatedEntropy {
430+ type Target = RandomBytes ;
431+ fn deref ( & self ) -> & Self :: Target { & self . 0 }
432+ }
433+
410434pub struct Node < ' chan_man , ' node_cfg : ' chan_man , ' chan_mon_cfg : ' node_cfg > {
411435 pub chain_source : & ' chan_mon_cfg test_utils:: TestChainSource ,
412436 pub tx_broadcaster : & ' chan_mon_cfg test_utils:: TestBroadcaster ,
@@ -415,6 +439,7 @@ pub struct Node<'chan_man, 'node_cfg: 'chan_man, 'chan_mon_cfg: 'node_cfg> {
415439 pub chain_monitor : & ' node_cfg test_utils:: TestChainMonitor < ' chan_mon_cfg > ,
416440 pub keys_manager : & ' chan_mon_cfg test_utils:: TestKeysInterface ,
417441 pub node : & ' chan_man TestChannelManager < ' node_cfg , ' chan_mon_cfg > ,
442+ pub onion_messenger : TestOnionMessenger < ' chan_man , ' node_cfg , ' chan_mon_cfg > ,
418443 pub network_graph : & ' node_cfg NetworkGraph < & ' chan_mon_cfg test_utils:: TestLogger > ,
419444 pub gossip_sync : P2PGossipSync < & ' node_cfg NetworkGraph < & ' chan_mon_cfg test_utils:: TestLogger > , & ' chan_mon_cfg test_utils:: TestChainSource , & ' chan_mon_cfg test_utils:: TestLogger > ,
420445 pub node_seed : [ u8 ; 32 ] ,
@@ -432,6 +457,14 @@ pub struct Node<'chan_man, 'node_cfg: 'chan_man, 'chan_mon_cfg: 'node_cfg> {
432457 & ' chan_mon_cfg test_utils:: TestLogger ,
433458 > ,
434459}
460+
461+ impl < ' a , ' b , ' c > Node < ' a , ' b , ' c > {
462+ pub fn init_features ( & self , peer_node_id : & PublicKey ) -> InitFeatures {
463+ self . override_init_features . borrow ( ) . clone ( )
464+ . unwrap_or_else ( || self . node . init_features ( ) | self . onion_messenger . provided_init_features ( peer_node_id) )
465+ }
466+ }
467+
435468#[ cfg( feature = "std" ) ]
436469impl < ' a , ' b , ' c > std:: panic:: UnwindSafe for Node < ' a , ' b , ' c > { }
437470#[ cfg( feature = "std" ) ]
@@ -1054,6 +1087,7 @@ macro_rules! reload_node {
10541087
10551088 $new_channelmanager = _reload_node( & $node, $new_config, & chanman_encoded, $monitors_encoded) ;
10561089 $node. node = & $new_channelmanager;
1090+ $node. onion_messenger. set_offers_handler( & $new_channelmanager) ;
10571091 } ;
10581092 ( $node: expr, $chanman_encoded: expr, $monitors_encoded: expr, $persister: ident, $new_chain_monitor: ident, $new_channelmanager: ident) => {
10591093 reload_node!( $node, $crate:: util:: config:: UserConfig :: default ( ) , $chanman_encoded, $monitors_encoded, $persister, $new_chain_monitor, $new_channelmanager) ;
@@ -2879,6 +2913,7 @@ pub fn create_node_cfgs_with_persisters<'a>(node_count: usize, chanmon_cfgs: &'a
28792913 tx_broadcaster : & chanmon_cfgs[ i] . tx_broadcaster ,
28802914 fee_estimator : & chanmon_cfgs[ i] . fee_estimator ,
28812915 router : test_utils:: TestRouter :: new ( network_graph. clone ( ) , & chanmon_cfgs[ i] . scorer ) ,
2916+ message_router : test_utils:: TestMessageRouter :: new ( network_graph. clone ( ) ) ,
28822917 chain_monitor,
28832918 keys_manager : & chanmon_cfgs[ i] . keys_manager ,
28842919 node_seed : seed,
@@ -2932,14 +2967,19 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
29322967 let connect_style = Rc :: new ( RefCell :: new ( ConnectStyle :: random_style ( ) ) ) ;
29332968
29342969 for i in 0 ..node_count {
2970+ let dedicated_entropy = DedicatedEntropy ( RandomBytes :: new ( [ i as u8 ; 32 ] ) ) ;
2971+ let onion_messenger = OnionMessenger :: new (
2972+ dedicated_entropy, cfgs[ i] . keys_manager , cfgs[ i] . logger , & cfgs[ i] . message_router ,
2973+ & chan_mgrs[ i] , IgnoringMessageHandler { } ,
2974+ ) ;
29352975 let gossip_sync = P2PGossipSync :: new ( cfgs[ i] . network_graph . as_ref ( ) , None , cfgs[ i] . logger ) ;
29362976 let wallet_source = Arc :: new ( test_utils:: TestWalletSource :: new ( SecretKey :: from_slice ( & [ i as u8 + 1 ; 32 ] ) . unwrap ( ) ) ) ;
29372977 nodes. push ( Node {
29382978 chain_source : cfgs[ i] . chain_source , tx_broadcaster : cfgs[ i] . tx_broadcaster ,
29392979 fee_estimator : cfgs[ i] . fee_estimator , router : & cfgs[ i] . router ,
29402980 chain_monitor : & cfgs[ i] . chain_monitor , keys_manager : & cfgs[ i] . keys_manager ,
29412981 node : & chan_mgrs[ i] , network_graph : cfgs[ i] . network_graph . as_ref ( ) , gossip_sync,
2942- node_seed : cfgs[ i] . node_seed , network_chan_count : chan_count. clone ( ) ,
2982+ node_seed : cfgs[ i] . node_seed , onion_messenger , network_chan_count : chan_count. clone ( ) ,
29432983 network_payment_count : payment_count. clone ( ) , logger : cfgs[ i] . logger ,
29442984 blocks : Arc :: clone ( & cfgs[ i] . tx_broadcaster . blocks ) ,
29452985 connect_style : Rc :: clone ( & connect_style) ,
@@ -2954,16 +2994,24 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
29542994
29552995 for i in 0 ..node_count {
29562996 for j in ( i+1 ) ..node_count {
2957- nodes[ i] . node . peer_connected ( & nodes[ j] . node . get_our_node_id ( ) , & msgs:: Init {
2958- features : nodes[ j] . override_init_features . borrow ( ) . clone ( ) . unwrap_or_else ( || nodes[ j] . node . init_features ( ) ) ,
2997+ let node_id_i = nodes[ i] . node . get_our_node_id ( ) ;
2998+ let node_id_j = nodes[ j] . node . get_our_node_id ( ) ;
2999+
3000+ let init_i = msgs:: Init {
3001+ features : nodes[ i] . init_features ( & node_id_j) ,
29593002 networks : None ,
29603003 remote_network_address : None ,
2961- } , true ) . unwrap ( ) ;
2962- nodes [ j ] . node . peer_connected ( & nodes [ i ] . node . get_our_node_id ( ) , & msgs:: Init {
2963- features : nodes[ i ] . override_init_features . borrow ( ) . clone ( ) . unwrap_or_else ( || nodes [ i ] . node . init_features ( ) ) ,
3004+ } ;
3005+ let init_j = msgs:: Init {
3006+ features : nodes[ j ] . init_features ( & node_id_i ) ,
29643007 networks : None ,
29653008 remote_network_address : None ,
2966- } , false ) . unwrap ( ) ;
3009+ } ;
3010+
3011+ nodes[ i] . node . peer_connected ( & node_id_j, & init_j, true ) . unwrap ( ) ;
3012+ nodes[ j] . node . peer_connected ( & node_id_i, & init_i, false ) . unwrap ( ) ;
3013+ nodes[ i] . onion_messenger . peer_connected ( & node_id_j, & init_j, true ) . unwrap ( ) ;
3014+ nodes[ j] . onion_messenger . peer_connected ( & node_id_i, & init_i, false ) . unwrap ( ) ;
29673015 }
29683016 }
29693017
0 commit comments