Skip to content

Commit d9e2a66

Browse files
committed
Make OnionMessageHandler extend EventsProvider
An OnionMessageHandler may buffer messages that can't be sent because the recipient is not a peer. Have the trait extend EventsProvider so that implementation so that an Event::ConnectionNeeded can be generated for any nodes that fall into this category. Also, implement EventsProvider for OnionMessenger and IgnoringMessageHandler.
1 parent d886a65 commit d9e2a66

File tree

3 files changed

+49
-20
lines changed

3 files changed

+49
-20
lines changed

lightning/src/ln/msgs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ use core::fmt::Display;
5252
use crate::io::{self, Cursor, Read};
5353
use crate::io_extras::read_to_end;
5454

55-
use crate::events::MessageSendEventsProvider;
55+
use crate::events::{EventsProvider, MessageSendEventsProvider};
5656
use crate::util::chacha20poly1305rfc::ChaChaPolyReadAdapter;
5757
use crate::util::logger;
5858
use crate::util::ser::{LengthReadable, LengthReadableArgs, Readable, ReadableArgs, Writeable, Writer, WithoutLength, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname, TransactionU16LenLimited, BigSize};
@@ -1561,7 +1561,7 @@ pub trait RoutingMessageHandler : MessageSendEventsProvider {
15611561
}
15621562

