@@ -27,21 +27,22 @@ use bitcoin::network::constants::Network;
27
27
use bitcoin_hashes:: Hash as TraitImport ;
28
28
use bitcoin_hashes:: hash160:: Hash as Hash160 ;
29
29
use bitcoin_hashes:: sha256:: Hash as Sha256 ;
30
+ use bitcoin_hashes:: sha256d:: Hash as Sha256d ;
30
31
31
32
use lightning:: chain:: chaininterface;
32
33
use lightning:: chain:: transaction:: OutPoint ;
33
34
use lightning:: chain:: chaininterface:: { BroadcasterInterface , ConfirmationTarget , ChainListener , FeeEstimator , ChainWatchInterfaceUtil } ;
34
35
use lightning:: chain:: keysinterface:: { ChannelKeys , KeysInterface } ;
35
36
use lightning:: ln:: channelmonitor;
36
- use lightning:: ln:: channelmonitor:: { ChannelMonitorUpdateErr , HTLCUpdate } ;
37
- use lightning:: ln:: channelmanager:: { ChannelManager , PaymentHash , PaymentPreimage } ;
37
+ use lightning:: ln:: channelmonitor:: { ChannelMonitor , ChannelMonitorUpdateErr , HTLCUpdate } ;
38
+ use lightning:: ln:: channelmanager:: { ChannelManager , PaymentHash , PaymentPreimage , ChannelManagerReadArgs } ;
38
39
use lightning:: ln:: router:: { Route , RouteHop } ;
39
40
use lightning:: ln:: msgs:: { CommitmentUpdate , ChannelMessageHandler , ErrorAction , HandleError , UpdateAddHTLC , LocalFeatures } ;
40
41
use lightning:: util:: events;
41
42
use lightning:: util:: logger:: Logger ;
42
43
use lightning:: util:: config:: UserConfig ;
43
44
use lightning:: util:: events:: { EventsProvider , MessageSendEventsProvider } ;
44
- use lightning:: util:: ser:: { Readable , Writeable } ;
45
+ use lightning:: util:: ser:: { Readable , ReadableArgs , Writeable , Writer } ;
45
46
46
47
mod utils;
47
48
use utils:: test_logger;
@@ -51,7 +52,7 @@ use secp256k1::Secp256k1;
51
52
52
53
use std:: mem;
53
54
use std:: cmp:: Ordering ;
54
- use std:: collections:: HashSet ;
55
+ use std:: collections:: { HashSet , HashMap } ;
55
56
use std:: sync:: { Arc , Mutex } ;
56
57
use std:: sync:: atomic;
57
58
use std:: io:: Cursor ;
@@ -68,22 +69,44 @@ impl BroadcasterInterface for TestBroadcaster {
68
69
fn broadcast_transaction ( & self , _tx : & Transaction ) { }
69
70
}
70
71
72
+ pub struct VecWriter ( pub Vec < u8 > ) ;
73
+ impl Writer for VecWriter {
74
+ fn write_all ( & mut self , buf : & [ u8 ] ) -> Result < ( ) , :: std:: io:: Error > {
75
+ self . 0 . extend_from_slice ( buf) ;
76
+ Ok ( ( ) )
77
+ }
78
+ fn size_hint ( & mut self , size : usize ) {
79
+ self . 0 . reserve_exact ( size) ;
80
+ }
81
+ }
82
+
71
83
pub struct TestChannelMonitor {
72
84
pub simple_monitor : Arc < channelmonitor:: SimpleManyChannelMonitor < OutPoint > > ,
73
85
pub update_ret : Mutex < Result < ( ) , channelmonitor:: ChannelMonitorUpdateErr > > ,
86
+ pub latest_good_update : Mutex < HashMap < OutPoint , Vec < u8 > > > ,
87
+ pub should_update_manager : atomic:: AtomicBool ,
74
88
}
75
89
impl TestChannelMonitor {
76
90
pub fn new ( chain_monitor : Arc < chaininterface:: ChainWatchInterface > , broadcaster : Arc < chaininterface:: BroadcasterInterface > , logger : Arc < Logger > , feeest : Arc < chaininterface:: FeeEstimator > ) -> Self {
77
91
Self {
78
92
simple_monitor : channelmonitor:: SimpleManyChannelMonitor :: new ( chain_monitor, broadcaster, logger, feeest) ,
79
93
update_ret : Mutex :: new ( Ok ( ( ) ) ) ,
94
+ latest_good_update : Mutex :: new ( HashMap :: new ( ) ) ,
95
+ should_update_manager : atomic:: AtomicBool :: new ( false ) ,
80
96
}
81
97
}
82
98
}
83
99
impl channelmonitor:: ManyChannelMonitor for TestChannelMonitor {
84
100
fn add_update_monitor ( & self , funding_txo : OutPoint , monitor : channelmonitor:: ChannelMonitor ) -> Result < ( ) , channelmonitor:: ChannelMonitorUpdateErr > {
101
+ let ret = self . update_ret . lock ( ) . unwrap ( ) . clone ( ) ;
102
+ if let Ok ( ( ) ) = ret {
103
+ let mut ser = VecWriter ( Vec :: new ( ) ) ;
104
+ monitor. write_for_disk ( & mut ser) . unwrap ( ) ;
105
+ self . latest_good_update . lock ( ) . unwrap ( ) . insert ( funding_txo, ser. 0 ) ;
106
+ self . should_update_manager . store ( true , atomic:: Ordering :: Relaxed ) ;
107
+ }
85
108
assert ! ( self . simple_monitor. add_update_monitor( funding_txo, monitor) . is_ok( ) ) ;
86
- self . update_ret . lock ( ) . unwrap ( ) . clone ( )
109
+ ret
87
110
}
88
111
89
112
fn fetch_pending_htlc_updated ( & self ) -> Vec < HTLCUpdate > {
@@ -156,6 +179,45 @@ pub fn do_test(data: &[u8]) {
156
179
} }
157
180
}
158
181
182
+ macro_rules! reload_node {
183
+ ( $ser: expr, $node_id: expr, $old_monitors: expr) => { {
184
+ let logger: Arc <Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) ) ) ;
185
+ let watch = Arc :: new( ChainWatchInterfaceUtil :: new( Network :: Bitcoin , Arc :: clone( & logger) ) ) ;
186
+ let monitor = Arc :: new( TestChannelMonitor :: new( watch. clone( ) , broadcast. clone( ) , logger. clone( ) , fee_est. clone( ) ) ) ;
187
+
188
+ let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, session_id: atomic:: AtomicU8 :: new( 0 ) , channel_id: atomic:: AtomicU8 :: new( 0 ) } ) ;
189
+ let mut config = UserConfig :: new( ) ;
190
+ config. channel_options. fee_proportional_millionths = 0 ;
191
+ config. channel_options. announced_channel = true ;
192
+ config. peer_channel_config_limits. min_dust_limit_satoshis = 0 ;
193
+
194
+ let mut monitors = HashMap :: new( ) ;
195
+ let mut old_monitors = $old_monitors. lock( ) . unwrap( ) ;
196
+ for ( outpoint, monitor_ser) in old_monitors. drain( ) {
197
+ monitors. insert( outpoint, <( Sha256d , ChannelMonitor ) >:: read( & mut Cursor :: new( & monitor_ser) , Arc :: clone( & logger) ) . expect( "Failed to read monitor" ) . 1 ) ;
198
+ monitor. latest_good_update. lock( ) . unwrap( ) . insert( outpoint, monitor_ser) ;
199
+ }
200
+ let mut monitor_refs = HashMap :: new( ) ;
201
+ for ( outpoint, monitor) in monitors. iter( ) {
202
+ monitor_refs. insert( * outpoint, monitor) ;
203
+ }
204
+
205
+ let read_args = ChannelManagerReadArgs {
206
+ keys_manager,
207
+ fee_estimator: fee_est. clone( ) ,
208
+ monitor: monitor. clone( ) ,
209
+ chain_monitor: watch,
210
+ tx_broadcaster: broadcast. clone( ) ,
211
+ logger,
212
+ default_config: config,
213
+ channel_monitors: & monitor_refs,
214
+ } ;
215
+
216
+ ( <( Sha256d , ChannelManager ) >:: read( & mut Cursor :: new( & $ser. 0 ) , read_args) . expect( "Failed to read manager" ) . 1 , monitor)
217
+ } }
218
+ }
219
+
220
+
159
221
let mut channel_txn = Vec :: new ( ) ;
160
222
macro_rules! make_channel {
161
223
( $source: expr, $dest: expr, $chan_id: expr) => { {
@@ -265,11 +327,11 @@ pub fn do_test(data: &[u8]) {
265
327
266
328
// 3 nodes is enough to hit all the possible cases, notably unknown-source-unknown-dest
267
329
// forwarding.
268
- let ( node_a, monitor_a) = make_node ! ( 0 ) ;
269
- let ( node_b, monitor_b) = make_node ! ( 1 ) ;
270
- let ( node_c, monitor_c) = make_node ! ( 2 ) ;
330
+ let ( mut node_a, mut monitor_a) = make_node ! ( 0 ) ;
331
+ let ( mut node_b, mut monitor_b) = make_node ! ( 1 ) ;
332
+ let ( mut node_c, mut monitor_c) = make_node ! ( 2 ) ;
271
333
272
- let nodes = [ node_a, node_b, node_c] ;
334
+ let mut nodes = [ node_a, node_b, node_c] ;
273
335
274
336
make_channel ! ( nodes[ 0 ] , nodes[ 1 ] , 0 ) ;
275
337
make_channel ! ( nodes[ 1 ] , nodes[ 2 ] , 1 ) ;
@@ -290,6 +352,13 @@ pub fn do_test(data: &[u8]) {
290
352
let mut ba_events = Vec :: new ( ) ;
291
353
let mut bc_events = Vec :: new ( ) ;
292
354
355
+ let mut node_a_ser = VecWriter ( Vec :: new ( ) ) ;
356
+ nodes[ 0 ] . write ( & mut node_a_ser) . unwrap ( ) ;
357
+ let mut node_b_ser = VecWriter ( Vec :: new ( ) ) ;
358
+ nodes[ 1 ] . write ( & mut node_b_ser) . unwrap ( ) ;
359
+ let mut node_c_ser = VecWriter ( Vec :: new ( ) ) ;
360
+ nodes[ 2 ] . write ( & mut node_c_ser) . unwrap ( ) ;
361
+
293
362
macro_rules! test_err {
294
363
( $res: expr) => {
295
364
match $res {
@@ -584,8 +653,64 @@ pub fn do_test(data: &[u8]) {
584
653
0x1c => process_msg_events ! ( 2 , false ) ,
585
654
0x1d => process_events ! ( 2 , true ) ,
586
655
0x1e => process_events ! ( 2 , false ) ,
656
+ 0x1f => {
657
+ if !chan_a_disconnected {
658
+ nodes[ 1 ] . peer_disconnected ( & nodes[ 0 ] . get_our_node_id ( ) , false ) ;
659
+ chan_a_disconnected = true ;
660
+ drain_msg_events_on_disconnect ! ( 0 ) ;
661
+ }
662
+ let ( new_node_a, new_monitor_a) = reload_node ! ( node_a_ser, 0 , monitor_a. latest_good_update) ;
663
+ node_a = Arc :: new ( new_node_a) ;
664
+ nodes[ 0 ] = node_a. clone ( ) ;
665
+ monitor_a = new_monitor_a;
666
+ } ,
667
+ 0x20 => {
668
+ if !chan_a_disconnected {
669
+ nodes[ 0 ] . peer_disconnected ( & nodes[ 1 ] . get_our_node_id ( ) , false ) ;
670
+ chan_a_disconnected = true ;
671
+ nodes[ 0 ] . get_and_clear_pending_msg_events ( ) ;
672
+ ba_events. clear ( ) ;
673
+ }
674
+ if !chan_b_disconnected {
675
+ nodes[ 2 ] . peer_disconnected ( & nodes[ 1 ] . get_our_node_id ( ) , false ) ;
676
+ chan_b_disconnected = true ;
677
+ nodes[ 2 ] . get_and_clear_pending_msg_events ( ) ;
678
+ bc_events. clear ( ) ;
679
+ }
680
+ let ( new_node_b, new_monitor_b) = reload_node ! ( node_b_ser, 1 , monitor_b. latest_good_update) ;
681
+ node_b = Arc :: new ( new_node_b) ;
682
+ nodes[ 1 ] = node_b. clone ( ) ;
683
+ monitor_b = new_monitor_b;
684
+ } ,
685
+ 0x21 => {
686
+ if !chan_b_disconnected {
687
+ nodes[ 1 ] . peer_disconnected ( & nodes[ 2 ] . get_our_node_id ( ) , false ) ;
688
+ chan_b_disconnected = true ;
689
+ drain_msg_events_on_disconnect ! ( 2 ) ;
690
+ }
691
+ let ( new_node_c, new_monitor_c) = reload_node ! ( node_c_ser, 2 , monitor_c. latest_good_update) ;
692
+ node_c = Arc :: new ( new_node_c) ;
693
+ nodes[ 2 ] = node_c. clone ( ) ;
694
+ monitor_c = new_monitor_c;
695
+ } ,
587
696
_ => test_return ! ( ) ,
588
697
}
698
+
699
+ if monitor_a. should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
700
+ node_a_ser. 0 . clear ( ) ;
701
+ nodes[ 0 ] . write ( & mut node_a_ser) . unwrap ( ) ;
702
+ monitor_a. should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
703
+ }
704
+ if monitor_b. should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
705
+ node_b_ser. 0 . clear ( ) ;
706
+ nodes[ 1 ] . write ( & mut node_b_ser) . unwrap ( ) ;
707
+ monitor_b. should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
708
+ }
709
+ if monitor_c. should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
710
+ node_c_ser. 0 . clear ( ) ;
711
+ nodes[ 2 ] . write ( & mut node_c_ser) . unwrap ( ) ;
712
+ monitor_c. should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
713
+ }
589
714
}
590
715
}
591
716
0 commit comments