Skip to content

Commit 6035829

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 449c8f0 commit 6035829

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};
2424
use ln::chan_utils;
2525
use chain::chaininterface::{FeeEstimator,ConfirmationTarget};
@@ -266,7 +266,7 @@ pub(super) struct Channel<ChanSigner: ChannelKeys> {
266266
monitor_pending_funding_locked: bool,
267267
monitor_pending_revoke_and_ack: bool,
268268
monitor_pending_commitment_signed: bool,
269-
monitor_pending_forwards: Vec<(PendingForwardHTLCInfo, u64)>,
269+
monitor_pending_forwards: Vec<(PendingHTLCInfo, u64)>,
270270
monitor_pending_failures: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>,
271271

272272
// pending_update_fee is filled when sending and receiving update_fee
@@ -1974,7 +1974,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
19741974
/// waiting on this revoke_and_ack. The generation of this new commitment_signed may also fail,
19751975
/// generating an appropriate error *after* the channel state has been updated based on the
19761976
/// revoke_and_ack message.
1977-
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), ChannelError> {
1977+
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), ChannelError> {
19781978
if (self.channel_state & (ChannelState::ChannelFunded as u32)) != (ChannelState::ChannelFunded as u32) {
19791979
return Err(ChannelError::Close("Got revoke/ACK message when channel was not in an operational state"));
19801980
}
@@ -2269,7 +2269,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
22692269
/// which failed. The messages which were generated from that call which generated the
22702270
/// monitor update failure must *not* have been sent to the remote end, and must instead
22712271
/// have been dropped. They will be regenerated when monitor_updating_restored is called.
2272-
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)>) {
2272+
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)>) {
22732273
assert_eq!(self.channel_state & ChannelState::MonitorUpdateFailed as u32, 0);
22742274
self.monitor_pending_revoke_and_ack = resend_raa;
22752275
self.monitor_pending_commitment_signed = resend_commitment;
@@ -2283,7 +2283,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
22832283
/// Indicates that the latest ChannelMonitor update has been committed by the client
22842284
/// successfully and we should restore normal operation. Returns messages which should be sent
22852285
/// to the remote side.
2286-
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>) {
2286+
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>) {
22872287
assert_eq!(self.channel_state & ChannelState::MonitorUpdateFailed as u32, ChannelState::MonitorUpdateFailed as u32);
22882288
self.channel_state &= !(ChannelState::MonitorUpdateFailed as u32);
22892289

lightning/src/ln/channelmanager.rs

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

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

232-
pub(super) enum HTLCForwardInfo {
233-
AddHTLC {
234-
prev_short_channel_id: u64,
235-
prev_htlc_id: u64,
236-
forward_info: PendingForwardHTLCInfo,
237-
},
238-
FailHTLC {
239-
htlc_id: u64,
240-
err_packet: msgs::OnionErrorPacket,
241-
},
242-
}
243-
244248
/// For events which result in both a RevokeAndACK and a CommitmentUpdate, by default they should
245249
/// be sent in the order they appear in the return value, however sometimes the order needs to be
246250
/// variable at runtime (eg Channel::channel_reestablish needs to re-send messages in the order
@@ -260,7 +264,7 @@ pub(super) struct ChannelHolder<ChanSigner: ChannelKeys> {
260264
/// short channel id -> forward infos. Key of 0 means payments received
261265
/// Note that while this is held in the same mutex as the channels themselves, no consistency
262266
/// guarantees are made about the existence of a channel with the short id here, nor the short
263-
/// ids in the PendingForwardHTLCInfo!
267+
/// ids in the PendingHTLCInfo!
264268
pub(super) forward_htlcs: HashMap<u64, Vec<HTLCForwardInfo>>,
265269
/// payment_hash -> Vec<(amount_received, htlc_source)> for tracking things that were to us and
266270
/// can be failed/claimed by the user
@@ -569,7 +573,7 @@ macro_rules! handle_monitor_err {
569573
} else if $resend_commitment { "commitment" }
570574
else if $resend_raa { "RAA" }
571575
else { "nothing" },
572-
(&$failed_forwards as &Vec<(PendingForwardHTLCInfo, u64)>).len(),
576+
(&$failed_forwards as &Vec<(PendingHTLCInfo, u64)>).len(),
573577
(&$failed_fails as &Vec<(HTLCSource, PaymentHash, HTLCFailReason)>).len());
574578
if !$resend_commitment {
575579
debug_assert!($action_type == RAACommitmentOrder::RevokeAndACKFirst || !$resend_raa);
@@ -986,7 +990,7 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
986990
// instead we stay symmetric with the forwarding case, only responding (after a
987991
// delay) once they've send us a commitment_signed!
988992

989-
PendingHTLCStatus::Forward(PendingForwardHTLCInfo {
993+
PendingHTLCStatus::Forward(PendingHTLCInfo {
990994
onion_packet: None,
991995
payment_hash: msg.payment_hash.clone(),
992996
short_channel_id: 0,
@@ -1036,7 +1040,7 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
10361040
},
10371041
};
10381042

1039-
PendingHTLCStatus::Forward(PendingForwardHTLCInfo {
1043+
PendingHTLCStatus::Forward(PendingHTLCInfo {
10401044
onion_packet: Some(outgoing_packet),
10411045
payment_hash: msg.payment_hash.clone(),
10421046
short_channel_id: short_channel_id,
@@ -1047,7 +1051,7 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
10471051
};
10481052

10491053
channel_state = Some(self.channel_state.lock().unwrap());
1050-
if let &PendingHTLCStatus::Forward(PendingForwardHTLCInfo { ref onion_packet, ref short_channel_id, ref amt_to_forward, ref outgoing_cltv_value, .. }) = &pending_forward_info {
1054+
if let &PendingHTLCStatus::Forward(PendingHTLCInfo { ref onion_packet, ref short_channel_id, ref amt_to_forward, ref outgoing_cltv_value, .. }) = &pending_forward_info {
10511055
if onion_packet.is_some() { // If short_channel_id is 0 here, we'll reject them in the body here
10521056
let id_option = channel_state.as_ref().unwrap().short_to_id.get(&short_channel_id).cloned();
10531057
let forwarding_id = match id_option {
@@ -2200,7 +2204,7 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
22002204
// If the update_add is completely bogus, the call will Err and we will close,
22012205
// but if we've sent a shutdown and they haven't acknowledged it yet, we just
22022206
// want to reject the new HTLC and fail it backwards instead of forwarding.
2203-
if let PendingHTLCStatus::Forward(PendingForwardHTLCInfo { incoming_shared_secret, .. }) = pending_forward_info {
2207+
if let PendingHTLCStatus::Forward(PendingHTLCInfo { incoming_shared_secret, .. }) = pending_forward_info {
22042208
let chan_update = self.get_channel_update(chan.get());
22052209
pending_forward_info = PendingHTLCStatus::Fail(HTLCFailureMsg::Relay(msgs::UpdateFailHTLC {
22062210
channel_id: msg.channel_id,
@@ -2330,7 +2334,7 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
23302334
}
23312335

23322336
#[inline]
2333-
fn forward_htlcs(&self, per_source_pending_forwards: &mut [(u64, Vec<(PendingForwardHTLCInfo, u64)>)]) {
2337+
fn forward_htlcs(&self, per_source_pending_forwards: &mut [(u64, Vec<(PendingHTLCInfo, u64)>)]) {
23342338
for &mut (prev_short_channel_id, ref mut pending_forwards) in per_source_pending_forwards {
23352339
let mut forward_event = None;
23362340
if !pending_forwards.is_empty() {
@@ -3041,7 +3045,7 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
30413045
const SERIALIZATION_VERSION: u8 = 1;
30423046
const MIN_SERIALIZATION_VERSION: u8 = 1;
30433047

3044-
impl Writeable for PendingForwardHTLCInfo {
3048+
impl Writeable for PendingHTLCInfo {
30453049
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
30463050
self.onion_packet.write(writer)?;
30473051
self.incoming_shared_secret.write(writer)?;
@@ -3053,9 +3057,9 @@ impl Writeable for PendingForwardHTLCInfo {
30533057
}
30543058
}
30553059

3056-
impl<R: ::std::io::Read> Readable<R> for PendingForwardHTLCInfo {
3057-
fn read(reader: &mut R) -> Result<PendingForwardHTLCInfo, DecodeError> {
3058-
Ok(PendingForwardHTLCInfo {
3060+
impl<R: ::std::io::Read> Readable<R> for PendingHTLCInfo {
3061+
fn read(reader: &mut R) -> Result<PendingHTLCInfo, DecodeError> {
3062+
Ok(PendingHTLCInfo {
30593063
onion_packet: Readable::read(reader)?,
30603064
incoming_shared_secret: Readable::read(reader)?,
30613065
payment_hash: Readable::read(reader)?,

0 commit comments

Comments
 (0)