Skip to content

Commit 2e86db5

Browse files
author
Antoine Riard
committed
Add ChannelClosed generation at cooperative/force-close/error processing
When we detect a channel `is_shutdown()` or call on it `force_shutdown()`, we notify the user with a Event::ChannelClosed informing about the id and closure reason in a best effort.
1 parent 4cbfa72 commit 2e86db5

File tree

7 files changed

+509
-155
lines changed

7 files changed

+509
-155
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 64 additions & 33 deletions
Large diffs are not rendered by default.

lightning/src/ln/channelmanager.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ use ln::onion_utils;
5353
use ln::msgs::{ChannelMessageHandler, DecodeError, LightningError, OptionalField};
5454
use chain::keysinterface::{Sign, KeysInterface, KeysManager, InMemorySigner};
5555
use util::config::UserConfig;
56-
use util::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
56+
use util::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider, ClosureDescriptor};
5757
use util::{byte_utils, events};
5858
use util::ser::{Readable, ReadableArgs, MaybeReadable, Writeable, Writer};
5959
use util::chacha20::{ChaCha20, ChaChaReader};
@@ -778,6 +778,9 @@ macro_rules! handle_error {
778778
msg: update
779779
});
780780
}
781+
if let Some(channel_id) = chan_id {
782+
$self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id, err: ClosureDescriptor::ProcessingError });
783+
}
781784
}
782785

783786
log_error!($self.logger, "{}", err.err);
@@ -1279,6 +1282,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
12791282
msg: update
12801283
});
12811284
}
1285+
// We don't generate a ChannelClosed here as we'll generate oen at `ClosingSigned` handling.
12821286

12831287
Ok(())
12841288
}
@@ -1325,6 +1329,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
13251329
msg: update
13261330
});
13271331
}
1332+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureDescriptor::ForceClosed });
13281333

