Skip to content

Commit 0a4efd6

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 ae6c3bb commit 0a4efd6

File tree

7 files changed

+24
-6
lines changed

7 files changed

+24
-6
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ impl TestChainMonitor {
285285
Arc::clone(&persister),
286286
Arc::clone(&keys),
287287
keys.get_peer_storage_key(),
288+
false,
288289
)),
289290
logger,
290291
keys,

fuzz/src/full_stack.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
597597
Arc::new(TestPersister { update_ret: Mutex::new(ChannelMonitorUpdateStatus::Completed) }),
598598
Arc::clone(&keys_manager),
599599
keys_manager.get_peer_storage_key(),
600+
false,
600601
));
601602

602603
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
@@ -371,6 +371,9 @@ pub struct ChainMonitor<
371371

372372
#[cfg(peer_storage)]
373373
our_peerstorage_encryption_key: PeerStorageKey,
374+
375+
/// When `true`, [`chain::Watch`] operations are queued rather than executed immediately.
376+
deferred: bool,
374377
}
375378

376379
impl<
@@ -397,7 +400,7 @@ where
397400
pub fn new_async_beta(
398401
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F,
399402
persister: MonitorUpdatingPersisterAsync<K, S, L, ES, SP, T, F>, _entropy_source: ES,
400-
_our_peerstorage_encryption_key: PeerStorageKey,
403+
_our_peerstorage_encryption_key: PeerStorageKey, deferred: bool,
401404
) -> Self {
402405
let event_notifier = Arc::new(Notifier::new());
403406
Self {
@@ -414,6 +417,7 @@ where
414417
pending_send_only_events: Mutex::new(Vec::new()),
415418
#[cfg(peer_storage)]
416419
our_peerstorage_encryption_key: _our_peerstorage_encryption_key,
420+
deferred,
417421
}
418422
}
419423
}
@@ -603,7 +607,7 @@ where
603607
/// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
604608
pub fn new(
605609
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P,
606-
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey,
610+
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey, deferred: bool,
607611
) -> Self {
608612
Self {
609613
monitors: RwLock::new(new_hash_map()),
@@ -619,6 +623,7 @@ where
619623
pending_send_only_events: Mutex::new(Vec::new()),
620624
#[cfg(peer_storage)]
621625
our_peerstorage_encryption_key: _our_peerstorage_encryption_key,
626+
deferred,
622627
}
623628
}
624629

@@ -1426,13 +1431,21 @@ where
14261431
fn watch_channel(
14271432
&self, channel_id: ChannelId, monitor: ChannelMonitor<ChannelSigner>,
14281433
) -> Result<ChannelMonitorUpdateStatus, ()> {
1429-
self.watch_channel_internal(channel_id, monitor)
1434+
if !self.deferred {
1435+
return self.watch_channel_internal(channel_id, monitor);
1436+
}
1437+
1438+
unimplemented!();
14301439
}
14311440

14321441
fn update_channel(
14331442
&self, channel_id: ChannelId, update: &ChannelMonitorUpdate,
14341443
) -> ChannelMonitorUpdateStatus {
1435-
self.update_channel_internal(channel_id, update)
1444+
if !self.deferred {
1445+
return self.update_channel_internal(channel_id, update);
1446+
}
1447+
1448+
unimplemented!();
14361449
}
14371450

14381451
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
@@ -4918,6 +4918,7 @@ fn native_async_persist() {
49184918
native_async_persister,
49194919
Arc::clone(&keys_manager),
49204920
keys_manager.get_peer_storage_key(),
4921+
false,
49214922
);
49224923

49234924
// 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
@@ -20641,7 +20641,7 @@ pub mod bench {
2064120641

2064220642
let seed_a = [1u8; 32];
2064320643
let keys_manager_a = KeysManager::new(&seed_a, 42, 42, true);
20644-
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());
20644+
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);
2064520645
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 {
2064620646
network,
2064720647
best_block: BestBlock::from_network(network),
@@ -20651,7 +20651,7 @@ pub mod bench {
2065120651
let logger_b = test_utils::TestLogger::with_id("node a".to_owned());
2065220652
let seed_b = [2u8; 32];
2065320653
let keys_manager_b = KeysManager::new(&seed_b, 42, 42, true);
20654-
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());
20654+
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);
2065520655
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 {
2065620656
network,
2065720657
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
@@ -537,6 +537,7 @@ impl<'a> TestChainMonitor<'a> {
537537
persister,
538538
keys_manager,
539539
keys_manager.get_peer_storage_key(),
540+
false,
540541
),
541542
keys_manager,
542543
expect_channel_force_closed: Mutex::new(None),

0 commit comments

Comments
 (0)