Skip to content

Commit 6d7658d

Browse files
committed
WIP: Add MessageRouter trait to OnionMessenger
1 parent 40a2d4d commit 6d7658d

File tree

6 files changed

+82
-23
lines changed

6 files changed

+82
-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-net-tokio/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@
3636
//! type ChainAccess = dyn lightning::chain::Access + Send + Sync;
3737
//! type ChainFilter = dyn lightning::chain::Filter + Send + Sync;
3838
//! type DataPersister = dyn lightning::chain::chainmonitor::Persist<lightning::chain::keysinterface::InMemorySigner> + Send + Sync;
39+
//! type MessageRouter = dyn lightning::onion_message::MessageRouter + Send + Sync;
3940
//! type ChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::chain::keysinterface::InMemorySigner, Arc<ChainFilter>, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>, Arc<DataPersister>>;
4041
//! type ChannelManager = Arc<lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor, TxBroadcaster, FeeEstimator, Logger>>;
41-
//! type PeerManager = Arc<lightning::ln::peer_handler::SimpleArcPeerManager<lightning_net_tokio::SocketDescriptor, ChainMonitor, TxBroadcaster, FeeEstimator, ChainAccess, Logger>>;
42+
//! type PeerManager = Arc<lightning::ln::peer_handler::SimpleArcPeerManager<lightning_net_tokio::SocketDescriptor, ChainMonitor, TxBroadcaster, FeeEstimator, ChainAccess, Logger, MessageRouter>>;
4243
//!
4344
//! // Connect to node with pubkey their_node_id at addr:
4445
//! async fn connect_to_node(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, their_node_id: PublicKey, addr: SocketAddr) {

lightning/src/ln/peer_handler.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,11 +493,11 @@ impl Peer {
493493
/// issues such as overly long function definitions.
494494
///
495495
/// (C-not exported) as `Arc`s don't make sense in bindings.
496-
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<
496+
pub type SimpleArcPeerManager<SD, M, T, F, C, L, R> = PeerManager<
497497
SD,
498498
Arc<SimpleArcChannelManager<M, T, F, L>>,
499499
Arc<P2PGossipSync<Arc<NetworkGraph<Arc<L>>>, Arc<C>, Arc<L>>>,
500-
Arc<SimpleArcOnionMessenger<M, T, F, L>>,
500+
Arc<SimpleArcOnionMessenger<M, T, F, L, R>>,
501501
Arc<L>,
502502
IgnoringMessageHandler,
503503
Arc<KeysManager>
@@ -511,11 +511,13 @@ pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<
511511
/// helps with issues such as long function definitions.
512512
///
513513
/// (C-not exported) as general type aliases don't make sense in bindings.
514-
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, 'n, SD, M, T, F, C, L> = PeerManager<
514+
pub type SimpleRefPeerManager<
515+
'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, 'n, 'o, SD, M, T, F, C, L, R
516+
> = PeerManager<
515517
SD,
516518
&'n SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, M, T, F, L>,
517519
&'f P2PGossipSync<&'g NetworkGraph<&'f L>, &'h C, &'f L>,
518-
&'i SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, 'n, M, T, F, L>,
520+
&'i SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, 'n, 'o, M, T, F, L, R>,
519521
&'f L,
520522
IgnoringMessageHandler,
521523
&'c KeysManager

lightning/src/onion_message/functional_tests.rs

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

@@ -24,7 +24,14 @@ use crate::sync::Arc;
2424

2525
struct MessengerNode {
2626
keys_manager: Arc<test_utils::TestKeysInterface>,
27-
messenger: OnionMessenger<Arc<test_utils::TestKeysInterface>, Arc<test_utils::TestKeysInterface>, Arc<test_utils::TestLogger>, Arc<TestOffersMessageHandler>, Arc<TestCustomMessageHandler>>,
27+
messenger: OnionMessenger<
28+
Arc<test_utils::TestKeysInterface>,
29+
Arc<test_utils::TestKeysInterface>,
30+
Arc<test_utils::TestLogger>,
31+
Arc<TestMessageRouter>,
32+
Arc<TestOffersMessageHandler>,
33+
Arc<TestCustomMessageHandler>
34+
>,
2835
logger: Arc<test_utils::TestLogger>,
2936
}
3037

@@ -34,6 +41,14 @@ impl MessengerNode {
3441
}
3542
}
3643

44+
struct TestMessageRouter {}
45+
46+
impl MessageRouter for TestMessageRouter {
47+
fn find_route(&self, sender: &PublicKey, destination: &Destination) -> Vec<PublicKey> {
48+
todo!()
49+
}
50+
}
51+
3752
struct TestOffersMessageHandler {}
3853

3954
impl OffersMessageHandler for TestOffersMessageHandler {
@@ -84,7 +99,11 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
8499
let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&seed, Network::Testnet));
85100
nodes.push(MessengerNode {
86101
keys_manager: keys_manager.clone(),
87-
messenger: OnionMessenger::new(keys_manager.clone(), keys_manager.clone(), logger.clone(), Arc::new(TestOffersMessageHandler {}), Arc::new(TestCustomMessageHandler {})),
102+
messenger: OnionMessenger::new(
103+
keys_manager.clone(), keys_manager.clone(), logger.clone(),
104+
Arc::new(TestMessageRouter {}), Arc::new(TestOffersMessageHandler {}),
105+
Arc::new(TestCustomMessageHandler {})
106+
),
88107
logger,
89108
});
90109
}

