Skip to content
This repository was archived by the owner on Feb 3, 2025. It is now read-only.

Commit 7eb6e91

Browse files
committed
Initial onion message routing
1 parent a72a87c commit 7eb6e91

File tree

2 files changed

+103
-43
lines changed

2 files changed

+103
-43
lines changed

mutiny-core/src/node.rs

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
use crate::labels::LabelStorage;
22
use crate::ldkstorage::{persist_monitor, ChannelOpenParams};
3+
use crate::multiesplora::MultiEsploraClient;
34
use crate::nodemanager::ChannelClosure;
5+
use crate::peermanager::LspMessageRouter;
6+
use crate::scb::message_handler::SCBMessageHandler;
47
use crate::scb::StaticChannelBackup;
8+
use crate::utils::get_monitor_version;
59
use crate::{
610
background::process_events_async,
711
chain::MutinyChain,
@@ -18,33 +22,24 @@ use crate::{
1822
peermanager::{GossipMessageHandler, PeerManager, PeerManagerImpl},
1923
utils::{self, sleep},
2024
};
21-
use crate::{keymanager::PhantomKeysManager, scorer::HubPreferentialScorer};
22-
23-
use crate::scb::message_handler::SCBMessageHandler;
2425
use crate::{fees::P2WSH_OUTPUT_SIZE, peermanager::connect_peer_if_necessary};
26+
use crate::{keymanager::PhantomKeysManager, scorer::HubPreferentialScorer};
2527
use crate::{lspclient::FeeRequest, storage::MutinyStorage};
2628
use anyhow::{anyhow, Context};
2729
use bdk::FeeRate;
2830
use bitcoin::hashes::{hex::ToHex, sha256::Hash as Sha256};
2931
use bitcoin::secp256k1::rand;
32+
use bitcoin::util::bip32::ExtendedPrivKey;
3033
use bitcoin::{hashes::Hash, secp256k1::PublicKey, BlockHash, Network, OutPoint};
3134
use core::time::Duration;
32-
use lightning::chain::channelmonitor::ChannelMonitor;
33-
use lightning::util::ser::{ReadableArgs, Writeable};
34-
use lightning::{
35-
ln::channelmanager::{RecipientOnionFields, RetryableSendFailure},
36-
routing::scoring::ProbabilisticScoringFeeParameters,
37-
util::config::ChannelConfig,
38-
};
39-
40-
use crate::multiesplora::MultiEsploraClient;
41-
use crate::utils::get_monitor_version;
42-
use bitcoin::util::bip32::ExtendedPrivKey;
4335
use futures_util::lock::Mutex;
36+
use lightning::chain::channelmonitor::ChannelMonitor;
4437
use lightning::events::bump_transaction::{BumpTransactionEventHandler, Wallet};
4538
use lightning::ln::PaymentSecret;
39+
use lightning::onion_message::OnionMessenger as LdkOnionMessenger;
4640
use lightning::sign::{EntropySource, InMemorySigner, NodeSigner, Recipient};
4741
use lightning::util::config::MaxDustHTLCExposure;
42+
use lightning::util::ser::{ReadableArgs, Writeable};
4843
use lightning::{
4944
chain::{chainmonitor, Filter, Watch},
5045
ln::{
@@ -63,6 +58,11 @@ use lightning::{
6358
logger::Logger,
6459
},
6560
};
61+
use lightning::{
62+
ln::channelmanager::{RecipientOnionFields, RetryableSendFailure},
63+
routing::scoring::ProbabilisticScoringFeeParameters,
64+
util::config::ChannelConfig,
65+
};
6666
use lightning_invoice::payment::PaymentError;
6767
use lightning_invoice::{
6868
payment::{pay_invoice, pay_zero_value_invoice},
@@ -94,10 +94,19 @@ pub(crate) type RapidGossipSync =
9494

9595
pub(crate) type NetworkGraph = gossip::NetworkGraph<Arc<MutinyLogger>>;
9696

97+
pub(crate) type OnionMessenger<S: MutinyStorage> = LdkOnionMessenger<
98+
Arc<PhantomKeysManager<S>>,
99+
Arc<PhantomKeysManager<S>>,
100+
Arc<MutinyLogger>,
101+
Arc<LspMessageRouter>,
102+
Arc<PhantomChannelManager<S>>,
103+
IgnoringMessageHandler,
104+
>;
105+
97106
pub(crate) type MessageHandler<S: MutinyStorage> = LdkMessageHandler<
98107
Arc<PhantomChannelManager<S>>,
99108
Arc<GossipMessageHandler<S>>,
100-
Arc<IgnoringMessageHandler>,
109+
Arc<OnionMessenger<S>>,
101110
Arc<SCBMessageHandler>,
102111
>;
103112

@@ -310,21 +319,6 @@ impl<S: MutinyStorage> Node<S> {
310319
}
311320
}
312321

313-
let route_handler = Arc::new(GossipMessageHandler {
314-
storage: persister.storage.clone(),
315-
network_graph: gossip_sync.network_graph().clone(),
316-
logger: logger.clone(),
317-
});
318-
319-
// init peer manager
320-
let scb_message_handler = Arc::new(SCBMessageHandler::new());
321-
let ln_msg_handler = MessageHandler {
322-
chan_handler: channel_manager.clone(),
323-
route_handler,
324-
onion_message_handler: Arc::new(IgnoringMessageHandler {}),
325-
custom_message_handler: scb_message_handler.clone(),
326-
};
327-
328322
log_info!(logger, "creating lsp client");
329323
let lsp_client: Option<LspClient> = match node_index.lsp {
330324
None => {
@@ -341,6 +335,31 @@ impl<S: MutinyStorage> Node<S> {
341335
}
342336
Some(ref lsp) => lsp_clients.iter().find(|c| &c.url == lsp).cloned(),
343337
};
338+
let lsp_client_pubkey = lsp_client.clone().map(|lsp| lsp.pubkey);
339+
let message_router = Arc::new(LspMessageRouter::new(lsp_client_pubkey));
340+
let onion_message_handler = Arc::new(OnionMessenger::new(
341+
keys_manager.clone(),
342+
keys_manager.clone(),
343+
logger.clone(),
344+
message_router,
345+
channel_manager.clone(),
346+
IgnoringMessageHandler {},
347+
));
348+
349+
let route_handler = Arc::new(GossipMessageHandler {
350+
storage: persister.storage.clone(),
351+
network_graph: gossip_sync.network_graph().clone(),
352+
logger: logger.clone(),
353+
});
354+
355+
// init peer manager
356+
let scb_message_handler = Arc::new(SCBMessageHandler::new());
357+
let ln_msg_handler = MessageHandler {
358+
chan_handler: channel_manager.clone(),
359+
route_handler,
360+
onion_message_handler,
361+
custom_message_handler: scb_message_handler.clone(),
362+
};
344363

345364
let bump_tx_event_handler = Arc::new(BumpTransactionEventHandler::new(
346365
Arc::clone(&chain),
@@ -349,8 +368,6 @@ impl<S: MutinyStorage> Node<S> {
349368
Arc::clone(&logger),
350369
));
351370

352-
let lsp_client_pubkey = lsp_client.clone().map(|lsp| lsp.pubkey);
353-
354371
// init event handler
355372
let event_handler = EventHandler::new(
356373
channel_manager.clone(),

mutiny-core/src/peermanager.rs

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
use crate::node::NetworkGraph;
1+
use crate::networking::socket::{schedule_descriptor_read, MutinySocketDescriptor};
2+
use crate::node::{NetworkGraph, OnionMessenger};
3+
use crate::scb::message_handler::SCBMessageHandler;
24
use crate::storage::MutinyStorage;
35
use crate::{error::MutinyError, fees::MutinyFeeEstimator};
46
use crate::{gossip, ldkstorage::PhantomChannelManager, logging::MutinyLogger};
57
use crate::{gossip::read_peer_info, node::PubkeyConnectionInfo};
68
use crate::{keymanager::PhantomKeysManager, node::ConnectionType};
79
use bitcoin::secp256k1::PublicKey;
8-
use lightning::{
9-
ln::{msgs::SocketAddress, peer_handler::SocketDescriptor as LdkSocketDescriptor},
10-
log_debug, log_trace,
11-
};
12-
use std::{net::SocketAddr, sync::atomic::AtomicBool};
13-
14-
use crate::networking::socket::{schedule_descriptor_read, MutinySocketDescriptor};
15-
use crate::scb::message_handler::SCBMessageHandler;
1610
use lightning::events::{MessageSendEvent, MessageSendEventsProvider};
1711
use lightning::ln::features::{InitFeatures, NodeFeatures};
1812
use lightning::ln::msgs;
1913
use lightning::ln::msgs::{LightningError, RoutingMessageHandler};
2014
use lightning::ln::peer_handler::PeerHandleError;
21-
use lightning::ln::peer_handler::{IgnoringMessageHandler, PeerManager as LdkPeerManager};
15+
use lightning::ln::peer_handler::PeerManager as LdkPeerManager;
2216
use lightning::log_warn;
17+
use lightning::onion_message::{Destination, MessageRouter, OnionMessagePath};
2318
use lightning::routing::gossip::NodeId;
2419
use lightning::util::logger::Logger;
20+
use lightning::{
21+
ln::{msgs::SocketAddress, peer_handler::SocketDescriptor as LdkSocketDescriptor},
22+
log_debug, log_trace,
23+
};
2524
use std::sync::Arc;
25+
use std::{net::SocketAddr, sync::atomic::AtomicBool};
2626

2727
#[cfg(target_arch = "wasm32")]
2828
use crate::networking::ws_socket::WsTcpSocketDescriptor;
@@ -91,7 +91,7 @@ pub(crate) type PeerManagerImpl<S: MutinyStorage> = LdkPeerManager<
9191
MutinySocketDescriptor,
9292
Arc<PhantomChannelManager<S>>,
9393
Arc<GossipMessageHandler<S>>,
94-
Arc<IgnoringMessageHandler>,
94+
Arc<OnionMessenger<S>>,
9595
Arc<MutinyLogger>,
9696
Arc<SCBMessageHandler>,
9797
Arc<PhantomKeysManager<S>>,
@@ -294,6 +294,49 @@ impl<S: MutinyStorage> RoutingMessageHandler for GossipMessageHandler<S> {
294294
}
295295
}
296296

297+
/// LDK currently can't route onion messages, so we need to do it ourselves
298+
/// We just assume they are connected to us or the LSP.
299+
pub struct LspMessageRouter {
300+
intermediate_nodes: Vec<PublicKey>,
301+
}
302+
303+
impl LspMessageRouter {
304+
pub fn new(lsp_pubkey: Option<PublicKey>) -> Self {
305+
let intermediate_nodes = match lsp_pubkey {
306+
Some(pubkey) => vec![pubkey],
307+
None => vec![],
308+
};
309+
310+
Self { intermediate_nodes }
311+
}
312+
}
313+
314+
impl MessageRouter for LspMessageRouter {
315+
fn find_path(
316+
&self,
317+
_sender: PublicKey,
318+
peers: Vec<PublicKey>,
319+
destination: Destination,
320+
) -> Result<OnionMessagePath, ()> {
321+
let first_node = match &destination {
322+
Destination::Node(node_id) => *node_id,
323+
Destination::BlindedPath(path) => path.introduction_node_id,
324+
};
325+
326+
if peers.contains(&first_node) {
327+
Ok(OnionMessagePath {
328+
intermediate_nodes: vec![],
329+
destination,
330+
})
331+
} else {
332+
Ok(OnionMessagePath {
333+
intermediate_nodes: self.intermediate_nodes.clone(),
334+
destination,
335+
})
336+
}
337+
}
338+
}
339+
297340
pub(crate) async fn connect_peer_if_necessary<S: MutinyStorage>(
298341
#[cfg(target_arch = "wasm32")] websocket_proxy_addr: &str,
299342
peer_connection_info: &PubkeyConnectionInfo,

0 commit comments

Comments
 (0)