@@ -3806,7 +3806,10 @@ fn test_funding_peer_disconnect() {
38063806 let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
38073807 let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
38083808 let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
3809- let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
3809+ let persister: test_utils:: TestPersister ;
3810+ let new_chain_monitor: test_utils:: TestChainMonitor ;
3811+ let nodes_0_deserialized: ChannelManager < EnforcingSigner , & test_utils:: TestChainMonitor , & test_utils:: TestBroadcaster , & test_utils:: TestKeysInterface , & test_utils:: TestFeeEstimator , & test_utils:: TestLogger > ;
3812+ let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
38103813 let tx = create_chan_between_nodes_with_value_init ( & nodes[ 0 ] , & nodes[ 1 ] , 100000 , 10001 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
38113814
38123815 nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
@@ -3884,6 +3887,61 @@ fn test_funding_peer_disconnect() {
38843887 let route = get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , & net_graph_msg_handler. network_graph . read ( ) . unwrap ( ) , & nodes[ 1 ] . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV , & logger) . unwrap ( ) ;
38853888 let ( payment_preimage, _, _) = send_along_route ( & nodes[ 0 ] , route, & [ & nodes[ 1 ] ] , 1000000 ) ;
38863889 claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage) ;
3890+
3891+ // Check that after deserialization and reconnection we can still generate an identical
3892+ // channel_announcement from the cached signatures.
3893+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
3894+
3895+ let nodes_0_serialized = nodes[ 0 ] . node . encode ( ) ;
3896+ let mut chan_0_monitor_serialized = test_utils:: TestVecWriter ( Vec :: new ( ) ) ;
3897+ nodes[ 0 ] . chain_monitor . chain_monitor . monitors . read ( ) . unwrap ( ) . iter ( ) . next ( ) . unwrap ( ) . 1 . write ( & mut chan_0_monitor_serialized) . unwrap ( ) ;
3898+
3899+ persister = test_utils:: TestPersister :: new ( ) ;
3900+ let keys_manager = & chanmon_cfgs[ 0 ] . keys_manager ;
3901+ new_chain_monitor = test_utils:: TestChainMonitor :: new ( Some ( nodes[ 0 ] . chain_source ) , nodes[ 0 ] . tx_broadcaster . clone ( ) , nodes[ 0 ] . logger , node_cfgs[ 0 ] . fee_estimator , & persister, keys_manager) ;
3902+ nodes[ 0 ] . chain_monitor = & new_chain_monitor;
3903+ let mut chan_0_monitor_read = & chan_0_monitor_serialized. 0 [ ..] ;
3904+ let ( _, mut chan_0_monitor) = <( BlockHash , ChannelMonitor < EnforcingSigner > ) >:: read (
3905+ & mut chan_0_monitor_read, keys_manager) . unwrap ( ) ;
3906+ assert ! ( chan_0_monitor_read. is_empty( ) ) ;
3907+
3908+ let mut nodes_0_read = & nodes_0_serialized[ ..] ;
3909+ let ( _, nodes_0_deserialized_tmp) = {
3910+ let mut channel_monitors = HashMap :: new ( ) ;
3911+ channel_monitors. insert ( chan_0_monitor. get_funding_txo ( ) . 0 , & mut chan_0_monitor) ;
3912+ <( BlockHash , ChannelManager < EnforcingSigner , & test_utils:: TestChainMonitor , & test_utils:: TestBroadcaster , & test_utils:: TestKeysInterface , & test_utils:: TestFeeEstimator , & test_utils:: TestLogger > ) >:: read ( & mut nodes_0_read, ChannelManagerReadArgs {
3913+ default_config : UserConfig :: default ( ) ,
3914+ keys_manager,
3915+ fee_estimator : node_cfgs[ 0 ] . fee_estimator ,
3916+ chain_monitor : nodes[ 0 ] . chain_monitor ,
3917+ tx_broadcaster : nodes[ 0 ] . tx_broadcaster . clone ( ) ,
3918+ logger : nodes[ 0 ] . logger ,
3919+ channel_monitors,
3920+ } ) . unwrap ( )
3921+ } ;
3922+ nodes_0_deserialized = nodes_0_deserialized_tmp;
3923+ assert ! ( nodes_0_read. is_empty( ) ) ;
3924+
3925+ assert ! ( nodes[ 0 ] . chain_monitor. watch_channel( chan_0_monitor. get_funding_txo( ) . 0 , chan_0_monitor) . is_ok( ) ) ;
3926+ nodes[ 0 ] . node = & nodes_0_deserialized;
3927+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
3928+
3929+ reconnect_nodes ( & nodes[ 0 ] , & nodes[ 1 ] , ( false , false ) , ( 0 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( false , false ) ) ;
3930+
3931+ // as_announcement should be re-generated exactly by broadcast_node_announcement.
3932+ nodes[ 0 ] . node . broadcast_node_announcement ( [ 0 , 0 , 0 ] , [ 0 ; 32 ] , Vec :: new ( ) ) ;
3933+ let msgs = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
3934+ let mut found_announcement = false ;
3935+ for event in msgs. iter ( ) {
3936+ match event {
3937+ MessageSendEvent :: BroadcastChannelAnnouncement { ref msg, .. } => {
3938+ if * msg == as_announcement { found_announcement = true ; }
3939+ } ,
3940+ MessageSendEvent :: BroadcastNodeAnnouncement { .. } => { } ,
3941+ _ => panic ! ( "Unexpected event" ) ,
3942+ }
3943+ }
3944+ assert ! ( found_announcement) ;
38873945}
38883946
38893947#[ test]
0 commit comments