diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index bb290deba9c..aa9d44ae7dc 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -36,7 +36,7 @@ use crate::chain::transaction::{OutPoint, TransactionData}; use crate::chain::{ChannelMonitorUpdateStatus, Filter, WatchedOutput}; use crate::events::{self, Event, EventHandler, ReplayEvent}; use crate::ln::channel_state::ChannelDetails; -use crate::ln::msgs::{self, BaseMessageHandler, Init, MessageSendEvent}; +use crate::ln::msgs::{self, BaseMessageHandler, Init, MessageSendEvent, SendOnlyMessageHandler}; use crate::ln::our_peer_storage::DecryptedOurPeerStorage; use crate::ln::types::ChannelId; use crate::prelude::*; @@ -866,6 +866,25 @@ where } } +impl< + ChannelSigner: EcdsaChannelSigner, + C: Deref, + T: Deref, + F: Deref, + L: Deref, + P: Deref, + ES: Deref, + > SendOnlyMessageHandler for ChainMonitor +where + C::Target: chain::Filter, + T::Target: BroadcasterInterface, + F::Target: FeeEstimator, + L::Target: Logger, + P::Target: Persist, + ES::Target: EntropySource, +{ +} + impl< ChannelSigner: EcdsaChannelSigner, C: Deref, diff --git a/lightning/src/ln/msgs.rs b/lightning/src/ln/msgs.rs index 2cf7e109eb1..da5cdf7c9de 100644 --- a/lightning/src/ln/msgs.rs +++ b/lightning/src/ln/msgs.rs @@ -2177,6 +2177,13 @@ pub trait OnionMessageHandler: BaseMessageHandler { fn timer_tick_occurred(&self); } +/// A handler which can only be used to send messages. +/// +/// This is implemented by [`ChainMonitor`]. +/// +/// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor +pub trait SendOnlyMessageHandler: BaseMessageHandler {} + #[derive(Clone, Debug, PartialEq, Eq)] /// Information communicated in the onion to the recipient for multi-part tracking and proof that /// the payment is associated with an invoice. diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 66b3e00818d..ef79fa4b30d 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -22,7 +22,7 @@ use crate::blinded_path::message::{AsyncPaymentsContext, DNSResolverContext, Off use crate::ln::msgs; use crate::ln::msgs::{ BaseMessageHandler, ChannelMessageHandler, Init, LightningError, MessageSendEvent, - OnionMessageHandler, RoutingMessageHandler, SocketAddress, + OnionMessageHandler, RoutingMessageHandler, SendOnlyMessageHandler, SocketAddress, }; use crate::ln::peer_channel_encryptor::{ MessageBuf, NextNoiseStep, PeerChannelEncryptor, MSG_BUF_ALLOC_SIZE, @@ -270,6 +270,8 @@ impl CustomOnionMessageHandler for IgnoringMessageHandler { } } +impl SendOnlyMessageHandler for IgnoringMessageHandler {} + impl OnionMessageContents for Infallible { fn tlv_type(&self) -> u64 { unreachable!(); @@ -581,7 +583,7 @@ where RM::Target: RoutingMessageHandler, OM::Target: OnionMessageHandler, CustomM::Target: CustomMessageHandler, - SM::Target: BaseMessageHandler, + SM::Target: SendOnlyMessageHandler, { /// A message handler which handles messages specific to channels. Usually this is just a /// [`ChannelManager`] object or an [`ErroringMessageHandler`]. @@ -604,8 +606,9 @@ where /// [`IgnoringMessageHandler`]. pub custom_message_handler: CustomM, - /// A message handler which can be used to send messages. This should generally be a - /// [`ChainMonitor`]. + /// A message handler which can be used to send messages. + /// + /// This should generally be a [`ChainMonitor`]. /// /// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor pub send_only_message_handler: SM, @@ -965,7 +968,7 @@ pub trait APeerManager { type CMH: Deref; type NST: NodeSigner + ?Sized; type NS: Deref; - type SMT: BaseMessageHandler + ?Sized; + type SMT: SendOnlyMessageHandler + ?Sized; type SM: Deref; /// Gets a reference to the underlying [`PeerManager`]. fn as_ref( @@ -999,7 +1002,7 @@ where L::Target: Logger, CMH::Target: CustomMessageHandler, NS::Target: NodeSigner, - SM::Target: BaseMessageHandler, + SM::Target: SendOnlyMessageHandler, { type Descriptor = Descriptor; type CMT = ::Target; @@ -1056,7 +1059,7 @@ pub struct PeerManager< L::Target: Logger, CMH::Target: CustomMessageHandler, NS::Target: NodeSigner, - SM::Target: BaseMessageHandler, + SM::Target: SendOnlyMessageHandler, { message_handler: MessageHandler, /// Connection state for each connected peer - we have an outer read-write lock which is taken @@ -1140,7 +1143,7 @@ where OM::Target: OnionMessageHandler, L::Target: Logger, NS::Target: NodeSigner, - SM::Target: BaseMessageHandler, + SM::Target: SendOnlyMessageHandler, { /// Constructs a new `PeerManager` with the given `ChannelMessageHandler` and /// `OnionMessageHandler`. No routing message handler is used and network graph messages are @@ -1290,7 +1293,7 @@ where L::Target: Logger, CMH::Target: CustomMessageHandler, NS::Target: NodeSigner, - SM::Target: BaseMessageHandler, + SM::Target: SendOnlyMessageHandler, { /// Constructs a new `PeerManager` with the given message handlers. /// @@ -3841,6 +3844,8 @@ mod tests { } } + impl SendOnlyMessageHandler for TestBaseMsgHandler {} + fn create_peermgr_cfgs(peer_count: usize) -> Vec { let mut cfgs = Vec::new(); for i in 0..peer_count {