Skip to content

Commit 5b28744

Browse files
valentinewallaceAntoine Riard
and
Antoine Riard
committed
Add CounterpartyForwardingInfo field to channel.
This will be filled in in upcoming commits, then exposed in ChannelDetails to allow constructing route hints for invoices. Also update the cltv_expiry_deta comment in msgs::ChannelUpdate Co-authored-by: Valentine Wallace <[email protected]> Co-authored-by: Antoine Riard <[email protected]>
1 parent 2cb5b1a commit 5b28744

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

lightning/src/ln/channel.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,18 @@ impl HTLCCandidate {
281281
}
282282
}
283283

284+
/// Information needed for constructing an invoice route hint for this channel.
285+
pub struct CounterpartyForwardingInfo {
286+
/// Base routing fee in millisatoshis.
287+
pub fee_base_msat: u32,
288+
/// Amount in millionths of a satoshi the channel will charge per transferred satoshi.
289+
pub fee_proportional_millionths: u32,
290+
/// The minimum difference in cltv_expiry between an ingoing HTLC and its outgoing counterpart,
291+
/// such that the outgoing HTLC is forwardable to this counterparty. See `msgs::ChannelUpdate`'s
292+
/// `cltv_expiry_delta` for more details.
293+
pub cltv_expiry_delta: u16,
294+
}
295+
284296
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
285297
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
286298
// calling channel_id() before we're set up or things like get_outbound_funding_signed on an
@@ -391,6 +403,8 @@ pub(super) struct Channel<Signer: Sign> {
391403
//implied by OUR_MAX_HTLCS: max_accepted_htlcs: u16,
392404
minimum_depth: u32,
393405

406+
counterparty_forwarding_info: Option<CounterpartyForwardingInfo>,
407+
394408
pub(crate) channel_transaction_parameters: ChannelTransactionParameters,
395409

396410
counterparty_cur_commitment_point: Option<PublicKey>,
@@ -577,6 +591,8 @@ impl<Signer: Sign> Channel<Signer> {
577591
counterparty_max_accepted_htlcs: 0,
578592
minimum_depth: 0, // Filled in in accept_channel
579593

594+
counterparty_forwarding_info: None,
595+
580596
channel_transaction_parameters: ChannelTransactionParameters {
581597
holder_pubkeys: pubkeys,
582598
holder_selected_contest_delay: config.own_channel_config.our_to_self_delay,
@@ -813,6 +829,8 @@ impl<Signer: Sign> Channel<Signer> {
813829
counterparty_max_accepted_htlcs: msg.max_accepted_htlcs,
814830
minimum_depth: config.own_channel_config.minimum_depth,
815831

832+
counterparty_forwarding_info: None,
833+
816834
channel_transaction_parameters: ChannelTransactionParameters {
817835
holder_pubkeys: pubkeys,
818836
holder_selected_contest_delay: config.own_channel_config.our_to_self_delay,
@@ -4437,6 +4455,16 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
44374455
self.counterparty_max_accepted_htlcs.write(writer)?;
44384456
self.minimum_depth.write(writer)?;
44394457

4458+
match &self.counterparty_forwarding_info {
4459+
Some(info) => {
4460+
1u8.write(writer)?;
4461+
info.fee_base_msat.write(writer)?;
4462+
info.fee_proportional_millionths.write(writer)?;
4463+
info.cltv_expiry_delta.write(writer)?;
4464+
},
4465+
None => 0u8.write(writer)?
4466+
}
4467+
44404468
self.channel_transaction_parameters.write(writer)?;
44414469
self.counterparty_cur_commitment_point.write(writer)?;
44424470

@@ -4597,6 +4625,16 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
45974625
let counterparty_max_accepted_htlcs = Readable::read(reader)?;
45984626
let minimum_depth = Readable::read(reader)?;
45994627

4628+
let counterparty_forwarding_info = match <u8 as Readable>::read(reader)? {
4629+
0 => None,
4630+
1 => Some(CounterpartyForwardingInfo {
4631+
fee_base_msat: Readable::read(reader)?,
4632+
fee_proportional_millionths: Readable::read(reader)?,
4633+
cltv_expiry_delta: Readable::read(reader)?,
4634+
}),
4635+
_ => return Err(DecodeError::InvalidValue),
4636+
};
4637+
46004638
let channel_parameters = Readable::read(reader)?;
46014639
let counterparty_cur_commitment_point = Readable::read(reader)?;
46024640

@@ -4667,6 +4705,8 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
46674705
counterparty_max_accepted_htlcs,
46684706
minimum_depth,
46694707

4708+
counterparty_forwarding_info,
4709+
46704710
channel_transaction_parameters: channel_parameters,
46714711
counterparty_cur_commitment_point,
46724712

lightning/src/ln/msgs.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,14 @@ pub struct UnsignedChannelUpdate {
543543
pub timestamp: u32,
544544
/// Channel flags
545545
pub flags: u8,
546-
/// The number of blocks to subtract from incoming HTLC cltv_expiry values
546+
/// The number of blocks such that if:
547+
/// `incoming_htlc.cltv_expiry < outgoing_htlc.cltv_expiry + cltv_expiry_delta`
548+
/// then we need to fail the HTLC backwards. When forwarding an HTLC, cltv_expiry_delta determines
549+
/// the outgoing HTLC's minimum cltv_expiry value -- so, if an incoming HTLC comes in with a
550+
/// cltv_expiry of 100000, and the node we're forwarding to has a cltv_expiry_delta value of 10,
551+
/// then we'll check that the outgoing HTLC's cltv_expiry value is at least 100010 before
552+
/// forwarding. Note that the HTLC sender is the one who originally sets this value when
553+
/// constructing the route.
547554
pub cltv_expiry_delta: u16,
548555
/// The minimum HTLC size incoming to sender, in milli-satoshi
549556
pub htlc_minimum_msat: u64,

0 commit comments

Comments
 (0)