Skip to content

Commit d79d0a0

Browse files
committed
Add random CLTV offset in dedicated method.
1 parent d31918c commit d79d0a0

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

lightning/src/routing/router.rs

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -609,12 +609,18 @@ fn compute_fees(amount_msat: u64, channel_fees: RoutingFees) -> Option<u64> {
609609
pub fn find_route<L: Deref, S: Score>(
610610
our_node_pubkey: &PublicKey, route_params: &RouteParameters, network: &NetworkGraph,
611611
first_hops: Option<&[&ChannelDetails]>, logger: L, scorer: &S, random_seed_bytes: &[u8; 32]
612-
) -> Result<Route, LightningError>
612+
) -> Result<Route, LightningError>
613613
where L::Target: Logger {
614-
get_route(
614+
match get_route(
615615
our_node_pubkey, &route_params.payment_params, network, first_hops, route_params.final_value_msat,
616616
route_params.final_cltv_expiry_delta, logger, scorer, random_seed_bytes
617-
)
617+
) {
618+
Ok(mut route) => {
619+
add_random_cltv_offset(&mut route, &route_params.payment_params, network, random_seed_bytes);
620+
Ok(route)
621+
},
622+
Err(err) => Err(err),
623+
}
618624
}
619625

620626
pub(crate) fn get_route<L: Deref, S: Score>(
@@ -664,7 +670,6 @@ where L::Target: Logger {
664670
// 8. The last path in every selected route is likely to be more than we need.
665671
// Reduce its value-to-transfer and recompute fees.
666672
// 9. Choose the best route by the lowest total fee.
667-
// 10. Add a random 'shadow route' offset to the CLTV expiry delta values to improve privacy.
668673

669674
// As for the actual search algorithm,
670675
// we do a payee-to-payer pseudo-Dijkstra's sorting by each node's distance from the payee
@@ -1515,14 +1520,27 @@ where L::Target: Logger {
15151520
}
15161521
}
15171522

1518-
// Step (10).
1519-
// Add a random 'shadow route' offset to the CLTV expiry delta values to improve privacy.
1520-
for path in selected_paths.iter_mut() {
1523+
1524+
let route = Route {
1525+
paths: selected_paths.into_iter().map(|path| path.into_iter().collect()).collect::<Result<Vec<_>, _>>()?,
1526+
payment_params: Some(payment_params.clone()),
1527+
};
1528+
log_info!(logger, "Got route to {}: {}", payment_params.payee_pubkey, log_route!(route));
1529+
Ok(route)
1530+
}
1531+
1532+
// Add a random 'shadow route' offset to the CLTV expiry delta values to improve privacy.
1533+
fn add_random_cltv_offset(route: &mut Route, payment_params: &PaymentParameters, network: &NetworkGraph, random_seed_bytes: &[u8; 32]) {
1534+
let network_graph = network.read_only();
1535+
let network_channels = network_graph.channels();
1536+
let network_nodes = network_graph.nodes();
1537+
1538+
for path in route.paths.iter_mut() {
15211539
let mut shadow_ctlv_expiry_delta_offset: u32 = 0;
15221540

15231541
// Choose the last publicly known node as the starting point for the random walk
1524-
if let Some(starting_hop) = path.iter().rev().find(|h| network_nodes.contains_key(&NodeId::from_pubkey(&h.as_ref().unwrap().pubkey))) {
1525-
let mut cur_node_id = NodeId::from_pubkey(&starting_hop.as_ref().unwrap().pubkey);
1542+
if let Some(starting_hop) = path.iter().rev().find(|h| network_nodes.contains_key(&NodeId::from_pubkey(&h.pubkey))) {
1543+
let mut cur_node_id = NodeId::from_pubkey(&starting_hop.pubkey);
15261544

15271545
// Init PRNG with path nonce
15281546
let mut path_nonce = [0u8; 8];
@@ -1574,28 +1592,19 @@ where L::Target: Logger {
15741592

15751593
// Limit the offset so we never exceed the max_total_cltv_expiry_delta
15761594
let max_path_offset = payment_params.max_total_cltv_expiry_delta
1577-
.checked_sub(path.iter().fold(0, |acc,b| b.as_ref().unwrap().cltv_expiry_delta.max(acc)))
1595+
.checked_sub(path.iter().fold(0, |acc,b| b.cltv_expiry_delta.max(acc)))
15781596
.unwrap_or(shadow_ctlv_expiry_delta_offset);
15791597
shadow_ctlv_expiry_delta_offset = cmp::min(shadow_ctlv_expiry_delta_offset,
15801598
max_path_offset.checked_sub(max_path_offset.wrapping_rem(40)).unwrap_or(max_path_offset));
15811599

15821600
// Add 'shadow' CLTV offset to all hops but the final one
1583-
for h in path {
1584-
if let Ok(hop) = h {
1585-
if hop.pubkey != payment_params.payee_pubkey {
1586-
hop.cltv_expiry_delta = hop.cltv_expiry_delta
1587-
.checked_add(shadow_ctlv_expiry_delta_offset).unwrap_or(hop.cltv_expiry_delta);
1588-
}
1601+
for hop in path {
1602+
if hop.pubkey != payment_params.payee_pubkey {
1603+
hop.cltv_expiry_delta = hop.cltv_expiry_delta
1604+
.checked_add(shadow_ctlv_expiry_delta_offset).unwrap_or(hop.cltv_expiry_delta);
15891605
}
15901606
}
15911607
}
1592-
1593-
let route = Route {
1594-
paths: selected_paths.into_iter().map(|path| path.into_iter().collect()).collect::<Result<Vec<_>, _>>()?,
1595-
payment_params: Some(payment_params.clone()),
1596-
};
1597-
log_info!(logger, "Got route to {}: {}", payment_params.payee_pubkey, log_route!(route));
1598-
Ok(route)
15991608
}
16001609

16011610
#[cfg(test)]

lightning/src/routing/scoring.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
//! # use lightning::routing::network_graph::NetworkGraph;
2121
//! # use lightning::routing::router::{RouteParameters, find_route};
2222
//! # use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringParameters, Scorer, ScoringParameters};
23+
//! # use lightning::chain::keysinterface::{KeysManager, KeysInterface};
2324
//! # use lightning::util::logger::{Logger, Record};
2425
//! # use secp256k1::key::PublicKey;
2526
//! #
@@ -40,8 +41,11 @@
4041
//! ..ProbabilisticScoringParameters::default()
4142
//! };
4243
//! let scorer = ProbabilisticScorer::new(params, &network_graph);
44+
//! let random_seed = [42u8; 32];
45+
//! let keys_manager = KeysManager::new(&random_seed, 1234, 5678);
46+
//! let random_seed_bytes = keys_manager.get_secure_random_bytes();
4347
//!
44-
//! let route = find_route(&payer, &route_params, &network_graph, None, &logger, &scorer);
48+
//! let route = find_route(&payer, &route_params, &network_graph, None, &logger, &scorer, &random_seed_bytes);
4549
//! # }
4650
//! ```
4751
//!

0 commit comments

Comments
 (0)