11
11
//! nodes for functional tests.
12
12
13
13
use crate :: chain:: { BestBlock , ChannelMonitorUpdateStatus , Confirm , Listen , Watch , chainmonitor:: Persist } ;
14
- use crate :: sign:: EntropySource ;
15
14
use crate :: chain:: channelmonitor:: ChannelMonitor ;
16
15
use crate :: chain:: transaction:: OutPoint ;
17
16
use crate :: events:: { ClaimedHTLC , ClosureReason , Event , HTLCDestination , MessageSendEvent , MessageSendEventsProvider , PathFailure , PaymentPurpose , PaymentFailureReason } ;
18
17
use crate :: events:: bump_transaction:: { BumpTransactionEvent , BumpTransactionEventHandler , Wallet , WalletSource } ;
19
18
use crate :: ln:: { ChannelId , PaymentPreimage , PaymentHash , PaymentSecret } ;
20
19
use crate :: ln:: channelmanager:: { AChannelManager , ChainParameters , ChannelManager , ChannelManagerReadArgs , RAACommitmentOrder , PaymentSendFailure , RecipientOnionFields , PaymentId , MIN_CLTV_EXPIRY_DELTA } ;
21
- use crate :: routing:: gossip:: { P2PGossipSync , NetworkGraph , NetworkUpdate } ;
22
- use crate :: routing:: router:: { self , PaymentParameters , Route , RouteParameters } ;
23
20
use crate :: ln:: features:: InitFeatures ;
24
21
use crate :: ln:: msgs;
25
- use crate :: ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
26
- use crate :: util:: test_channel_signer:: TestChannelSigner ;
22
+ use crate :: ln:: msgs:: { ChannelMessageHandler , OnionMessageHandler , RoutingMessageHandler } ;
23
+ use crate :: ln:: peer_handler:: IgnoringMessageHandler ;
24
+ use crate :: onion_message:: messenger:: OnionMessenger ;
25
+ use crate :: routing:: gossip:: { P2PGossipSync , NetworkGraph , NetworkUpdate } ;
26
+ use crate :: routing:: router:: { self , PaymentParameters , Route , RouteParameters } ;
27
+ use crate :: sign:: { EntropySource , RandomBytes } ;
28
+ use crate :: util:: config:: { UserConfig , MaxDustHTLCExposure } ;
29
+ use crate :: util:: errors:: APIError ;
30
+ #[ cfg( test) ]
31
+ use crate :: util:: logger:: Logger ;
27
32
use crate :: util:: scid_utils;
33
+ use crate :: util:: test_channel_signer:: TestChannelSigner ;
28
34
use crate :: util:: test_utils;
29
35
use crate :: util:: test_utils:: { panicking, TestChainMonitor , TestScorer , TestKeysInterface } ;
30
- use crate :: util:: errors:: APIError ;
31
- use crate :: util:: config:: { UserConfig , MaxDustHTLCExposure } ;
32
36
use crate :: util:: ser:: { ReadableArgs , Writeable } ;
33
- #[ cfg( test) ]
34
- use crate :: util:: logger:: Logger ;
35
37
36
38
use bitcoin:: blockdata:: block:: { Block , Header , Version } ;
37
39
use bitcoin:: blockdata:: locktime:: absolute:: LockTime ;
@@ -43,13 +45,14 @@ use bitcoin::network::constants::Network;
43
45
use bitcoin:: pow:: CompactTarget ;
44
46
use bitcoin:: secp256k1:: { PublicKey , SecretKey } ;
45
47
48
+ use alloc:: rc:: Rc ;
49
+ use core:: cell:: RefCell ;
50
+ use core:: iter:: repeat;
51
+ use core:: mem;
52
+ use core:: ops:: Deref ;
46
53
use crate :: io;
47
54
use crate :: prelude:: * ;
48
- use core:: cell:: RefCell ;
49
- use alloc:: rc:: Rc ;
50
55
use crate :: sync:: { Arc , Mutex , LockTestExt , RwLock } ;
51
- use core:: mem;
52
- use core:: iter:: repeat;
53
56
54
57
pub const CHAN_CONFIRM_DEPTH : u32 = 10 ;
55
58
@@ -388,6 +391,7 @@ pub struct NodeCfg<'a> {
388
391
pub tx_broadcaster : & ' a test_utils:: TestBroadcaster ,
389
392
pub fee_estimator : & ' a test_utils:: TestFeeEstimator ,
390
393
pub router : test_utils:: TestRouter < ' a > ,
394
+ pub message_router : test_utils:: TestMessageRouter < ' a > ,
391
395
pub chain_monitor : test_utils:: TestChainMonitor < ' a > ,
392
396
pub keys_manager : & ' a test_utils:: TestKeysInterface ,
393
397
pub logger : & ' a test_utils:: TestLogger ,
@@ -407,6 +411,26 @@ type TestChannelManager<'node_cfg, 'chan_mon_cfg> = ChannelManager<
407
411
& ' chan_mon_cfg test_utils:: TestLogger ,
408
412
> ;
409
413
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
+
410
434
pub struct Node < ' chan_man , ' node_cfg : ' chan_man , ' chan_mon_cfg : ' node_cfg > {
411
435
pub chain_source : & ' chan_mon_cfg test_utils:: TestChainSource ,
412
436
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> {
415
439
pub chain_monitor : & ' node_cfg test_utils:: TestChainMonitor < ' chan_mon_cfg > ,
416
440
pub keys_manager : & ' chan_mon_cfg test_utils:: TestKeysInterface ,
417
441
pub node : & ' chan_man TestChannelManager < ' node_cfg , ' chan_mon_cfg > ,
442
+ pub onion_messenger : TestOnionMessenger < ' chan_man , ' node_cfg , ' chan_mon_cfg > ,
418
443
pub network_graph : & ' node_cfg NetworkGraph < & ' chan_mon_cfg test_utils:: TestLogger > ,
419
444
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 > ,
420
445
pub node_seed : [ u8 ; 32 ] ,
@@ -432,6 +457,14 @@ pub struct Node<'chan_man, 'node_cfg: 'chan_man, 'chan_mon_cfg: 'node_cfg> {
432
457
& ' chan_mon_cfg test_utils:: TestLogger ,
433
458
> ,
434
459
}
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
+
435
468
#[ cfg( feature = "std" ) ]
436
469
impl < ' a , ' b , ' c > std:: panic:: UnwindSafe for Node < ' a , ' b , ' c > { }
437
470
#[ cfg( feature = "std" ) ]
@@ -599,7 +632,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
599
632
node_signer : self . keys_manager ,
600
633
signer_provider : self . keys_manager ,
601
634
fee_estimator : & test_utils:: TestFeeEstimator { sat_per_kw : Mutex :: new ( 253 ) } ,
602
- router : & test_utils:: TestRouter :: new ( Arc :: new ( network_graph) , & scorer) ,
635
+ router : & test_utils:: TestRouter :: new ( Arc :: new ( network_graph) , & self . logger , & scorer) ,
603
636
chain_monitor : self . chain_monitor ,
604
637
tx_broadcaster : & broadcaster,
605
638
logger : & self . logger ,
@@ -1054,6 +1087,7 @@ macro_rules! reload_node {
1054
1087
1055
1088
$new_channelmanager = _reload_node( & $node, $new_config, & chanman_encoded, $monitors_encoded) ;
1056
1089
$node. node = & $new_channelmanager;
1090
+ $node. onion_messenger. set_offers_handler( & $new_channelmanager) ;
1057
1091
} ;
1058
1092
( $node: expr, $chanman_encoded: expr, $monitors_encoded: expr, $persister: ident, $new_chain_monitor: ident, $new_channelmanager: ident) => {
1059
1093
reload_node!( $node, $crate:: util:: config:: UserConfig :: default ( ) , $chanman_encoded, $monitors_encoded, $persister, $new_chain_monitor, $new_channelmanager) ;
@@ -2897,7 +2931,8 @@ pub fn create_node_cfgs_with_persisters<'a>(node_count: usize, chanmon_cfgs: &'a
2897
2931
logger : & chanmon_cfgs[ i] . logger ,
2898
2932
tx_broadcaster : & chanmon_cfgs[ i] . tx_broadcaster ,
2899
2933
fee_estimator : & chanmon_cfgs[ i] . fee_estimator ,
2900
- router : test_utils:: TestRouter :: new ( network_graph. clone ( ) , & chanmon_cfgs[ i] . scorer ) ,
2934
+ router : test_utils:: TestRouter :: new ( network_graph. clone ( ) , & chanmon_cfgs[ i] . logger , & chanmon_cfgs[ i] . scorer ) ,
2935
+ message_router : test_utils:: TestMessageRouter :: new ( network_graph. clone ( ) ) ,
2901
2936
chain_monitor,
2902
2937
keys_manager : & chanmon_cfgs[ i] . keys_manager ,
2903
2938
node_seed : seed,
@@ -2951,14 +2986,19 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
2951
2986
let connect_style = Rc :: new ( RefCell :: new ( ConnectStyle :: random_style ( ) ) ) ;
2952
2987
2953
2988
for i in 0 ..node_count {
2989
+ let dedicated_entropy = DedicatedEntropy ( RandomBytes :: new ( [ i as u8 ; 32 ] ) ) ;
2990
+ let onion_messenger = OnionMessenger :: new (
2991
+ dedicated_entropy, cfgs[ i] . keys_manager , cfgs[ i] . logger , & cfgs[ i] . message_router ,
2992
+ & chan_mgrs[ i] , IgnoringMessageHandler { } ,
2993
+ ) ;
2954
2994
let gossip_sync = P2PGossipSync :: new ( cfgs[ i] . network_graph . as_ref ( ) , None , cfgs[ i] . logger ) ;
2955
2995
let wallet_source = Arc :: new ( test_utils:: TestWalletSource :: new ( SecretKey :: from_slice ( & [ i as u8 + 1 ; 32 ] ) . unwrap ( ) ) ) ;
2956
2996
nodes. push ( Node {
2957
2997
chain_source : cfgs[ i] . chain_source , tx_broadcaster : cfgs[ i] . tx_broadcaster ,
2958
2998
fee_estimator : cfgs[ i] . fee_estimator , router : & cfgs[ i] . router ,
2959
2999
chain_monitor : & cfgs[ i] . chain_monitor , keys_manager : & cfgs[ i] . keys_manager ,
2960
3000
node : & chan_mgrs[ i] , network_graph : cfgs[ i] . network_graph . as_ref ( ) , gossip_sync,
2961
- node_seed : cfgs[ i] . node_seed , network_chan_count : chan_count. clone ( ) ,
3001
+ node_seed : cfgs[ i] . node_seed , onion_messenger , network_chan_count : chan_count. clone ( ) ,
2962
3002
network_payment_count : payment_count. clone ( ) , logger : cfgs[ i] . logger ,
2963
3003
blocks : Arc :: clone ( & cfgs[ i] . tx_broadcaster . blocks ) ,
2964
3004
connect_style : Rc :: clone ( & connect_style) ,
@@ -2973,16 +3013,24 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
2973
3013
2974
3014
for i in 0 ..node_count {
2975
3015
for j in ( i+1 ) ..node_count {
2976
- nodes[ i] . node . peer_connected ( & nodes[ j] . node . get_our_node_id ( ) , & msgs:: Init {
2977
- features : nodes[ j] . override_init_features . borrow ( ) . clone ( ) . unwrap_or_else ( || nodes[ j] . node . init_features ( ) ) ,
3016
+ let node_id_i = nodes[ i] . node . get_our_node_id ( ) ;
3017
+ let node_id_j = nodes[ j] . node . get_our_node_id ( ) ;
3018
+
3019
+ let init_i = msgs:: Init {
3020
+ features : nodes[ i] . init_features ( & node_id_j) ,
2978
3021
networks : None ,
2979
3022
remote_network_address : None ,
2980
- } , true ) . unwrap ( ) ;
2981
- nodes [ j ] . node . peer_connected ( & nodes [ i ] . node . get_our_node_id ( ) , & msgs:: Init {
2982
- features : nodes[ i ] . override_init_features . borrow ( ) . clone ( ) . unwrap_or_else ( || nodes [ i ] . node . init_features ( ) ) ,
3023
+ } ;
3024
+ let init_j = msgs:: Init {
3025
+ features : nodes[ j ] . init_features ( & node_id_i ) ,
2983
3026
networks : None ,
2984
3027
remote_network_address : None ,
2985
- } , false ) . unwrap ( ) ;
3028
+ } ;
3029
+
3030
+ nodes[ i] . node . peer_connected ( & node_id_j, & init_j, true ) . unwrap ( ) ;
3031
+ nodes[ j] . node . peer_connected ( & node_id_i, & init_i, false ) . unwrap ( ) ;
3032
+ nodes[ i] . onion_messenger . peer_connected ( & node_id_j, & init_j, true ) . unwrap ( ) ;
3033
+ nodes[ j] . onion_messenger . peer_connected ( & node_id_i, & init_i, false ) . unwrap ( ) ;
2986
3034
}
2987
3035
}
2988
3036
0 commit comments