@@ -1085,13 +1085,25 @@ impl ChainListener for ChannelManager {
1085
1085
}
1086
1086
}
1087
1087
1088
+ /// We force-close the channel without letting our counterparty participate in the shutdown
1088
1089
fn block_disconnected ( & self , header : & BlockHeader ) {
1089
- let mut channel_state = self . channel_state . lock ( ) . unwrap ( ) ;
1090
+ let mut closed_channel = Vec :: new ( ) ;
1091
+ let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
1092
+ let channel_state = channel_state_lock. borrow_parts ( ) ;
1090
1093
for channel in channel_state. by_id . values_mut ( ) {
1091
1094
if channel. block_disconnected ( header) {
1092
- //TODO Close channel here
1095
+ channel. force_shutdown ( ) ;
1096
+ if let Some ( chan_id) = channel. get_short_channel_id ( ) {
1097
+ closed_channel. push ( chan_id. clone ( ) ) ;
1098
+ }
1093
1099
}
1094
1100
}
1101
+ for short_id in closed_channel {
1102
+ if let Some ( channel_id) = channel_state. short_to_id . get ( & short_id) {
1103
+ channel_state. by_id . remove ( channel_id) ;
1104
+ }
1105
+ channel_state. short_to_id . remove ( & short_id) ;
1106
+ }
1095
1107
}
1096
1108
}
1097
1109
@@ -1816,6 +1828,7 @@ impl ChannelMessageHandler for ChannelManager {
1816
1828
mod tests {
1817
1829
use chain:: chaininterface;
1818
1830
use chain:: transaction:: OutPoint ;
1831
+ use chain:: chaininterface:: ChainListener ;
1819
1832
use ln:: channelmanager:: { ChannelManager , OnionKeys } ;
1820
1833
use ln:: router:: { Route , RouteHop , Router } ;
1821
1834
use ln:: msgs;
@@ -2919,4 +2932,30 @@ mod tests {
2919
2932
assert_eq ! ( node. chan_monitor. added_monitors. lock( ) . unwrap( ) . len( ) , 0 ) ;
2920
2933
}
2921
2934
}
2935
+
2936
+ #[ test]
2937
+ fn test_unconf_chan ( ) {
2938
+ // After creating a chan between nodes, we disconnect all blocks previously seen to force a channel close on nodes[0] side
2939
+ let nodes = create_network ( 2 ) ;
2940
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
2941
+
2942
+ let channel_state = nodes[ 0 ] . node . channel_state . lock ( ) . unwrap ( ) ;
2943
+ assert_eq ! ( channel_state. by_id. len( ) , 1 ) ;
2944
+ assert_eq ! ( channel_state. short_to_id. len( ) , 1 ) ;
2945
+ mem:: drop ( channel_state) ;
2946
+
2947
+ let mut headers = Vec :: new ( ) ;
2948
+ let mut header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
2949
+ headers. push ( header. clone ( ) ) ;
2950
+ for _i in 2 ..100 {
2951
+ header = BlockHeader { version : 0x20000000 , prev_blockhash : header. bitcoin_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
2952
+ headers. push ( header. clone ( ) ) ;
2953
+ }
2954
+ while !headers. is_empty ( ) {
2955
+ nodes[ 0 ] . node . block_disconnected ( & headers. pop ( ) . unwrap ( ) ) ;
2956
+ }
2957
+ let channel_state = nodes[ 0 ] . node . channel_state . lock ( ) . unwrap ( ) ;
2958
+ assert_eq ! ( channel_state. by_id. len( ) , 0 ) ;
2959
+ assert_eq ! ( channel_state. short_to_id. len( ) , 0 ) ;
2960
+ }
2922
2961
}
0 commit comments