13291334
Ok(chan.get_counterparty_node_id())
13301335
}
@@ -2220,6 +2225,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
22202225
if let Some(short_id) = channel.get_short_channel_id() {
22212226
channel_state.short_to_id.remove(&short_id);
22222227
}
2228+
// ChannelClosed event is generated by handle_errors for us.
22232229
Err(MsgHandleErrInternal::from_finish_shutdown(msg, channel_id, channel.force_shutdown(true), self.get_channel_update_for_broadcast(&channel).ok()))
22242230
},
22252231
ChannelError::CloseDelayBroadcast(_) => { panic!("Wait is only generated on receipt of channel_reestablish, which is handled by try_chan_entry, we don't bother to support it here"); }
@@ -3091,6 +3097,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
30913097
msg: update
30923098
});
30933099
}
3100+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureDescriptor::CounterpartyInitiated });
30943101
}
30953102
Ok(())
30963103
}
@@ -3137,6 +3144,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
31373144
msg: update
31383145
});
31393146
}
3147+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureDescriptor::CooperativeClosure });
31403148
}
31413149
Ok(())
31423150
}
@@ -3615,6 +3623,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
36153623
msg: update
36163624
});
36173625
}
3626+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::UnknownOnchainCommitment });
36183627
pending_msg_events.push(events::MessageSendEvent::HandleError {
36193628
node_id: chan.get_counterparty_node_id(),
36203629
action: msgs::ErrorAction::SendErrorMessage {
@@ -3676,6 +3685,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
36763685
Err(e) => {
36773686
let (close_channel, res) = convert_chan_err!(self, e, short_to_id, chan, channel_id);
36783687
handle_errors.push((chan.get_counterparty_node_id(), Err(res)));
3688+
// ChannelClosed event is generated by handle_error for us
36793689
!close_channel
36803690
}
36813691
}
@@ -4089,6 +4099,7 @@ where
40894099
msg: update
40904100
});
40914101
}
4102+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureDescriptor::UnknownOnchainCommitment });
40924103
pending_msg_events.push(events::MessageSendEvent::HandleError {
40934104
node_id: channel.get_counterparty_node_id(),
40944105
action: msgs::ErrorAction::SendErrorMessage { msg: e },
@@ -4279,6 +4290,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
42794290
msg: update
42804291
});
42814292
}
4293+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::DisconnectedPeer });
42824294
false
42834295
} else {
42844296
true
@@ -4293,6 +4305,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
42934305
if let Some(short_id) = chan.get_short_channel_id() {
42944306
short_to_id.remove(&short_id);
42954307
}
4308+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::ProcessingError });
42964309
return false;
42974310
} else {
42984311
no_channels_remain = false;

lightning/src/ln/functional_test_utils.rs

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -731,16 +731,16 @@ macro_rules! get_closing_signed_broadcast {
731731
#[macro_export]
732732
macro_rules! check_closed_broadcast {
733733
($node: expr, $with_error_msg: expr) => {{
734-
let events = $node.node.get_and_clear_pending_msg_events();
735-
assert_eq!(events.len(), if $with_error_msg { 2 } else { 1 });
736-
match events[0] {
734+
let msg_events = $node.node.get_and_clear_pending_msg_events();
735+
assert_eq!(msg_events.len(), if $with_error_msg { 2 } else { 1 });
736+
match msg_events[0] {
737737
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
738738
assert_eq!(msg.contents.flags & 2, 2);
739739
},
740740
_ => panic!("Unexpected event"),
741741
}
742742
if $with_error_msg {
743-
match events[1] {
743+
match msg_events[1] {
744744
MessageSendEvent::HandleError { action: ErrorAction::SendErrorMessage { ref msg }, node_id: _ } => {
745745
// TODO: Check node_id
746746
Some(msg.clone())
@@ -751,6 +751,19 @@ macro_rules! check_closed_broadcast {
751751
}}
752752
}
753753

754+
/// Check that a channel's closing channel event has been issued
755+
#[macro_export]
756+
macro_rules! check_closed_event {
757+
($node: expr, $events: expr) => {{
758+
let events = $node.node.get_and_clear_pending_events();
759+
assert_eq!(events.len(), $events);
760+
match events[0] {
761+
Event::ChannelClosed { .. } => {}
762+
_ => panic!("Unexpected event"),
763+
}
764+
}}
765+
}
766+
754767
pub fn close_channel<'a, 'b, 'c>(outbound_node: &Node<'a, 'b, 'c>, inbound_node: &Node<'a, 'b, 'c>, channel_id: &[u8; 32], funding_tx: Transaction, close_inbound_first: bool) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, Transaction) {
755768
let (node_a, broadcaster_a, struct_a) = if close_inbound_first { (&inbound_node.node, &inbound_node.tx_broadcaster, inbound_node) } else { (&outbound_node.node, &outbound_node.tx_broadcaster, outbound_node) };
756769
let (node_b, broadcaster_b) = if close_inbound_first { (&outbound_node.node, &outbound_node.tx_broadcaster) } else { (&inbound_node.node, &inbound_node.tx_broadcaster) };
@@ -911,7 +924,8 @@ macro_rules! commitment_signed_dance {
911924
{
912925
commitment_signed_dance!($node_a, $node_b, $commitment_signed, $fail_backwards, true);
913926
if $fail_backwards {
914-
expect_pending_htlcs_forwardable!($node_a);
927+
let events = $node_a.node.get_and_clear_pending_events();
928+
expect_pending_htlcs_forwardable!($node_a, events);
915929
check_added_monitors!($node_a, 1);
916930

917931
let channel_state = $node_a.node.channel_state.lock().unwrap();
@@ -953,19 +967,18 @@ macro_rules! get_route_and_payment_hash {
953967
}
954968

955969
macro_rules! expect_pending_htlcs_forwardable_ignore {
956-
($node: expr) => {{
957-
let events = $node.node.get_and_clear_pending_events();
958-
assert_eq!(events.len(), 1);
959-
match events[0] {
970+
($node: expr, $events: expr) => {{
971+
assert_eq!($events.len(), 1);
972+
match $events[0] {
960973
Event::PendingHTLCsForwardable { .. } => { },
961974
_ => panic!("Unexpected event"),
962975
};
963976
}}
964977
}
965978

966979
macro_rules! expect_pending_htlcs_forwardable {
967-
($node: expr) => {{
968-
expect_pending_htlcs_forwardable_ignore!($node);
980+
($node: expr, $events: expr) => {{
981+
expect_pending_htlcs_forwardable_ignore!($node, $events);
969982
$node.node.process_pending_htlc_forwards();
970983
}}
971984
}
@@ -988,10 +1001,9 @@ macro_rules! expect_payment_received {
9881001
}
9891002

9901003
macro_rules! expect_payment_sent {
991-
($node: expr, $expected_payment_preimage: expr) => {
992-
let events = $node.node.get_and_clear_pending_events();
993-
assert_eq!(events.len(), 1);
994-
match events[0] {
1004+
($node: expr, $expected_payment_preimage: expr, $events: expr) => {
1005+
assert_eq!($events.len(), 1);
1006+
match $events[0] {
9951007
Event::PaymentSent { ref payment_preimage } => {
9961008
assert_eq!($expected_payment_preimage, *payment_preimage);
9971009
},
@@ -1026,8 +1038,8 @@ macro_rules! expect_payment_failure_chan_update {
10261038

10271039
#[cfg(test)]
10281040
macro_rules! expect_payment_failed {
1029-
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr $(, $expected_error_code: expr, $expected_error_data: expr)*) => {
1030-
let events = $node.node.get_and_clear_pending_events();
1041+
($node: expr, $events: expr, $expected_payment_hash: expr, $rejected_by_dest: expr $(, $expected_error_code: expr, $expected_error_data: expr)*) => {
1042+
let events: Vec<Event> = $events;
10311043
assert_eq!(events.len(), 1);
10321044
match events[0] {
10331045
Event::PaymentFailed { ref payment_hash, rejected_by_dest, ref error_code, ref error_data } => {
@@ -1062,7 +1074,8 @@ pub fn pass_along_path<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_path
10621074
check_added_monitors!(node, 0);
10631075
commitment_signed_dance!(node, prev_node, payment_event.commitment_msg, false);
10641076

1065-
expect_pending_htlcs_forwardable!(node);
1077+
let events = node.node.get_and_clear_pending_events();
1078+
expect_pending_htlcs_forwardable!(node, events);
10661079

10671080
if idx == expected_path.len() - 1 {
10681081
let events_2 = node.node.get_and_clear_pending_events();
@@ -1192,7 +1205,14 @@ pub fn claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, exp
11921205

11931206
if !skip_last {
11941207
last_update_fulfill_dance!(origin_node, expected_route.first().unwrap());
1195-
expect_payment_sent!(origin_node, our_payment_preimage);
1208+
let mut events = origin_node.node.get_and_clear_pending_events();
1209+
let payment_sent: Vec<Event>;
1210+
if events.len() == 2 {
1211+
payment_sent = events.drain(1..2).collect();
1212+
} else {
1213+
payment_sent = events;
1214+
}
1215+
expect_payment_sent!(origin_node, our_payment_preimage, payment_sent);
11961216
}
11971217
}
11981218
}
@@ -1241,7 +1261,8 @@ pub fn send_payment<'a, 'b, 'c>(origin: &Node<'a, 'b, 'c>, expected_route: &[&No
12411261

12421262
pub fn fail_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], skip_last: bool, our_payment_hash: PaymentHash) {
12431263
assert!(expected_route.last().unwrap().node.fail_htlc_backwards(&our_payment_hash));
1244-
expect_pending_htlcs_forwardable!(expected_route.last().unwrap());
1264+
let events = expected_route.last().unwrap().node.get_and_clear_pending_events();
1265+
expect_pending_htlcs_forwardable!(expected_route.last().unwrap(), events);
12451266
check_added_monitors!(expected_route.last().unwrap(), 1);
12461267

12471268
let mut next_msgs: Option<(msgs::UpdateFailHTLC, msgs::CommitmentSigned)> = None;
@@ -1251,7 +1272,8 @@ pub fn fail_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expe
12511272
$node.node.handle_update_fail_htlc(&$prev_node.node.get_our_node_id(), &next_msgs.as_ref().unwrap().0);
12521273
commitment_signed_dance!($node, $prev_node, next_msgs.as_ref().unwrap().1, !$last_node);
12531274
if skip_last && $last_node {
1254-
expect_pending_htlcs_forwardable!($node);
1275+
let events = $node.node.get_and_clear_pending_events();
1276+
expect_pending_htlcs_forwardable!($node, events);
12551277
}
12561278
}
12571279
}

0 commit comments

Comments
 (0)