Skip to content

Commit a71000f

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 f15da3d commit a71000f

File tree

6 files changed

+104
-20
lines changed

6 files changed

+104
-20
lines changed

fuzz/src/onion_message.rs

Lines changed: 14 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, OnionMessagePath, 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,16 @@ 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_path(
62+
&self, _sender: PublicKey, _peers: Vec<PublicKey>, _destination: Destination
63+
) -> Result<OnionMessagePath, ()> {
64+
unreachable!()
65+
}
66+
}
67+
5668
struct TestOffersMessageHandler {}
5769

5870
impl OffersMessageHandler for TestOffersMessageHandler {

lightning-background-processor/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,9 @@ use core::task;
519519
/// # type MyUtxoLookup = dyn lightning::routing::utxo::UtxoLookup + Send + Sync;
520520
/// # type MyFilter = dyn lightning::chain::Filter + Send + Sync;
521521
/// # type MyLogger = dyn lightning::util::logger::Logger + Send + Sync;
522+
/// # type MyMessageRouter = dyn lightning::onion_message::MessageRouter + Send + Sync;
522523
/// # type MyChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::sign::InMemorySigner, Arc<MyFilter>, Arc<MyBroadcaster>, Arc<MyFeeEstimator>, Arc<MyLogger>, Arc<MyPersister>>;
523-
/// # type MyPeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<MySocketDescriptor, MyChainMonitor, MyBroadcaster, MyFeeEstimator, MyUtxoLookup, MyLogger>;
524+
/// # type MyPeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<MySocketDescriptor, MyChainMonitor, MyBroadcaster, MyFeeEstimator, MyUtxoLookup, MyLogger, MyMessageRouter>;
524525
/// # type MyNetworkGraph = lightning::routing::gossip::NetworkGraph<Arc<MyLogger>>;
525526
/// # type MyGossipSync = lightning::routing::gossip::P2PGossipSync<Arc<MyNetworkGraph>, Arc<MyUtxoLookup>, Arc<MyLogger>>;
526527
/// # type MyChannelManager = lightning::ln::channelmanager::SimpleArcChannelManager<MyChainMonitor, MyBroadcaster, MyFeeEstimator, MyLogger>;

lightning/src/ln/peer_handler.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,15 @@ impl Peer {
607607
/// issues such as overly long function definitions.
608608
///
609609
/// This is not exported to bindings users as `Arc`s don't make sense in bindings.
610-
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<P2PGossipSync<Arc<NetworkGraph<Arc<L>>>, Arc<C>, Arc<L>>>, Arc<SimpleArcOnionMessenger<L>>, Arc<L>, IgnoringMessageHandler, Arc<KeysManager>>;
610+
pub type SimpleArcPeerManager<SD, M, T, F, C, L, R> = PeerManager<
611+
SD,
612+
Arc<SimpleArcChannelManager<M, T, F, L>>,
613+
Arc<P2PGossipSync<Arc<NetworkGraph<Arc<L>>>, Arc<C>, Arc<L>>>,
614+
Arc<SimpleArcOnionMessenger<L, R>>,
615+
Arc<L>,
616+
IgnoringMessageHandler,
617+
Arc<KeysManager>
618+
>;
611619

612620
/// SimpleRefPeerManager is a type alias for a PeerManager reference, and is the reference
613621
/// counterpart to the SimpleArcPeerManager type alias. Use this type by default when you don't
@@ -617,7 +625,17 @@ pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArc
617625
/// helps with issues such as long function definitions.
618626
///
619627
/// This is not exported to bindings users as general type aliases don't make sense in bindings.
620-
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, M, T, F, L>, &'f P2PGossipSync<&'g NetworkGraph<&'f L>, &'h C, &'f L>, &'i SimpleRefOnionMessenger<'j, 'k, L>, &'f L, IgnoringMessageHandler, &'c KeysManager>;
628+
pub type SimpleRefPeerManager<
629+
'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, 'n, SD, M, T, F, C, L, R
630+
> = PeerManager<
631+
SD,
632+
&'n SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, M, T, F, L>,
633+
&'f P2PGossipSync<&'g NetworkGraph<&'f L>, &'h C, &'f L>,
634+
&'i SimpleRefOnionMessenger<'g, 'm, 'n, L, R>,
635+
&'f L,
636+
IgnoringMessageHandler,
637+
&'c KeysManager
638+
>;
621639

622640

623641
/// A generic trait which is implemented for all [`PeerManager`]s. This makes bounding functions or

lightning/src/onion_message/functional_tests.rs

Lines changed: 24 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, OnionMessagePath, OnionMessenger, SendError};
16+
use super::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, MessageRouter, OffersMessage, OffersMessageHandler, OnionMessageContents, OnionMessagePath, 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,16 @@ impl MessengerNode {
3845
}
3946
}
4047

