Skip to content

Commit 3da1368

Browse files
committed
Introduce SendOnlyMessageHandler trait
Previously, we introduced a new `send_only_message_handler: BaseMessageHandler` field to `MessageHandler`, which we expect to only ever be implemented by `ChainMonitor`. However, given that more objects implement `BaseMessageHandler`, the API allowed to plugin different objects, such as `ChannelManager`, resulting in unexpected behavior. Here, we resolve this by introducing a new super trait `SendOnlyMessageHandler` that is only implemented by `ChainMonitor`.
1 parent 42085b9 commit 3da1368

File tree

3 files changed

+41
-10
lines changed

3 files changed

+41
-10
lines changed

lightning/src/chain/chainmonitor.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use crate::chain::transaction::{OutPoint, TransactionData};
3636
use crate::chain::{ChannelMonitorUpdateStatus, Filter, WatchedOutput};
3737
use crate::events::{self, Event, EventHandler, ReplayEvent};
3838
use crate::ln::channel_state::ChannelDetails;
39-
use crate::ln::msgs::{self, BaseMessageHandler, Init, MessageSendEvent};
39+
use crate::ln::msgs::{self, BaseMessageHandler, Init, MessageSendEvent, SendOnlyMessageHandler};
4040
use crate::ln::our_peer_storage::DecryptedOurPeerStorage;
4141
use crate::ln::types::ChannelId;
4242
use crate::prelude::*;
@@ -866,6 +866,25 @@ where
866866
}
867867
}
868868

869+
impl<
870+
ChannelSigner: EcdsaChannelSigner,
871+
C: Deref,
872+
T: Deref,
873+
F: Deref,
874+
L: Deref,
875+
P: Deref,
876+
ES: Deref,
877+
> SendOnlyMessageHandler for ChainMonitor<ChannelSigner, C, T, F, L, P, ES>
878+
where
879+
C::Target: chain::Filter,
880+
T::Target: BroadcasterInterface,
881+
F::Target: FeeEstimator,
882+
L::Target: Logger,
883+
P::Target: Persist<ChannelSigner>,
884+
ES::Target: EntropySource,
885+
{
886+
}
887+
869888
impl<
870889
ChannelSigner: EcdsaChannelSigner,
871890
C: Deref,

lightning/src/ln/msgs.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2177,6 +2177,13 @@ pub trait OnionMessageHandler: BaseMessageHandler {
21772177
fn timer_tick_occurred(&self);
21782178
}
21792179

2180+
/// A handler which can only be used to send messages.
2181+
///
2182+
/// This is mostly implemented by [`ChainMonitor`].
2183+
///
2184+
/// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor
2185+
pub trait SendOnlyMessageHandler: BaseMessageHandler {}
2186+
21802187
#[derive(Clone, Debug, PartialEq, Eq)]
21812188
/// Information communicated in the onion to the recipient for multi-part tracking and proof that
21822189
/// the payment is associated with an invoice.

lightning/src/ln/peer_handler.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::blinded_path::message::{AsyncPaymentsContext, DNSResolverContext, Off
2222
use crate::ln::msgs;
2323
use crate::ln::msgs::{
2424
BaseMessageHandler, ChannelMessageHandler, Init, LightningError, MessageSendEvent,
25-
OnionMessageHandler, RoutingMessageHandler, SocketAddress,
25+
OnionMessageHandler, RoutingMessageHandler, SendOnlyMessageHandler, SocketAddress,
2626
};
2727
use crate::ln::peer_channel_encryptor::{
2828
MessageBuf, NextNoiseStep, PeerChannelEncryptor, MSG_BUF_ALLOC_SIZE,
@@ -270,6 +270,8 @@ impl CustomOnionMessageHandler for IgnoringMessageHandler {
270270
}
271271
}
272272

273+
impl SendOnlyMessageHandler for IgnoringMessageHandler {}
274+
273275
impl OnionMessageContents for Infallible {
274276
fn tlv_type(&self) -> u64 {
275277
unreachable!();
@@ -581,7 +583,7 @@ where
581583
RM::Target: RoutingMessageHandler,
582584
OM::Target: OnionMessageHandler,
583585
CustomM::Target: CustomMessageHandler,
584-
SM::Target: BaseMessageHandler,
586+
SM::Target: SendOnlyMessageHandler,
585587
{
586588
/// A message handler which handles messages specific to channels. Usually this is just a
587589
/// [`ChannelManager`] object or an [`ErroringMessageHandler`].
@@ -604,8 +606,9 @@ where
604606
/// [`IgnoringMessageHandler`].
605607
pub custom_message_handler: CustomM,
606608

607-
/// A message handler which can be used to send messages. This should generally be a
608-
/// [`ChainMonitor`].
609+
/// A message handler which can be used to send messages.
610+
///
611+
/// This should generally be a [`ChainMonitor`].
609612
///
610613
/// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor
611614
pub send_only_message_handler: SM,
@@ -965,7 +968,7 @@ pub trait APeerManager {
965968
type CMH: Deref<Target = Self::CMHT>;
966969
type NST: NodeSigner + ?Sized;
967970
type NS: Deref<Target = Self::NST>;
968-
type SMT: BaseMessageHandler + ?Sized;
971+
type SMT: SendOnlyMessageHandler + ?Sized;
969972
type SM: Deref<Target = Self::SMT>;
970973
/// Gets a reference to the underlying [`PeerManager`].
971974
fn as_ref(
@@ -999,7 +1002,7 @@ where
9991002
L::Target: Logger,
10001003
CMH::Target: CustomMessageHandler,
10011004
NS::Target: NodeSigner,
1002-
SM::Target: BaseMessageHandler,
1005+
SM::Target: SendOnlyMessageHandler,
10031006
{
10041007
type Descriptor = Descriptor;
10051008
type CMT = <CM as Deref>::Target;
@@ -1056,7 +1059,7 @@ pub struct PeerManager<
10561059
L::Target: Logger,
10571060
CMH::Target: CustomMessageHandler,
10581061
NS::Target: NodeSigner,
1059-
SM::Target: BaseMessageHandler,
1062+
SM::Target: SendOnlyMessageHandler,
10601063
{
10611064
message_handler: MessageHandler<CM, RM, OM, CMH, SM>,
10621065
/// Connection state for each connected peer - we have an outer read-write lock which is taken
@@ -1140,7 +1143,7 @@ where
11401143
OM::Target: OnionMessageHandler,
11411144
L::Target: Logger,
11421145
NS::Target: NodeSigner,
1143-
SM::Target: BaseMessageHandler,
1146+
SM::Target: SendOnlyMessageHandler,
11441147
{
11451148
/// Constructs a new `PeerManager` with the given `ChannelMessageHandler` and
11461149
/// `OnionMessageHandler`. No routing message handler is used and network graph messages are
@@ -1290,7 +1293,7 @@ where
12901293
L::Target: Logger,
12911294
CMH::Target: CustomMessageHandler,
12921295
NS::Target: NodeSigner,
1293-
SM::Target: BaseMessageHandler,
1296+
SM::Target: SendOnlyMessageHandler,
12941297
{
12951298
/// Constructs a new `PeerManager` with the given message handlers.
12961299
///
@@ -3841,6 +3844,8 @@ mod tests {
38413844
}
38423845
}
38433846

3847+
impl SendOnlyMessageHandler for TestBaseMsgHandler {}
3848+
38443849
fn create_peermgr_cfgs(peer_count: usize) -> Vec<PeerManagerCfg> {
38453850
let mut cfgs = Vec::new();
38463851
for i in 0..peer_count {

0 commit comments

Comments
 (0)