Skip to content

Commit faede5e

Browse files
committed
OffersMessageHandler trait for OnionMessenger
TODO: Include details
1 parent 78923e8 commit faede5e

File tree

6 files changed

+134
-36
lines changed

6 files changed

+134
-36
lines changed

fuzz/src/onion_message.rs

Lines changed: 11 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, OnionMessenger};
14+
use lightning::onion_message::{CustomOnionMessageContents, CustomOnionMessageHandler, OffersMessage, OffersMessageHandler, OnionMessenger};
1515

1616
use crate::utils::test_logger;
1717

@@ -29,8 +29,11 @@ pub fn do_test<L: Logger>(data: &[u8], logger: &L) {
2929
node_secret: secret,
3030
counter: AtomicU64::new(0),
3131
};
32+
let offers_msg_handler = TestOffersMessageHandler {};
3233
let custom_msg_handler = TestCustomMessageHandler {};
33-
let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &custom_msg_handler);
34+
let onion_messenger = OnionMessenger::new(
35+
&keys_manager, &keys_manager, logger, &offers_msg_handler, &custom_msg_handler
36+
);
3437
let mut pk = [2; 33]; pk[1] = 0xff;
3538
let peer_node_id_not_used = PublicKey::from_slice(&pk).unwrap();
3639
onion_messenger.handle_onion_message(&peer_node_id_not_used, &msg);
@@ -50,6 +53,12 @@ pub extern "C" fn onion_message_run(data: *const u8, datalen: usize) {
5053
do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, &logger);
5154
}
5255

56+
struct TestOffersMessageHandler {}
57+
58+
impl OffersMessageHandler for TestOffersMessageHandler {
59+
fn handle_message(&self, _message: OffersMessage) {}
60+
}
61+
5362
struct TestCustomMessage {}
5463

5564
const CUSTOM_MESSAGE_TYPE: u64 = 4242;

lightning/src/ln/peer_handler.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::util::ser::{VecWriter, Writeable, Writer};
2626
use crate::ln::peer_channel_encryptor::{PeerChannelEncryptor,NextNoiseStep};
2727
use crate::ln::wire;
2828
use crate::ln::wire::Encode;
29-
use crate::onion_message::{CustomOnionMessageContents, CustomOnionMessageHandler, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
29+
use crate::onion_message::{CustomOnionMessageContents, CustomOnionMessageHandler, OffersMessage, OffersMessageHandler, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
3030
use crate::routing::gossip::{NetworkGraph, P2PGossipSync};
3131
use crate::util::atomic_counter::AtomicCounter;
3232
use crate::util::events::{MessageSendEvent, MessageSendEventsProvider, OnionMessageProvider};
@@ -94,6 +94,9 @@ impl OnionMessageHandler for IgnoringMessageHandler {
9494
InitFeatures::empty()
9595
}
9696
}
97+
impl OffersMessageHandler for IgnoringMessageHandler {
98+
fn handle_message(&self, _msg: OffersMessage) {}
99+
}
97100
impl CustomOnionMessageHandler for IgnoringMessageHandler {
98101
type CustomMessage = Infallible;
99102
fn handle_custom_message(&self, _msg: Infallible) {
@@ -490,7 +493,15 @@ impl Peer {
490493
/// issues such as overly long function definitions.
491494
///
492495
/// (C-not exported) as `Arc`s don't make sense in bindings.
493-
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>>;
496+
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<
497+
SD,
498+
Arc<SimpleArcChannelManager<M, T, F, L>>,
499+
Arc<P2PGossipSync<Arc<NetworkGraph<Arc<L>>>, Arc<C>, Arc<L>>>,
500+
Arc<SimpleArcOnionMessenger<M, T, F, L>>,
501+
Arc<L>,
502+
IgnoringMessageHandler,
503+
Arc<KeysManager>
504+
>;
494505

495506
/// SimpleRefPeerManager is a type alias for a PeerManager reference, and is the reference
496507
/// counterpart to the SimpleArcPeerManager type alias. Use this type by default when you don't
@@ -500,7 +511,15 @@ pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArc
500511
/// helps with issues such as long function definitions.
501512
///
502513
/// (C-not exported) as general type aliases don't make sense in bindings.
503-
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>;
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<
515+
SD,
516+
&'n SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'm, M, T, F, L>,
517+
&'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>,
519+
&'f L,
520+
IgnoringMessageHandler,
521+
&'c KeysManager
522+
>;
504523

505524
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
506525
/// socket events into messages which it passes on to its [`MessageHandler`].

lightning/src/onion_message/functional_tests.rs

Lines changed: 11 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, OnionMessageContents, OnionMessenger, SendError};
15+
use super::{BlindedPath, CustomOnionMessageContents, CustomOnionMessageHandler, Destination, OffersMessage, OffersMessageHandler, OnionMessageContents, OnionMessenger, SendError};
1616
use crate::util::ser::{Writeable, Writer};
1717
use crate::util::test_utils;
1818

@@ -24,7 +24,7 @@ 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<TestCustomMessageHandler>>,
27+
messenger: OnionMessenger<Arc<test_utils::TestKeysInterface>, Arc<test_utils::TestKeysInterface>, Arc<test_utils::TestLogger>, Arc<TestOffersMessageHandler>, Arc<TestCustomMessageHandler>>,
2828
logger: Arc<test_utils::TestLogger>,
2929
}
3030

@@ -34,6 +34,14 @@ impl MessengerNode {
3434
}
3535
}
3636

37+
struct TestOffersMessageHandler {}
38+
39+
impl OffersMessageHandler for TestOffersMessageHandler {
40+
fn handle_message(&self, _message: OffersMessage) {
41+
todo!()
42+
}
43+
}
44+
3745
#[derive(Clone)]
3846
struct TestCustomMessage {}
3947

@@ -76,7 +84,7 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
7684
let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&seed, Network::Testnet));
7785
nodes.push(MessengerNode {
7886
keys_manager: keys_manager.clone(),
79-
messenger: OnionMessenger::new(keys_manager.clone(), keys_manager.clone(), logger.clone(), Arc::new(TestCustomMessageHandler {})),
87+
messenger: OnionMessenger::new(keys_manager.clone(), keys_manager.clone(), logger.clone(), Arc::new(TestOffersMessageHandler {}), Arc::new(TestCustomMessageHandler {})),
8088
logger,
8189
});
8290
}

