Skip to content

Commit eab9b34

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

File tree

3 files changed

+56
-90
lines changed

3 files changed

+56
-90
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ use ln::onion_utils;
5252
use ln::msgs::{ChannelMessageHandler, DecodeError, LightningError, OptionalField};
5353
use chain::keysinterface::{Sign, KeysInterface, KeysManager, InMemorySigner};
5454
use util::config::UserConfig;
55-
use util::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider, ClosureDescriptor};
55+
use util::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
5656
use util::{byte_utils, events};
5757
use util::ser::{Readable, ReadableArgs, MaybeReadable, Writeable, Writer};
5858
use util::chacha20::{ChaCha20, ChaChaReader};
@@ -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 { err: err.err.clone() } });
840+
$self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id, err: ClosureReason::ProcessingError { err: err.err.clone() } });
841841
}
842842
}
843843

@@ -1460,6 +1460,16 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14601460
if let Some(short_id) = chan.get().get_short_channel_id() {
14611461
channel_state.short_to_id.remove(&short_id);
14621462
}
1463+
let mut pending_events_lock = self.pending_events.lock().unwrap();
1464+
if peer_node_id.is_some() {
1465+
if let Some(peer_msg) = peer_msg {
1466+
pending_events_lock.push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureReason::CounterpartyForceClosed { peer_msg: Some(peer_msg.to_string()) } });
1467+
} else {
1468+
pending_events_lock.push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureReason::CounterpartyForceClosed { peer_msg: None } });
1469+
}
1470+
} else {
1471+
pending_events_lock.push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureReason::HolderForceClosed });
1472+
}
14631473
chan.remove_entry().1
14641474
} else {
14651475
return Err(APIError::ChannelUnavailable{err: "No such channel".to_owned()});
@@ -1473,7 +1483,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14731483
msg: update
14741484
});
14751485
}
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 }}});
14771486

14781487
Ok(chan.get_counterparty_node_id())
14791488
}
@@ -3557,7 +3566,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
35573566
});
35583567
}
35593568
//TODO: split between CounterpartyInitiated/LocallyInitiated
3560-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureDescriptor::CooperativeClosure });
3569+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureReason::CooperativeClosure });
35613570
}
35623571
Ok(())
35633572
}
@@ -3969,7 +3978,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
39693978
msg: update
39703979
});
39713980
}
3972-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
3981+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureReason::CommitmentTxBroadcasted });
39733982
pending_msg_events.push(events::MessageSendEvent::HandleError {
39743983
node_id: chan.get_counterparty_node_id(),
39753984
action: msgs::ErrorAction::SendErrorMessage {
@@ -4505,7 +4514,7 @@ where
45054514
msg: update
45064515
});
45074516
}
4508-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
4517+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureReason::CommitmentTxBroadcasted });
45094518
pending_msg_events.push(events::MessageSendEvent::HandleError {
45104519
node_id: channel.get_counterparty_node_id(),
45114520
action: msgs::ErrorAction::SendErrorMessage { msg: e },
@@ -4696,7 +4705,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
46964705
msg: update
46974706
});
46984707
}
4699-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::DisconnectedPeer });
4708+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureReason::DisconnectedPeer });
47004709
false
47014710
} else {
47024711
true
@@ -4711,7 +4720,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
47114720
if let Some(short_id) = chan.get_short_channel_id() {
47124721
short_to_id.remove(&short_id);
47134722
}
4714-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::DisconnectedPeer });
4723+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureReason::DisconnectedPeer });
47154724
return false;
47164725
} else {
47174726
no_channels_remain = false;
@@ -4807,7 +4816,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
48074816
}
48084817
} else {
48094818
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
4810-
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id), None);
4819+
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id), Some(&msg.data));
48114820
}
48124821
}
48134822
}

lightning/src/util/events.rs

Lines changed: 21 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,15 @@ pub enum PaymentPurpose {
7070
}
7171