15631563
/// A handler for received [`OnionMessage`]s and for providing generated ones to send.
1564-
pub trait OnionMessageHandler {
1564+
pub trait OnionMessageHandler: EventsProvider {
15651565
/// Handle an incoming `onion_message` message from the given peer.
15661566
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage);
15671567

lightning/src/ln/peer_handler.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use bitcoin::blockdata::constants::ChainHash;
1919
use bitcoin::secp256k1::{self, Secp256k1, SecretKey, PublicKey};
2020

2121
use crate::sign::{KeysManager, NodeSigner, Recipient};
22-
use crate::events::{MessageSendEvent, MessageSendEventsProvider};
22+
use crate::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
2323
use crate::ln::ChannelId;
2424
use crate::ln::features::{InitFeatures, NodeFeatures};
2525
use crate::ln::msgs;
@@ -89,6 +89,9 @@ pub trait CustomMessageHandler: wire::CustomMessageReader {
8989
/// A dummy struct which implements `RoutingMessageHandler` without storing any routing information
9090
/// or doing any processing. You can provide one of these as the route_handler in a MessageHandler.
9191
pub struct IgnoringMessageHandler{}
92+
impl EventsProvider for IgnoringMessageHandler {
93+
fn process_pending_events<H: Deref>(&self, _handler: H) where H::Target: EventHandler {}
94+
}
9295
impl MessageSendEventsProvider for IgnoringMessageHandler {
9396
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> { Vec::new() }
9497
}

lightning/src/onion_message/messenger.rs

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
1818
use crate::blinded_path::BlindedPath;
1919
use crate::blinded_path::message::{advance_path_by_one, ForwardTlvs, ReceiveTlvs};
2020
use crate::blinded_path::utils;
21+
use crate::events::{Event, EventHandler, EventsProvider};
2122
use crate::sign::{EntropySource, KeysManager, NodeSigner, Recipient};
2223
#[cfg(not(c_bindings))]
2324
use crate::ln::channelmanager::{SimpleArcChannelManager, SimpleRefChannelManager};
@@ -164,21 +165,21 @@ enum OnionMessageBuffer {
164165
ConnectedPeer(VecDeque<OnionMessage>),
165166

166167
/// Messages for a node that is not yet connected.
167-
PendingConnection(VecDeque<OnionMessage>),
168+
PendingConnection(VecDeque<OnionMessage>, Option<Vec<SocketAddress>>),
168169
}
169170

170171
impl OnionMessageBuffer {
171172
fn pending_messages(&self) -> &VecDeque<OnionMessage> {
172173
match self {
173174
OnionMessageBuffer::ConnectedPeer(pending_messages) => pending_messages,
174-
OnionMessageBuffer::PendingConnection(pending_messages) => pending_messages,
175+
OnionMessageBuffer::PendingConnection(pending_messages, _) => pending_messages,
175176
}
176177
}
177178

178179
fn enqueue_message(&mut self, message: OnionMessage) {
179180
let pending_messages = match self {
180181
OnionMessageBuffer::ConnectedPeer(pending_messages) => pending_messages,
181-
OnionMessageBuffer::PendingConnection(pending_messages) => pending_messages,
182+
OnionMessageBuffer::PendingConnection(pending_messages, _) => pending_messages,
182183
};
183184

184185
pending_messages.push_back(message);
@@ -187,7 +188,7 @@ impl OnionMessageBuffer {
187188
fn dequeue_message(&mut self) -> Option<OnionMessage> {
188189
let pending_messages = match self {
189190
OnionMessageBuffer::ConnectedPeer(pending_messages) => pending_messages,
190-
OnionMessageBuffer::PendingConnection(pending_messages) => {
191+
OnionMessageBuffer::PendingConnection(pending_messages, _) => {
191192
debug_assert!(false);
192193
pending_messages
193194
},
@@ -200,14 +201,14 @@ impl OnionMessageBuffer {
200201
fn release_pending_messages(&mut self) -> VecDeque<OnionMessage> {
201202
let pending_messages = match self {
202203
OnionMessageBuffer::ConnectedPeer(pending_messages) => pending_messages,
203-
OnionMessageBuffer::PendingConnection(pending_messages) => pending_messages,
204+
OnionMessageBuffer::PendingConnection(pending_messages, _) => pending_messages,
204205
};
205206

206207
core::mem::take(pending_messages)
207208
}
208209

209210
fn mark_connected(&mut self) {
210-
if let OnionMessageBuffer::PendingConnection(pending_messages) = self {
211+
if let OnionMessageBuffer::PendingConnection(pending_messages, _) = self {
211212
let mut new_pending_messages = VecDeque::new();
212213
core::mem::swap(pending_messages, &mut new_pending_messages);
213214
*self = OnionMessageBuffer::ConnectedPeer(new_pending_messages);
@@ -379,6 +380,8 @@ pub enum SendError {
379380
/// The provided [`Destination`] was an invalid [`BlindedPath`] due to not having any blinded
380381
/// hops.
381382
TooFewBlindedHops,
383+
/// The first hop does not support onion message forwarding.
384+
InvalidFirstHop(PublicKey),
382385
/// A path from the sender to the destination could not be found by the [`MessageRouter`].
383386
PathNotFound,
384387
/// Onion message contents must have a TLV type >= 64.
@@ -451,12 +454,12 @@ pub enum PeeledOnion<T: OnionMessageContents> {
451454
pub fn create_onion_message<ES: Deref, NS: Deref, T: OnionMessageContents>(
452455
entropy_source: &ES, node_signer: &NS, secp_ctx: &Secp256k1<secp256k1::All>,
453456
path: OnionMessagePath, contents: T, reply_path: Option<BlindedPath>,
454-
) -> Result<(PublicKey, OnionMessage), SendError>
457+
) -> Result<(PublicKey, OnionMessage, Option<Vec<SocketAddress>>), SendError>
455458
where
456459
ES::Target: EntropySource,
457460
NS::Target: NodeSigner,
458461
{
459-
let OnionMessagePath { intermediate_nodes, mut destination, .. } = path;
462+
let OnionMessagePath { intermediate_nodes, mut destination, addresses } = path;
460463
if let Destination::BlindedPath(BlindedPath { ref blinded_hops, .. }) = destination {
461464
if blinded_hops.is_empty() {
462465
return Err(SendError::TooFewBlindedHops);
@@ -497,10 +500,8 @@ where
497500
let onion_routing_packet = construct_onion_message_packet(
498501
packet_payloads, packet_keys, prng_seed).map_err(|()| SendError::TooBigPacket)?;
499502

500-
Ok((first_node_id, OnionMessage {
501-
blinding_point,
502-
onion_routing_packet
503-
}))
503+
let message = OnionMessage { blinding_point, onion_routing_packet };
504+
Ok((first_node_id, message, addresses))
504505
}
505506

506507
/// Decode one layer of an incoming [`OnionMessage`].
@@ -656,7 +657,7 @@ where
656657
pub(super) fn send_onion_message_using_path<T: OnionMessageContents>(
657658
&self, path: OnionMessagePath, contents: T, reply_path: Option<BlindedPath>
658659
) -> Result<SendSuccess, SendError> {
659-
let (first_node_id, onion_message) = create_onion_message(
660+
let (first_node_id, onion_message, addresses) = create_onion_message(
660661
&self.entropy_source, &self.node_signer, &self.secp_ctx, path, contents, reply_path
661662
)?;
662663

@@ -666,10 +667,14 @@ where
666667
}
667668

668669
match message_buffers.entry(first_node_id) {
669-
hash_map::Entry::Vacant(e) => {
670-
e.insert(OnionMessageBuffer::PendingConnection(VecDeque::new()))
671-
.enqueue_message(onion_message);
672-
Ok(SendSuccess::BufferedAwaitingConnection(first_node_id))
670+
hash_map::Entry::Vacant(e) => match addresses {
671+
None => Err(SendError::InvalidFirstHop(first_node_id)),
672+
Some(addresses) => {
673+
e.insert(
674+
OnionMessageBuffer::PendingConnection(VecDeque::new(), Some(addresses))
675+
).enqueue_message(onion_message);
676+
Ok(SendSuccess::BufferedAwaitingConnection(first_node_id))
677+
},
673678
},
674679
hash_map::Entry::Occupied(mut e) => {
675680
e.get_mut().enqueue_message(onion_message);
@@ -757,6 +762,27 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, On
757762
false
758763
}
759764

765+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> EventsProvider
766+
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
767+
where
768+
ES::Target: EntropySource,
769+
NS::Target: NodeSigner,
770+
L::Target: Logger,
771+
MR::Target: MessageRouter,
772+
OMH::Target: OffersMessageHandler,
773+
CMH::Target: CustomOnionMessageHandler,
774+
{
775+
fn process_pending_events<H: Deref>(&self, handler: H) where H::Target: EventHandler {
776+
for (node_id, recipient) in self.message_buffers.lock().unwrap().iter_mut() {
777+
if let OnionMessageBuffer::PendingConnection(_, addresses) = recipient {
778+
if let Some(addresses) = addresses.take() {
779+
handler.handle_event(Event::ConnectionNeeded { node_id: *node_id, addresses });
780+
}
781+
}
782+
}
783+
}
784+
}
785+
760786
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
761787
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
762788
where

0 commit comments

Comments
 (0)