Skip to content

Commit a393d16

Browse files
Parameterize ChannelManager by a Router trait
This will be used in upcoming work to fetch routes on-the-fly for payment retries, which will no longer be the responsibility of InvoicePayer.
1 parent a128f8b commit a393d16

File tree

18 files changed

+231
-130
lines changed

18 files changed

+231
-130
lines changed

fuzz/src/chanmon_consistency.rs

+21-5
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ use lightning::chain::transaction::OutPoint;
3838
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
3939
use lightning::chain::keysinterface::{KeyMaterial, KeysInterface, InMemorySigner, Recipient};
4040
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
41-
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
41+
use lightning::ln::channelmanager::{self, ChainParameters, ChannelDetails, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
4242
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
43-
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
43+
use lightning::ln::msgs::{self, CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
4444
use lightning::ln::script::ShutdownScript;
4545
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
4646
use lightning::util::errors::APIError;
@@ -49,7 +49,7 @@ use lightning::util::logger::Logger;
4949
use lightning::util::config::UserConfig;
5050
use lightning::util::events::MessageSendEventsProvider;
5151
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
52-
use lightning::routing::router::{Route, RouteHop};
52+
use lightning::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters, Router};
5353

5454
use crate::utils::test_logger::{self, Output};
5555
use crate::utils::test_persister::TestPersister;
@@ -85,6 +85,20 @@ impl FeeEstimator for FuzzEstimator {
8585
}
8686
}
8787

88+
struct FuzzRouter {}
89+
90+
impl Router for FuzzRouter {
91+
fn find_route(
92+
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
93+
_inflight_htlcs: InFlightHtlcs
94+
) -> Result<Route, msgs::LightningError> {
95+
Err(msgs::LightningError {
96+
err: String::from("Not implemented"),
97+
action: msgs::ErrorAction::IgnoreError
98+
})
99+
}
100+
}
101+
88102
pub struct TestBroadcaster {}
89103
impl BroadcasterInterface for TestBroadcaster {
90104
fn broadcast_transaction(&self, _tx: &Transaction) { }
@@ -293,7 +307,7 @@ fn check_payment_err(send_err: PaymentSendFailure) {
293307
}
294308
}
295309

296-
type ChanMan = ChannelManager<Arc<TestChainMonitor>, Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
310+
type ChanMan<'a> = ChannelManager<Arc<TestChainMonitor>, Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
297311

298312
#[inline]
299313
fn get_payment_secret_hash(dest: &ChanMan, payment_id: &mut u8) -> Option<(PaymentSecret, PaymentHash)> {
@@ -364,6 +378,7 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
364378
pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
365379
let out = SearchingOutput::new(underlying_out);
366380
let broadcast = Arc::new(TestBroadcaster{});
381+
let router = FuzzRouter {};
367382

368383
macro_rules! make_node {
369384
($node_id: expr, $fee_estimator: expr) => { {
@@ -382,7 +397,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
382397
network,
383398
best_block: BestBlock::from_genesis(network),
384399
};
385-
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params),
400+
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), config, params),
386401
monitor, keys_manager)
387402
} }
388403
}
@@ -416,6 +431,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
416431
fee_estimator: $fee_estimator.clone(),
417432
chain_monitor: chain_monitor.clone(),
418433
tx_broadcaster: broadcast.clone(),
434+
router: &router,
419435
logger,
420436
default_config: config,
421437
channel_monitors: monitor_refs,

fuzz/src/full_stack.rs

+24-9
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ use lightning::chain::chainmonitor;
3535
use lightning::chain::transaction::OutPoint;
3636
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeyMaterial, KeysInterface};
3737
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
38-
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentId};
38+
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentId};
3939
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
40-
use lightning::ln::msgs::DecodeError;
40+
use lightning::ln::msgs::{self, DecodeError};
4141
use lightning::ln::script::ShutdownScript;
4242
use lightning::routing::gossip::{P2PGossipSync, NetworkGraph};
43-
use lightning::routing::router::{find_route, PaymentParameters, RouteParameters};
43+
use lightning::routing::router::{find_route, InFlightHtlcs, PaymentParameters, Route, RouteParameters, Router};
4444
use lightning::routing::scoring::FixedPenaltyScorer;
4545
use lightning::util::config::UserConfig;
4646
use lightning::util::errors::APIError;
@@ -127,6 +127,20 @@ impl FeeEstimator for FuzzEstimator {
127127
}
128128
}
129129

130+
struct FuzzRouter {}
131+
132+
impl Router for FuzzRouter {
133+
fn find_route(
134+
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
135+
_inflight_htlcs: InFlightHtlcs
136+
) -> Result<Route, msgs::LightningError> {
137+
Err(msgs::LightningError {
138+
err: String::from("Not implemented"),
139+
action: msgs::ErrorAction::IgnoreError
140+
})
141+
}
142+
}
143+
130144
struct TestBroadcaster {
131145
txn_broadcasted: Mutex<Vec<Transaction>>,
132146
}
@@ -162,13 +176,13 @@ impl<'a> std::hash::Hash for Peer<'a> {
162176
}
163177
}
164178

