Skip to content

Commit 45cca60

Browse files
Move DefaultRouter to router module
1 parent fc834d8 commit 45cca60

File tree

4 files changed

+72
-69
lines changed

4 files changed

+72
-69
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,13 +580,13 @@ mod tests {
580580
use lightning::ln::msgs::{ChannelMessageHandler, Init};
581581
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
582582
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
583+
use lightning::routing::router::DefaultRouter;
583584
use lightning::util::config::UserConfig;
584585
use lightning::util::events::{Event, MessageSendEventsProvider, MessageSendEvent};
585586
use lightning::util::ser::Writeable;
586587
use lightning::util::test_utils;
587588
use lightning::util::persist::KVStorePersister;
588589
use lightning_invoice::payment::{InvoicePayer, Retry};
589-
use lightning_invoice::utils::DefaultRouter;
590590
use lightning_persister::FilesystemPersister;
591591
use std::fs;
592592
use std::path::PathBuf;

lightning-invoice/src/utils.rs

Lines changed: 3 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::payment::Payer;
55

66
use crate::{prelude::*, Description, InvoiceDescription, Sha256};
77
use bech32::ToBase32;
8-
use bitcoin_hashes::{Hash, sha256};
8+
use bitcoin_hashes::Hash;
99
use lightning::chain;
1010
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
1111
use lightning::chain::keysinterface::{Recipient, KeysInterface};
@@ -14,15 +14,12 @@ use lightning::ln::channelmanager::{ChannelDetails, ChannelManager, PaymentId, P
1414
#[cfg(feature = "std")]
1515
use lightning::ln::channelmanager::{PhantomRouteHints, MIN_CLTV_EXPIRY_DELTA};
1616
use lightning::ln::inbound_payment::{create, create_from_hash, ExpandedKey};
17-
use lightning::ln::msgs::LightningError;
18-
use lightning::routing::gossip::{NetworkGraph, RoutingFees};
19-
use lightning::routing::router::{InFlightHtlcs, Route, RouteHint, RouteHintHop, RouteParameters, find_route, RouteHop, Router};
20-
use lightning::routing::scoring::{LockableScore, Score, ScorerAccountingForInFlightHtlcs};
17+
use lightning::routing::gossip::RoutingFees;
18+
use lightning::routing::router::{InFlightHtlcs, Route, RouteHint, RouteHintHop};
2119
use lightning::util::logger::Logger;
2220
use secp256k1::PublicKey;
2321
use core::ops::Deref;
2422
use core::time::Duration;
25-
use crate::sync::Mutex;
2623

2724
#[cfg(feature = "std")]
2825
/// Utility to create an invoice that can be paid to one of multiple nodes, or a "phantom invoice."
@@ -524,67 +521,6 @@ fn filter_channels<L: Deref>(
524521
.collect::<Vec<RouteHint>>()
525522
}
526523

527-
/// A [`Router`] implemented using [`find_route`].
528-
pub struct DefaultRouter<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref> where
529-
L::Target: Logger,
530-
S::Target: for <'a> LockableScore<'a>,
531-
{
532-
network_graph: G,
533-
logger: L,
534-
random_seed_bytes: Mutex<[u8; 32]>,
535-
scorer: S
536-
}
537-
538-
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref> DefaultRouter<G, L, S> where
539-
L::Target: Logger,
540-
S::Target: for <'a> LockableScore<'a>,
541-
{
542-
/// Creates a new router using the given [`NetworkGraph`], a [`Logger`], and a randomness source
543-
/// `random_seed_bytes`.
544-
pub fn new(network_graph: G, logger: L, random_seed_bytes: [u8; 32], scorer: S) -> Self {
545-
let random_seed_bytes = Mutex::new(random_seed_bytes);
546-
Self { network_graph, logger, random_seed_bytes, scorer }
547-
}
548-
}
549-
550-
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref> Router for DefaultRouter<G, L, S> where
551-
L::Target: Logger,
552-
S::Target: for <'a> LockableScore<'a>,
553-
{
554-
fn find_route(
555-
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
556-
inflight_htlcs: InFlightHtlcs
557-
) -> Result<Route, LightningError> {
558-
let random_seed_bytes = {
559-
let mut locked_random_seed_bytes = self.random_seed_bytes.lock().unwrap();
560-
*locked_random_seed_bytes = sha256::Hash::hash(&*locked_random_seed_bytes).into_inner();
561-
*locked_random_seed_bytes
562-
};
563-
564-
find_route(
565-
payer, params, &self.network_graph, first_hops, &*self.logger,
566-
&ScorerAccountingForInFlightHtlcs::new(&mut self.scorer.lock(), inflight_htlcs),
567-
&random_seed_bytes
568-
)
569-
}
570-
571-
fn notify_payment_path_failed(&self, path: &[&RouteHop], short_channel_id: u64) {
572-
self.scorer.lock().payment_path_failed(path, short_channel_id);
573-
}
574-
575-
fn notify_payment_path_successful(&self, path: &[&RouteHop]) {
576-
self.scorer.lock().payment_path_successful(path);
577-
}
578-
579-
fn notify_payment_probe_successful(&self, path: &[&RouteHop]) {
580-
self.scorer.lock().probe_successful(path);
581-
}
582-
583-
fn notify_payment_probe_failed(&self, path: &[&RouteHop], short_channel_id: u64) {
584-
self.scorer.lock().probe_failed(path, short_channel_id);
585-
}
586-
}
587-
588524
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Payer for ChannelManager<M, T, K, F, L>
589525
where
590526
M::Target: chain::Watch<<K::Target as KeysInterface>::Signer>,

lightning/src/routing/router.rs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,86 @@
1313
//! interrogate it to get routes for your own payments.
1414
1515
use bitcoin::secp256k1::PublicKey;
16+
use bitcoin::hashes::Hash;
17+
use bitcoin::hashes::sha256::Hash as Sha256;
1618

1719
use crate::ln::PaymentHash;
1820
use crate::ln::channelmanager::{ChannelDetails, PaymentId};
1921
use crate::ln::features::{ChannelFeatures, InvoiceFeatures, NodeFeatures};
2022
use crate::ln::msgs::{DecodeError, ErrorAction, LightningError, MAX_VALUE_MSAT};
2123
use crate::routing::gossip::{DirectedChannelInfo, EffectiveCapacity, ReadOnlyNetworkGraph, NetworkGraph, NodeId, RoutingFees};
22-
use crate::routing::scoring::{ChannelUsage, Score};
24+
use crate::routing::scoring::{ChannelUsage, LockableScore, Score, ScorerAccountingForInFlightHtlcs};
2325
use crate::util::ser::{Writeable, Readable, Writer};
2426
use crate::util::logger::{Level, Logger};
2527
use crate::util::chacha20::ChaCha20;
2628

2729
use crate::io;
2830
use crate::prelude::*;
31+
use crate::sync::Mutex;
2932
use alloc::collections::BinaryHeap;
3033
use core::cmp;
3134
use core::ops::Deref;
3235

36+
/// A [`Router`] implemented using [`find_route`].
37+
pub struct DefaultRouter<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref> where
38+
L::Target: Logger,
39+
S::Target: for <'a> LockableScore<'a>,
40+
{
41+
network_graph: G,
42+
logger: L,
43+
random_seed_bytes: Mutex<[u8; 32]>,
44+
scorer: S
45+
}
46+
47+
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref> DefaultRouter<G, L, S> where
48+
L::Target: Logger,
49+
S::Target: for <'a> LockableScore<'a>,
50+
{
51+
/// Creates a new router.
52+
pub fn new(network_graph: G, logger: L, random_seed_bytes: [u8; 32], scorer: S) -> Self {
53+
let random_seed_bytes = Mutex::new(random_seed_bytes);
54+
Self { network_graph, logger, random_seed_bytes, scorer }
55+
}
56+
}
57+
58+
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref> Router for DefaultRouter<G, L, S> where
59+
L::Target: Logger,
60+
S::Target: for <'a> LockableScore<'a>,
61+
{
62+
fn find_route(
63+
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
64+
inflight_htlcs: InFlightHtlcs
65+
) -> Result<Route, LightningError> {
66+
let random_seed_bytes = {
67+
let mut locked_random_seed_bytes = self.random_seed_bytes.lock().unwrap();
68+
*locked_random_seed_bytes = Sha256::hash(&*locked_random_seed_bytes).into_inner();
69+
*locked_random_seed_bytes
70+
};
71+
72+
find_route(
73+
payer, params, &self.network_graph, first_hops, &*self.logger,
74+
&ScorerAccountingForInFlightHtlcs::new(&mut self.scorer.lock(), inflight_htlcs),
75+
&random_seed_bytes
76+
)
77+
}
78+
79+
fn notify_payment_path_failed(&self, path: &[&RouteHop], short_channel_id: u64) {
80+
self.scorer.lock().payment_path_failed(path, short_channel_id);
81+
}
82+
83+
fn notify_payment_path_successful(&self, path: &[&RouteHop]) {
84+
self.scorer.lock().payment_path_successful(path);
85+
}
86+
87+
fn notify_payment_probe_successful(&self, path: &[&RouteHop]) {
88+
self.scorer.lock().probe_successful(path);
89+
}
90+
91+
fn notify_payment_probe_failed(&self, path: &[&RouteHop], short_channel_id: u64) {
92+
self.scorer.lock().probe_failed(path, short_channel_id);
93+
}
94+
}
95+
3396
/// A trait defining behavior for routing a payment.
3497
pub trait Router {
3598
/// Finds a [`Route`] between `payer` and `payee` for a payment with the given values.

lightning/src/routing/scoring.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,12 @@ impl ReadableArgs<u64> for FixedPenaltyScorer {
321321
/// Useful for custom [`Router`] implementations to wrap their [`Score`] on-the-fly when calling
322322
/// [`find_route`].
323323
///
324+
/// Not to be used in conjunction with [`DefaultRouter`] because `DefaultRouter` automatically wraps
325+
/// its scorer with a `ScorerAccountingForInFlightHtlcs` when finding a route.
326+
///
324327
/// [`Router`]: crate::routing::router::Router
325328
/// [`find_route`]: crate::routing::router::find_route
329+
/// [`DefaultRouter`]: crate::routing::router::DefaultRouter
326330
pub struct ScorerAccountingForInFlightHtlcs<'a, S: Score>
327331
{
328332
scorer: &'a mut S,

0 commit comments

Comments
 (0)