Skip to content

Commit 046a998

Browse files
committed
MessageRouter trait for OnionMessenger
Add a trait for finding routes for onion messages and parameterize OnionMessenger with it. This allows OnionMessenger to reply to messages that it handles via one of its handlers (e.g., OffersMessageHandler).
1 parent 3a1d74a commit 046a998

File tree

6 files changed

+85
-23
lines changed

6 files changed

+85
-23
lines changed

fuzz/src/onion_message.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use lightning::ln::script::ShutdownScript;
1111
use lightning::util::enforcing_trait_impls::EnforcingSigner;
1212
use lightning::util::logger::Logger;
1313
use lightning::util::ser::{Readable, Writeable, Writer};
14-
use lightning::onion_message::{CustomOnionMessageContents, CustomOnionMessageHandler, OffersMessage, OffersMessageHandler, OnionMessenger};
14+
use lightning::onion_message::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, MessageRouter, OffersMessage, OffersMessageHandler, OnionMessenger};
1515

1616
use crate::utils::test_logger;
1717

@@ -29,10 +29,12 @@ pub fn do_test<L: Logger>(data: &[u8], logger: &L) {
2929
node_secret: secret,
3030
counter: AtomicU64::new(0),
3131
};
32+
let message_router = TestMessageRouter {};
3233
let offers_msg_handler = TestOffersMessageHandler {};
3334
let custom_msg_handler = TestCustomMessageHandler {};
3435
let onion_messenger = OnionMessenger::new(
35-
&keys_manager, &keys_manager, logger, &offers_msg_handler, &custom_msg_handler
36+
&keys_manager, &keys_manager, logger, &message_router, &offers_msg_handler,
37+
&custom_msg_handler
3638
);
3739
let mut pk = [2; 33]; pk[1] = 0xff;
3840
let peer_node_id_not_used = PublicKey::from_slice(&pk).unwrap();
@@ -53,6 +55,14 @@ pub extern "C" fn onion_message_run(data: *const u8, datalen: usize) {
5355
do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, &logger);
5456
}
5557

58+
struct TestMessageRouter {}
59+
60+
impl MessageRouter for TestMessageRouter {
61+
fn find_route(&self, _sender: &PublicKey, _destination: &Destination) -> Vec<PublicKey> {
62+
unreachable!()
63+
}
64+
}
65+
5666
struct TestOffersMessageHandler {}
5767

