Skip to content

Commit e66a7fc

Browse files
author
Antoine Riard
committed
-f Matt's comments
1 parent 0b2d476 commit e66a7fc

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
@@ -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 });
807+
$self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id, err: ClosureDescriptor::ProcessingError { err: err.err.clone() } });
808808
}
809809
}
810810

@@ -1414,7 +1414,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14141414
}
14151415
}
14161416

1417-
fn force_close_channel_with_peer(&self, channel_id: &[u8; 32], peer_node_id: Option<&PublicKey>) -> Result<PublicKey, APIError> {
1417+
fn force_close_channel_with_peer(&self, channel_id: &[u8; 32], peer_node_id: Option<&PublicKey>, peer_msg: Option<&String>) -> Result<PublicKey, APIError> {
14181418
let mut chan = {
14191419
let mut channel_state_lock = self.channel_state.lock().unwrap();
14201420
let channel_state = &mut *channel_state_lock;
@@ -1440,7 +1440,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14401440
msg: update
14411441
});
14421442
}
1443-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: *channel_id, err: ClosureDescriptor::ForceClosed });
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 }}});
14441444

14451445
Ok(chan.get_counterparty_node_id())
14461446
}
@@ -1449,7 +1449,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14491449
/// the chain and rejecting new HTLCs on the given channel. Fails if channel_id is unknown to the manager.
14501450
pub fn force_close_channel(&self, channel_id: &[u8; 32]) -> Result<(), APIError> {
14511451
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
1452-
match self.force_close_channel_with_peer(channel_id, None) {
1452+
match self.force_close_channel_with_peer(channel_id, None, None) {
14531453
Ok(counterparty_node_id) => {
14541454
self.channel_state.lock().unwrap().pending_msg_events.push(
14551455
events::MessageSendEvent::HandleError {
@@ -3506,6 +3506,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
35063506
msg: update
35073507
});
35083508
}
3509+
//TODO: split between CounterpartyInitiated/LocallyInitiated
35093510
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: msg.channel_id, err: ClosureDescriptor::CooperativeClosure });
35103511
}
35113512
Ok(())
@@ -3917,7 +3918,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
39173918
msg: update
39183919
});
39193920
}
3920-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::UnknownOnchainCommitment });
3921+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
39213922
pending_msg_events.push(events::MessageSendEvent::HandleError {
39223923
node_id: chan.get_counterparty_node_id(),
39233924
action: msgs::ErrorAction::SendErrorMessage {
@@ -4453,7 +4454,7 @@ where
44534454
msg: update
44544455
});
44554456
}
4456-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureDescriptor::UnknownOnchainCommitment });
4457+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: channel.channel_id(), err: ClosureDescriptor::CommitmentTxBroadcasted });
44574458
pending_msg_events.push(events::MessageSendEvent::HandleError {
44584459
node_id: channel.get_counterparty_node_id(),
44594460
action: msgs::ErrorAction::SendErrorMessage { msg: e },
@@ -4659,7 +4660,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
46594660
if let Some(short_id) = chan.get_short_channel_id() {
46604661
short_to_id.remove(&short_id);
46614662
}
4662-
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::ProcessingError });
4663+
self.pending_events.lock().unwrap().push(events::Event::ChannelClosed { channel_id: chan.channel_id(), err: ClosureDescriptor::DisconnectedPeer });
46634664
return false;
46644665
} else {
46654666
no_channels_remain = false;
@@ -4751,12 +4752,12 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
47514752
for chan in self.list_channels() {
47524753
if chan.counterparty.node_id == *counterparty_node_id {
47534754
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
4754-
let _ = self.force_close_channel_with_peer(&chan.channel_id, Some(counterparty_node_id));
4755+
let _ = self.force_close_channel_with_peer(&chan.channel_id, Some(counterparty_node_id), Some(&msg.data));
47554756
}
47564757
}
47574758
} else {
47584759
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
4759-
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id));
4760+
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id), None);
47604761
}
47614762
}
47624763
}

lightning/src/util/events.rs

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

7171
#[derive(Clone, Debug)]
7272
pub enum ClosureDescriptor {
73-
ForceClosed,
74-
UserInitiated,
75-
CounterpartyInitiated,
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
77+
peer_msg: Option<String>,
78+
},
79+
/// Closure generated from receiving a peer's ClosingSigned message. Note the shutdown
80+
/// sequence might have been initially initiated by us.
7681
CooperativeClosure,
77-
UnknownOnchainCommitment,
78-
ProcessingError,
82+
/// Closure generated from receiving chain::Watch's CommitmentTxBroadcast event.
83+
CommitmentTxBroadcasted,
84+
/// Closure generated from processing an event, likely a HTLC forward/relay/reception.
85+
ProcessingError {
86+
err: String,
87+
},
88+
/// Closure generated from ChannelManager::peer_disconnected.
7989
DisconnectedPeer,
8090
}
8191

8292
impl Writeable for ClosureDescriptor {
8393
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
8494
match self {
85-
ClosureDescriptor::ForceClosed => 0u8.write(writer)?,
86-
ClosureDescriptor::UserInitiated => 1u8.write(writer)?,
87-
ClosureDescriptor::CounterpartyInitiated => 2u8.write(writer)?,
88-
ClosureDescriptor::CooperativeClosure => 3u8.write(writer)?,
89-
ClosureDescriptor::UnknownOnchainCommitment => 4u8.write(writer)?,
90-
ClosureDescriptor::ProcessingError => 5u8.write(writer)?,
91-
ClosureDescriptor::DisconnectedPeer => 6u8.write(writer)?,
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)?,
92119
}
93120
Ok(())
94121
}
@@ -97,13 +124,34 @@ impl Writeable for ClosureDescriptor {
97124
impl Readable for ClosureDescriptor {
98125
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
99126
Ok(match <u8 as Readable>::read(reader)? {
100-
0 => ClosureDescriptor::ForceClosed,
101-
1 => ClosureDescriptor::UserInitiated,
102-
2 => ClosureDescriptor::CounterpartyInitiated,
103-
3 => ClosureDescriptor::CooperativeClosure,
104-
4 => ClosureDescriptor::UnknownOnchainCommitment,
105-
5 => ClosureDescriptor::ProcessingError,
106-
6 => ClosureDescriptor::DisconnectedPeer,
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,
107155
_ => return Err(DecodeError::InvalidValue),
108156
})
109157
}
@@ -301,7 +349,7 @@ impl Writeable for Event {
301349
});
302350
},
303351
&Event::ChannelClosed { ref channel_id, ref err } => {
304-
6u8.write(writer)?;
352+
9u8.write(writer)?;
305353
channel_id.write(writer)?;
306354
err.write(writer)?;
307355
write_tlv_fields!(writer, {});
@@ -413,14 +461,14 @@ impl MaybeReadable for Event {
413461
};
414462
f()
415463
},
416-
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
417-
x if x % 2 == 1 => Ok(None),
418-
6u8 => {
464+
9u8 => {
419465
let channel_id = Readable::read(reader)?;
420466
let err = Readable::read(reader)?;
421467
read_tlv_fields!(reader, {});
422468
Ok(Some(Event::ChannelClosed { channel_id, err}))
423469
},
470+
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
471+
x if x % 2 == 1 => Ok(None),
424472
_ => Err(msgs::DecodeError::InvalidValue)
425473
}
426474
}

0 commit comments

Comments
 (0)