Skip to content

Commit 4c8dc2c

Browse files
Add baseline OnionMessenger and msgs::OnionMessage and its serialization
OnionMessenger will be hooked up to the PeerManager to send and receive OMs in a follow-up PR.
1 parent 6017379 commit 4c8dc2c

File tree

3 files changed

+107
-1
lines changed

3 files changed

+107
-1
lines changed

lightning/src/ln/msgs.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use bitcoin::hash_types::{Txid, BlockHash};
3232

3333
use ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
3434
use ln::onion_utils;
35+
use onion_message;
3536

3637
use prelude::*;
3738
use core::fmt;
@@ -41,7 +42,7 @@ use io_extras::read_to_end;
4142

4243
use util::events::MessageSendEventsProvider;
4344
use util::logger;
44-
use util::ser::{Readable, Writeable, Writer, FixedLengthReader, HighZeroBytesDroppedVarInt, Hostname};
45+
use util::ser::{LengthReadable, Readable, Writeable, Writer, FixedLengthReader, HighZeroBytesDroppedVarInt, Hostname};
4546

4647
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
4748

@@ -305,6 +306,14 @@ pub struct UpdateAddHTLC {
305306
pub(crate) onion_routing_packet: OnionPacket,
306307
}
307308

309+
/// An onion message to be sent or received from a peer
310+
#[derive(Clone, Debug, PartialEq)]
311+
pub struct OnionMessage {
312+
/// Used in decrypting the onion packet's payload.
313+
pub blinding_point: PublicKey,
314+
pub(crate) onion_routing_packet: onion_message::Packet,
315+
}
316+
308317
/// An update_fulfill_htlc message to be sent or received from a peer
309318
#[derive(Clone, Debug, PartialEq)]
310319
pub struct UpdateFulfillHTLC {
@@ -1340,6 +1349,29 @@ impl_writeable_msg!(UpdateAddHTLC, {
13401349
onion_routing_packet
13411350
}, {});
13421351

1352+
impl Readable for OnionMessage {
1353+
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1354+
let blinding_point: PublicKey = Readable::read(r)?;
1355+
let len: u16 = Readable::read(r)?;
1356+
let mut packet_reader = FixedLengthReader::new(r, len as u64);
1357+
let onion_routing_packet: onion_message::Packet = <onion_message::Packet as LengthReadable>::read(&mut packet_reader)?;
1358+
Ok(Self {
1359+
blinding_point,
1360+
onion_routing_packet,
1361+
})
1362+
}
1363+
}
1364+
1365+
impl Writeable for OnionMessage {
1366+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1367+
self.blinding_point.write(w)?;
1368+
let onion_packet_len = self.onion_routing_packet.serialized_length();
1369+
(onion_packet_len as u16).write(w)?;
1370+
self.onion_routing_packet.write(w)?;
1371+
Ok(())
1372+
}
1373+
}
1374+
13431375
impl Writeable for FinalOnionHopData {
13441376
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
13451377
self.payment_secret.0.write(w)?;
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// This file is Copyright its original authors, visible in version control
2+
// history.
3+
//
4+
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5+
// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7+
// You may not use this file except in accordance with one or both of these
8+
// licenses.
9+
10+
//! LDK sends, receives, and forwards onion messages via the [`OnionMessenger`]. See its docs for
11+
//! more information.
12+
13+
use bitcoin::secp256k1::{self, PublicKey, Secp256k1};
14+
15+
use chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager, Sign};
16+
use ln::msgs;
17+
use util::logger::Logger;
18+
19+
use core::ops::Deref;
20+
use sync::{Arc, Mutex};
21+
use prelude::*;
22+
23+
/// A sender, receiver and forwarder of onion messages. In upcoming releases, this object will be
24+
/// used to retrieve invoices and fulfill invoice requests from [offers].
25+
///
26+
/// [offers]: <https://github.com/lightning/bolts/pull/798>
27+
pub struct OnionMessenger<Signer: Sign, K: Deref, L: Deref>
28+
where K::Target: KeysInterface<Signer = Signer>,
29+
L::Target: Logger,
30+
{
31+
keys_manager: K,
32+
logger: L,
33+
pending_messages: Mutex<HashMap<PublicKey, Vec<msgs::OnionMessage>>>,
34+
secp_ctx: Secp256k1<secp256k1::All>,
35+
// Coming soon:
36+
// invoice_handler: InvoiceHandler,
37+
// custom_handler: CustomHandler, // handles custom onion messages
38+
}
39+
40+
impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
41+
where K::Target: KeysInterface<Signer = Signer>,
42+
L::Target: Logger,
43+
{
44+
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
45+
/// their respective handlers.
46+
pub fn new(keys_manager: K, logger: L) -> Self {
47+
let mut secp_ctx = Secp256k1::new();
48+
secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
49+
OnionMessenger {
50+
keys_manager,
51+
pending_messages: Mutex::new(HashMap::new()),
52+
secp_ctx,
53+
logger,
54+
}
55+
}
56+
}
57+
58+
// TODO: parameterize the below Simple* types with OnionMessenger and handle the messages it
59+
// produces
60+
/// Useful for simplifying the parameters of [`SimpleArcChannelManager`] and
61+
/// [`SimpleArcPeerManager`]. See their docs for more details.
62+
///
63+
///[`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
64+
///[`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
65+
pub type SimpleArcOnionMessenger<L> = OnionMessenger<InMemorySigner, Arc<KeysManager>, Arc<L>>;
66+
/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
67+
/// [`SimpleRefPeerManager`]. See their docs for more details.
68+
///
69+
///[`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
70+
///[`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
71+
pub type SimpleRefOnionMessenger<'a, 'b, L> = OnionMessenger<InMemorySigner, &'a KeysManager, &'b L>;

lightning/src/onion_message/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
//! Onion Messages: sending, receiving, forwarding, and ancillary utilities live here
1111
1212
mod blinded_route;
13+
mod messenger;
1314
mod packet;
1415
mod utils;
1516

1617
// Re-export structs so they can be imported with just the `onion_message::` module prefix.
1718
pub use self::blinded_route::{BlindedRoute, BlindedHop};
19+
pub use self::messenger::{OnionMessenger, SimpleArcOnionMessenger, SimpleRefOnionMessenger};
20+
pub(crate) use self::packet::Packet;

0 commit comments

Comments
 (0)