5868
impl OffersMessageHandler for TestOffersMessageHandler {

lightning-background-processor/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,8 +510,9 @@ use core::task;
510510
/// # type MyUtxoLookup = dyn lightning::routing::utxo::UtxoLookup + Send + Sync;
511511
/// # type MyFilter = dyn lightning::chain::Filter + Send + Sync;
512512
/// # type MyLogger = dyn lightning::util::logger::Logger + Send + Sync;
513+
/// # type MyMessageRouter = dyn lightning::onion_message::MessageRouter + Send + Sync;
513514
/// # type MyChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::sign::InMemorySigner, Arc<MyFilter>, Arc<MyBroadcaster>, Arc<MyFeeEstimator>, Arc<MyLogger>, Arc<MyPersister>>;
514-
/// # type MyPeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<MySocketDescriptor, MyChainMonitor, MyBroadcaster, MyFeeEstimator, MyUtxoLookup, MyLogger>;
515+
/// # type MyPeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<MySocketDescriptor, MyChainMonitor, MyBroadcaster, MyFeeEstimator, MyUtxoLookup, MyLogger, MyMessageRouter>;
515516
/// # type MyNetworkGraph = lightning::routing::gossip::NetworkGraph<Arc<MyLogger>>;
516517
/// # type MyGossipSync = lightning::routing::gossip::P2PGossipSync<Arc<MyNetworkGraph>, Arc<MyUtxoLookup>, Arc<MyLogger>>;
517518
/// # type MyChannelManager = lightning::ln::channelmanager::SimpleArcChannelManager<MyChainMonitor, MyBroadcaster, MyFeeEstimator, MyLogger>;

lightning/src/ln/peer_handler.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -578,11 +578,11 @@ impl Peer {
578578
/// issues such as overly long function definitions.
579579
///
580580
/// This is not exported to bindings users as `Arc`s don't make sense in bindings.
581-
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<
581+
pub type SimpleArcPeerManager<SD, M, T, F, C, L, R> = PeerManager<
582582
SD,
583583
Arc<SimpleArcChannelManager<M, T, F, L>>,
584584
Arc<P2PGossipSync<Arc<NetworkGraph<Arc<L>>>, Arc<C>, Arc<L>>>,
585-
Arc<SimpleArcOnionMessenger<M, T, F, L>>,
585+
Arc<SimpleArcOnionMessenger<M, T, F, L, R>>,
586586
Arc<L>,
587587
IgnoringMessageHandler,
588588
Arc<KeysManager>
@@ -596,11 +596,13 @@ pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<
596596
/// helps with issues such as long function definitions.
597597
///
598598
/// This is not exported to bindings users as general type aliases don't make sense in bindings.
599-
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, 'n, SD, M, T, F, C, L> = PeerManager<
599+
pub type SimpleRefPeerManager<
600+
'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, 'n, 'o, SD, M, T, F, C, L, R
601+
> = PeerManager<
600602
SD,
601603
&'n SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, M, T, F, L>,
602604
&'f P2PGossipSync<&'g NetworkGraph<&'f L>, &'h C, &'f L>,
603-
&'i SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, 'n, M, T, F, L>,
605+
&'i SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, 'n, 'o, M, T, F, L, R>,
604606
&'f L,
605607
IgnoringMessageHandler,
606608
&'c KeysManager

lightning/src/onion_message/functional_tests.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::blinded_path::BlindedPath;
1313
use crate::sign::{NodeSigner, Recipient};
1414
use crate::ln::features::InitFeatures;
1515
use crate::ln::msgs::{self, DecodeError, OnionMessageHandler};
16-
use super::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, OffersMessage, OffersMessageHandler, OnionMessageContents, OnionMessenger, SendError};
16+
use super::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, MessageRouter, OffersMessage, OffersMessageHandler, OnionMessageContents, OnionMessenger, SendError};
1717
use crate::util::ser::{Writeable, Writer};
1818
use crate::util::test_utils;
1919

@@ -27,7 +27,14 @@ use crate::sync::Arc;
2727

2828
struct MessengerNode {
2929
keys_manager: Arc<test_utils::TestKeysInterface>,
30-
messenger: OnionMessenger<Arc<test_utils::TestKeysInterface>, Arc<test_utils::TestKeysInterface>, Arc<test_utils::TestLogger>, Arc<TestOffersMessageHandler>, Arc<TestCustomMessageHandler>>,
30+
messenger: OnionMessenger<
31+
Arc<test_utils::TestKeysInterface>,
32+
Arc<test_utils::TestKeysInterface>,
33+
Arc<test_utils::TestLogger>,
34+
Arc<TestMessageRouter>,
35+
Arc<TestOffersMessageHandler>,
36+
Arc<TestCustomMessageHandler>
37+
>,
3138
custom_message_handler: Arc<TestCustomMessageHandler>,
3239
logger: Arc<test_utils::TestLogger>,
3340
}
@@ -38,6 +45,14 @@ impl MessengerNode {
3845
}
3946
}
4047

48+
struct TestMessageRouter {}
49+
50+
impl MessageRouter for TestMessageRouter {
51+
fn find_route(&self, _sender: &PublicKey, _destination: &Destination) -> Vec<PublicKey> {
52+
todo!()
53+
}
54+
}
55+
4156
struct TestOffersMessageHandler {}
4257