lightning/src/onion_message/messenger.rs

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use crate::prelude::*;
4848
/// # use lightning::chain::keysinterface::{InMemorySigner, KeysManager};
4949
/// # use lightning::ln::msgs::DecodeError;
5050
/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
51-
/// # use lightning::onion_message::{BlindedPath, CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessenger};
51+
/// # use lightning::onion_message::{BlindedPath, CustomOnionMessageContents, Destination, MessageRouter, OnionMessageContents, OnionMessenger};
5252
/// # use lightning::util::logger::{Logger, Record};
5353
/// # use lightning::util::ser::{Writeable, Writer};
5454
/// # use lightning::io;
@@ -57,6 +57,12 @@ use crate::prelude::*;
5757
/// # impl Logger for FakeLogger {
5858
/// # fn log(&self, record: &Record) { unimplemented!() }
5959
/// # }
60+
/// # struct FakeMessageRouter {}
61+
/// # impl MessageRouter for FakeMessageRouter {
62+
/// # fn find_route(&self, sender: &PublicKey, destination: &Destination) -> Vec<PublicKey> {
63+
/// # unimplemented!()
64+
/// # }
65+
/// # }
6066
/// # let seed = [42u8; 32];
6167
/// # let time = Duration::from_secs(123456);
6268
/// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
@@ -66,11 +72,14 @@ use crate::prelude::*;
6672
/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6773
/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6874
/// # let destination_node_id = hop_node_id1;
75+
/// # let message_router = Arc::new(FakeMessageRouter {});
6976
/// # let custom_message_handler = IgnoringMessageHandler {};
7077
/// # let offers_message_handler = IgnoringMessageHandler {};
7178
/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
7279
/// // ChannelManager.
73-
/// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, offers_message_handler, custom_message_handler);
80+
/// let onion_messenger = OnionMessenger::new(
81+
/// &keys_manager, &keys_manager, logger, message_router, offers_message_handler, custom_message_handler
82+
/// );
7483
///
7584
/// # struct YourCustomMessage {}
7685
/// impl Writeable for YourCustomMessage {
@@ -107,11 +116,12 @@ use crate::prelude::*;
107116
///
108117
/// [offers]: <https://github.com/lightning/bolts/pull/798>
109118
/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
110-
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>
111120
where
112121
ES::Target: EntropySource,
113122
NS::Target: NodeSigner,
114123
L::Target: Logger,
124+
MR::Target: MessageRouter,
115125
OMH::Target: OffersMessageHandler,
116126
CMH:: Target: CustomOnionMessageHandler,
117127
{
@@ -120,10 +130,19 @@ where
120130
logger: L,
121131
pending_messages: Mutex<HashMap<PublicKey, VecDeque<msgs::OnionMessage>>>,
122132
secp_ctx: Secp256k1<secp256k1::All>,
133+
message_router: MR,
123134
offers_handler: OMH,
124135
custom_handler: CMH,
125136
}
126137

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

195-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessenger<ES, NS, L, OMH, CMH>
214+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
215+
OnionMessenger<ES, NS, L, MR, OMH, CMH>
196216
where
197217
ES::Target: EntropySource,
198218
NS::Target: NodeSigner,
199219
L::Target: Logger,
220+
MR::Target: MessageRouter,
200221
OMH::Target: OffersMessageHandler,
201222
CMH::Target: CustomOnionMessageHandler,
202223
{
203224
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
204225
/// their respective handlers.
205226
pub fn new(
206-
entropy_source: ES, node_signer: NS, logger: L, offers_handler: OMH, custom_handler: CMH
227+
entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
228+
custom_handler: CMH
207229
) -> Self {
208230
let mut secp_ctx = Secp256k1::new();
209231
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
@@ -213,6 +235,7 @@ where
213235
pending_messages: Mutex::new(HashMap::new()),
214236
secp_ctx,
215237
logger,
238+
message_router,
216239
offers_handler,
217240
custom_handler,
218241
}
@@ -308,12 +331,13 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
308331
false
309332
}
310333

311-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
312-
for OnionMessenger<ES, NS, L, OMH, CMH>
334+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
335+
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
313336
where
314337
ES::Target: EntropySource,
315338
NS::Target: NodeSigner,
316339
L::Target: Logger,
340+
MR::Target: MessageRouter,
317341
OMH::Target: OffersMessageHandler,
318342
CMH::Target: CustomOnionMessageHandler + Sized,
319343
{
@@ -457,12 +481,13 @@ where
457481
}
458482
}
459483

460-
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
461-
for OnionMessenger<ES, NS, L, OMH, CMH>
484+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
485+
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
462486
where
463487
ES::Target: EntropySource,
464488
NS::Target: NodeSigner,
465489
L::Target: Logger,
490+
MR::Target: MessageRouter,
466491
OMH::Target: OffersMessageHandler,
467492
CMH::Target: CustomOnionMessageHandler,
468493
{
@@ -484,10 +509,11 @@ where
484509
///
485510
/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
486511
/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
487-
pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
512+
pub type SimpleArcOnionMessenger<M, T, F, L, R> = OnionMessenger<
488513
Arc<KeysManager>,
489514
Arc<KeysManager>,
490515
Arc<L>,
516+
Arc<R>,
491517
Arc<SimpleArcChannelManager<M, T, F, L>>,
492518
IgnoringMessageHandler
493519
>;
@@ -499,11 +525,12 @@ pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
499525
///
500526
/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
501527
/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
502-
pub type SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, M, T, F, L> = OnionMessenger<
528+
pub type SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, M, T, F, L, R> = OnionMessenger<
503529
&'c KeysManager,
504530
&'c KeysManager,
505531
&'g L,
506-
&'i SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,
532+
&'i R,
533+
&'j SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,
507534
IgnoringMessageHandler
508535
>;
509536

lightning/src/onion_message/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ mod functional_tests;
3030

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

0 commit comments

Comments
 (0)