Commit graph

140 commits

Author SHA1 Message Date
Jeffrey Czyz
1c4d3289ff
Return correct SendSuccess in OnionMessenger
When enqueuing a message for a node already awaiting a connection,
BufferedAwaitingConnection should be returned when a node is not yet
connected as a peer. However, it was only returned when the first
message was enqueued. Any messages enqueued after but before a
connection was established incorrectly returned Buffered.
2023-12-07 23:44:47 -06:00
Jeffrey Czyz
be618bb7b5
Rename OnionMessagePath::addresses
The name itself doesn't provide much meaning to what the addresses
correspond to.
2023-12-07 23:44:41 -06:00
Jeffrey Czyz
5892fd698e
Fix create_onion_message return type documentation 2023-12-07 22:25:25 -06:00
Jeffrey Czyz
0b83116436
Rename OnionMessageBuffer to OnionMessageRecipient 2023-12-06 14:45:24 -06:00
Jeffrey Czyz
d46519bbd0
Remove superfluous space from where clause 2023-12-06 14:45:24 -06:00
Jeffrey Czyz
89e630b918
Test pending connection onion message buffering
Add tests for onion message buffering checking that messages are cleared
upon disconnection and timed out after MAX_TIMER_TICKS. Also, checks
that ConnectionNeeded events are generated.
2023-12-06 14:45:18 -06:00
Jeffrey Czyz
210407e1bb
Reuse MessengerNode in spec_test_vector
Additional tests will be added needing a similar node struct, so
consolidate its usage.
2023-12-06 14:43:39 -06:00
Jeffrey Czyz
cfaa7f3617
Drop buffered messages for timed out nodes
OnionMessenger buffers onion messages for nodes that are pending a
connection. To prevent DoS concerns, add a timer_tick_occurred method to
OnionMessageHandler so that buffered messages can be dropped. This will
be called in lightning-background-processor every 10 seconds.
2023-12-06 14:25:31 -06:00
Jeffrey Czyz
06b05df755
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.
2023-12-06 08:51:23 -06:00
Jeffrey Czyz
b86f02afad
Return socket addresses from DefaultMessageRouter
When there isn't a direct connection with the Destination of an
OnionMessage, look up socket addresses from the NetworkGraph. This is
used to signal to OnionMessenger that a direct connection is needed to
send the message.
2023-12-06 08:47:34 -06:00
Jeffrey Czyz
1114c3c5aa
Add Option<Vec<SocketAddress>> to OnionMessagePath
MessageRouter::find_path is given a Destination to reach via a set of
peers. If a path cannot be found, it may return a partial path such that
OnionMessenger can signal a direct connection to the first node in the
path is needed. Include a list of socket addresses in the returned
OnionMessagePath to allow OnionMessenger to know how to connect to the
node.

