Skip to content

Commit e8f7fe1

Browse files
Support generating events when an OM for an offline peer is received.
Docs will be added in upcoming commits.
1 parent 3b1b0a5 commit e8f7fe1

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

lightning/src/events/mod.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,18 @@ pub enum Event {
10411041
///
10421042
/// [`ChannelHandshakeConfig::negotiate_anchors_zero_fee_htlc_tx`]: crate::util::config::ChannelHandshakeConfig::negotiate_anchors_zero_fee_htlc_tx
10431043
BumpTransaction(BumpTransactionEvent),
1044+
/// We received an onion message that is intended to be forwarded to a peer
1045+
/// that is currently offline. This event will only be generated if the
1046+
/// `OnionMessenger` was initialized with
1047+
/// [`OnionMessenger::new_with_offline_peer_interception`], see its docs.
1048+
///
1049+
/// [`OnionMessenger::new_with_offline_peer_interception`]: crate::onion_message::messenger::OnionMessenger::new_with_offline_peer_interception
1050+
OnionMessageIntercepted {
1051+
/// The node id of the offline peer.
1052+
peer_node_id: PublicKey,
1053+
/// The onion message intended to be forwarded to `peer_node_id`.
1054+
message: msgs::OnionMessage,
1055+
},
10441056
}
10451057

10461058
impl Writeable for Event {
@@ -1286,6 +1298,13 @@ impl Writeable for Event {
12861298
35u8.write(writer)?;
12871299
// Never write ConnectionNeeded events as buffered onion messages aren't serialized.
12881300
},
1301+
&Event::OnionMessageIntercepted { ref peer_node_id, ref message } => {
1302+
37u8.write(writer)?;
1303+
write_tlv_fields!(writer, {
1304+
(0, peer_node_id, required),
1305+
(2, message, required),
1306+
});
1307+
}
12891308
// Note that, going forward, all new events must only write data inside of
12901309
// `write_tlv_fields`. Versions 0.0.101+ will ignore odd-numbered events that write
12911310
// data via `write_tlv_fields`.
@@ -1697,6 +1716,18 @@ impl MaybeReadable for Event {
16971716
},
16981717
// Note that we do not write a length-prefixed TLV for ConnectionNeeded events.
16991718
35u8 => Ok(None),
1719+
37u8 => {
1720+
let mut f = || {
1721+
_init_and_read_len_prefixed_tlv_fields!(reader, {
1722+
(0, peer_node_id, required),
1723+
(2, message, required),
1724+
});
1725+
Ok(Some(Event::OnionMessageIntercepted {
1726+
peer_node_id: peer_node_id.0.unwrap(), message: message.0.unwrap()
1727+
}))
1728+
};
1729+
f()
1730+
},
17001731
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
17011732
// Version 0.0.100 failed to properly ignore odd types, possibly resulting in corrupt
17021733
// reads.

lightning/src/onion_message/messenger.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ where
175175
message_router: MR,
176176
offers_handler: OMH,
177177
custom_handler: CMH,
178+
intercept_messages_for_offline_peers: bool,
179+
pending_events: Mutex<Vec<Event>>,
178180
}
179181

180182
/// [`OnionMessage`]s buffered to be sent.
@@ -796,6 +798,28 @@ where
796798
pub fn new(
797799
entropy_source: ES, node_signer: NS, logger: L, node_id_lookup: NL, message_router: MR,
798800
offers_handler: OMH, custom_handler: CMH
801+
) -> Self {
802+
Self::new_inner(
803+
entropy_source, node_signer, logger, node_id_lookup, message_router,
804+
offers_handler, custom_handler, false
805+
)
806+
}
807+
808+
///
809+
pub fn new_with_offline_peer_interception(
810+
entropy_source: ES, node_signer: NS, logger: L, node_id_lookup: NL,
811+
message_router: MR, offers_handler: OMH, custom_handler: CMH
812+
) -> Self {
813+
Self::new_inner(
814+
entropy_source, node_signer, logger, node_id_lookup, message_router,
815+
offers_handler, custom_handler, true
816+
)
817+
}
818+
819+
fn new_inner(
820+
entropy_source: ES, node_signer: NS, logger: L, node_id_lookup: NL,
821+
message_router: MR, offers_handler: OMH, custom_handler: CMH,
822+
intercept_messages_for_offline_peers: bool
799823
) -> Self {
800824
let mut secp_ctx = Secp256k1::new();
801825
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
@@ -809,6 +833,8 @@ where
809833
message_router,
810834
offers_handler,
811835
custom_handler,
836+
intercept_messages_for_offline_peers,
837+
pending_events: Mutex::new(Vec::new()),
812838
}
813839
}
814840

@@ -1004,6 +1030,11 @@ where
10041030
}
10051031
}
10061032
}
1033+
let mut events = Vec::new();
1034+
core::mem::swap(&mut *self.pending_events.lock().unwrap(), &mut events);
1035+
for ev in events {
1036+
handler.handle_event(ev);
1037+
}
10071038
}
10081039
}
10091040

@@ -1081,6 +1112,13 @@ where
10811112
e.get_mut().enqueue_message(onion_message);
10821113
log_trace!(logger, "Forwarding an onion message to peer {}", next_node_id);
10831114
},
1115+
_ if self.intercept_messages_for_offline_peers => {
1116+
self.pending_events.lock().unwrap().push(
1117+
Event::OnionMessageIntercepted {
1118+
peer_node_id: next_node_id, message: onion_message
1119+
}
1120+
);
1121+
},
10841122
_ => {
10851123
log_trace!(
10861124
logger,

0 commit comments

Comments
 (0)