Skip to content

Commit 396e569

Browse files
authored
Merge pull request #103 from EthanYuan/check-peer-connection
validate peer connections from lnd channels
2 parents 8ae021f + e546c34 commit 396e569

5 files changed

Lines changed: 54 additions & 13 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mutiny-core/src/lib.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ pub use crate::ldkstorage::{
4646
ACTIVE_NODE_ID_KEY, CHANNEL_CLOSURE_BUMP_PREFIX, CHANNEL_CLOSURE_PREFIX, CHANNEL_MANAGER_KEY,
4747
MONITORS_PREFIX_KEY,
4848
};
49-
use crate::lsp::lndchannel::fetch_lnd_channels_snapshot;
49+
use crate::lsp::lndchannel::{
50+
fetch_lnd_channels, fetch_lnd_channels_snapshot, LndChannelsSnapshot,
51+
};
5052
use crate::messagehandler::CommonLnEventCallback;
5153
use crate::nodemanager::NodeManager;
5254
use crate::nodemanager::{ChannelClosure, MutinyBip21RawMaterials};
@@ -835,11 +837,12 @@ impl<S: MutinyStorage> MutinyWalletBuilder<S> {
835837
return;
836838
};
837839

838-
let first_lnd_snapshot =
839-
match fetch_lnd_channels_snapshot(&Client::new(), lsp_url, &node_id, &logger).await {
840-
Ok(snapshot) => {
841-
log_debug!(logger, "First fetched lnd snapshot: {:?}", snapshot);
842-
snapshot
840+
let (lnd_channels, first_lnd_snapshot) =
841+
match fetch_lnd_channels(&Client::new(), lsp_url, &node_id, &logger).await {
842+
Ok(lnd_channels) => {
843+
let lnd_snapshot: LndChannelsSnapshot = lnd_channels.clone().into();
844+
log_debug!(logger, "First fetched lnd snapshot: {:?}", lnd_snapshot);
845+
(lnd_channels, lnd_snapshot)
843846
}
844847
Err(e) => {
845848
log_error!(logger, "First lnd snapshot fetch failed: {e}");
@@ -851,7 +854,7 @@ impl<S: MutinyStorage> MutinyWalletBuilder<S> {
851854
let only_device_lock_vss_pending =
852855
pending.len() == 1 && pending.iter().any(|(key, _)| key == DEVICE_LOCK_KEY);
853856
let can_update_snapshot = (pending.is_empty() || only_device_lock_vss_pending)
854-
&& CONNECTED_PEER_MANAGER.is_any_connected();
857+
&& CONNECTED_PEER_MANAGER.validate_peer_connections(&lnd_channels);
855858
if can_update_snapshot {
856859
let second_lnd_snapshot =
857860
match fetch_lnd_channels_snapshot(&Client::new(), lsp_url, &node_id, &logger).await

mutiny-core/src/lsp/lndchannel.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub struct ChannelConstraints {
2323
#[derive(Debug, Serialize, Deserialize, Clone)]
2424
pub struct LndChannel {
2525
pub active: bool,
26+
pub local_pubkey: String,
2627
pub remote_pubkey: String,
2728
pub channel_point: String,
2829
pub chan_id: String,

mutiny-core/src/peermanager.rs

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::keymanager::PhantomKeysManager;
2+
use crate::lsp::lndchannel::LndChannel;
23
use crate::messagehandler::CommonLnEvent;
34
use crate::messagehandler::MutinyMessageHandler;
45
#[cfg(target_arch = "wasm32")]
@@ -24,7 +25,8 @@ use lightning::routing::gossip::NodeId;
2425
use lightning::util::logger::Logger;
2526
use lightning::{ln::msgs::SocketAddress, log_warn};
2627
use lightning::{log_debug, log_error};
27-
use std::collections::HashMap;
28+
use std::collections::{HashMap, HashSet};
29+
use std::str::FromStr;
2830
use std::sync::atomic::AtomicBool;
2931
use std::sync::Arc;
3032
use utils::Mutex;
@@ -660,8 +662,43 @@ impl ConnectedPeerManager {
660662
}
661663
}
662664

663-
pub fn is_any_connected(&self) -> bool {
664-
let lock = self.peers.lock().unwrap();
665-
!lock.is_empty()
665+
pub fn validate_peer_connections(&self, channels: &[LndChannel]) -> bool {
666+
let (peers_of_active_channels, valid) =
667+
channels
668+
.iter()
669+
.fold(
670+
(HashSet::new(), true),
671+
|(mut s, valid), c| match PublicKey::from_str(&c.local_pubkey) {
672+
Ok(k) => {
673+
s.insert(k);
674+
(s, valid)
675+
}
676+
Err(e) => {
677+
if let Some(l) = &*self.logger.lock().unwrap() {
678+
log_warn!(l, "Invalid local_pubkey in {}: {}", c.chan_id, e);
679+
}
680+
(s, false)
681+
}
682+
},
683+
);
684+
if !valid {
685+
return false;
686+
}
687+
688+
let peers_in_manager = {
689+
let peers = self.peers.lock().unwrap();
690+
peers.keys().cloned().collect::<HashSet<_>>()
691+
};
692+
693+
let is_match = peers_of_active_channels.is_subset(&peers_in_manager);
694+
if !is_match {
695+
if let Some(l) = &*self.logger.lock().unwrap() {
696+
peers_of_active_channels
697+
.difference(&peers_in_manager)
698+
.for_each(|pk| log_warn!(l, "Missing peer: {}", pk));
699+
}
700+
}
701+
702+
is_match
666703
}
667704
}

mutiny-wasm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cargo-features = ["per-package-target"]
22

33
[package]
44
name = "mutiny-wasm"
5-
version = "1.14.5"
5+
version = "1.14.6"
66
edition = "2021"
77
authors = ["utxostack"]
88
forced-target = "wasm32-unknown-unknown"

0 commit comments

Comments
 (0)