Skip to content

Commit 505ebed

Browse files
committed
Parameterize InvoicePayer by routing::Score
1 parent 010436d commit 505ebed

File tree

3 files changed

+77
-30
lines changed

3 files changed

+77
-30
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ mod tests {
311311
use lightning::ln::features::InitFeatures;
312312
use lightning::ln::msgs::{ChannelMessageHandler, Init};
313313
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
314+
use lightning::routing::scorer::Scorer;
314315
use lightning::routing::network_graph::{NetworkGraph, NetGraphMsgHandler};
315316
use lightning::util::config::UserConfig;
316317
use lightning::util::events::{Event, MessageSendEventsProvider, MessageSendEvent};

lightning-invoice/src/payment.rs

Lines changed: 72 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
//! # use lightning::ln::{PaymentHash, PaymentSecret};
3131
//! # use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
3232
//! # use lightning::ln::msgs::LightningError;
33+
//! # use lightning::routing;
34+
//! # use lightning::routing::network_graph::NodeId;
3335
//! # use lightning::routing::router::{Route, RouteParameters};
3436
//! # use lightning::util::events::{Event, EventHandler, EventsProvider};
3537
//! # use lightning::util::logger::{Logger, Record};
@@ -57,12 +59,19 @@
5759
//! #
5860
//! # struct FakeRouter {};
5961
//! # impl Router for FakeRouter {
60-
//! # fn find_route(
62+
//! # fn find_route<S: routing::Score>(
6163
//! # &self, payer: &PublicKey, params: &RouteParameters,
62-
//! # first_hops: Option<&[&ChannelDetails]>
64+
//! # first_hops: Option<&[&ChannelDetails]>, scorer: &S
6365
//! # ) -> Result<Route, LightningError> { unimplemented!() }
6466
//! # }
6567
//! #
68+
//! # struct FakeScorer {};
69+
//! # impl routing::Score for FakeScorer {
70+
//! # fn channel_penalty_msat(
71+
//! # &self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId
72+
//! # ) -> u64 { 0 }
73+
//! # }
74+
//! #
6675
//! # struct FakeLogger {};
6776
//! # impl Logger for FakeLogger {
6877
//! # fn log(&self, record: &Record) { unimplemented!() }
@@ -78,8 +87,9 @@
7887
//! };
7988
//! # let payer = FakePayer {};
8089
//! # let router = FakeRouter {};
90+
//! # let scorer = FakeScorer {};
8191
//! # let logger = FakeLogger {};
82-
//! let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
92+
//! let invoice_payer = InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
8393
//!
8494
//! let invoice = "...";
8595
//! let invoice = invoice.parse::<Invoice>().unwrap();
@@ -105,6 +115,7 @@ use bitcoin_hashes::Hash;
105115
use lightning::ln::{PaymentHash, PaymentSecret};
106116
use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
107117
use lightning::ln::msgs::LightningError;
118+
use lightning::routing;
108119
use lightning::routing::router::{Payee, Route, RouteParameters};
109120
use lightning::util::events::{Event, EventHandler};
110121
use lightning::util::logger::Logger;
@@ -117,15 +128,17 @@ use std::sync::Mutex;
117128
use std::time::{Duration, SystemTime};
118129

119130
/// A utility for paying [`Invoice]`s.
120-
pub struct InvoicePayer<P: Deref, R, L: Deref, E>
131+
pub struct InvoicePayer<P: Deref, R, S, L: Deref, E>
121132
where
122133
P::Target: Payer,
123134
R: Router,
135+
S: routing::Score,
124136
L::Target: Logger,
125137
E: EventHandler,
126138
{
127139
payer: P,
128140
router: R,
141+
scorer: S,
129142
logger: L,
130143
event_handler: E,
131144
payment_cache: Mutex<HashMap<PaymentHash, usize>>,
@@ -152,8 +165,9 @@ pub trait Payer {
152165
/// A trait defining behavior for routing an [`Invoice`] payment.
153166
pub trait Router {
154167
/// Finds a [`Route`] between `payer` and `payee` for a payment with the given values.
155-
fn find_route(
156-
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>
168+
fn find_route<S: routing::Score>(
169+
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
170+
scorer: &S
157171
) -> Result<Route, LightningError>;
158172
}
159173

@@ -172,10 +186,11 @@ pub enum PaymentError {
172186
Sending(PaymentSendFailure),
173187
}
174188

175-
impl<P: Deref, R, L: Deref, E> InvoicePayer<P, R, L, E>
189+
impl<P: Deref, R, S, L: Deref, E> InvoicePayer<P, R, S, L, E>
176190
where
177191
P::Target: Payer,
178192
R: Router,
193+
S: routing::Score,
179194
L::Target: Logger,
180195
E: EventHandler,
181196
{
@@ -184,11 +199,12 @@ where
184199
/// Will forward any [`Event::PaymentPathFailed`] events to the decorated `event_handler` once
185200
/// `retry_attempts` has been exceeded for a given [`Invoice`].
186201
pub fn new(
187-
payer: P, router: R, logger: L, event_handler: E, retry_attempts: RetryAttempts
202+
payer: P, router: R, scorer: S, logger: L, event_handler: E, retry_attempts: RetryAttempts
188203
) -> Self {
189204
Self {
190205
payer,
191206
router,
207+
scorer,
192208
logger,
193209
event_handler,
194210
payment_cache: Mutex::new(HashMap::new()),
@@ -242,6 +258,7 @@ where
242258
&payer,
243259
&params,
244260
Some(&first_hops.iter().collect::<Vec<_>>()),
261+
&self.scorer,
245262
).map_err(|e| PaymentError::Routing(e))?;
246263

247264
let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
@@ -261,7 +278,7 @@ where
261278
let payer = self.payer.node_id();
262279
let first_hops = self.payer.first_hops();
263280
let route = self.router.find_route(
264-
&payer, &params, Some(&first_hops.iter().collect::<Vec<_>>())
281+
&payer, &params, Some(&first_hops.iter().collect::<Vec<_>>()), &self.scorer
265282
).map_err(|e| PaymentError::Routing(e))?;
266283
self.payer.retry_payment(&route, payment_id).map_err(|e| PaymentError::Sending(e))
267284
}
@@ -284,10 +301,11 @@ fn has_expired(params: &RouteParameters) -> bool {
284301
Invoice::is_expired_from_epoch(&SystemTime::UNIX_EPOCH, expiry_time)
285302
}
286303

287-
impl<P: Deref, R, L: Deref, E> EventHandler for InvoicePayer<P, R, L, E>
304+
impl<P: Deref, R, S, L: Deref, E> EventHandler for InvoicePayer<P, R, S, L, E>
288305
where
289306
P::Target: Payer,
290307
R: Router,
308+
S: routing::Score,
291309
L::Target: Logger,
292310
E: EventHandler,
293311
{
@@ -354,7 +372,8 @@ mod tests {
354372
use lightning::ln::PaymentPreimage;
355373
use lightning::ln::features::{ChannelFeatures, NodeFeatures};
356374
use lightning::ln::msgs::{ErrorAction, LightningError};
357-
use lightning::routing::router::{Route, RouteHop};
375+
use lightning::routing::network_graph::NodeId;
376+
use lightning::routing::router::{Payee, Route, RouteHop};
358377
use lightning::util::test_utils::TestLogger;
359378
use lightning::util::errors::APIError;
360379
use lightning::util::events::Event;
@@ -422,9 +441,10 @@ mod tests {
422441

423442
let payer = TestPayer::new();
424443
let router = TestRouter {};
444+
let scorer = TestScorer::new();
425445
let logger = TestLogger::new();
426446
let invoice_payer =
427-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(0));
447+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(0));
428448

429449
let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
430450
assert_eq!(*payer.attempts.borrow(), 1);
@@ -450,9 +470,10 @@ mod tests {
450470
.expect_value_msat(final_value_msat)
451471
.expect_value_msat(final_value_msat / 2);
452472
let router = TestRouter {};
473+
let scorer = TestScorer::new();
453474
let logger = TestLogger::new();
454475
let invoice_payer =
455-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
476+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
456477

457478
let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
458479
assert_eq!(*payer.attempts.borrow(), 1);
@@ -490,9 +511,10 @@ mod tests {
490511

491512
let payer = TestPayer::new();
492513
let router = TestRouter {};
514+
let scorer = TestScorer::new();
493515
let logger = TestLogger::new();
494516
let invoice_payer =
495-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
517+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
496518

497519
let payment_id = Some(PaymentId([1; 32]));
498520
let event = Event::PaymentPathFailed {
@@ -534,9 +556,10 @@ mod tests {
534556
.expect_value_msat(final_value_msat / 2)
535557
.expect_value_msat(final_value_msat / 2);
536558
let router = TestRouter {};
559+
let scorer = TestScorer::new();
537560
let logger = TestLogger::new();
538561
let invoice_payer =
539-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
562+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
540563

541564
let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
542565
assert_eq!(*payer.attempts.borrow(), 1);
@@ -583,9 +606,10 @@ mod tests {
583606

584607
let payer = TestPayer::new();
585608
let router = TestRouter {};
609+
let scorer = TestScorer::new();
586610
let logger = TestLogger::new();
587611
let invoice_payer =
588-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
612+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
589613

590614
let payment_preimage = PaymentPreimage([1; 32]);
591615
let invoice = invoice(payment_preimage);
@@ -614,9 +638,10 @@ mod tests {
614638

615639
let payer = TestPayer::new();
616640
let router = TestRouter {};
641+
let scorer = TestScorer::new();
617642
let logger = TestLogger::new();
618643
let invoice_payer =
619-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
644+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
620645

621646
let payment_preimage = PaymentPreimage([1; 32]);
622647
let invoice = expired_invoice(payment_preimage);
@@ -651,9 +676,10 @@ mod tests {
651676
.fails_on_attempt(2)
652677
.expect_value_msat(final_value_msat);
653678
let router = TestRouter {};
679+
let scorer = TestScorer::new();
654680
let logger = TestLogger::new();
655681
let invoice_payer =
656-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
682+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
657683

658684
let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
659685
assert_eq!(*payer.attempts.borrow(), 1);
@@ -680,9 +706,10 @@ mod tests {
680706

681707
let payer = TestPayer::new();
682708
let router = TestRouter {};
709+
let scorer = TestScorer::new();
683710
let logger = TestLogger::new();
684711
let invoice_payer =
685-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
712+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
686713

687714
let payment_preimage = PaymentPreimage([1; 32]);
688715
let invoice = invoice(payment_preimage);
@@ -711,9 +738,10 @@ mod tests {
711738

712739
let payer = TestPayer::new();
713740
let router = TestRouter {};
741+
let scorer = TestScorer::new();
714742
let logger = TestLogger::new();
715743
let invoice_payer =
716-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(0));
744+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(0));
717745

718746
let payment_preimage = PaymentPreimage([1; 32]);
719747
let invoice = invoice(payment_preimage);
@@ -751,9 +779,10 @@ mod tests {
751779
fn fails_paying_invoice_with_routing_errors() {
752780
let payer = TestPayer::new();
753781
let router = FailingRouter {};
782+
let scorer = TestScorer::new();
754783
let logger = TestLogger::new();
755784
let invoice_payer =
756-
InvoicePayer::new(&payer, router, &logger, |_: &_| {}, RetryAttempts(0));
785+
InvoicePayer::new(&payer, router, scorer, &logger, |_: &_| {}, RetryAttempts(0));
757786

758787
let payment_preimage = PaymentPreimage([1; 32]);
759788
let invoice = invoice(payment_preimage);
@@ -768,9 +797,10 @@ mod tests {
768797
fn fails_paying_invoice_with_sending_errors() {
769798
let payer = TestPayer::new().fails_on_attempt(1);
770799
let router = TestRouter {};
800+
let scorer = TestScorer::new();
771801
let logger = TestLogger::new();
772802
let invoice_payer =
773-
InvoicePayer::new(&payer, router, &logger, |_: &_| {}, RetryAttempts(0));
803+
InvoicePayer::new(&payer, router, scorer, &logger, |_: &_| {}, RetryAttempts(0));
774804

775805
let payment_preimage = PaymentPreimage([1; 32]);
776806
let invoice = invoice(payment_preimage);
@@ -793,9 +823,10 @@ mod tests {
793823

794824
let payer = TestPayer::new().expect_value_msat(final_value_msat);
795825
let router = TestRouter {};
826+
let scorer = TestScorer::new();
796827
let logger = TestLogger::new();
797828
let invoice_payer =
798-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(0));
829+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(0));
799830

800831
let payment_id =
801832
Some(invoice_payer.pay_zero_value_invoice(&invoice, final_value_msat).unwrap());
@@ -815,9 +846,10 @@ mod tests {
815846

816847
let payer = TestPayer::new();
817848
let router = TestRouter {};
849+
let scorer = TestScorer::new();
818850
let logger = TestLogger::new();
819851
let invoice_payer =
820-
InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(0));
852+
InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(0));
821853

822854
let payment_preimage = PaymentPreimage([1; 32]);
823855
let invoice = invoice(payment_preimage);
@@ -874,11 +906,12 @@ mod tests {
874906
}
875907

876908
impl Router for TestRouter {
877-
fn find_route(
909+
fn find_route<S: routing::Score>(
878910
&self,
879911
_payer: &PublicKey,
880912
params: &RouteParameters,
881913
_first_hops: Option<&[&ChannelDetails]>,
914+
_scorer: &S,
882915
) -> Result<Route, LightningError> {
883916
Ok(Route {
884917
payee: Some(params.payee.clone()), ..Self::route_for_value(params.final_value_msat)
@@ -889,16 +922,29 @@ mod tests {
889922
struct FailingRouter;
890923

891924
impl Router for FailingRouter {
892-
fn find_route(
925+
fn find_route<S: routing::Score>(
893926
&self,
894927
_payer: &PublicKey,
895928
_params: &RouteParameters,
896929
_first_hops: Option<&[&ChannelDetails]>,
930+
_scorer: &S,
897931
) -> Result<Route, LightningError> {
898932
Err(LightningError { err: String::new(), action: ErrorAction::IgnoreError })
899933
}
900934
}
901935

936+
struct TestScorer;
937+
938+
impl TestScorer {
939+
fn new() -> Self { Self {} }
940+
}
941+
942+
impl routing::Score for TestScorer {
943+
fn channel_penalty_msat(
944+
&self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId
945+
) -> u64 { 0 }
946+
}
947+
902948
struct TestPayer {
903949
expectations: core::cell::RefCell<std::collections::VecDeque<u64>>,
904950
attempts: core::cell::RefCell<usize>,

lightning-invoice/src/utils.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use lightning::chain::keysinterface::{Sign, KeysInterface};
1111
use lightning::ln::{PaymentHash, PaymentSecret};
1212
use lightning::ln::channelmanager::{ChannelDetails, ChannelManager, PaymentId, PaymentSendFailure, MIN_FINAL_CLTV_EXPIRY};
1313
use lightning::ln::msgs::LightningError;
14+
use lightning::routing;
1415
use lightning::routing::network_graph::{NetworkGraph, RoutingFees};
1516
use lightning::routing::router::{Route, RouteHint, RouteHintHop, RouteParameters, find_route};
16-
use lightning::routing::scorer::Scorer;
1717
use lightning::util::logger::Logger;
1818
use secp256k1::key::PublicKey;
1919
use std::convert::TryInto;
@@ -111,11 +111,11 @@ impl<G, L: Deref> DefaultRouter<G, L> where G: Deref<Target = NetworkGraph>, L::
111111

112112
impl<G, L: Deref> Router for DefaultRouter<G, L>
113113
where G: Deref<Target = NetworkGraph>, L::Target: Logger {
114-
fn find_route(
114+
fn find_route<S: routing::Score>(
115115
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
116+
scorer: &S
116117
) -> Result<Route, LightningError> {
117-
let scorer = Scorer::default();
118-
find_route(payer, params, &*self.network_graph, first_hops, &*self.logger, &scorer)
118+
find_route(payer, params, &*self.network_graph, first_hops, &*self.logger, scorer)
119119
}
120120
}
121121

0 commit comments

Comments
 (0)