Skip to content

Commit 28d60ec

Browse files
Aditya Sharmaadi2011
Aditya Sharma
authored andcommitted
Enable ChainMonitor to distribute PeerStorage
To enable ChainMonitor sending peer storage to channel partners whenever a new block is added, We implement BaseMessageHandler for ChainMonitor. This allows the `ChainMonitor` to handle the peer storage distribution. Key changes: - Add BaseMessageHandler into the MessageHandler. - Implement BaseMessageHandler for ChainMonitor. - Process BaseMessageHandler events inside process_events().
1 parent 3778b81 commit 28d60ec

File tree

8 files changed

+118
-25
lines changed

8 files changed

+118
-25
lines changed

fuzz/src/chanmon_consistency.rs

+1
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ impl TestChainMonitor {
204204
logger.clone(),
205205
feeest,
206206
Arc::clone(&persister),
207+
keys.get_peer_storage_key(),
207208
)),
208209
logger,
209210
keys,

fuzz/src/full_stack.rs

+3
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ type PeerMan<'a> = PeerManager<
242242
Arc<dyn Logger>,
243243
IgnoringMessageHandler,
244244
Arc<KeyProvider>,
245+
IgnoringMessageHandler,
245246
>;
246247

247248
struct MoneyLossDetector<'a> {
@@ -626,6 +627,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
626627
Arc::clone(&logger),
627628
fee_est.clone(),
628629
Arc::new(TestPersister { update_ret: Mutex::new(ChannelMonitorUpdateStatus::Completed) }),
630+
keys_manager.get_peer_storage_key(),
629631
));
630632