4358
impl OffersMessageHandler for TestOffersMessageHandler {
@@ -106,11 +121,15 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
106121
let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i)));
107122
let seed = [i as u8; 32];
108123
let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&seed, Network::Testnet));
124+
let message_router = Arc::new(TestMessageRouter {});
109125
let offers_message_handler = Arc::new(TestOffersMessageHandler {});
110126
let custom_message_handler = Arc::new(TestCustomMessageHandler::new());
111127
nodes.push(MessengerNode {
112128
keys_manager: keys_manager.clone(),
113-
messenger: OnionMessenger::new(keys_manager.clone(), keys_manager, logger.clone(), offers_message_handler, custom_message_handler.clone()),
129+
messenger: OnionMessenger::new(
130+
keys_manager.clone(), keys_manager, logger.clone(), message_router,
131+
offers_message_handler, custom_message_handler.clone()
132+
),
114133
custom_message_handler,
115134
logger,
116135
});

lightning/src/onion_message/messenger.rs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ use crate::prelude::*;
4747
/// # use lightning::blinded_path::BlindedPath;
4848
/// # use lightning::sign::KeysManager;
4949
/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
50-
/// # use lightning::onion_message::{CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessenger};
50+
/// # use lightning::onion_message::{CustomOnionMessageContents, Destination, MessageRouter, OnionMessageContents, OnionMessenger};
5151
/// # use lightning::util::logger::{Logger, Record};
5252
/// # use lightning::util::ser::{Writeable, Writer};
5353
/// # use lightning::io;
@@ -56,6 +56,12 @@ use crate::prelude::*;
5656
/// # impl Logger for FakeLogger {
5757
/// # fn log(&self, record: &Record) { unimplemented!() }
5858
/// # }
59+
/// # struct FakeMessageRouter {}
60+
/// # impl MessageRouter for FakeMessageRouter {
61+
/// # fn find_route(&self, sender: &PublicKey, destination: &Destination) -> Vec<PublicKey> {
62+
/// # unimplemented!()
63+
/// # }
64+
/// # }
5965
/// # let seed = [42u8; 32];
6066
/// # let time = Duration::from_secs(123456);
6167
/// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
@@ -65,11 +71,15 @@ use crate::prelude::*;
6571
/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6672
/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6773
/// # let destination_node_id = hop_node_id1;
74+
/// # let message_router = Arc::new(FakeMessageRouter {});
6875
/// # let custom_message_handler = IgnoringMessageHandler {};
6976
/// # let offers_message_handler = IgnoringMessageHandler {};
7077
/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
7178
/// // ChannelManager.
72-
/// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &offers_message_handler, &custom_message_handler);
79+
/// let onion_messenger = OnionMessenger::new(
80+
/// &keys_manager, &keys_manager, logger, message_router, &offers_message_handler,
81+
/// &custom_message_handler
82+
/// );
7383
///
7484
/// # struct YourCustomMessage {}
7585
/// impl Writeable for YourCustomMessage {
@@ -106,11 +116,12 @@ use crate::prelude::*;
106116
///
107117
/// [offers]: <https://github.com/lightning/bolts/pull/798>
108118
/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
109-
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref>
119+
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
110120
where
111121
ES::Target: EntropySource,
112122
NS::Target: NodeSigner,
113123
L::Target: Logger,
124+
MR::Target: MessageRouter,
114125
OMH::Target: OffersMessageHandler,
115126
CMH:: Target: CustomOnionMessageHandler,
116127
{
@@ -119,10 +130,21 @@ where
119130
logger: L,
120131
pending_messages: Mutex<HashMap<PublicKey, VecDeque<msgs::OnionMessage>>>,
121132
secp_ctx: Secp256k1<secp256k1::All>,
133+
message_router: MR,
122134
offers_handler: OMH,
123135
custom_handler: CMH,
124136
}
125137

