Skip to content

Commit 2d6ad40

Browse files
Aditya Sharmaadi2011
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 ead620a commit 2d6ad40

File tree

9 files changed

+127
-29
lines changed

9 files changed

+127
-29
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 1 addition & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
649649
/// # type ChannelManager<B, F, FE> = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor<B, F, FE>, B, FE, Logger>;
650650
/// # type OnionMessenger<B, F, FE> = lightning::onion_message::messenger::OnionMessenger<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<Logger>, Arc<ChannelManager<B, F, FE>>, Arc<lightning::onion_message::messenger::DefaultMessageRouter<Arc<NetworkGraph>, Arc<Logger>, Arc<lightning::sign::KeysManager>>>, Arc<ChannelManager<B, F, FE>>, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler>;
651651
/// # type Scorer = RwLock<lightning::routing::scoring::ProbabilisticScorer<Arc<NetworkGraph>, Arc<Logger>>>;
652-
/// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger>;
652+
/// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger, F, Store>;
653653
/// #
654654
/// # struct Node<
655655
/// # B: lightning::chain::chaininterface::BroadcasterInterface + Send + Sync + 'static,
@@ -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/src/manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ where {
300300
/// # type MyFilter = dyn lightning::chain::Filter + Send + Sync;
301301
/// # type MyLogger = dyn lightning::util::logger::Logger + Send + Sync;
302302
/// # type MyChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::sign::InMemorySigner, Arc<MyFilter>, Arc<MyBroadcaster>, Arc<MyFeeEstimator>, Arc<MyLogger>, Arc<MyStore>>;
303-
/// # type MyPeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<MySocketDescriptor, MyChainMonitor, MyBroadcaster, MyFeeEstimator, Arc<MyUtxoLookup>, MyLogger>;
303+
/// # type MyPeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<MySocketDescriptor, MyChainMonitor, MyBroadcaster, MyFeeEstimator, Arc<MyUtxoLookup>, MyLogger, MyFilter, MyStore>;
304304
/// # type MyNetworkGraph = lightning::routing::gossip::NetworkGraph<Arc<MyLogger>>;
305305
/// # type MyGossipSync = lightning::routing::gossip::P2PGossipSync<Arc<MyNetworkGraph>, Arc<MyUtxoLookup>, Arc<MyLogger>>;
306306
/// # type MyChannelManager = lightning::ln::channelmanager::SimpleArcChannelManager<MyChainMonitor, MyBroadcaster, MyFeeEstimator, MyLogger>;

lightning-liquidity/tests/common/mod.rs

Lines changed: 4 additions & 1 deletion
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: Arc::clone(&chain_monitor),
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 57 additions & 2 deletions
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;
@@ -215,6 +216,9 @@ impl<ChannelSigner: EcdsaChannelSigner> Deref for LockedChannelMonitor<'_, Chann
215216
}
216217
}
217218

219+
/// Represents Secret Key used for encrypting Peer Storage.
220+
type PeerStorageKey = [u8; 32];
221+
218222
/// An implementation of [`chain::Watch`] for monitoring channels.
219223
///
220224
/// Connected and disconnected blocks must be provided to `ChainMonitor` as documented by
@@ -253,6 +257,7 @@ pub struct ChainMonitor<ChannelSigner: EcdsaChannelSigner, C: Deref, T: Deref, F
253257
/// A [`Notifier`] used to wake up the background processor in case we have any [`Event`]s for
254258
/// it to give to users (or [`MonitorEvent`]s for `ChannelManager` to process).
255259
event_notifier: Notifier,
260+
pending_send_only_events: Mutex<Vec<MessageSendEvent>>,
256261
}
257262

258263
impl<ChannelSigner: EcdsaChannelSigner, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref> ChainMonitor<ChannelSigner, C, T, F, L, P>
@@ -386,7 +391,15 @@ where C::Target: chain::Filter,
386391
/// pre-filter blocks or only fetch blocks matching a compact filter. Otherwise, clients may
387392
/// always need to fetch full blocks absent another means for determining which blocks contain
388393
/// transactions relevant to the watched channels.
389-
pub fn new(chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P) -> Self {
394+
///
395+
/// # Note
396+
/// `our_peerstorage_encryption_key` must be obtained from [`crate::sign::NodeSigner::get_peer_storage_key()`].
397+
/// This key is used to encrypt peer storage backups.
398+
///
399+
/// **Important**: This key should not be set arbitrarily or changed after initialization. The same key
400+
/// is obtained by the `ChannelManager` through `KeyMananger` to decrypt peer backups.
401+
/// Using an inconsistent or incorrect key will result in the inability to decrypt previously encrypted backups.
402+
pub fn new(chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P, our_peerstorage_encryption_key: PeerStorageKey) -> Self {
390403
Self {
391404
monitors: RwLock::new(new_hash_map()),
392405
chain_source,
@@ -397,6 +410,7 @@ where C::Target: chain::Filter,
397410
pending_monitor_events: Mutex::new(Vec::new()),
398411
highest_chain_height: AtomicUsize::new(0),
399412
event_notifier: Notifier::new(),
413+
pending_send_only_events: Mutex::new(Vec::new()),
400414
}
401415
}
402416

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

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

0 commit comments

Comments
 (0)