Skip to content

Commit 8777c4b

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 8777c4b

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

lightning/src/ln/channel.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,21 @@ 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 number of blocks such that if:
291+
/// `htlc.cltv_expiry - current_block_height <= cltv_expiry_delta`
292+
/// then we need to fail the HTLC backwards. When forwarding an HTLC, cltv_expiry_delta is used to
293+
/// calculate the outgoing HTLC's cltv_expiry value -- so, if an incoming HTLC comes in with a
294+
/// cltv_expiry of 100000, and the node we're forwarding to has a cltv_expiry_delta value of 10,
295+
/// then we'll set the outgoing HTLC's cltv_expiry value to 100010.
296+
pub cltv_expiry_delta: u16,
297+
}
298+
284299
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
285300
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
286301
// calling channel_id() before we're set up or things like get_outbound_funding_signed on an
@@ -391,6 +406,8 @@ pub(super) struct Channel<Signer: Sign> {
391406
//implied by OUR_MAX_HTLCS: max_accepted_htlcs: u16,
392407
minimum_depth: u32,
393408

409+
counterparty_forwarding_info: Option<CounterpartyForwardingInfo>,
410+
394411
pub(crate) channel_transaction_parameters: ChannelTransactionParameters,
395412

396413
counterparty_cur_commitment_point: Option<PublicKey>,
@@ -577,6 +594,8 @@ impl<Signer: Sign> Channel<Signer> {
577594
counterparty_max_accepted_htlcs: 0,
578595
minimum_depth: 0, // Filled in in accept_channel
579596

597+
counterparty_forwarding_info: None,
598+
580599
channel_transaction_parameters: ChannelTransactionParameters {
581600
holder_pubkeys: pubkeys,
582601
holder_selected_contest_delay: config.own_channel_config.our_to_self_delay,
@@ -813,6 +832,8 @@ impl<Signer: Sign> Channel<Signer> {
813832
counterparty_max_accepted_htlcs: msg.max_accepted_htlcs,
814833
minimum_depth: config.own_channel_config.minimum_depth,
815834

835+
counterparty_forwarding_info: None,
836+
816837
channel_transaction_parameters: ChannelTransactionParameters {
817838
holder_pubkeys: pubkeys,
818839
holder_selected_contest_delay: config.own_channel_config.our_to_self_delay,
@@ -4437,6 +4458,16 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
44374458
self.counterparty_max_accepted_htlcs.write(writer)?;
44384459
self.minimum_depth.write(writer)?;
44394460

4461+
match &self.counterparty_forwarding_info {
4462+
Some(info) => {
4463+
1u8.write(writer)?;
4464+
info.fee_base_msat.write(writer)?;
4465+
info.fee_proportional_millionths.write(writer)?;
4466+
info.cltv_expiry_delta.write(writer)?;
4467+
},
4468+
None => 0u8.write(writer)?
4469+
}
4470+
44404471
self.channel_transaction_parameters.write(writer)?;
44414472
self.counterparty_cur_commitment_point.write(writer)?;
44424473

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

4631+
let counterparty_forwarding_info = match <u8 as Readable>::read(reader)? {
4632+
0 => None,
4633+
1 => Some(CounterpartyForwardingInfo {
4634+
fee_base_msat: Readable::read(reader)?,
4635+
fee_proportional_millionths: Readable::read(reader)?,
4636+
cltv_expiry_delta: Readable::read(reader)?,
4637+
}),
4638+
_ => return Err(DecodeError::InvalidValue),
4639+
};
4640+
46004641
let channel_parameters = Readable::read(reader)?;
46014642
let counterparty_cur_commitment_point = Readable::read(reader)?;
46024643

@@ -4667,6 +4708,8 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
46674708
counterparty_max_accepted_htlcs,
46684709
minimum_depth,
46694710

4711+
counterparty_forwarding_info,
4712+
46704713
channel_transaction_parameters: channel_parameters,
46714714
counterparty_cur_commitment_point,
46724715

lightning/src/ln/msgs.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,12 @@ 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+
/// `htlc.cltv_expiry - current_block_height <= cltv_expiry_delta`
548+
/// then we need to fail the HTLC backwards. When forwarding an HTLC, cltv_expiry_delta is used to
549+
/// calculate the outgoing HTLC's 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 set the outgoing HTLC's cltv_expiry value to 100010.
547552
pub cltv_expiry_delta: u16,
548553
/// The minimum HTLC size incoming to sender, in milli-satoshi
549554
pub htlc_minimum_msat: u64,

0 commit comments

Comments
 (0)