165-
type ChannelMan = ChannelManager<
179+
type ChannelMan<'a> = ChannelManager<
166180
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
167-
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
168-
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, IgnoringMessageHandler, Arc<dyn Logger>, IgnoringMessageHandler>;
181+
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
182+
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan<'a>>, Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, IgnoringMessageHandler, Arc<dyn Logger>, IgnoringMessageHandler>;
169183

170184
struct MoneyLossDetector<'a> {
171-
manager: Arc<ChannelMan>,
185+
manager: Arc<ChannelMan<'a>>,
172186
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
173187
handler: PeerMan<'a>,
174188

@@ -182,7 +196,7 @@ struct MoneyLossDetector<'a> {
182196
}
183197
impl<'a> MoneyLossDetector<'a> {
184198
pub fn new(peers: &'a RefCell<[bool; 256]>,
185-
manager: Arc<ChannelMan>,
199+
manager: Arc<ChannelMan<'a>>,
186200
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
187201
handler: PeerMan<'a>) -> Self {
188202
MoneyLossDetector {
@@ -360,6 +374,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
360374
let fee_est = Arc::new(FuzzEstimator {
361375
input: input.clone(),
362376
});
377+
let router = FuzzRouter {};
363378

364379
macro_rules! get_slice {
365380
($len: expr) => {
@@ -399,7 +414,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
399414
network,
400415
best_block: BestBlock::from_genesis(network),
401416
};
402-
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params));
417+
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), config, params));
403418
// Adding new calls to `KeysInterface::get_secure_random_bytes` during startup can change all the
404419
// keys subsequently generated in this test. Rather than regenerating all the messages manually,
405420
// it's easier to just increment the counter here so the keys don't change.

lightning-background-processor/src/lib.rs

+12-6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use lightning::ln::channelmanager::ChannelManager;
2222
use lightning::ln::msgs::{ChannelMessageHandler, OnionMessageHandler, RoutingMessageHandler};
2323
use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor};
2424
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
25+
use lightning::routing::router::Router;
2526
use lightning::routing::scoring::WriteableScore;
2627
use lightning::util::events::{Event, EventHandler, EventsProvider};
2728
use lightning::util::logger::Logger;
@@ -342,6 +343,7 @@ pub async fn process_events_async<
342343
T: 'static + Deref + Send + Sync,
343344
K: 'static + Deref + Send + Sync,
344345
F: 'static + Deref + Send + Sync,
346+
R: 'static + Deref + Send + Sync,
345347
G: 'static + Deref<Target = NetworkGraph<L>> + Send + Sync,
346348
L: 'static + Deref + Send + Sync,
347349
P: 'static + Deref + Send + Sync,
@@ -353,7 +355,7 @@ pub async fn process_events_async<
353355
EventHandler: Fn(Event) -> EventHandlerFuture,
354356
PS: 'static + Deref + Send,
355357
M: 'static + Deref<Target = ChainMonitor<<K::Target as KeysInterface>::Signer, CF, T, F, L, P>> + Send + Sync,
356-
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, L>> + Send + Sync,
358+
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, R, L>> + Send + Sync,
357359
PGS: 'static + Deref<Target = P2PGossipSync<G, CA, L>> + Send + Sync,
358360
RGS: 'static + Deref<Target = RapidGossipSync<G, L>> + Send,
359361
UMH: 'static + Deref + Send + Sync,
@@ -374,13 +376,14 @@ where
374376
T::Target: 'static + BroadcasterInterface,
375377
K::Target: 'static + KeysInterface,
376378
F::Target: 'static + FeeEstimator,
379+
R::Target: 'static + Router,
377380
L::Target: 'static + Logger,
378381
P::Target: 'static + Persist<<K::Target as KeysInterface>::Signer>,
379382
CMH::Target: 'static + ChannelMessageHandler,
380383
OMH::Target: 'static + OnionMessageHandler,
381384
RMH::Target: 'static + RoutingMessageHandler,
382385
UMH::Target: 'static + CustomMessageHandler,
383-
PS::Target: 'static + Persister<'a, CW, T, K, F, L, SC>,
386+
PS::Target: 'static + Persister<'a, CW, T, K, F, R, L, SC>,
384387
{
385388
let mut should_break = true;
386389
let async_event_handler = |event| {
@@ -460,6 +463,7 @@ impl BackgroundProcessor {
460463
T: 'static + Deref + Send + Sync,
461464
K: 'static + Deref + Send + Sync,
462465
F: 'static + Deref + Send + Sync,
466+
R: 'static + Deref + Send + Sync,
463467
G: 'static + Deref<Target = NetworkGraph<L>> + Send + Sync,
464468
L: 'static + Deref + Send + Sync,
465469
P: 'static + Deref + Send + Sync,
@@ -470,7 +474,7 @@ impl BackgroundProcessor {
470474
EH: 'static + EventHandler + Send,
471475
PS: 'static + Deref + Send,
472476
M: 'static + Deref<Target = ChainMonitor<<K::Target as KeysInterface>::Signer, CF, T, F, L, P>> + Send + Sync,
473-
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, L>> + Send + Sync,
477+
CM: 'static + Deref<Target = ChannelManager<CW, T, K, F, R, L>> + Send + Sync,
474478
PGS: 'static + Deref<Target = P2PGossipSync<G, CA, L>> + Send + Sync,
475479
RGS: 'static + Deref<Target = RapidGossipSync<G, L>> + Send,
476480
UMH: 'static + Deref + Send + Sync,
@@ -488,13 +492,14 @@ impl BackgroundProcessor {
488492
T::Target: 'static + BroadcasterInterface,
489493
K::Target: 'static + KeysInterface,
490494
F::Target: 'static + FeeEstimator,
495+
R::Target: 'static + Router,
491496
L::Target: 'static + Logger,
492497
P::Target: 'static + Persist<<K::Target as KeysInterface>::Signer>,
493498
CMH::Target: 'static + ChannelMessageHandler,
494499
OMH::Target: 'static + OnionMessageHandler,
495500
RMH::Target: 'static + RoutingMessageHandler,
496501
UMH::Target: 'static + CustomMessageHandler,
497-
PS::Target: 'static + Persister<'a, CW, T, K, F, L, SC>,
502+
PS::Target: 'static + Persister<'a, CW, T, K, F, R, L, SC>,
498503
{
499504
let stop_thread = Arc::new(AtomicBool::new(false));
500505
let stop_thread_clone = stop_thread.clone();
@@ -615,7 +620,7 @@ mod tests {
615620
type RGS = Arc<RapidGossipSync<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>>>;
616621

617622
struct Node {
618-
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, test_utils::TestLogger>>,
623+
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, test_utils::TestRouter, test_utils::TestLogger>>,
619624
p2p_gossip_sync: PGS,
620625
rapid_gossip_sync: RGS,
621626
peer_manager: Arc<PeerManager<TestDescriptor, Arc<test_utils::TestChannelMessageHandler>, Arc<test_utils::TestRoutingMessageHandler>, IgnoringMessageHandler, Arc<test_utils::TestLogger>, IgnoringMessageHandler>>,
@@ -722,6 +727,7 @@ mod tests {
722727
for i in 0..num_nodes {
723728
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), blocks: Arc::new(Mutex::new(Vec::new()))});
724729
let fee_estimator = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) });
730+
let router = Arc::new(test_utils::TestRouter { });
725731
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
726732
let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i)));
727733
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", persist_dir, i)));
@@ -733,7 +739,7 @@ mod tests {
733739
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
734740
let best_block = BestBlock::from_genesis(network);
735741
let params = ChainParameters { network, best_block };
736-
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
742+
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), router.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
737743
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
738744
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
739745
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone()));

