Skip to content

Commit 1eda181

Browse files
Add baseline OnionMessenger and msgs::OnionMessage and its serialization
OnionMessenger will be a MessageSendEventsProvider, so the next commit will be adding the boilerplate for it to send and receive messages from the PeerManager
1 parent 796ae0c commit 1eda181

File tree

2 files changed

+87
-2
lines changed

2 files changed

+87
-2
lines changed

lightning/src/ln/msgs.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use bitcoin::blockdata::script::Script;
3131
use bitcoin::hash_types::{Txid, BlockHash};
3232

3333
use ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
34+
use onion_message;
3435

3536
use prelude::*;
3637
use core::fmt;
@@ -40,7 +41,7 @@ use io_extras::read_to_end;
4041

4142
use util::events::MessageSendEventsProvider;
4243
use util::logger;
43-
use util::ser::{Readable, Writeable, Writer, FixedLengthReader, HighZeroBytesDroppedVarInt};
44+
use util::ser::{LengthReadable, Readable, Writeable, Writer, FixedLengthReader, HighZeroBytesDroppedVarInt};
4445

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

@@ -304,6 +305,16 @@ pub struct UpdateAddHTLC {
304305
pub(crate) onion_routing_packet: OnionPacket,
305306
}
306307

308+
/// An onion message to be sent or received from a peer
309+
#[derive(Clone, Debug, PartialEq)]
310+
pub struct OnionMessage {
311+
/// This blinding point is used in the shared secret that is used to decrypt the onion message
312+
/// payload's `encrypted_data` field.
313+
pub(crate) blinding_point: PublicKey,
314+
pub(crate) len: u16,
315+
pub(crate) onion_routing_packet: onion_message::Packet,
316+
}
317+
307318
/// An update_fulfill_htlc message to be sent or received from a peer
308319
#[derive(Clone, Debug, PartialEq)]
309320
pub struct UpdateFulfillHTLC {
@@ -1304,6 +1315,29 @@ impl_writeable_msg!(UpdateAddHTLC, {
13041315
onion_routing_packet
13051316
}, {});
13061317

1318+
impl Readable for OnionMessage {
1319+
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1320+
let blinding_point: PublicKey = Readable::read(r)?;
1321+
let len: u16 = Readable::read(r)?;
1322+
let mut packet_reader = FixedLengthReader::new(r, len as u64);
1323+
let onion_routing_packet: onion_message::Packet = <onion_message::Packet as LengthReadable>::read(&mut packet_reader)?;
1324+
Ok(Self {
1325+
blinding_point,
1326+
len,
1327+
onion_routing_packet,
1328+
})
1329+
}
1330+
}
1331+
1332+
impl Writeable for OnionMessage {
1333+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1334+
self.blinding_point.write(w)?;
1335+
self.len.write(w)?;
1336+
self.onion_routing_packet.write(w)?;
1337+
Ok(())
1338+
}
1339+
}
1340+
13071341
impl Writeable for FinalOnionHopData {
13081342
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
13091343
self.payment_secret.0.write(w)?;

lightning/src/onion_message.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,18 @@ use bitcoin::hashes::sha256::Hash as Sha256;
1414
use bitcoin::secp256k1::{self, PublicKey, Secp256k1, SecretKey};
1515
use bitcoin::secp256k1::ecdh::SharedSecret;
1616

17-
use chain::keysinterface::{KeysInterface, Sign};
17+
use chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager, Sign};
1818
use ln::msgs::DecodeError;
1919
use ln::onion_utils;
2020
use util::chacha20poly1305rfc::ChaChaPolyWriteAdapter;
21+
use util::events::MessageSendEvent;
22+
use util::logger::Logger;
2123
use util::ser::{IgnoringLengthReadable, LengthRead, LengthReadable, Readable, VecWriter, Writeable, Writer};
2224

2325
use core::ops::Deref;
2426
use io::{self, Read};
2527
use prelude::*;
28+
use sync::{Arc, Mutex};
2629

2730
#[derive(Clone, Debug, PartialEq)]
2831
pub(crate) struct Packet {
@@ -225,6 +228,41 @@ impl BlindedRoute {
225228
}
226229
}
227230

231+
/// A sender, receiver and forwarder of onion messages. In upcoming releases, this object will be
232+
/// used to retrieve invoices and fulfill invoice requests from [offers].
233+
///
234+
/// [offers]: https://github.com/lightning/bolts/pull/798
235+
pub struct OnionMessenger<Signer: Sign, K: Deref, L: Deref>
236+
where K::Target: KeysInterface<Signer = Signer>,
237+
L::Target: Logger,
238+
{
239+
keys_manager: K,
240+
logger: L,
241+
pending_msg_events: Mutex<Vec<MessageSendEvent>>,
242+
secp_ctx: Secp256k1<secp256k1::All>,
243+
// Coming soon:
244+
// invoice_handler: InvoiceHandler,
245+
// custom_handler: CustomHandler, // handles custom onion messages
246+
}
247+
248+
impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
249+
where K::Target: KeysInterface<Signer = Signer>,
250+
L::Target: Logger,
251+
{
252+
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
253+
/// their respective handlers.
254+
pub fn new(keys_manager: K, logger: L) -> Self {
255+
let mut secp_ctx = Secp256k1::new();
256+
secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
257+
OnionMessenger {
258+
keys_manager,
259+
pending_msg_events: Mutex::new(Vec::new()),
260+
secp_ctx,
261+
logger,
262+
}
263+
}
264+
}
265+
228266
#[inline]
229267
fn construct_keys_callback<
230268
T: secp256k1::Signing + secp256k1::Verification,
@@ -300,3 +338,16 @@ fn construct_blinded_route_keys<T: secp256k1::Signing + secp256k1::Verification>
300338

301339
Ok((encrypted_data_keys, blinded_node_pks))
302340
}
341+
342+
/// Useful for simplifying the parameters of [`SimpleArcChannelManager`] and
343+
/// [`SimpleArcPeerManager`]. See their docs for more details.
344+
///
345+
///[`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
346+
///[`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
347+
pub type SimpleArcOnionMessenger<L> = OnionMessenger<InMemorySigner, Arc<KeysManager>, Arc<L>>;
348+
/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
349+
/// [`SimpleRefPeerManager`]. See their docs for more details.
350+
///
351+
///[`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
352+
///[`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
353+
pub type SimpleRefOnionMessenger<'a, 'b, L> = OnionMessenger<InMemorySigner, &'a KeysManager, &'b L>;

0 commit comments

Comments
 (0)