Skip to content

Commit 9c39df9

Browse files
author
Antoine Riard
committed
-f fix new Matt's comments
1 parent e66a7fc commit 9c39df9

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
@@ -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, ClosureDescriptor};
56+
use util::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
5757
use util::{byte_utils, events};
5858
use util::ser::{Readable, ReadableArgs, MaybeReadable, Writeable, Writer};
5959
use util::chacha20::{ChaCha20, ChaChaReader};
@@ -804,7 +804,7 @@ macro_rules! handle_error {
804804
});
805805
}
806806
if let Some(channel_id) = chan_id {
807-
$self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id, err: ClosureDescriptor::ProcessingError { err: err.err.clone() } });
807+
$self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id, err: ClosureReason::ProcessingError { err: err.err.clone() } });
808808
}
809809
}
810810

@@ -1427,6 +1427,16 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14271427
if let Some(short_id) = chan.get().get_short_channel_id() {
14281428
channel_state.short_to_id.remove(&short_id);
14291429
}
1430+
let mut pending_events_lock = self.pending_events.lock().unwrap();
1431+
if peer_node_id.is_some() {
1432+
if let Some(peer_msg) = peer_msg {
1433+
pending_events_lock.push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureReason::CounterpartyForceClosed { peer_msg: Some(peer_msg.to_string()) } });
1434+
} else {
1435+
pending_events_lock.push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureReason::CounterpartyForceClosed { peer_msg: None } });
1436+
}
1437+
} else {
1438+
pending_events_lock.push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureReason::HolderForceClosed });
1439+
}
14301440
chan.remove_entry().1
14311441
} else {
14321442
return Err(APIError::ChannelUnavailable{err: "No such channel".to_owned()});
@@ -1440,7 +1450,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14401450
msg: update
14411451
});
14421452
}
1443-
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 }}});
14441453

14451454
Ok(chan.get_counterparty_node_id())
14461455
}
@@ -3507,7 +3516,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
35073516
});
35083517
}
35093518
//TODO: split between CounterpartyInitiated/LocallyInitiated
3510-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureDescriptor::CooperativeClosure });
3519+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureReason::CooperativeClosure });
35113520
}
35123521
Ok(())
35133522
}
@@ -3918,7 +3927,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
39183927
msg: update
39193928
});
39203929
}
3921-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
3930+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureReason::CommitmentTxBroadcasted });
39223931
pending_msg_events.push(events::MessageSendEvent::HandleError {
39233932
node_id: chan.get_counterparty_node_id(),
39243933
action: msgs::ErrorAction::SendErrorMessage {
@@ -4454,7 +4463,7 @@ where
44544463
msg: update
44554464
});
44564465
}
4457-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
4466+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureReason::CommitmentTxBroadcasted });
44584467
pending_msg_events.push(events::MessageSendEvent::HandleError {
44594468
node_id: channel.get_counterparty_node_id(),
44604469
action: msgs::ErrorAction::SendErrorMessage { msg: e },
@@ -4645,7 +4654,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
46454654
msg: update
46464655
});
46474656
}
4648-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::DisconnectedPeer });
4657+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureReason::DisconnectedPeer });
46494658
false
46504659
} else {
46514660
true
@@ -4660,7 +4669,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
46604669
if let Some(short_id) = chan.get_short_channel_id() {
46614670
short_to_id.remove(&short_id);
46624671
}
4663-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::DisconnectedPeer });
4672+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureReason::DisconnectedPeer });
46644673
return false;
46654674
} else {
46664675
no_channels_remain = false;
@@ -4757,7 +4766,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
47574766
}
47584767
} else {
47594768
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
4760-
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id), None);
4769+
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id), Some(&msg.data));
47614770
}
47624771
}
47634772
}

lightning/src/util/events.rs

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

