Skip to content

Commit 1ad3eae

Browse files
author
Antoine Riard
committed
-f Matt's comments
1 parent e3fedfd commit 1ad3eae

File tree

2 files changed

+81
-32
lines changed

2 files changed

+81
-32
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ macro_rules! handle_error {
837837
});
838838
}
839839
if let Some(channel_id) = chan_id {
840-
$self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id, err: ClosureDescriptor::ProcessingError });
840+
$self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id, err: ClosureDescriptor::ProcessingError { err: err.err.clone() } });
841841
}
842842
}
843843

@@ -1447,7 +1447,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14471447
}
14481448
}
14491449

1450-
fn force_close_channel_with_peer(&self, channel_id: &[u8; 32], peer_node_id: Option<&PublicKey>) -> Result<PublicKey, APIError> {
1450+
fn force_close_channel_with_peer(&self, channel_id: &[u8; 32], peer_node_id: Option<&PublicKey>, peer_msg: Option<&String>) -> Result<PublicKey, APIError> {
14511451
let mut chan = {
14521452
let mut channel_state_lock = self.channel_state.lock().unwrap();
14531453
let channel_state = &mut *channel_state_lock;
@@ -1473,7 +1473,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14731473
msg: update
14741474
});
14751475
}
1476-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureDescriptor::ForceClosed });
1476+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureDescriptor::ForceClosed { peer_msg: if peer_msg.is_some() { Some(peer_msg.unwrap().clone()) } else { None }}});
14771477

14781478
Ok(chan.get_counterparty_node_id())
14791479
}
@@ -1482,7 +1482,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14821482
/// the chain and rejecting new HTLCs on the given channel. Fails if channel_id is unknown to the manager.
14831483
pub fn force_close_channel(&self, channel_id: &[u8; 32]) -> Result<(), APIError> {
14841484
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
1485-
match self.force_close_channel_with_peer(channel_id, None) {
1485+
match self.force_close_channel_with_peer(channel_id, None, None) {
14861486
Ok(counterparty_node_id) => {
14871487
self.channel_state.lock().unwrap().pending_msg_events.push(
14881488
events::MessageSendEvent::HandleError {
@@ -3556,6 +3556,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
35563556
msg: update
35573557
});
35583558
}
3559+
//TODO: split between CounterpartyInitiated/LocallyInitiated
35593560
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureDescriptor::CooperativeClosure });
35603561
}
35613562
Ok(())
@@ -3968,7 +3969,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
39683969
msg: update
39693970
});
39703971
}
3971-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::UnknownOnchainCommitment });
3972+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
39723973
pending_msg_events.push(events::MessageSendEvent::HandleError {
39733974
node_id: chan.get_counterparty_node_id(),
39743975
action: msgs::ErrorAction::SendErrorMessage {
@@ -4504,7 +4505,7 @@ where
45044505
msg: update
45054506
});
45064507
}
4507-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureDescriptor::UnknownOnchainCommitment });
4508+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
45084509
pending_msg_events.push(events::MessageSendEvent::HandleError {
45094510
node_id: channel.get_counterparty_node_id(),
45104511
action: msgs::ErrorAction::SendErrorMessage { msg: e },
@@ -4710,7 +4711,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
47104711
if let Some(short_id) = chan.get_short_channel_id() {
47114712
short_to_id.remove(&short_id);
47124713
}
4713-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::ProcessingError });
4714+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::DisconnectedPeer });
47144715
return false;
47154716
} else {
47164717
no_channels_remain = false;
@@ -4801,12 +4802,12 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
48014802
for chan in self.list_channels() {
48024803
if chan.counterparty.node_id == *counterparty_node_id {
48034804
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
4804-
let _ = self.force_close_channel_with_peer(&chan.channel_id, Some(counterparty_node_id));
4805+
let _ = self.force_close_channel_with_peer(&chan.channel_id, Some(counterparty_node_id), Some(&msg.data));
48054806
}
48064807
}
48074808
} else {
48084809
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
4809-
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id));
4810+
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id), None);
48104811
}
48114812
}
48124813
}

lightning/src/util/events.rs