lightning/src/onion_message/messenger.rs

Lines changed: 56 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ use bitcoin::hashes::sha256::Hash as Sha256;
1616
use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
1717

1818
use crate::chain::keysinterface::{EntropySource, KeysManager, NodeSigner, Recipient};
19+
use crate::ln::channelmanager::{SimpleArcChannelManager, SimpleRefChannelManager};
1920
use crate::ln::features::{InitFeatures, NodeFeatures};
2021
use crate::ln::msgs::{self, OnionMessageHandler};
2122
use crate::ln::onion_utils;
2223
use crate::ln::peer_handler::IgnoringMessageHandler;
2324
use super::blinded_path::{BlindedPath, ForwardTlvs, ReceiveTlvs};
2425
pub use super::packet::{CustomOnionMessageContents, OnionMessageContents};
26+
use super::offers::OffersMessageHandler;
2527
use super::packet::{BIG_PACKET_HOP_DATA_LEN, ForwardControlTlvs, Packet, Payload, ReceiveControlTlvs, SMALL_PACKET_HOP_DATA_LEN};
2628
use super::utils;
2729
use crate::util::events::OnionMessageProvider;
@@ -64,10 +66,11 @@ use crate::prelude::*;
6466
/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6567
/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6668
/// # let destination_node_id = hop_node_id1;
67-
/// # let your_custom_message_handler = IgnoringMessageHandler {};
69+
/// # let custom_message_handler = IgnoringMessageHandler {};
70+
/// # let offers_message_handler = IgnoringMessageHandler {};
6871
/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
6972
/// // ChannelManager.
70-
/// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, your_custom_message_handler);
73+
/// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, offers_message_handler, custom_message_handler);
7174
///
7275
/// # struct YourCustomMessage {}
7376
/// impl Writeable for YourCustomMessage {
@@ -104,20 +107,21 @@ use crate::prelude::*;
104107
///
105108
/// [offers]: <https://github.com/lightning/bolts/pull/798>
106109
/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
107-
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, CMH: Deref>
108-
where ES::Target: EntropySource,
109-
NS::Target: NodeSigner,
110-
L::Target: Logger,
111-
CMH:: Target: CustomOnionMessageHandler,
110+
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref>
111+
where
112+
ES::Target: EntropySource,
113+
NS::Target: NodeSigner,
114+
L::Target: Logger,
115+
OMH::Target: OffersMessageHandler,
116+
CMH:: Target: CustomOnionMessageHandler,
112117
{
113118
entropy_source: ES,
114119
node_signer: NS,
115120
logger: L,
116121
pending_messages: Mutex<HashMap<PublicKey, VecDeque<msgs::OnionMessage>>>,
117122
secp_ctx: Secp256k1<secp256k1::All>,
123+
offers_handler: OMH,
118124
custom_handler: CMH,
119-
// Coming soon:
120-
// invoice_handler: InvoiceHandler,
121125
}
122126