48+
struct TestMessageRouter {}
49+
50+
impl MessageRouter for TestMessageRouter {
51+
fn find_path(
52+
&self, _sender: PublicKey, _peers: Vec<PublicKey>, _destination: Destination
53+
) -> Result<OnionMessagePath, ()> {
54+
todo!()
55+
}
56+
}
57+
4158
struct TestOffersMessageHandler {}
4259

4360
impl OffersMessageHandler for TestOffersMessageHandler {
@@ -106,11 +123,15 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
106123
let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i)));
107124
let seed = [i as u8; 32];
108125
let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&seed, Network::Testnet));
126+
let message_router = Arc::new(TestMessageRouter {});
109127
let offers_message_handler = Arc::new(TestOffersMessageHandler {});
110128
let custom_message_handler = Arc::new(TestCustomMessageHandler::new());
111129
nodes.push(MessengerNode {
112130
keys_manager: keys_manager.clone(),
113-
messenger: OnionMessenger::new(keys_manager.clone(), keys_manager, logger.clone(), offers_message_handler, custom_message_handler.clone()),
131+
messenger: OnionMessenger::new(
132+
keys_manager.clone(), keys_manager, logger.clone(), message_router,
133+
offers_message_handler, custom_message_handler.clone()
134+
),
114135
custom_message_handler,
115136
logger,
116137
});

lightning/src/onion_message/messenger.rs

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use crate::prelude::*;
4646
/// # use lightning::blinded_path::BlindedPath;
4747
/// # use lightning::sign::KeysManager;
4848
/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
49-
/// # use lightning::onion_message::{CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessagePath, OnionMessenger};
49+
/// # use lightning::onion_message::{CustomOnionMessageContents, Destination, MessageRouter, OnionMessageContents, OnionMessagePath, OnionMessenger};
5050
/// # use lightning::util::logger::{Logger, Record};
5151
/// # use lightning::util::ser::{Writeable, Writer};
5252
/// # use lightning::io;
@@ -55,6 +55,12 @@ use crate::prelude::*;
5555
/// # impl Logger for FakeLogger {
5656
/// # fn log(&self, record: &Record) { unimplemented!() }
5757
/// # }
58+
/// # struct FakeMessageRouter {}
59+
/// # impl MessageRouter for FakeMessageRouter {
60+
/// # fn find_path(&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination) -> Result<OnionMessagePath, ()> {
61+
/// # unimplemented!()
62+
/// # }
63+
/// # }
5864
/// # let seed = [42u8; 32];
5965
/// # let time = Duration::from_secs(123456);
6066
/// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
@@ -64,11 +70,15 @@ use crate::prelude::*;
6470
/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6571
/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6672
/// # let destination_node_id = hop_node_id1;
73+
/// # let message_router = Arc::new(FakeMessageRouter {});
6774
/// # let custom_message_handler = IgnoringMessageHandler {};
6875
/// # let offers_message_handler = IgnoringMessageHandler {};
6976
/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
7077
/// // ChannelManager.
71-
/// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &offers_message_handler, &custom_message_handler);
78+
/// let onion_messenger = OnionMessenger::new(
79+
/// &keys_manager, &keys_manager, logger, message_router, &offers_message_handler,
80+
/// &custom_message_handler
81+
/// );
7282
///
7383
/// # struct YourCustomMessage {}
7484
/// impl Writeable for YourCustomMessage {
@@ -111,11 +121,12 @@ use crate::prelude::*;
111121
///
112122
/// [offers]: <https://github.com/lightning/bolts/pull/798>
113123
/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
114-
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref>
124+
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
115125
where
116126
ES::Target: EntropySource,
117127
NS::Target: NodeSigner,
118128
L::Target: Logger,
129+
MR::Target: MessageRouter,
119130
OMH::Target: OffersMessageHandler,
120131
CMH:: Target: CustomOnionMessageHandler,
121132
{
@@ -124,10 +135,23 @@ where
124135
logger: L,
125136
pending_messages: Mutex<HashMap<PublicKey, VecDeque<msgs::OnionMessage>>>,
126137
secp_ctx: Secp256k1<secp256k1::All>,
138+
message_router: MR,
127139
offers_handler: OMH,
128140
custom_handler: CMH,
129141
}
130142

