Skip to content

Commit 9c9c9b3

Browse files
joostjagerclaude
andcommitted
Add AChainMonitor trait and use it in background processor
Add a new `AChainMonitor` trait following the same pattern as `AChannelManager`. This trait provides associated types for all generic parameters of `ChainMonitor` and a `get_cm()` method to access the underlying `ChainMonitor`. Update the background processor to use `AChainMonitor` trait bounds instead of spelling out the full `ChainMonitor` generic parameters. This simplifies the function signatures by removing 5-6 explicit generic parameters (CF, T, F, P, ES) per function. This is preparation for adding a flush method to the AChainMonitor trait. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 8679d8d commit 9c9c9b3

File tree

2 files changed

+113
-40
lines changed

2 files changed

+113
-40
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use fwd_batch::BatchDelay;
3232

3333
use lightning::chain;
3434
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
35-
use lightning::chain::chainmonitor::{ChainMonitor, Persist};
35+
use lightning::chain::chainmonitor::AChainMonitor;
3636
#[cfg(feature = "std")]
3737
use lightning::events::EventHandler;
3838
#[cfg(feature = "std")]
@@ -118,6 +118,7 @@ use alloc::vec::Vec;
118118
///
119119
/// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
120120
/// [`ChannelManager::timer_tick_occurred`]: lightning::ln::channelmanager::ChannelManager::timer_tick_occurred
121+
/// [`ChainMonitor::rebroadcast_pending_claims`]: lightning::chain::chainmonitor::ChainMonitor::rebroadcast_pending_claims
121122
/// [`ChannelMonitor`]: lightning::chain::channelmonitor::ChannelMonitor
122123
/// [`Event`]: lightning::events::Event
123124
/// [`PeerManager::timer_tick_occurred`]: lightning::ln::peer_handler::PeerManager::timer_tick_occurred
@@ -923,16 +924,11 @@ use futures_util::{dummy_waker, Joiner, OptionalSelector, Selector, SelectorOutp
923924
pub async fn process_events_async<
924925
'a,
925926
UL: UtxoLookup,
926-
CF: chain::Filter,
927-
T: BroadcasterInterface,
928-
F: FeeEstimator,
929927
G: Deref<Target = NetworkGraph<L>>,
930928
L: Logger,
931-
P: Deref,
932929
EventHandlerFuture: core::future::Future<Output = Result<(), ReplayEvent>>,
933930
EventHandler: Fn(Event) -> EventHandlerFuture,
934-
ES: EntropySource,
935-
M: Deref<Target = ChainMonitor<<CM::Target as AChannelManager>::Signer, CF, T, F, L, P, ES>>,
931+
M: Deref,
936932
CM: Deref,
937933
OM: Deref,
938934
PGS: Deref<Target = P2PGossipSync<G, UL, L>>,
@@ -942,7 +938,17 @@ pub async fn process_events_async<
942938
D: Deref,
943939
O: OutputSpender,
944940
K: KVStore,
945-
OS: Deref<Target = OutputSweeper<T, D, F, CF, K, L, O>>,
941+
OS: Deref<
942+
Target = OutputSweeper<
943+
<M::Target as AChainMonitor>::Broadcaster,
944+
D,
945+
<M::Target as AChainMonitor>::FeeEstimator,
946+
<M::Target as AChainMonitor>::Filter,
947+
K,
948+
L,
949+
O,
950+
>,
951+
>,
946952
S: Deref<Target = SC>,
947953
SC: for<'b> WriteableScore<'b>,
948954
SleepFuture: core::future::Future<Output = bool> + core::marker::Unpin,
@@ -955,7 +961,7 @@ pub async fn process_events_async<
955961
sleeper: Sleeper, mobile_interruptable_platform: bool, fetch_time: FetchTime,
956962
) -> Result<(), lightning::io::Error>
957963
where
958-
P::Target: Persist<<CM::Target as AChannelManager>::Signer>,
964+
M::Target: AChainMonitor<Signer = <CM::Target as AChannelManager>::Signer, Logger = L>,
959965
CM::Target: AChannelManager,
960966
OM::Target: AOnionMessenger,
961967
PM::Target: APeerManager,
@@ -1004,7 +1010,7 @@ where
10041010
log_trace!(logger, "Calling ChannelManager's timer_tick_occurred on startup");
10051011
channel_manager.get_cm().timer_tick_occurred();
10061012
log_trace!(logger, "Rebroadcasting monitor's pending claims on startup");
1007-
chain_monitor.rebroadcast_pending_claims();
1013+
chain_monitor.get_cm().rebroadcast_pending_claims();
10081014

