Skip to content

Commit dcfb304

Browse files
joostjagerclaude
andcommitted
Add deferred bool to ChainMonitor
Add a `deferred` parameter to `ChainMonitor::new` and `ChainMonitor::new_async_beta`. When set to true, the Watch trait methods (watch_channel and update_channel) will unimplemented!() for now. All existing callers pass false to preserve current behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 939f798 commit dcfb304

7 files changed

Lines changed: 24 additions & 6 deletions

File tree

fuzz/src/chanmon_consistency.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ impl TestChainMonitor {
282282
Arc::clone(&persister),
283283
Arc::clone(&keys),
284284
keys.get_peer_storage_key(),
285+
false,
285286
)),
286287
logger,
287288
keys,

fuzz/src/full_stack.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger + MaybeSend + MaybeSync>
603603
Arc::new(TestPersister { update_ret: Mutex::new(ChannelMonitorUpdateStatus::Completed) }),
604604
Arc::clone(&keys_manager),
605605
keys_manager.get_peer_storage_key(),
606+
false,
606607
));
607608

608609
let network = Network::Bitcoin;

fuzz/src/lsps_message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub fn do_test(data: &[u8]) {
5959
Arc::clone(&kv_store),
6060
Arc::clone(&keys_manager),
6161
keys_manager.get_peer_storage_key(),
62+
false,
6263
));
6364
let best_block = BestBlock::from_network(network);
6465
let params = ChainParameters { network, best_block };

lightning/src/chain/chainmonitor.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ pub struct ChainMonitor<
373373

374374
#[cfg(peer_storage)]
375375
our_peerstorage_encryption_key: PeerStorageKey,
376+
377+
/// When `true`, [`chain::Watch`] operations are queued rather than executed immediately.
378+
deferred: bool,
376379
}
377380

378381
impl<
@@ -399,7 +402,7 @@ where
399402
pub fn new_async_beta(
400403
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F,
401404
persister: MonitorUpdatingPersisterAsync<K, S, L, ES, SP, T, F>, _entropy_source: ES,
402-
_our_peerstorage_encryption_key: PeerStorageKey,
405+
_our_peerstorage_encryption_key: PeerStorageKey, deferred: bool,
403406
) -> Self {
404407
let event_notifier = Arc::new(Notifier::new());
405408
Self {
@@ -416,6 +419,7 @@ where
416419
pending_send_only_events: Mutex::new(Vec::new()),
417420
#[cfg(peer_storage)]
418421
our_peerstorage_encryption_key: _our_peerstorage_encryption_key,
422+
deferred,
419423
}
420424
}
421425
}
@@ -605,7 +609,7 @@ where
605609
/// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
606610
pub fn new(
607611
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P,
608-
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey,
612+
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey, deferred: bool,
609613
) -> Self {
610614
Self {
611615
monitors: RwLock::new(new_hash_map()),
@@ -621,6 +625,7 @@ where
621625
pending_send_only_events: Mutex::new(Vec::new()),
622626
#[cfg(peer_storage)]
623627
our_peerstorage_encryption_key: _our_peerstorage_encryption_key,
628+
deferred,
624629
}
625630
}
626631

@@ -1428,13 +1433,21 @@ where
14281433
fn watch_channel(
14291434
&self, channel_id: ChannelId, monitor: ChannelMonitor<ChannelSigner>,
14301435
) -> Result<ChannelMonitorUpdateStatus, ()> {
1431-
self.watch_channel_internal(channel_id, monitor)
1436+
if !self.deferred {
1437+
return self.watch_channel_internal(channel_id, monitor);
1438+
}
1439+
1440+
unimplemented!();
14321441
}
14331442

14341443
fn update_channel(
14351444
&self, channel_id: ChannelId, update: &ChannelMonitorUpdate,
14361445
) -> ChannelMonitorUpdateStatus {
1437-
self.update_channel_internal(channel_id, update)
1446+
if !self.deferred {
1447+
return self.update_channel_internal(channel_id, update);
1448+
}
1449+
1450+
unimplemented!();
14381451
}
14391452

14401453
fn release_pending_monitor_events(

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4924,6 +4924,7 @@ fn native_async_persist() {
49244924
native_async_persister,
49254925
Arc::clone(&keys_manager),
49264926
keys_manager.get_peer_storage_key(),
4927+
false,
49274928
);
49284929

49294930
// Write the initial ChannelMonitor async, testing primarily that the `MonitorEvent::Completed`

lightning/src/ln/channelmanager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21093,7 +21093,7 @@ pub mod bench {
2109321093

2109421094
let seed_a = [1u8; 32];
2109521095
let keys_manager_a = KeysManager::new(&seed_a, 42, 42, true);
21096-
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a, &keys_manager_a, keys_manager_a.get_peer_storage_key());
21096+
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a, &keys_manager_a, keys_manager_a.get_peer_storage_key(), false);
2109721097
let node_a = ChannelManager::new(&fee_estimator, &chain_monitor_a, &tx_broadcaster, &router, &message_router, &logger_a, &keys_manager_a, &keys_manager_a, &keys_manager_a, config.clone(), ChainParameters {
2109821098
network,
2109921099
best_block: BestBlock::from_network(network),
@@ -21103,7 +21103,7 @@ pub mod bench {
2110321103
let logger_b = test_utils::TestLogger::with_id("node a".to_owned());
2110421104
let seed_b = [2u8; 32];
2110521105
let keys_manager_b = KeysManager::new(&seed_b, 42, 42, true);
21106-
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b, &keys_manager_b, keys_manager_b.get_peer_storage_key());
21106+
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b, &keys_manager_b, keys_manager_b.get_peer_storage_key(), false);
2110721107
let node_b = ChannelManager::new(&fee_estimator, &chain_monitor_b, &tx_broadcaster, &router, &message_router, &logger_b, &keys_manager_b, &keys_manager_b, &keys_manager_b, config.clone(), ChainParameters {
2110821108
network,
2110921109
best_block: BestBlock::from_network(network),

lightning/src/util/test_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,7 @@ impl<'a> TestChainMonitor<'a> {
536536
persister,
537537
keys_manager,
538538
keys_manager.get_peer_storage_key(),
539+
false,
539540
),
540541
keys_manager,
541542
expect_channel_force_closed: Mutex::new(None),

0 commit comments

Comments
 (0)