Skip to content

Commit c13ee0f

Browse files
author
Antoine Riard
committed
Track remote peer forwarding parameters on local channel
1 parent 33553d7 commit c13ee0f

File tree

7 files changed

+78
-0
lines changed

7 files changed

+78
-0
lines changed

fuzz/fuzz_targets/router_target.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ pub fn do_test(data: &[u8]) {
206206
remote_network_id: get_pubkey!(),
207207
channel_value_satoshis: slice_to_be64(get_slice!(8)),
208208
user_id: 0,
209+
their_to_self_delay: 0,
210+
their_htlc_minimum_msat: 0,
211+
their_fee_base_msat: 0,
212+
their_fee_proportional_millionths: 0,
209213
});
210214
}
211215
Some(&first_hops_vec[..])

src/ln/channel.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,8 @@ pub(super) struct Channel {
325325
their_to_self_delay: u16,
326326
//implied by BREAKDOWN_TIMEOUT: our_to_self_delay: u16,
327327
their_max_accepted_htlcs: u16,
328+
their_fee_base_msat: u32,
329+
their_fee_proportional_millionths: u32,
328330
//implied by OUR_MAX_HTLCS: our_max_accepted_htlcs: u16,
329331
minimum_depth: u32,
330332

@@ -491,6 +493,8 @@ impl Channel {
491493
our_htlc_minimum_msat: Channel::derive_our_htlc_minimum_msat(feerate),
492494
their_to_self_delay: 0,
493495
their_max_accepted_htlcs: 0,
496+
their_fee_base_msat: 0,
497+
their_fee_proportional_millionths: 0,
494498
minimum_depth: 0, // Filled in in accept_channel
495499

496500
their_funding_pubkey: None,
@@ -681,6 +685,8 @@ impl Channel {
681685
our_htlc_minimum_msat: Channel::derive_our_htlc_minimum_msat(msg.feerate_per_kw as u64),
682686
their_to_self_delay: msg.to_self_delay,
683687
their_max_accepted_htlcs: msg.max_accepted_htlcs,
688+
their_fee_base_msat: 0,
689+
their_fee_proportional_millionths: 0,
684690
minimum_depth: Channel::derive_minimum_depth(msg.funding_satoshis*1000, msg.push_msat),
685691

686692
their_funding_pubkey: Some(msg.funding_pubkey),
@@ -2040,6 +2046,14 @@ impl Channel {
20402046

20412047
}
20422048

2049+
/// Set channel fields with remote peer forwarding parameters, used mainly by ChannelDetails to feed the Router
2050+
pub fn channel_update(&mut self, msg: &msgs::ChannelUpdate) {
2051+
self.their_to_self_delay = msg.contents.cltv_expiry_delta;
2052+
self.their_htlc_minimum_msat = msg.contents.htlc_minimum_msat;
2053+
self.their_fee_base_msat = msg.contents.fee_base_msat;
2054+
self.their_fee_proportional_millionths = msg.contents.fee_proportional_millionths;
2055+
}
2056+
20432057
/// Adds a pending update to this channel. See the doc for send_htlc for
20442058
/// further details on the optionness of the return value.
20452059
/// You MUST call send_commitment prior to any other calls on this Channel
@@ -2641,6 +2655,18 @@ impl Channel {
26412655
self.our_htlc_minimum_msat
26422656
}
26432657

2658+
pub fn get_their_to_self_delay(&self) -> u16 {
2659+
self.their_to_self_delay
2660+
}
2661+
2662+
pub fn get_their_fee_base_msat(&self) -> u32 {
2663+
self.their_fee_base_msat
2664+
}
2665+
2666+
pub fn get_their_fee_proportional_millionths(&self) -> u32 {
2667+
self.their_fee_proportional_millionths
2668+
}
2669+
26442670
pub fn get_value_satoshis(&self) -> u64 {
26452671
self.channel_value_satoshis
26462672
}
@@ -3587,6 +3613,8 @@ impl Writeable for Channel {
35873613
self.our_htlc_minimum_msat.write(writer)?;
35883614
self.their_to_self_delay.write(writer)?;
35893615
self.their_max_accepted_htlcs.write(writer)?;
3616+
self.their_fee_base_msat.write(writer)?;
3617+
self.their_fee_proportional_millionths.write(writer)?;
35903618
self.minimum_depth.write(writer)?;
35913619

35923620
write_option!(self.their_funding_pubkey);
@@ -3761,6 +3789,8 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
37613789
let our_htlc_minimum_msat = Readable::read(reader)?;
37623790
let their_to_self_delay = Readable::read(reader)?;
37633791
let their_max_accepted_htlcs = Readable::read(reader)?;
3792+
let their_fee_base_msat = Readable::read(reader)?;
3793+
let their_fee_proportional_millionths = Readable::read(reader)?;
37643794
let minimum_depth = Readable::read(reader)?;
37653795

37663796
let their_funding_pubkey = read_option!();
@@ -3838,6 +3868,8 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
38383868
our_htlc_minimum_msat,
38393869
their_to_self_delay,
38403870
their_max_accepted_htlcs,
3871+
their_fee_base_msat,
3872+
their_fee_proportional_millionths,
38413873
minimum_depth,
38423874

38433875
their_funding_pubkey,

src/ln/channelmanager.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,14 @@ pub struct ChannelDetails {
384384
pub channel_value_satoshis: u64,
385385
/// The user_id passed in to create_channel, or 0 if the channel was inbound.
386386
pub user_id: u64,
387+
/// The CLTV delta added for the remote peer as a forwarding node
388+
pub their_to_self_delay: u16,
389+
/// The minimum HTLC amount for which the remote peer as a forwarding node is ready to relay
390+
pub their_htlc_minimum_msat: u64,
391+
/// The base fee the remote peer as a forwarding node will take to relay any HTLC.
392+
pub their_fee_base_msat: u32,
393+
/// The proportional fee on amount forwarded by a HTLC the remote peer will take to relay.
394+
pub their_fee_proportional_millionths: u32,
387395
}
388396

389397
macro_rules! handle_error {
@@ -539,6 +547,10 @@ impl ChannelManager {
539547
remote_network_id: channel.get_their_node_id(),
540548
channel_value_satoshis: channel.get_value_satoshis(),
541549
user_id: channel.get_user_id(),
550+
their_to_self_delay: channel.get_their_to_self_delay(),
551+
their_htlc_minimum_msat: channel.get_their_htlc_minimum_msat(),
552+
their_fee_base_msat: channel.get_their_fee_base_msat(),
553+
their_fee_proportional_millionths: channel.get_their_fee_proportional_millionths(),
542554
});
543555
}
544556
res
@@ -560,6 +572,10 @@ impl ChannelManager {
560572
remote_network_id: channel.get_their_node_id(),
561573
channel_value_satoshis: channel.get_value_satoshis(),
562574
user_id: channel.get_user_id(),
575+
their_to_self_delay: channel.get_their_to_self_delay(),
576+
their_htlc_minimum_msat: channel.get_their_htlc_minimum_msat(),
577+
their_fee_base_msat: channel.get_their_fee_base_msat(),
578+
their_fee_proportional_millionths: channel.get_their_fee_proportional_millionths(),
563579
});
564580
}
565581
}
@@ -2776,6 +2792,17 @@ impl ChannelMessageHandler for ChannelManager {
27762792
handle_error!(self, self.internal_announcement_signatures(their_node_id, msg), their_node_id)
27772793
}
27782794