lightning-block-sync/src/init.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
4949
/// use lightning::chain::chaininterface::FeeEstimator;
5050
/// use lightning::chain::keysinterface;
5151
/// use lightning::chain::keysinterface::KeysInterface;
52-
/// use lightning::ln::channelmanager::ChannelManager;
53-
/// use lightning::ln::channelmanager::ChannelManagerReadArgs;
52+
/// use lightning::ln::channelmanager::{ChannelManager, ChannelManagerReadArgs};
53+
/// use lightning::routing::router::Router;
5454
/// use lightning::util::config::UserConfig;
5555
/// use lightning::util::logger::Logger;
5656
/// use lightning::util::ser::ReadableArgs;
@@ -64,6 +64,7 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
6464
/// K: KeysInterface,
6565
/// T: BroadcasterInterface,
6666
/// F: FeeEstimator,
67+
/// R: Router,
6768
/// L: Logger,
6869
/// C: chain::Filter,
6970
/// P: chainmonitor::Persist<K::Signer>,
@@ -74,6 +75,7 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
7475
/// keys_manager: &K,
7576
/// tx_broadcaster: &T,
7677
/// fee_estimator: &F,
78+
/// router: &R,
7779
/// logger: &L,
7880
/// persister: &P,
7981
/// ) {
@@ -90,11 +92,12 @@ BlockSourceResult<ValidatedBlockHeader> where B::Target: BlockSource {
9092
/// fee_estimator,
9193
/// chain_monitor,
9294
/// tx_broadcaster,
95+
/// router,
9396
/// logger,
9497
/// config,
9598
/// vec![&mut monitor],
9699
/// );
97-
/// <(BlockHash, ChannelManager<&ChainMonitor<K::Signer, &C, &T, &F, &L, &P>, &T, &K, &F, &L>)>::read(
100+
/// <(BlockHash, ChannelManager<&ChainMonitor<K::Signer, &C, &T, &F, &L, &P>, &T, &K, &F, &R, &L>)>::read(
98101
/// &mut Cursor::new(&serialized_manager), read_args).unwrap()
99102
/// };
100103
///

lightning-invoice/src/payment.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ use crate::prelude::*;
144144
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
145145
use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
146146
use lightning::ln::msgs::LightningError;
147-
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteHop, RouteParameters, Router};
147+
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteParameters, Router};
148148
use lightning::util::events::{Event, EventHandler};
149149
use lightning::util::logger::Logger;
150150
use crate::time_utils::Time;

0 commit comments

Comments
 (0)