143+
/// A trait defining behavior for routing an [`OnionMessage`].
144+
///
145+
/// [`OnionMessage`]: msgs::OnionMessage
146+
pub trait MessageRouter {
147+
/// Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
148+
///
149+
/// [`OnionMessage`]: msgs::OnionMessage
150+
fn find_path(
151+
&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination
152+
) -> Result<OnionMessagePath, ()>;
153+
}
154+
131155
/// A path for sending an [`msgs::OnionMessage`].
132156
#[derive(Clone)]
133157
pub struct OnionMessagePath {
@@ -207,18 +231,21 @@ pub trait CustomOnionMessageHandler {
207231
fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError>;
208232
}
209233

210-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessenger<ES, NS, L, OMH, CMH>
234+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
235+
OnionMessenger<ES, NS, L, MR, OMH, CMH>
211236
where
212237
ES::Target: EntropySource,
213238
NS::Target: NodeSigner,
214239
L::Target: Logger,
240+
MR::Target: MessageRouter,
215241
OMH::Target: OffersMessageHandler,
216242
CMH::Target: CustomOnionMessageHandler,
217243
{
218244
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
219245
/// their respective handlers.
220246
pub fn new(
221-
entropy_source: ES, node_signer: NS, logger: L, offers_handler: OMH, custom_handler: CMH
247+
entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
248+
custom_handler: CMH
222249
) -> Self {
223250
let mut secp_ctx = Secp256k1::new();
224251
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
@@ -228,6 +255,7 @@ where
228255
pending_messages: Mutex::new(HashMap::new()),
229256
secp_ctx,
230257
logger,
258+
message_router,
231259
offers_handler,
232260
custom_handler,
233261
}
@@ -328,12 +356,13 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
328356
false
329357
}
330358

331-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
332-
for OnionMessenger<ES, NS, L, OMH, CMH>
359+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
360+
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
333361
where
334362
ES::Target: EntropySource,
335363
NS::Target: NodeSigner,
336364
L::Target: Logger,
365+
MR::Target: MessageRouter,
337366
OMH::Target: OffersMessageHandler,
338367
CMH::Target: CustomOnionMessageHandler + Sized,
339368
{
@@ -478,12 +507,13 @@ where
478507
}
479508
}
480509

481-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
482-
for OnionMessenger<ES, NS, L, OMH, CMH>
510+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
511+
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
483512
where
484513
ES::Target: EntropySource,
485514
NS::Target: NodeSigner,
486515
L::Target: Logger,
516+
MR::Target: MessageRouter,
487517
OMH::Target: OffersMessageHandler,
488518
CMH::Target: CustomOnionMessageHandler,
489519
{
@@ -505,10 +535,11 @@ where
505535
///
506536
/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
507537
/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
508-
pub type SimpleArcOnionMessenger<L> = OnionMessenger<
538+
pub type SimpleArcOnionMessenger<L, R> = OnionMessenger<
509539
Arc<KeysManager>,
510540
Arc<KeysManager>,
511541
Arc<L>,
542+
Arc<R>,
512543
IgnoringMessageHandler,
513544
IgnoringMessageHandler
514545
>;
@@ -520,10 +551,11 @@ pub type SimpleArcOnionMessenger<L> = OnionMessenger<
520551
///
521552
/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
522553
/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
523-
pub type SimpleRefOnionMessenger<'a, 'b, L> = OnionMessenger<
554+
pub type SimpleRefOnionMessenger<'a, 'b, 'c, L, R> = OnionMessenger<
524555
&'a KeysManager,
525556
&'a KeysManager,
526557
&'b L,
558+
&'c R,
527559
IgnoringMessageHandler,
528560
IgnoringMessageHandler
529561
>;

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, OnionMessagePath, OnionMessenger, SendError, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
30+
pub use self::messenger::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, MessageRouter, OnionMessageContents, OnionMessagePath, OnionMessenger, SendError, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
3131
pub use self::offers::{OffersMessage, OffersMessageHandler};
3232
pub(crate) use self::packet::{ControlTlvs, Packet};

0 commit comments

Comments
 (0)