123127
/// The destination of an onion message.
@@ -188,15 +192,19 @@ pub trait CustomOnionMessageHandler {
188192
fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError>;
189193
}
190194

191-
impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessenger<ES, NS, L, CMH>
192-
where ES::Target: EntropySource,
193-
NS::Target: NodeSigner,
194-
L::Target: Logger,
195-
CMH::Target: CustomOnionMessageHandler,
195+
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessenger<ES, NS, L, OMH, CMH>
196+
where
197+
ES::Target: EntropySource,
198+
NS::Target: NodeSigner,
199+
L::Target: Logger,
200+
OMH::Target: OffersMessageHandler,
201+
CMH::Target: CustomOnionMessageHandler,
196202
{
197203
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
198204
/// their respective handlers.
199-
pub fn new(entropy_source: ES, node_signer: NS, logger: L, custom_handler: CMH) -> Self {
205+
pub fn new(
206+
entropy_source: ES, node_signer: NS, logger: L, offers_handler: OMH, custom_handler: CMH
207+
) -> Self {
200208
let mut secp_ctx = Secp256k1::new();
201209
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
202210
OnionMessenger {
@@ -205,6 +213,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessenger<ES, NS, L, CMH>
205213
pending_messages: Mutex::new(HashMap::new()),
206214
secp_ctx,
207215
logger,
216+
offers_handler,
208217
custom_handler,
209218
}
210219
}
@@ -299,11 +308,14 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
299308
false
300309
}
301310

302-
impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMessenger<ES, NS, L, CMH>
303-
where ES::Target: EntropySource,
304-
NS::Target: NodeSigner,
305-
L::Target: Logger,
306-
CMH::Target: CustomOnionMessageHandler + Sized,
311+
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
312+
for OnionMessenger<ES, NS, L, OMH, CMH>
313+
where
314+
ES::Target: EntropySource,
315+
NS::Target: NodeSigner,
316+
L::Target: Logger,
317+
OMH::Target: OffersMessageHandler,
318+
CMH::Target: CustomOnionMessageHandler + Sized,
307319
{
308320
/// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
309321
/// soon we'll delegate the onion message to a handler that can generate invoices or send
@@ -342,7 +354,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
342354
"Received an onion message with path_id {:02x?} and {} reply_path",
343355
path_id, if reply_path.is_some() { "a" } else { "no" });
344356
match message {
345-
OnionMessageContents::Offers(_msg) => todo!(),
357+
OnionMessageContents::Offers(msg) => self.offers_handler.handle_message(msg),
346358
OnionMessageContents::Custom(msg) => self.custom_handler.handle_custom_message(msg),
347359
}
348360
},
@@ -445,11 +457,14 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
445457
}
446458
}
447459