7171
#[derive(Clone, Debug)]
72-
pub enum ClosureDescriptor {
73-
/// Closure generated from ChannelManager::force_close_channel or receiving a peer error
74-
/// message by ChannelManager::handle_error
75-
ForceClosed {
76-
/// If the error is coming from the peer, there should be a human-readable msg
72+
/// Some information provided on the closure source of the channel halting.
73+
pub enum ClosureReason {
74+
/// Closure generated from receiving a peer error message by ChannelManager::handle_error
75+
CounterpartyForceClosed {
76+
/// The error is coming from the peer, there *might* be a human-readable msg
7777
peer_msg: Option<String>,
7878
},
79+
/// Closure generated from ChannelManager::force_close_channel
80+
HolderForceClosed,
7981
/// Closure generated from receiving a peer's ClosingSigned message. Note the shutdown
8082
/// sequence might have been initially initiated by us.
8183
CooperativeClosure,
@@ -89,73 +91,14 @@ pub enum ClosureDescriptor {
8991
DisconnectedPeer,
9092
}
9193

92-
impl Writeable for ClosureDescriptor {
93-
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
94-
match self {
95-
ClosureDescriptor::ForceClosed { peer_msg } => {
96-
0u8.write(writer)?;
97-
if let Some(peer_msg) = peer_msg {
98-
0u8.write(writer)?;
99-
let bytes = peer_msg.clone().into_bytes();
100-
(bytes.len() as u64).write(writer)?;
101-
for b in bytes.iter() {
102-
b.write(writer)?;
103-
}
104-
} else {
105-
1u8.write(writer)?;
106-
}
107-
}
108-
ClosureDescriptor::CooperativeClosure => 1u8.write(writer)?,
109-
ClosureDescriptor::CommitmentTxBroadcasted => 2u8.write(writer)?,
110-
ClosureDescriptor::ProcessingError { err } => {
111-
3u8.write(writer)?;
112-
let bytes = err.clone().into_bytes();
113-
(bytes.len() as u64).write(writer)?;
114-
for b in bytes.iter() {
115-
b.write(writer)?;
116-
}
117-
},
118-
ClosureDescriptor::DisconnectedPeer => 4u8.write(writer)?,
119-
}
120-
Ok(())
121-
}
122-
}
123-
124-
impl Readable for ClosureDescriptor {
125-
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
126-
Ok(match <u8 as Readable>::read(reader)? {
127-
0 => {
128-
let peer_msg = match <u8 as Readable>::read(reader)? {
129-
0 => {
130-
let bytes_len: u64 = Readable::read(reader)?;
131-
let mut bytes: Vec<u8> = Vec::with_capacity(bytes_len as usize);
132-
for _ in 0..bytes_len {
133-
bytes.push(Readable::read(reader)?);
134-
}
135-
let err = String::from_utf8(bytes).unwrap();
136-
Some(err)
137-
},
138-
1 => None,
139-
_ => return Err(DecodeError::InvalidValue),
140-
};
141-
ClosureDescriptor::ForceClosed { peer_msg }
142-
},
143-
1 => ClosureDescriptor::CooperativeClosure,
144-
2 => ClosureDescriptor::CommitmentTxBroadcasted,
145-
3 => {
146-
let bytes_len: u64 = Readable::read(reader)?;
147-
let mut bytes: Vec<u8> = Vec::with_capacity(bytes_len as usize);
148-
for _ in 0..bytes_len {
149-
bytes.push(Readable::read(reader)?);
150-
}
151-
let err = String::from_utf8(bytes).unwrap();
152-
ClosureDescriptor::ProcessingError { err }
153-
},
154-
4 => ClosureDescriptor::DisconnectedPeer,
155-
_ => return Err(DecodeError::InvalidValue),
156-
})
157-
}
158-
}
94+
impl_writeable_tlv_based_enum_upgradable!(ClosureReason,
95+
(0, CounterpartyForceClosed) => { (1, peer_msg, option) },
96+
(2, HolderForceClosed) => {},
97+
(6, CommitmentTxBroadcasted) => {},
98+
(4, CooperativeClosure) => {},
99+
(8, ProcessingError) => { (1, err, required) },
100+
(10, DisconnectedPeer) => {},
101+
);
159102

160103
/// An Event which you should probably take some action in response to.
161104
///
@@ -263,16 +206,12 @@ pub enum Event {
263206
claim_from_onchain_tx: bool,
264207
},
265208
/// Used to indicate that a channel with the given `channel_id` is in the process of closure.
266-
/// Note that if you try to force-close multiple times a channel through
267-
/// [`ChannelManager::force_close_channel`] before receiving the corresponding monitor
268-
/// event for the broadcast of the commitment transaction, multiple `ChannelClosed` events
269-
/// can be generated.
270209
ChannelClosed {
271210
/// The channel_id which has been barren from further off-chain updates but
272211
/// funding output might still be not resolved yet.
273212
channel_id: [u8; 32],
274213
/// A machine-readable error message
275-
err: ClosureDescriptor
214+
err: ClosureReason
276215
}
277216
}
278217

@@ -349,7 +288,7 @@ impl Writeable for Event {
349288
});
350289
},
351290
&Event::ChannelClosed { ref channel_id, ref err } => {
352-
9u8.write(writer)?;
291+
8u8.write(writer)?;
353292
channel_id.write(writer)?;
354293
err.write(writer)?;
355294
write_tlv_fields!(writer, {});
@@ -461,11 +400,12 @@ impl MaybeReadable for Event {
461400
};
462401
f()
463402
},
464-
9u8 => {
403+
8u8 => {
465404
let channel_id = Readable::read(reader)?;
466-
let err = Readable::read(reader)?;
405+
let err = MaybeReadable::read(reader)?;
467406
read_tlv_fields!(reader, {});
468-
Ok(Some(Event::ChannelClosed { channel_id, err}))
407+
if err.is_none() { return Ok(None); }
408+
Ok(Some(Event::ChannelClosed { channel_id, err: err.unwrap() }))
469409
},
470410
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
471411
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
@@ -867,3 +867,20 @@ impl Readable for () {
867867
Ok(())
868868
}
869869
}
870+
871+
impl Writeable for String {
872+
#[inline]
873+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
874+
(self.len() as u16).write(w)?;
875+
w.write_all(self.as_bytes())
876+
}
877+
}
878+
879+
impl Readable for String {
880+
#[inline]
881+
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
882+
let v: Vec<u8> = Readable::read(r)?;
883+
let ret = String::from_utf8(v).map_err(|_| DecodeError::InvalidValue)?;
884+
Ok(ret)
885+
}
886+
}

0 commit comments

Comments
 (0)