This allows DefaultMessageRouter to use its NetworkGraph to return
socket addresses for gossiped nodes.
2023-12-06 08:47:33 -06:00
Jeffrey Czyz
17af8d5f09
Add NetworkGraph reference to DefaultMessageRouter
When buffering onion messages for a node that is not connected as a
peer, it's possible that the node does not exist. Include a NetworkGraph
reference in DefaultMessageRouter so that it can be used to check if the
node actually exists. Otherwise, an malicious node may send an onion
message where the reply path's introduction node doesn't exist. This
would result in buffering messages that may never be delivered.
2023-12-06 08:47:33 -06:00
Jeffrey Czyz
ddee9289dc
Buffer onion messages requiring a connection
MessageRouter::find_path returns a path to use when sending an onion
message. If the first node on the path is not connected or does not
support onion messages, sending will fail with InvalidFirstHop. Instead
of failing outright, buffer the message for later sending once the first
node is a connected peer.
2023-12-06 08:47:33 -06:00
Jeffrey Czyz
8412e8368c
Destination in OnionMessenger::send_onion_message
OnionMessenger::send_onion_message takes an OnionMessagePath. This isn't
very useful as it requires finding a path manually. Instead, have the
method take a Destination and use OnionMessenger's MessageRouter to
construct the path. Later, this will allow for buffering messages where
the first node in the path isn't a direct connection.
2023-12-06 08:47:18 -06:00
Jeffrey Czyz
79f212b70a
Use a message buffer abstraction in OnionMessenger
Onion messages are buffered for sending to the next node. Since the
network has limited adoption, connecting directly to a peer may be
necessary. Add an OnionMessageBuffer abstraction that can differentiate
between connected peers and those are pending a connection. This allows
for buffering messages before a connection is established and applying
different buffer policies for peers yet to be connected.
2023-12-05 22:39:16 -06:00
henghonglee
ff5e5221d2 logging every sent and receive onion message
Logs every sent + receive for P2P messages
solves #2346
2023-12-03 00:24:14 +05:30
henghonglee
0cba31fd38
Pass Record by value to Logger
Instead of passing a reference to a Record, pass the Logger an owned
Record so that it can be decorated with semantic context.
2023-12-01 11:30:19 -06:00
Wilmer Paulino
ec928d55b4
Bump rust-bitcoin to v0.30.2 2023-11-22 15:58:01 -08:00
Matt Corallo
26c00ad751 derive(Hash) for P2P messages
In other languages (Java and C#, notably), overriding `Eq` without
overriding `Hash` can lead to surprising or broken behavior. Even
in Rust, its usually the case that you actually want both. Here we
add missing `Hash` derivations for P2P messages, to at least
address the first pile of warnings the C# compiler dumps.
2023-11-14 00:40:30 +00:00
Evan Feenstra
0c7b6479b0 export create_onion_message and peel_onion_message from ln::onion_message 2023-11-06 10:42:50 -08:00
Matt Corallo
49a5fdf6aa Use a tuple, not a struct, for PendingOnionMessage in bindings
Bindings aren't currently able to handle a struct with a generic
which is actually exposed - we map all structs concretely to a
single type, whereas having fluctuating types on a struct requires
mapping the inner field to a trait first.

Since this isn't super practical, we make `PendingOnionMessage` a
tuple in bindings, rather than a struct.
2023-10-23 19:42:32 +00:00
Matt Corallo
4918c415af Drop an unnecessary no-export on ParsedOnionMessageContents 2023-10-23 16:50:35 +00:00
Matt Corallo
4443db67f9 Do not compile the Simple* type aliases in c_bindings at all
Because the bindings changes now require further changes to our
type definitions, avoiding building the `Simple*` type aliases
entirely makes the patchset there simpler.
2023-10-21 16:30:41 +00:00
Jeffrey Czyz
a841e6b9e1
Onion message routing to immediate peers.
DefaultMessageRouter always fails. Update it so that it can route to a
directly connected peer. This is needed for an Offers minimum viable
product.
2023-10-20 09:49:58 -05:00
Jeffrey Czyz
0e41d8085a
Use ChannelManager as OffersMessageHandler 2023-10-20 09:49:57 -05:00
Jeffrey Czyz
905028b615
Clean up peel_onion name, parameters, and docs
For consistency with other functions and doc cleanliness.
2023-10-18 18:33:14 -05:00
Jeffrey Czyz
622f7f2f79
Remove outdated docs 2023-10-18 18:31:27 -05:00
Jeffrey Czyz
6dc42235ba
Allow sending onion messages to 1-hop blinded path
This allows for specifying the introduction node as the message
recipient.
2023-10-18 18:31:27 -05:00
Jeffrey Czyz
8b442fe4eb
Enqueue onion messages in handlers
When constructing onion messages to send initially (opposed to replying
to one from a handler), the user must construct an OnionMessagePath first
before calling OnionMessener::send_onion_message. Additionally, having a
reference to OnionMessener isn't always desirable. For instance, in an
upcoming commit, ChannelManager will implement OffersMessageHandler,
which OnionMessenger needs a reference to. If ChannelManager had a
reference to OnionMessenger, too, there would be a dependency cycle.

Instead, modify OffersMessageHandler and CustomOnionMessageHandler's
interfaces to include a method for releasing pending onion messages.
That way, ChannelManager may, for instance, construct and enqueue an
InvoiceRequest for sending without needing a reference to
OnionMessenger.

Additionally, OnionMessenger has responsibility for path finding just as
it does when replying to messages from a handler. It performs this when
extracting messages from the handlers before returning the next message
to send to a peer.
2023-10-18 18:31:16 -05:00
Jeffrey Czyz
840efd5334
Generalize CustomOnionMessageContents trait
Rename CustomOnionMessageContents to OnionMessageContents and use it as
a trait bound on messages passed to OnionMessenger methods. This allows
using the trait in an upcoming commit as a bound on the contents of
PendingOnionMessage.

Also, make ParsedOnionMessageContent implement OnionMessageContents so
that Payload can be bounded by OnionMessageContents directly, but used
when either reading a ParsedOnionMessageContent or writing a specific
type of OnionMessageContents (e.g., OffersMessage).
2023-10-18 18:15:05 -05:00
Jeffrey Czyz
94573dda33
Rename OnionMessageContents
In preparation for needing the name OnionMessageContents for a trait to
bound methods, rename it to ParsedOnionMessageContents. In the next
commit, it's use will be limited to reading only, and the new trait will
be a bound on method parameters instead.
2023-10-18 17:18:03 -05:00
Jeffrey Czyz
81c6147a9e
Generalize respond_with_onion_message
OnionMessenger can send onion message responses from its handlers using
respond_with_onion_message, which finds a path to the destination and
enqueues the response for sending. Generalize this as it can be used not
only for responses but for initial sends as well.
2023-10-18 17:09:27 -05:00
Jeffrey Czyz
cfe6b952a8
Import msgs::OnionMessage 2023-10-18 17:09:24 -05:00
Jeffrey Czyz
a4894bd3ca
Clean up onion messenger parameters and docs 2023-10-18 17:00:04 -05:00
Jeffrey Czyz
b78cb69de3
Avoid overloading introduction_node_id 2023-10-18 17:00:04 -05:00
Jeffrey Czyz
86e2b0059f
Remove OnionMessageProvider
OnionMessageProvider is a super-trait of OnionMessageHandler, but they
don't need to be used separately. Additionally, the former is misplaced
in the events module. Remove OnionMessageProvider and add it's only
method, next_onion_message_for_peer, into OnionMessageHandler.
2023-10-18 17:00:04 -05:00
Jeffrey Czyz
a6cd661712
Update OnionMessenger docs for Offers 2023-10-18 17:00:03 -05:00
Evan Feenstra
fe6f166bca public static peel_onion method on OnionMessenger 2023-10-17 14:48:09 -07:00
Matt Corallo
07205a2869 Make create_onion_message a freestanding function
The new `create_onion_message` function in `OnionMessenger` is hard
to handle - it has various generic requirements indirectly via the
struct, but they're not bounded by any of the method parameters.
Thus, you can't simply call `OnionMessenger::create_onion_message`,
as various bounds are not specified.

Instead, we move it to a freestanding function so that it can be
called directly without explicitly setting bounds.
2023-10-01 00:05:01 +00:00
Evan Feenstra
30b74a6bcf public make_onion_message static method on OnionMessenger 2023-09-20 13:42:35 -07:00
Valentine Wallace
ebb0676e85
Fix documentation on onion message packet ControlTlvs 2023-08-23 11:28:42 -04:00
Valentine Wallace
d224f980ed
Simplify onion message blinded hop construction
Also adds a util for general blinded hop creation to be reused for blinded
payment paths.
2023-08-23 11:26:45 -04:00
Valentine Wallace
cf64e3fba5
Add new _init_and_read_tlv_stream ser macro
Useful for when you want to use _init_and_read_len_prefixed_tlv_fields but there is no
length byte at the start of the TLV stream.
2023-08-23 11:24:54 -04:00
Valentine Wallace
7c1726b585
Update blinded path util to take iterator instead of slice
Useful for blinded payment path construction.
2023-08-22 13:26:12 -04:00
Valentine Wallace
1b356619b3
Move Padding into blinded_path module for use in blinded payments 2023-08-22 13:26:12 -04:00
Valentine Wallace
fe5a076aa6
Move blinded message path util into message submodule 2023-08-22 13:26:11 -04:00
Valentine Wallace
381cc646c6
Move some blinded path message code into message submodule.
We'll similarly separate blinded path payments code into its own module.
2023-08-22 13:18:42 -04:00
Matt Corallo
4fb5708eec
Merge pull request #2411 from valentinewallace/2023-07-blinded-onion-keys
Support constructing blinded path onion keys
2023-08-22 17:10:59 +00:00
Valentine Wallace
ec5e837cc2
Generalize next_hop_packet_pubkey onion util
Useful for generating a next hop blinding point when forwarding a blinded
payment.
2023-08-19 18:55:34 -04:00
Valentine Wallace
49f4d5f8f4
Add onion message test vectors
Also re-alphabetize the imports in the onion message functional tests.

Co-authored-by: Carla Kirk-Cohen <kirkcohenc@gmail.com>
2023-07-27 11:55:47 -07:00