448-
impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageProvider for OnionMessenger<ES, NS, L, CMH>
449-
where ES::Target: EntropySource,
450-
NS::Target: NodeSigner,
451-
L::Target: Logger,
452-
CMH::Target: CustomOnionMessageHandler,
460+
impl<ES: Deref, NS: Deref, L: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
461+
for OnionMessenger<ES, NS, L, OMH, CMH>
462+
where
463+
ES::Target: EntropySource,
464+
NS::Target: NodeSigner,
465+
L::Target: Logger,
466+
OMH::Target: OffersMessageHandler,
467+
CMH::Target: CustomOnionMessageHandler,
453468
{
454469
fn next_onion_message_for_peer(&self, peer_node_id: PublicKey) -> Option<msgs::OnionMessage> {
455470
let mut pending_msgs = self.pending_messages.lock().unwrap();
@@ -469,15 +484,28 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageProvider for OnionM
469484
///
470485
/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
471486
/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
472-
pub type SimpleArcOnionMessenger<L> = OnionMessenger<Arc<KeysManager>, Arc<KeysManager>, Arc<L>, IgnoringMessageHandler>;
487+
pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
488+
Arc<KeysManager>,
489+
Arc<KeysManager>,
490+
Arc<L>,
491+
Arc<SimpleArcChannelManager<M, T, F, L>>,
492+
IgnoringMessageHandler
493+
>;
494+
473495
/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
474496
/// [`SimpleRefPeerManager`]. See their docs for more details.
475497
///
476498
/// (C-not exported) as general type aliases don't make sense in bindings.
477499
///
478500
/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
479501
/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
480-
pub type SimpleRefOnionMessenger<'a, 'b, L> = OnionMessenger<&'a KeysManager, &'a KeysManager, &'b L, IgnoringMessageHandler>;
502+
pub type SimpleRefOnionMessenger<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, M, T, F, L> = OnionMessenger<
503+
&'c KeysManager,
504+
&'c KeysManager,
505+
&'g L,
506+
&'i SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,
507+
IgnoringMessageHandler
508+
>;
481509

482510
/// Construct onion packet payloads and keys for sending an onion message along the given
483511
/// `unblinded_path` to the given `destination`.

lightning/src/onion_message/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ mod functional_tests;
3131
// Re-export structs so they can be imported with just the `onion_message::` module prefix.
3232
pub use self::blinded_path::{BlindedPath, BlindedHop};
3333
pub use self::messenger::{CustomOnionMessageContents, CustomOnionMessageHandler, Destination, OnionMessageContents, OnionMessenger, SendError, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
34+
pub use self::offers::{OffersMessage, OffersMessageHandler};
3435
pub(crate) use self::packet::Packet;

lightning/src/onion_message/offers.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,18 @@
1010
//! Message handling for BOLT 12 Offers.
1111
1212
use core::convert::TryFrom;
13+
use core::ops::Deref;
14+
use crate::chain;
15+
use crate::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
16+
use crate::chain::keysinterface::{EntropySource, NodeSigner, SignerProvider};
1317
use crate::io::{self, Read};
18+
use crate::ln::channelmanager::ChannelManager;
1419
use crate::ln::msgs::DecodeError;
1520
use crate::offers::invoice_request::InvoiceRequest;
1621
use crate::offers::invoice::Invoice;
1722
use crate::offers::parse::ParseError;
23+
use crate::routing::router::Router;
24+
use crate::util::logger::Logger;
1825
use crate::util::ser::{ReadableArgs, Writeable, Writer};
1926

2027
use crate::prelude::*;
@@ -24,6 +31,15 @@ const INVOICE_REQUEST_TLV_TYPE: u64 = 64;
2431
const INVOICE_TLV_TYPE: u64 = 66;
2532
const INVOICE_ERROR_TLV_TYPE: u64 = 68;
2633

34+
/// A handler for an [`OnionMessage`] containing a BOLT 12 Offers message as its payload.
35+
///
36+
/// [`OnionMessage`]: crate::ln::msgs::OnionMessage
37+
pub trait OffersMessageHandler {
38+
/// Handles the given message by either responding with an [`Invoice`], sending a payment, or
39+
/// replying with an error.
40+
fn handle_message(&self, message: OffersMessage);
41+
}
42+
2743
/// Possible BOLT 12 Offers messages sent and received via an [`OnionMessage`].
2844
///
2945
/// [`OnionMessage`]: crate::ln::msgs::OnionMessage
@@ -93,3 +109,20 @@ impl ReadableArgs<u64> for OffersMessage {
93109
}
94110
}
95111
}
112+
113+
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref>
114+
OffersMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, L>
115+
where
116+
M::Target: chain::Watch<<SP::Target as SignerProvider>::Signer>,
117+
T::Target: BroadcasterInterface,
118+
ES::Target: EntropySource,
119+
NS::Target: NodeSigner,
120+
SP::Target: SignerProvider,
121+
F::Target: FeeEstimator,
122+
R::Target: Router,
123+
L::Target: Logger,
124+
{
125+
fn handle_message(&self, _message: OffersMessage) {
126+
todo!()
127+
}
128+
}

0 commit comments

Comments
 (0)