10091015
let mut last_freshness_call = sleeper(FRESHNESS_TIMER);
10101016
let mut last_onion_message_handler_call = sleeper(ONION_MESSAGE_HANDLER_TIMER);
@@ -1022,7 +1028,7 @@ where
10221028

10231029
loop {
10241030
channel_manager.get_cm().process_pending_events_async(async_event_handler).await;
1025-
chain_monitor.process_pending_events_async(async_event_handler).await;
1031+
chain_monitor.get_cm().process_pending_events_async(async_event_handler).await;
10261032
if let Some(om) = &onion_messenger {
10271033
om.get_om().process_pending_events_async(async_event_handler).await
10281034
}
@@ -1072,7 +1078,7 @@ where
10721078
let fut = Selector {
10731079
a: sleeper(sleep_delay),
10741080
b: channel_manager.get_cm().get_event_or_persistence_needed_future(),
1075-
c: chain_monitor.get_update_future(),
1081+
c: chain_monitor.get_cm().get_update_future(),
10761082
d: om_fut,
10771083
e: lm_fut,
10781084
f: gv_fut,
@@ -1164,7 +1170,7 @@ where
11641170
};
11651171
if archive_timer_elapsed {
11661172
log_trace!(logger, "Archiving stale ChannelMonitors.");
1167-
chain_monitor.archive_fully_resolved_channel_monitors();
1173+
chain_monitor.get_cm().archive_fully_resolved_channel_monitors();
11681174
have_archived = true;
11691175
log_trace!(logger, "Archived stale ChannelMonitors.");
11701176
}
@@ -1354,7 +1360,7 @@ where
13541360
match check_and_reset_sleeper(&mut last_rebroadcast_call, || sleeper(REBROADCAST_TIMER)) {
13551361
Some(false) => {
13561362
log_trace!(logger, "Rebroadcasting monitor's pending claims");
1357-
chain_monitor.rebroadcast_pending_claims();
1363+
chain_monitor.get_cm().rebroadcast_pending_claims();
13581364
},
13591365
Some(true) => break,
13601366
None => {},
@@ -1416,16 +1422,11 @@ fn check_and_reset_sleeper<
14161422
/// synchronous background persistence.
14171423
pub async fn process_events_async_with_kv_store_sync<
14181424
UL: UtxoLookup,
1419-
CF: chain::Filter,
1420-
T: BroadcasterInterface,
1421-
F: FeeEstimator,
14221425
G: Deref<Target = NetworkGraph<L>>,
14231426
L: Logger,
1424-
P: Deref,
14251427
EventHandlerFuture: core::future::Future<Output = Result<(), ReplayEvent>>,
14261428
EventHandler: Fn(Event) -> EventHandlerFuture,
1427-
ES: EntropySource,
1428-
M: Deref<Target = ChainMonitor<<CM::Target as AChannelManager>::Signer, CF, T, F, L, P, ES>>,
1429+
M: Deref,
14291430
CM: Deref,
14301431
OM: Deref,
14311432
PGS: Deref<Target = P2PGossipSync<G, UL, L>>,
@@ -1435,7 +1436,17 @@ pub async fn process_events_async_with_kv_store_sync<
14351436
D: Deref,
14361437
O: OutputSpender,
14371438
K: Deref,
1438-
OS: Deref<Target = OutputSweeperSync<T, D, F, CF, K, L, O>>,
1439+
OS: Deref<
1440+
Target = OutputSweeperSync<
1441+
<M::Target as AChainMonitor>::Broadcaster,
1442+
D,
1443+
<M::Target as AChainMonitor>::FeeEstimator,
1444+
<M::Target as AChainMonitor>::Filter,
1445+
K,
1446+
L,
1447+
O,
1448+
>,
1449+
>,
14391450
S: Deref<Target = SC>,
14401451
SC: for<'b> WriteableScore<'b>,
14411452
SleepFuture: core::future::Future<Output = bool> + core::marker::Unpin,
@@ -1448,7 +1459,7 @@ pub async fn process_events_async_with_kv_store_sync<
14481459
sleeper: Sleeper, mobile_interruptable_platform: bool, fetch_time: FetchTime,
14491460
) -> Result<(), lightning::io::Error>
14501461
where
1451-
P::Target: Persist<<CM::Target as AChannelManager>::Signer>,
1462+
M::Target: AChainMonitor<Signer = <CM::Target as AChannelManager>::Signer, Logger = L>,
14521463
CM::Target: AChannelManager,
14531464
OM::Target: AOnionMessenger,
14541465
PM::Target: APeerManager,
@@ -1523,20 +1534,10 @@ impl BackgroundProcessor {
15231534
pub fn start<
15241535
'a,
15251536
UL: 'static + UtxoLookup,
1526-
CF: 'static + chain::Filter,
1527-
T: 'static + BroadcasterInterface,
1528-
F: 'static + FeeEstimator + Send,
15291537
G: 'static + Deref<Target = NetworkGraph<L>>,
15301538
L: 'static + Deref + Send,
1531-
P: 'static + Deref,
15321539
EH: 'static + EventHandler + Send,
1533-
ES: 'static + EntropySource + Send,
1534-
M: 'static
1535-
+ Deref<
1536-
Target = ChainMonitor<<CM::Target as AChannelManager>::Signer, CF, T, F, L, P, ES>,
1537-
>
1538-
+ Send
1539-
+ Sync,
1540+
M: 'static + Deref + Send + Sync,
15401541
CM: 'static + Deref + Send,
15411542
OM: 'static + Deref + Send,
15421543
PGS: 'static + Deref<Target = P2PGossipSync<G, UL, L>> + Send,
@@ -1548,15 +1549,27 @@ impl BackgroundProcessor {
15481549
D: 'static + Deref,
15491550
O: 'static + OutputSpender,
15501551
K: 'static + Deref + Send,
1551-
OS: 'static + Deref<Target = OutputSweeperSync<T, D, F, CF, K, L, O>> + Send,
1552+
OS: 'static
1553+
+ Deref<
1554+
Target = OutputSweeperSync<
1555+
<M::Target as AChainMonitor>::Broadcaster,
1556+
D,
1557+
<M::Target as AChainMonitor>::FeeEstimator,
1558+
<M::Target as AChainMonitor>::Filter,
1559+
K,
1560+
L,
1561+
O,
1562+
>,
1563+
>
1564+
+ Send,
15521565
>(
15531566
kv_store: K, event_handler: EH, chain_monitor: M, channel_manager: CM,
15541567
onion_messenger: Option<OM>, gossip_sync: GossipSync<PGS, RGS, G, UL, L>, peer_manager: PM,
15551568
liquidity_manager: Option<LM>, sweeper: Option<OS>, logger: L, scorer: Option<S>,
15561569
) -> Self
15571570
where
15581571
L::Target: 'static + Logger,
1559-
P::Target: 'static + Persist<<CM::Target as AChannelManager>::Signer>,
1572+
M::Target: AChainMonitor<Signer = <CM::Target as AChannelManager>::Signer, Logger = L>,
15601573
CM::Target: AChannelManager,
15611574
OM::Target: AOnionMessenger,
15621575
PM::Target: APeerManager,
@@ -1596,7 +1609,7 @@ impl BackgroundProcessor {
15961609
log_trace!(logger, "Calling ChannelManager's timer_tick_occurred on startup");
15971610
channel_manager.get_cm().timer_tick_occurred();
15981611
log_trace!(logger, "Rebroadcasting monitor's pending claims on startup");
1599-
chain_monitor.rebroadcast_pending_claims();
1612+
chain_monitor.get_cm().rebroadcast_pending_claims();
16001613

16011614
let mut last_freshness_call = Instant::now();
16021615
let mut last_onion_message_handler_call = Instant::now();
@@ -1615,7 +1628,7 @@ impl BackgroundProcessor {
16151628

16161629
loop {
16171630
channel_manager.get_cm().process_pending_events(&event_handler);
1618-
chain_monitor.process_pending_events(&event_handler);
1631+
chain_monitor.get_cm().process_pending_events(&event_handler);
16191632
if let Some(om) = &onion_messenger {
16201633
om.get_om().process_pending_events(&event_handler)
16211634
};
@@ -1648,7 +1661,7 @@ impl BackgroundProcessor {
16481661
let gv_fut = gossip_sync.validation_completion_future();
16491662
let always_futures = [
16501663
channel_manager.get_cm().get_event_or_persistence_needed_future(),
1651-
chain_monitor.get_update_future(),
1664+
chain_monitor.get_cm().get_update_future(),
16521665
];
16531666
let futures = always_futures.into_iter().chain(om_fut).chain(lm_fut).chain(gv_fut);
16541667
let sleeper = Sleeper::from_futures(futures);
@@ -1701,7 +1714,7 @@ impl BackgroundProcessor {
17011714
let archive_timer_elapsed = last_archive_call.elapsed() > archive_timer;
17021715
if archive_timer_elapsed {
17031716
log_trace!(logger, "Archiving stale ChannelMonitors.");
1704-
chain_monitor.archive_fully_resolved_channel_monitors();
1717+
chain_monitor.get_cm().archive_fully_resolved_channel_monitors();
17051718
have_archived = true;
17061719
last_archive_call = Instant::now();
17071720
log_trace!(logger, "Archived stale ChannelMonitors.");
@@ -1786,7 +1799,7 @@ impl BackgroundProcessor {
17861799
}
17871800
if last_rebroadcast_call.elapsed() > REBROADCAST_TIMER {
17881801
log_trace!(logger, "Rebroadcasting monitor's pending claims");
1789-
chain_monitor.rebroadcast_pending_claims();
1802+
chain_monitor.get_cm().rebroadcast_pending_claims();
17901803
last_rebroadcast_call = Instant::now();
17911804
}
17921805
}

lightning/src/chain/chainmonitor.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,6 +1488,66 @@ where
14881488
}
14891489
}
14901490

1491+
/// A trivial trait which describes any [`ChainMonitor`].
1492+
///
1493+
/// This is not exported to bindings users as general cover traits aren't useful in other
1494+
/// languages.
1495+
pub trait AChainMonitor {
1496+
/// A type implementing [`EcdsaChannelSigner`].
1497+
type Signer: EcdsaChannelSigner + Sized;
1498+
/// A type implementing [`chain::Filter`].
1499+
type Filter: chain::Filter;
1500+
/// A type implementing [`BroadcasterInterface`].
1501+
type Broadcaster: BroadcasterInterface;
1502+
/// A type implementing [`FeeEstimator`].
1503+
type FeeEstimator: FeeEstimator;
1504+
/// A type implementing [`Logger`].
1505+
type Logger: Logger;
1506+
/// A type that derefs to [`Persist`].
1507+
type Persister: Deref<Target = Self::PersisterTarget>;
1508+
/// The target of [`Self::Persister`].
1509+
type PersisterTarget: Persist<Self::Signer> + ?Sized;
1510+
/// A type implementing [`EntropySource`].
1511+
type EntropySource: EntropySource;
1512+
/// Returns a reference to the actual [`ChainMonitor`] object.
1513+
fn get_cm(
1514+
&self,
1515+
) -> &ChainMonitor<
1516+
Self::Signer,
1517+
Self::Filter,
1518+
Self::Broadcaster,
1519+
Self::FeeEstimator,
1520+
Self::Logger,
1521+
Self::Persister,
1522+
Self::EntropySource,
1523+
>;
1524+
}
1525+
1526+
impl<
1527+
ChannelSigner: EcdsaChannelSigner,
1528+
C: chain::Filter,
1529+
T: BroadcasterInterface,
1530+
F: FeeEstimator,
1531+
L: Logger,
1532+
P: Deref,
1533+
ES: EntropySource,
1534+
> AChainMonitor for ChainMonitor<ChannelSigner, C, T, F, L, P, ES>
1535+
where
1536+
P::Target: Persist<ChannelSigner>,
1537+
{
1538+
type Signer = ChannelSigner;
1539+
type Filter = C;
1540+
type Broadcaster = T;
1541+
type FeeEstimator = F;
1542+
type Logger = L;
1543+
type Persister = P;
1544+
type PersisterTarget = P::Target;
1545+
type EntropySource = ES;
1546+
fn get_cm(&self) -> &ChainMonitor<ChannelSigner, C, T, F, L, P, ES> {
1547+
self
1548+
}
1549+
}
1550+
14911551
#[cfg(test)]
14921552
mod tests {
14931553
use crate::chain::channelmonitor::ANTI_REORG_DELAY;

0 commit comments

Comments
 (0)