Skip to content

Commit d1feefd

Browse files
committed
Clarify the in-flight HTLC state-tracking structs a bit.
This also renames PendingForwardHTLCInfo to PendingHTLCInfo since it now also encompasses Pending *Received* HTLCs.
1 parent 2be0810 commit d1feefd

File tree

2 files changed

+39
-35
lines changed

2 files changed

+39
-35
lines changed

lightning/src/ln/channel.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use ln::features::{ChannelFeatures, InitFeatures};
1919
use ln::msgs;
2020
use ln::msgs::{DecodeError, OptionalField, DataLossProtect};
2121
use ln::channelmonitor::ChannelMonitor;
22-
use ln::channelmanager::{PendingHTLCStatus, HTLCSource, HTLCFailReason, HTLCFailureMsg, PendingForwardHTLCInfo, RAACommitmentOrder, PaymentPreimage, PaymentHash, BREAKDOWN_TIMEOUT, MAX_LOCAL_BREAKDOWN_TIMEOUT};
22+
use ln::channelmanager::{PendingHTLCStatus, HTLCSource, HTLCFailReason, HTLCFailureMsg, PendingHTLCInfo, RAACommitmentOrder, PaymentPreimage, PaymentHash, BREAKDOWN_TIMEOUT, MAX_LOCAL_BREAKDOWN_TIMEOUT};
2323
use ln::chan_utils::{LocalCommitmentTransaction, TxCreationKeys, HTLCOutputInCommitment, HTLC_SUCCESS_TX_WEIGHT, HTLC_TIMEOUT_TX_WEIGHT, make_funding_redeemscript, ChannelPublicKeys};
2424
use ln::chan_utils;
2525
use chain::chaininterface::{FeeEstimator,ConfirmationTarget};
@@ -269,7 +269,7 @@ pub(super) struct Channel<ChanSigner: ChannelKeys> {
269269
monitor_pending_funding_locked: bool,
270270
monitor_pending_revoke_and_ack: bool,
271271
monitor_pending_commitment_signed: bool,
272-
monitor_pending_forwards: Vec<(PendingForwardHTLCInfo, u64)>,
272+
monitor_pending_forwards: Vec<(PendingHTLCInfo, u64)>,
273273
monitor_pending_failures: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>,
274274

275275
// pending_update_fee is filled when sending and receiving update_fee
@@ -1986,7 +1986,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
19861986
/// waiting on this revoke_and_ack. The generation of this new commitment_signed may also fail,
19871987
/// generating an appropriate error *after* the channel state has been updated based on the
19881988
/// revoke_and_ack message.
1989-
pub fn revoke_and_ack(&mut self, msg: &msgs::RevokeAndACK, fee_estimator: &FeeEstimator) -> Result<(Option<msgs::CommitmentUpdate>, Vec<(PendingForwardHTLCInfo, u64)>, Vec<(HTLCSource, PaymentHash, HTLCFailReason)>, Option<msgs::ClosingSigned>, ChannelMonitor<ChanSigner>), ChannelError<ChanSigner>> {
1989+
pub fn revoke_and_ack(&mut self, msg: &msgs::RevokeAndACK, fee_estimator: &FeeEstimator) -> Result<(Option<msgs::CommitmentUpdate>, Vec<(PendingHTLCInfo, u64)>, Vec<(HTLCSource, PaymentHash, HTLCFailReason)>, Option<msgs::ClosingSigned>, ChannelMonitor<ChanSigner>), ChannelError<ChanSigner>> {
19901990
if (self.channel_state & (ChannelState::ChannelFunded as u32)) != (ChannelState::ChannelFunded as u32) {
19911991
return Err(ChannelError::Close("Got revoke/ACK message when channel was not in an operational state"));
19921992
}
@@ -2292,7 +2292,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
22922292
/// which failed. The messages which were generated from that call which generated the
22932293
/// monitor update failure must *not* have been sent to the remote end, and must instead
22942294
/// have been dropped. They will be regenerated when monitor_updating_restored is called.
2295-
pub fn monitor_update_failed(&mut self, resend_raa: bool, resend_commitment: bool, mut pending_forwards: Vec<(PendingForwardHTLCInfo, u64)>, mut pending_fails: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>) {
2295+
pub fn monitor_update_failed(&mut self, resend_raa: bool, resend_commitment: bool, mut pending_forwards: Vec<(PendingHTLCInfo, u64)>, mut pending_fails: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>) {
22962296
assert_eq!(self.channel_state & ChannelState::MonitorUpdateFailed as u32, 0);
22972297
self.monitor_pending_revoke_and_ack = resend_raa;
22982298
self.monitor_pending_commitment_signed = resend_commitment;
@@ -2306,7 +2306,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
23062306
/// Indicates that the latest ChannelMonitor update has been committed by the client
23072307
/// successfully and we should restore normal operation. Returns messages which should be sent
23082308
/// to the remote side.
2309-
pub fn monitor_updating_restored(&mut self) -> (Option<msgs::RevokeAndACK>, Option<msgs::CommitmentUpdate>, RAACommitmentOrder, Vec<(PendingForwardHTLCInfo, u64)>, Vec<(HTLCSource, PaymentHash, HTLCFailReason)>, bool, Option<msgs::FundingLocked>) {
2309+
pub fn monitor_updating_restored(&mut self) -> (Option<msgs::RevokeAndACK>, Option<msgs::CommitmentUpdate>, RAACommitmentOrder, Vec<(PendingHTLCInfo, u64)>, Vec<(HTLCSource, PaymentHash, HTLCFailReason)>, bool, Option<msgs::FundingLocked>) {
23102310
assert_eq!(self.channel_state & ChannelState::MonitorUpdateFailed as u32, ChannelState::MonitorUpdateFailed as u32);
23112311
self.channel_state &= !(ChannelState::MonitorUpdateFailed as u32);
23122312

lightning/src/ln/channelmanager.rs

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,19 @@ use std::ops::Deref;
5757
// forward the HTLC with information it will give back to us when it does so, or if it should Fail
5858
// the HTLC with the relevant message for the Channel to handle giving to the remote peer.
5959
//
60-
// When a Channel forwards an HTLC to its peer, it will give us back the PendingForwardHTLCInfo
61-
// which we will use to construct an outbound HTLC, with a relevant HTLCSource::PreviousHopData
62-
// filled in to indicate where it came from (which we can use to either fail-backwards or fulfill
63-
// the HTLC backwards along the relevant path).
60+
// Once said HTLC is committed in the Channel, if the PendingHTLCStatus indicated Forward, the
61+
// Channel will return the PendingHTLCInfo back to us, and we will create an HTLCForwardInfo
62+
// with it to track where it came from (in case of onwards-forward error), waiting a random delay
63+
// before we forward it.
64+
//
65+
// We will then use HTLCForwardInfo's PendingHTLCInfo to construct an outbound HTLC, with a
66+
// relevant HTLCSource::PreviousHopData filled in to indicate where it came from (which we can use
67+
// to either fail-backwards or fulfill the HTLC backwards along the relevant path).
6468
// Alternatively, we can fill an outbound HTLC with a HTLCSource::OutboundRoute indicating this is
6569
// our payment, which we can use to decode errors or inform the user that the payment was sent.
66-
/// Stores the info we will need to send when we want to forward an HTLC onwards
70+
6771
#[derive(Clone)] // See Channel::revoke_and_ack for why, tl;dr: Rust bug
68-
pub(super) struct PendingForwardHTLCInfo {
72+
pub(super) struct PendingHTLCInfo {
6973
onion_packet: Option<msgs::OnionPacket>,
7074
incoming_shared_secret: [u8; 32],
7175
payment_hash: PaymentHash,
@@ -83,10 +87,22 @@ pub(super) enum HTLCFailureMsg {
8387
/// Stores whether we can't forward an HTLC or relevant forwarding info
8488
#[derive(Clone)] // See Channel::revoke_and_ack for why, tl;dr: Rust bug
8589
pub(super) enum PendingHTLCStatus {
86-
Forward(PendingForwardHTLCInfo),
90+
Forward(PendingHTLCInfo),
8791
Fail(HTLCFailureMsg),
8892
}
8993

94+
pub(super) enum HTLCForwardInfo {
95+
AddHTLC {
96+
prev_short_channel_id: u64,
97+
prev_htlc_id: u64,
98+
forward_info: PendingHTLCInfo,
99+
},
100+
FailHTLC {
101+
htlc_id: u64,
102+
err_packet: msgs::OnionErrorPacket,
103+
},
104+
}
105+
90106
/// Tracks the inbound corresponding to an outbound HTLC
91107
#[derive(Clone, PartialEq)]
92108
pub(super) struct HTLCPreviousHopData {
@@ -231,18 +247,6 @@ impl MsgHandleErrInternal {
231247
/// second to 30 seconds, but people expect lightning to be, you know, kinda fast, sadly.
232248
const MIN_HTLC_RELAY_HOLDING_CELL_MILLIS: u64 = 100;
233249

234-
pub(super) enum HTLCForwardInfo {
235-
AddHTLC {
236-
prev_short_channel_id: u64,
237-
prev_htlc_id: u64,
238-
forward_info: PendingForwardHTLCInfo,
239-
},
240-
FailHTLC {
241-
htlc_id: u64,
242-
err_packet: msgs::OnionErrorPacket,
243-
},
244-
}
245-
246250
/// For events which result in both a RevokeAndACK and a CommitmentUpdate, by default they should
247251
/// be sent in the order they appear in the return value, however sometimes the order needs to be
248252
/// variable at runtime (eg Channel::channel_reestablish needs to re-send messages in the order
@@ -262,7 +266,7 @@ pub(super) struct ChannelHolder<ChanSigner: ChannelKeys> {
262266
/// short channel id -> forward infos. Key of 0 means payments received
263267
/// Note that while this is held in the same mutex as the channels themselves, no consistency
264268
/// guarantees are made about the existence of a channel with the short id here, nor the short
265-
/// ids in the PendingForwardHTLCInfo!
269+
/// ids in the PendingHTLCInfo!
266270
pub(super) forward_htlcs: HashMap<u64, Vec<HTLCForwardInfo>>,
267271
/// payment_hash -> Vec<(amount_received, htlc_source)> for tracking things that were to us and
268272
/// can be failed/claimed by the user
@@ -571,7 +575,7 @@ macro_rules! handle_monitor_err {
571575
} else if $resend_commitment { "commitment" }
572576
else if $resend_raa { "RAA" }
573577
else { "nothing" },
574-
(&$failed_forwards as &Vec<(PendingForwardHTLCInfo, u64)>).len(),
578+
(&$failed_forwards as &Vec<(PendingHTLCInfo, u64)>).len(),
575579
(&$failed_fails as &Vec<(HTLCSource, PaymentHash, HTLCFailReason)>).len());
576580
if !$resend_commitment {
577581
debug_assert!($action_type == RAACommitmentOrder::RevokeAndACKFirst || !$resend_raa);
@@ -963,7 +967,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
963967
// instead we stay symmetric with the forwarding case, only responding (after a
964968
// delay) once they've send us a commitment_signed!
965969

966-
PendingHTLCStatus::Forward(PendingForwardHTLCInfo {
970+
PendingHTLCStatus::Forward(PendingHTLCInfo {
967971
onion_packet: None,
968972
payment_hash: msg.payment_hash.clone(),
969973
short_channel_id: 0,
@@ -1015,7 +1019,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
10151019
},
10161020
};
10171021

1018-
PendingHTLCStatus::Forward(PendingForwardHTLCInfo {
1022+
PendingHTLCStatus::Forward(PendingHTLCInfo {
10191023
onion_packet: Some(outgoing_packet),
10201024
payment_hash: msg.payment_hash.clone(),
10211025
short_channel_id: short_channel_id,
@@ -1026,7 +1030,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
10261030
};
10271031

10281032
channel_state = Some(self.channel_state.lock().unwrap());
1029-
if let &PendingHTLCStatus::Forward(PendingForwardHTLCInfo { ref onion_packet, ref short_channel_id, ref amt_to_forward, ref outgoing_cltv_value, .. }) = &pending_forward_info {
1033+
if let &PendingHTLCStatus::Forward(PendingHTLCInfo { ref onion_packet, ref short_channel_id, ref amt_to_forward, ref outgoing_cltv_value, .. }) = &pending_forward_info {
10301034
if onion_packet.is_some() { // If short_channel_id is 0 here, we'll reject them in the body here
10311035
let id_option = channel_state.as_ref().unwrap().short_to_id.get(&short_channel_id).cloned();
10321036
let forwarding_id = match id_option {
@@ -2152,7 +2156,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
21522156
// If the update_add is completely bogus, the call will Err and we will close,
21532157
// but if we've sent a shutdown and they haven't acknowledged it yet, we just
21542158
// want to reject the new HTLC and fail it backwards instead of forwarding.
2155-
if let PendingHTLCStatus::Forward(PendingForwardHTLCInfo { incoming_shared_secret, .. }) = pending_forward_info {
2159+
if let PendingHTLCStatus::Forward(PendingHTLCInfo { incoming_shared_secret, .. }) = pending_forward_info {
21562160
let chan_update = self.get_channel_update(chan.get());
21572161
pending_forward_info = PendingHTLCStatus::Fail(HTLCFailureMsg::Relay(msgs::UpdateFailHTLC {
21582162
channel_id: msg.channel_id,
@@ -2283,7 +2287,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
22832287
}
22842288

22852289
#[inline]
2286-
fn forward_htlcs(&self, per_source_pending_forwards: &mut [(u64, Vec<(PendingForwardHTLCInfo, u64)>)]) {
2290+
fn forward_htlcs(&self, per_source_pending_forwards: &mut [(u64, Vec<(PendingHTLCInfo, u64)>)]) {
22872291
for &mut (prev_short_channel_id, ref mut pending_forwards) in per_source_pending_forwards {
22882292
let mut forward_event = None;
22892293
if !pending_forwards.is_empty() {
@@ -2998,7 +3002,7 @@ impl<ChanSigner: ChannelKeys, M: Deref + Sync + Send> ChannelMessageHandler for
29983002
const SERIALIZATION_VERSION: u8 = 1;
29993003
const MIN_SERIALIZATION_VERSION: u8 = 1;
30003004

3001-
impl Writeable for PendingForwardHTLCInfo {
3005+
impl Writeable for PendingHTLCInfo {
30023006
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
30033007
self.onion_packet.write(writer)?;
30043008
self.incoming_shared_secret.write(writer)?;
@@ -3010,9 +3014,9 @@ impl Writeable for PendingForwardHTLCInfo {
30103014
}
30113015
}
30123016

3013-
impl<R: ::std::io::Read> Readable<R> for PendingForwardHTLCInfo {
3014-
fn read(reader: &mut R) -> Result<PendingForwardHTLCInfo, DecodeError> {
3015-
Ok(PendingForwardHTLCInfo {
3017+
impl<R: ::std::io::Read> Readable<R> for PendingHTLCInfo {
3018+
fn read(reader: &mut R) -> Result<PendingHTLCInfo, DecodeError> {
3019+
Ok(PendingHTLCInfo {
30163020
onion_packet: Readable::read(reader)?,
30173021
incoming_shared_secret: Readable::read(reader)?,
30183022
payment_hash: Readable::read(reader)?,

0 commit comments

Comments
 (0)