631633
let network = Network::Bitcoin;
@@ -659,6 +661,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
659661
route_handler: gossip_sync.clone(),
660662
onion_message_handler: IgnoringMessageHandler {},
661663
custom_message_handler: IgnoringMessageHandler {},
664+
send_only_message_handler: IgnoringMessageHandler {},
662665
};
663666
let random_data = [
664667
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

lightning-background-processor/src/lib.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,7 @@ mod tests {
10851085
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
10861086
use lightning::routing::router::{CandidateRouteHop, DefaultRouter, Path, RouteHop};
10871087
use lightning::routing::scoring::{ChannelUsage, LockableScore, ScoreLookUp, ScoreUpdate};
1088-
use lightning::sign::{ChangeDestinationSource, InMemorySigner, KeysManager};
1088+
use lightning::sign::{ChangeDestinationSource, InMemorySigner, KeysManager, NodeSigner};
10891089
use lightning::types::features::{ChannelFeatures, NodeFeatures};
10901090
use lightning::types::payment::PaymentHash;
10911091
use lightning::util::config::UserConfig;
@@ -1208,6 +1208,7 @@ mod tests {
12081208
Arc<test_utils::TestLogger>,
12091209
IgnoringMessageHandler,
12101210
Arc<KeysManager>,
1211+
IgnoringMessageHandler,
12111212
>,
12121213
>,
12131214
chain_monitor: Arc<ChainMonitor>,
@@ -1568,6 +1569,7 @@ mod tests {
15681569
logger.clone(),
15691570
fee_estimator.clone(),
15701571
kv_store.clone(),
1572+
keys_manager.get_peer_storage_key(),
15711573
));
15721574
let best_block = BestBlock::from_network(network);
15731575
let params = ChainParameters { network, best_block };
@@ -1621,6 +1623,7 @@ mod tests {
16211623
route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new()),
16221624
onion_message_handler: messenger.clone(),
16231625
custom_message_handler: IgnoringMessageHandler {},
1626+
send_only_message_handler: IgnoringMessageHandler {},
16241627
};
16251628
let peer_manager = Arc::new(PeerManager::new(
16261629
msg_handler,

lightning-liquidity/tests/common/mod.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#![allow(unused_macros)]
66

77
use lightning::chain::Filter;
8-
use lightning::sign::EntropySource;
8+
use lightning::sign::{EntropySource, NodeSigner};
99

1010
use bitcoin::blockdata::constants::{genesis_block, ChainHash};
1111
use bitcoin::blockdata::transaction::Transaction;
@@ -130,6 +130,7 @@ pub(crate) struct Node {
130130
>,
131131
>,
132132
Arc<KeysManager>,
133+
Arc<ChainMonitor>,
133134
>,
134135
>,
135136
pub(crate) liquidity_manager:
@@ -430,6 +431,7 @@ pub(crate) fn create_liquidity_node(
430431
logger.clone(),
431432
fee_estimator.clone(),
432433
kv_store.clone(),
434+
keys_manager.get_peer_storage_key(),
433435
));
434436
let best_block = BestBlock::from_network(network);
435437
let chain_params = ChainParameters { network, best_block };
@@ -465,6 +467,7 @@ pub(crate) fn create_liquidity_node(
465467
chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new(
466468
ChainHash::using_genesis_block(Network::Testnet),
467469
)),
470+
send_only_message_handler: chain_monitor.clone(),
468471
route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new()),
469472
onion_message_handler: IgnoringMessageHandler {},
470473
custom_message_handler: Arc::clone(&liquidity_manager),

lightning-net-tokio/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,7 @@ mod tests {
832832
route_handler: Arc::clone(&a_handler),
833833
onion_message_handler: Arc::new(IgnoringMessageHandler {}),
834834
custom_message_handler: Arc::new(IgnoringMessageHandler {}),
835+
send_only_message_handler: Arc::new(IgnoringMessageHandler {}),
835836
};
836837
let a_manager = Arc::new(PeerManager::new(
837838
a_msg_handler,
@@ -855,6 +856,7 @@ mod tests {
855856
route_handler: Arc::clone(&b_handler),
856857
onion_message_handler: Arc::new(IgnoringMessageHandler {}),
857858
custom_message_handler: Arc::new(IgnoringMessageHandler {}),
859+
send_only_message_handler: Arc::new(IgnoringMessageHandler {}),
858860
};
859861
let b_manager = Arc::new(PeerManager::new(
860862
b_msg_handler,
@@ -917,6 +919,7 @@ mod tests {
917919
onion_message_handler: Arc::new(IgnoringMessageHandler {}),
918920
route_handler: Arc::new(lightning::ln::peer_handler::IgnoringMessageHandler {}),
919921
custom_message_handler: Arc::new(IgnoringMessageHandler {}),
922+
send_only_message_handler: Arc::new(IgnoringMessageHandler {}),
920923
};
921924
let a_manager = Arc::new(PeerManager::new(
922925
a_msg_handler,

lightning/src/chain/chainmonitor.rs

+55-2
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,17 @@ use crate::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
3232
use crate::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, Balance, MonitorEvent, TransactionOutputs, WithChannelMonitor};
3333
use crate::chain::transaction::{OutPoint, TransactionData};
3434
use crate::ln::types::ChannelId;
35+
use crate::ln::msgs::{self, BaseMessageHandler, Init, MessageSendEvent};
3536
use crate::sign::ecdsa::EcdsaChannelSigner;
3637
use crate::events::{self, Event, EventHandler, ReplayEvent};
3738
use crate::util::logger::{Logger, WithContext};
3839
use crate::util::errors::APIError;
3940
use crate::util::persist::MonitorName;
4041
use crate::util::wakers::{Future, Notifier};
4142
use crate::ln::channel_state::ChannelDetails;
42-
4343
use crate::prelude::*;
4444
use crate::sync::{RwLock, RwLockReadGuard, Mutex, MutexGuard};
45+
use crate::types::features::{InitFeatures, NodeFeatures};
4546
use core::ops::Deref;
4647
use core::sync::atomic::{AtomicUsize, Ordering};
4748
use bitcoin::secp256k1::PublicKey;
@@ -253,6 +254,7 @@ pub struct ChainMonitor<ChannelSigner: EcdsaChannelSigner, C: Deref, T: Deref, F
253254
/// A [`Notifier`] used to wake up the background processor in case we have any [`Event`]s for
254255
/// it to give to users (or [`MonitorEvent`]s for `ChannelManager` to process).
255256
event_notifier: Notifier,
257+
pending_send_only_events: Mutex<Vec<MessageSendEvent>>,
256258
}
257259

258260
impl<ChannelSigner: EcdsaChannelSigner, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref> ChainMonitor<ChannelSigner, C, T, F, L, P>
@@ -386,7 +388,15 @@ where C::Target: chain::Filter,
386388
/// pre-filter blocks or only fetch blocks matching a compact filter. Otherwise, clients may
387389
/// always need to fetch full blocks absent another means for determining which blocks contain
388390
/// transactions relevant to the watched channels.
389-
pub fn new(chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P) -> Self {
391+
///
392+
/// # Note
393+
/// `our_peerstorage_encryption_key` must be obtained from [`crate::sign::NodeSigner::get_peer_storage_key()`].
394+
/// This key is used to encrypt peer storage backups.
395+
///
396+
/// **Important**: This key should not be set arbitrarily or changed after initialization. The same key
397+
/// is obtained by the `ChannelManager` through `KeyMananger` to decrypt peer backups.
398+
/// Using an inconsistent or incorrect key will result in the inability to decrypt previously encrypted backups.
399+
pub fn new(chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P, our_peerstorage_encryption_key: [u8; 32]) -> Self {
390400
Self {
391401
monitors: RwLock::new(new_hash_map()),
392402
chain_source,
@@ -397,6 +407,7 @@ where C::Target: chain::Filter,
397407
pending_monitor_events: Mutex::new(Vec::new()),
398408
highest_chain_height: AtomicUsize::new(0),
399409
event_notifier: Notifier::new(),
410+
pending_send_only_events: Mutex::new(Vec::new()),
400411
}
401412
}
402413

@@ -665,6 +676,48 @@ where C::Target: chain::Filter,
665676
});
666677
}
667678
}
679+
680+
/// Retrieves all node IDs associated with the monitors.
681+
///
682+
/// This function collects the counterparty node IDs from all monitors into a `HashSet`,
683+
/// ensuring unique IDs are returned.
684+
fn get_peer_node_ids(&self) -> HashSet<PublicKey> {
685+
let mon = self.monitors.read().unwrap();
686+
mon
687+
.values()
688+
.map(|monitor| monitor.monitor.get_counterparty_node_id().clone())
689+
.collect()
690+
}
691+
692+
fn send_peer_storage(&self, their_node_id: PublicKey) {
693+
// TODO: Serialize `ChannelMonitor`s inside `our_peer_storage` and update [`OurPeerStorage::block_height`] accordingly.
694+
}
695+
}
696+
697+
impl<ChannelSigner: EcdsaChannelSigner, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref> BaseMessageHandler for ChainMonitor<ChannelSigner, C, T, F, L, P>
698+
where C::Target: chain::Filter,
699+
T::Target: BroadcasterInterface,
700+
F::Target: FeeEstimator,
701+
L::Target: Logger,
702+
P::Target: Persist<ChannelSigner>,
703+
{
704+
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> {
705+
let mut pending_events = self.pending_send_only_events.lock().unwrap();
706+
let mut ret = Vec::new();
707+
core::mem::swap(&mut ret, &mut *pending_events);
708+
ret }
709+
710+
fn peer_disconnected(&self, _their_node_id: PublicKey) {}
711+
712+
fn provided_node_features(&self) -> NodeFeatures {
713+
NodeFeatures::empty()
714+
}
715+
716+
fn provided_init_features(&self, _their_node_id: PublicKey) -> InitFeatures {
717+
InitFeatures::empty()
718+
}
719+
720+
fn peer_connected(&self, _their_node_id: PublicKey, _msg: &Init, _inbound: bool) -> Result<(), ()> { Ok(()) }
668721
}
669722

670723
impl<ChannelSigner: EcdsaChannelSigner, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref>

0 commit comments

Comments
 (0)