7272
#[derive(Clone, Debug)]
73-
pub enum ClosureDescriptor {
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
73+
/// Some information provided on the closure source of the channel halting.
74+
pub enum ClosureReason {
75+
/// Closure generated from receiving a peer error message by ChannelManager::handle_error
76+
CounterpartyForceClosed {
77+
/// The error is coming from the peer, there *might* be a human-readable msg
7878
peer_msg: Option<String>,
7979
},
80+
/// Closure generated from ChannelManager::force_close_channel
81+
HolderForceClosed,
8082
/// Closure generated from receiving a peer's ClosingSigned message. Note the shutdown
8183
/// sequence might have been initially initiated by us.
8284
CooperativeClosure,
@@ -90,73 +92,14 @@ pub enum ClosureDescriptor {
9092
DisconnectedPeer,
9193
}
9294

93-
impl Writeable for ClosureDescriptor {
94-
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
95-
match self {
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)?,
120-
}
121-
Ok(())
122-
}
123-
}
124-
125-
impl Readable for ClosureDescriptor {
126-
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
127-
Ok(match <u8 as Readable>::read(reader)? {
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,
156-
_ => return Err(DecodeError::InvalidValue),
157-
})
158-
}
159-
}
95+
impl_writeable_tlv_based_enum_upgradable!(ClosureReason,
96+
(0, CounterpartyForceClosed) => { (1, peer_msg, option) },
97+
(2, HolderForceClosed) => {},
98+
(6, CommitmentTxBroadcasted) => {},
99+
(4, CooperativeClosure) => {},
100+
(8, ProcessingError) => { (1, err, required) },
101+
(10, DisconnectedPeer) => {},
102+
);
160103

161104
/// An Event which you should probably take some action in response to.
162105
///
@@ -280,16 +223,12 @@ pub enum Event {
280223
claim_from_onchain_tx: bool,
281224
},
282225
/// Used to indicate that a channel with the given `channel_id` is in the process of closure.
283-
/// Note that if you try to force-close multiple times a channel through
284-
/// [`ChannelManager::force_close_channel`] before receiving the corresponding monitor
285-
/// event for the broadcast of the commitment transaction, multiple `ChannelClosed` events
286-
/// can be generated.
287226
ChannelClosed {
288227
/// The channel_id which has been barren from further off-chain updates but
289228
/// funding output might still be not resolved yet.
290229
channel_id: [u8; 32],
291230
/// A machine-readable error message
292-
err: ClosureDescriptor
231+
err: ClosureReason
293232
}
294233
}
295234

@@ -368,7 +307,7 @@ impl Writeable for Event {
368307
});
369308
},
370309
&Event::ChannelClosed { ref channel_id, ref err } => {
371-
9u8.write(writer)?;
310+
8u8.write(writer)?;
372311
channel_id.write(writer)?;
373312
err.write(writer)?;
374313
write_tlv_fields!(writer, {});
@@ -486,11 +425,12 @@ impl MaybeReadable for Event {
486425
};
487426
f()
488427
},
489-
9u8 => {
428+
8u8 => {
490429
let channel_id = Readable::read(reader)?;
491-
let err = Readable::read(reader)?;
430+
let err = MaybeReadable::read(reader)?;
492431
read_tlv_fields!(reader, {});
493-
Ok(Some(Event::ChannelClosed { channel_id, err}))
432+
if err.is_none() { return Ok(None); }
433+
Ok(Some(Event::ChannelClosed { channel_id, err: err.unwrap() }))
494434
},
495435
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
496436
x if x % 2 == 1 => Ok(None),

lightning/src/util/ser.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,3 +897,20 @@ impl Readable for () {
897897
Ok(())
898898
}
899899
}
900+
901+
impl Writeable for String {
902+
#[inline]
903+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
904+
(self.len() as u16).write(w)?;
905+
w.write_all(self.as_bytes())
906+
}
907+
}
908+
909+
impl Readable for String {
910+
#[inline]
911+
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
912+
let v: Vec<u8> = Readable::read(r)?;
913+
let ret = String::from_utf8(v).map_err(|_| DecodeError::InvalidValue)?;
914+
Ok(ret)
915+
}
916+
}

0 commit comments

Comments
 (0)