Lines changed: 71 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -71,25 +71,52 @@ pub enum PaymentPurpose {
7171

7272
#[derive(Clone, Debug)]
7373
pub enum ClosureDescriptor {
74-
ForceClosed,
75-
UserInitiated,
76-
CounterpartyInitiated,
74+
/// Closure generated from ChannelManager::force_close_channel or receiving a peer error
75+
/// message by ChannelManager::handle_error
76+
ForceClosed {
77+
/// If the error is coming from the peer, there should be a human-readable msg
78+
peer_msg: Option<String>,
79+
},
80+
/// Closure generated from receiving a peer's ClosingSigned message. Note the shutdown
81+
/// sequence might have been initially initiated by us.
7782
CooperativeClosure,
78-
UnknownOnchainCommitment,
79-
ProcessingError,
83+
/// Closure generated from receiving chain::Watch's CommitmentTxBroadcast event.
84+
CommitmentTxBroadcasted,
85+
/// Closure generated from processing an event, likely a HTLC forward/relay/reception.
86+
ProcessingError {
87+
err: String,
88+
},
89+
/// Closure generated from ChannelManager::peer_disconnected.
8090
DisconnectedPeer,
8191
}
8292

8393
impl Writeable for ClosureDescriptor {
8494
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
8595
match self {
86-
ClosureDescriptor::ForceClosed => 0u8.write(writer)?,
87-
ClosureDescriptor::UserInitiated => 1u8.write(writer)?,
88-
ClosureDescriptor::CounterpartyInitiated => 2u8.write(writer)?,
89-
ClosureDescriptor::CooperativeClosure => 3u8.write(writer)?,
90-
ClosureDescriptor::UnknownOnchainCommitment => 4u8.write(writer)?,
91-
ClosureDescriptor::ProcessingError => 5u8.write(writer)?,
92-
ClosureDescriptor::DisconnectedPeer => 6u8.write(writer)?,
96+
ClosureDescriptor::ForceClosed { peer_msg } => {
97+
0u8.write(writer)?;
98+
if let Some(peer_msg) = peer_msg {
99+
0u8.write(writer)?;
100+
let bytes = peer_msg.clone().into_bytes();
101+
(bytes.len() as u64).write(writer)?;
102+
for b in bytes.iter() {
103+
b.write(writer)?;
104+
}
105+
} else {
106+
1u8.write(writer)?;
107+
}
108+
}
109+
ClosureDescriptor::CooperativeClosure => 1u8.write(writer)?,
110+
ClosureDescriptor::CommitmentTxBroadcasted => 2u8.write(writer)?,
111+
ClosureDescriptor::ProcessingError { err } => {
112+
3u8.write(writer)?;
113+
let bytes = err.clone().into_bytes();
114+
(bytes.len() as u64).write(writer)?;
115+
for b in bytes.iter() {
116+
b.write(writer)?;
117+
}
118+
},
119+
ClosureDescriptor::DisconnectedPeer => 4u8.write(writer)?,
93120
}
94121
Ok(())
95122
}
@@ -98,13 +125,34 @@ impl Writeable for ClosureDescriptor {
98125
impl Readable for ClosureDescriptor {
99126
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
100127
Ok(match <u8 as Readable>::read(reader)? {
101-
0 => ClosureDescriptor::ForceClosed,
102-
1 => ClosureDescriptor::UserInitiated,
103-
2 => ClosureDescriptor::CounterpartyInitiated,
104-
3 => ClosureDescriptor::CooperativeClosure,
105-
4 => ClosureDescriptor::UnknownOnchainCommitment,
106-
5 => ClosureDescriptor::ProcessingError,
107-
6 => ClosureDescriptor::DisconnectedPeer,
128+
0 => {
129+
let peer_msg = match <u8 as Readable>::read(reader)? {
130+
0 => {
131+
let bytes_len: u64 = Readable::read(reader)?;
132+
let mut bytes: Vec<u8> = Vec::with_capacity(bytes_len as usize);
133+
for _ in 0..bytes_len {
134+
bytes.push(Readable::read(reader)?);
135+
}
136+
let err = String::from_utf8(bytes).unwrap();
137+
Some(err)
138+
},
139+
1 => None,
140+
_ => return Err(DecodeError::InvalidValue),
141+
};
142+
ClosureDescriptor::ForceClosed { peer_msg }
143+
},
144+
1 => ClosureDescriptor::CooperativeClosure,
145+
2 => ClosureDescriptor::CommitmentTxBroadcasted,
146+
3 => {
147+
let bytes_len: u64 = Readable::read(reader)?;
148+
let mut bytes: Vec<u8> = Vec::with_capacity(bytes_len as usize);
149+
for _ in 0..bytes_len {
150+
bytes.push(Readable::read(reader)?);
151+
}
152+
let err = String::from_utf8(bytes).unwrap();
153+
ClosureDescriptor::ProcessingError { err }
154+
},
155+
4 => ClosureDescriptor::DisconnectedPeer,
108156
_ => return Err(DecodeError::InvalidValue),
109157
})
110158
}
@@ -320,7 +368,7 @@ impl Writeable for Event {
320368
});
321369
},
322370
&Event::ChannelClosed { ref channel_id, ref err } => {
323-
6u8.write(writer)?;
371+
9u8.write(writer)?;
324372
channel_id.write(writer)?;
325373
err.write(writer)?;
326374
write_tlv_fields!(writer, {});
@@ -438,14 +486,14 @@ impl MaybeReadable for Event {
438486
};
439487
f()
440488
},
441-
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
442-
x if x % 2 == 1 => Ok(None),
443-
6u8 => {
489+
9u8 => {
444490
let channel_id = Readable::read(reader)?;
445491
let err = Readable::read(reader)?;
446492
read_tlv_fields!(reader, {});
447493
Ok(Some(Event::ChannelClosed { channel_id, err}))
448494
},
495+
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
496+
x if x % 2 == 1 => Ok(None),
449497
_ => Err(msgs::DecodeError::InvalidValue)
450498
}
451499
}

0 commit comments

Comments
 (0)