138+
/// A trait defining behavior for routing an [`OnionMessage`].
139+
///
140+
/// [`OnionMessage`]: msgs::OnionMessage
141+
pub trait MessageRouter {
142+
/// Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
143+
///
144+
/// [`OnionMessage`]: msgs::OnionMessage
145+
fn find_route(&self, sender: &PublicKey, destination: &Destination) -> Vec<PublicKey>;
146+
}
147+
126148
/// The destination of an onion message.
127149
pub enum Destination {
128150
/// We're sending this onion message to a node.
@@ -191,18 +213,21 @@ pub trait CustomOnionMessageHandler {
191213
fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError>;
192214
}
193215

194-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessenger<ES, NS, L, OMH, CMH>
216+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
217+
OnionMessenger<ES, NS, L, MR, OMH, CMH>
195218
where
196219
ES::Target: EntropySource,
197220
NS::Target: NodeSigner,
198221
L::Target: Logger,
222+
MR::Target: MessageRouter,
199223
OMH::Target: OffersMessageHandler,
200224
CMH::Target: CustomOnionMessageHandler,
201225
{
202226
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
203227
/// their respective handlers.
204228
pub fn new(
205-
entropy_source: ES, node_signer: NS, logger: L, offers_handler: OMH, custom_handler: CMH
229+
entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
230+
custom_handler: CMH
206231
) -> Self {
207232
let mut secp_ctx = Secp256k1::new();
208233
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
@@ -212,6 +237,7 @@ where
212237
pending_messages: Mutex::new(HashMap::new()),
213238
secp_ctx,
214239
logger,
240+
message_router,
215241
offers_handler,
216242
custom_handler,
217243
}
@@ -307,12 +333,13 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
307333
false
308334
}
309335

310-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
311-
for OnionMessenger<ES, NS, L, OMH, CMH>
336+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
337+
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
312338
where
313339
ES::Target: EntropySource,
314340
NS::Target: NodeSigner,
315341
L::Target: Logger,
342+
MR::Target: MessageRouter,
316343
OMH::Target: OffersMessageHandler,
317344
CMH::Target: CustomOnionMessageHandler + Sized,
318345
{
@@ -456,12 +483,13 @@ where
456483
}
457484
}
458485

459-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
460-
for OnionMessenger<ES, NS, L, OMH, CMH>
486+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
487+
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
461488
where
462489
ES::Target: EntropySource,
463490
NS::Target: NodeSigner,
464491
L::Target: Logger,
492+
MR::Target: MessageRouter,
465493
OMH::Target: OffersMessageHandler,
466494
CMH::Target: CustomOnionMessageHandler,
467495
{
@@ -483,10 +511,11 @@ where
483511
///
484512
/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
485513
/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
486-
pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
514+
pub type SimpleArcOnionMessenger<M, T, F, L, R> = OnionMessenger<
487515
Arc<KeysManager>,
488516
Arc<KeysManager>,
489517
Arc<L>,
518+
Arc<R>,
490519
Arc<SimpleArcChannelManager<M, T, F, L>>,
491520
IgnoringMessageHandler
492521
>;
@@ -498,11 +527,12 @@ pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
498527
///
499528
/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
500529
/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
501-
pub type SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, M, T, F, L> = OnionMessenger<
530+
pub type SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, M, T, F, L, R> = OnionMessenger<
502531
&'c KeysManager,
503532
&'c KeysManager,
504533
&'g L,
505-
&'i SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,
534+
&'i R,
535+
&'j SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,
506536
IgnoringMessageHandler
507537
>;
508538

lightning/src/onion_message/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ mod packet;
2727
mod functional_tests;
2828

2929
// Re-export structs so they can be imported with just the `onion_message::` module prefix.
30-
pub use self::messenger::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, OnionMessageContents, OnionMessenger, SendError, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
30+
pub use self::messenger::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, MessageRouter, OnionMessageContents, OnionMessenger, SendError, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
3131
pub use self::offers::{OffersMessage, OffersMessageHandler};
3232
pub(crate) use self::packet::{ControlTlvs, Packet};

0 commit comments

Comments
 (0)