2795+
fn handle_channel_update(&self, msg: &msgs::ChannelUpdate) -> Result<(), HandleError> {
2796+
let mut channel_state_lock = self.channel_state.lock().unwrap();
2797+
let channel_state = channel_state_lock.borrow_parts();
2798+
if let Some(channel_id) = channel_state.short_to_id.get(&msg.contents.short_channel_id) {
2799+
if let Some(chan) = channel_state.by_id.get_mut(channel_id) {
2800+
chan.channel_update(&msg);
2801+
}
2802+
}
2803+
Ok(())
2804+
}
2805+
27792806
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &msgs::ChannelReestablish) -> Result<(), HandleError> {
27802807
let _ = self.total_consistency_lock.read().unwrap();
27812808
handle_error!(self, self.internal_channel_reestablish(their_node_id, msg), their_node_id)
@@ -8130,4 +8157,5 @@ mod tests {
81308157
assert_eq!(spend_txn.len(), 1);
81318158
check_spends!(spend_txn[0], closing_tx);
81328159
}
8160+
81338161
}

src/ln/msgs.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,8 @@ pub trait ChannelMessageHandler : events::MessageSendEventsProvider + Send + Syn
559559
// Channel-to-announce:
560560
/// Handle an incoming announcement_signatures message from the given peer.
561561
fn handle_announcement_signatures(&self, their_node_id: &PublicKey, msg: &AnnouncementSignatures) -> Result<(), HandleError>;
562+
/// Handle an incoming channel_update message from the given peer.
563+
fn handle_channel_update(&self, msg: &ChannelUpdate) -> Result<(), HandleError>;
562564

563565
// Connection loss/reestablish:
564566
/// Indicates a connection to the peer failed/an existing connection was lost. If no connection

src/ln/peer_handler.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
739739
},
740740
258 => {
741741
let msg = try_potential_decodeerror!(msgs::ChannelUpdate::read(&mut reader));
742+
try_potential_handleerror!(self.message_handler.chan_handler.handle_channel_update(&msg));
742743
let should_forward = try_potential_handleerror!(self.message_handler.route_handler.handle_channel_update(&msg));
743744

744745
if should_forward {

src/ln/router.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,6 +1292,10 @@ mod tests {
12921292
remote_network_id: node8.clone(),
12931293
channel_value_satoshis: 0,
12941294
user_id: 0,
1295+
their_to_self_delay: 0,
1296+
their_htlc_minimum_msat: 0,
1297+
their_fee_base_msat: 0,
1298+
their_fee_proportional_millionths: 0,
12951299
}];
12961300
let route = router.get_route(&node3, Some(&our_chans), &Vec::new(), 100, 42).unwrap();
12971301
assert_eq!(route.hops.len(), 2);
@@ -1367,6 +1371,10 @@ mod tests {
13671371
remote_network_id: node4.clone(),
13681372
channel_value_satoshis: 0,
13691373
user_id: 0,
1374+
their_to_self_delay: 0,
1375+
their_htlc_minimum_msat: 0,
1376+
their_fee_base_msat: 0,
1377+
their_fee_proportional_millionths: 0,
13701378
}];
13711379
let route = router.get_route(&node7, Some(&our_chans), &last_hops, 100, 42).unwrap();
13721380
assert_eq!(route.hops.len(), 2);

src/util/test_utils.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
133133
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &msgs::AnnouncementSignatures) -> Result<(), HandleError> {
134134
Err(HandleError { err: "", action: None })
135135
}
136+
fn handle_channel_update(&self, _msg: &msgs::ChannelUpdate) -> Result<(), HandleError> {
137+
Err(HandleError { err: "", action: None })
138+
}
136139
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelReestablish) -> Result<(), HandleError> {
137140
Err(HandleError { err: "", action: None })
138141
}

0 commit comments

Comments
 (0)