Skip to content

Commit 7bebcc0

Browse files
committed
Persist inbound channel coming through OpenChannelRequest
- Add `peer_store` and `peer_manager` to `[EventHandler::new]` function - Persist channel peer info in `[LdkEvent::OpenChannelRequest]` event
1 parent 87217de commit 7bebcc0

File tree

5 files changed

+131
-9
lines changed

5 files changed

+131
-9
lines changed

src/builder.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -574,11 +574,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
574574
let mut user_config = UserConfig::default();
575575
user_config.channel_handshake_limits.force_announced_channel_preference = false;
576576

577-
if !config.trusted_peers_0conf.is_empty() {
578-
// Manually accept inbound channels if we expect 0conf channel requests, avoid
579-
// generating the events otherwise.
580-
user_config.manually_accept_inbound_channels = true;
581-
}
577+
user_config.manually_accept_inbound_channels = true;
582578
let channel_manager = {
583579
if let Ok(res) = kv_store.read(
584580
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,

src/event.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
use crate::peer_store::{PeerInfo, PeerStore};
2+
use crate::types::PeerManager;
13
use crate::{
2-
hex_utils, ChannelManager, Config, Error, KeysManager, NetworkGraph, UserChannelId, Wallet,
4+
hex_utils, ChannelManager, Config, Error, FilesystemLogger, KeysManager, NetworkGraph,
5+
UserChannelId, Wallet,
36
};
47

58
use crate::payment_store::{
@@ -251,6 +254,8 @@ where
251254
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
252255
logger: L,
253256
config: Arc<Config>,
257+
peer_manager: Arc<PeerManager<K>>,
258+
peer_store: Arc<PeerStore<K, Arc<FilesystemLogger>>>,
254259
}
255260

256261
impl<K: KVStore + Sync + Send + 'static, L: Deref> EventHandler<K, L>
@@ -262,6 +267,7 @@ where
262267
channel_manager: Arc<ChannelManager<K>>, network_graph: Arc<NetworkGraph>,
263268
keys_manager: Arc<KeysManager>, payment_store: Arc<PaymentStore<K, L>>,
264269
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>, logger: L, config: Arc<Config>,
270+
peer_manager: Arc<PeerManager<K>>, peer_store: Arc<PeerStore<K, Arc<FilesystemLogger>>>,
265271
) -> Self {
266272
Self {
267273
event_queue,
@@ -273,6 +279,8 @@ where
273279
logger,
274280
runtime,
275281
config,
282+
peer_manager,
283+
peer_store,
276284
}
277285
}
278286

@@ -641,6 +649,47 @@ where
641649
if allow_0conf { " trusted" } else { "" },
642650
counterparty_node_id,
643651
);
652+
let network_graph = self.network_graph.read_only();
653+
let nodes = network_graph.nodes();
654+
if let Some(node_info) =
655+
nodes.get(&NodeId::from_pubkey(&counterparty_node_id))
656+
{
657+
let ann_info = match node_info.announcement_info.clone() {
658+
Some(ann_info) => ann_info,
659+
None => {
660+
log_error!(self.logger,
661+
"Failed to add peer {} to peer store: no network address found",
662+
counterparty_node_id);
663+
return;
664+
}
665+
};
666+
let address = match ann_info.addresses().first() {
667+
Some(address) => address,
668+
None => {
669+
log_error!(self.logger,
670+
"Failed to add peer {} to peer store: no network address found",
671+
counterparty_node_id);
672+
return;
673+
}
674+
};
675+
let peer = PeerInfo {
676+
node_id: counterparty_node_id,
677+
address: address.clone(),
678+
};
679+
match self.peer_store.add_peer(peer) {
680+
Ok(_) => log_info!(
681+
self.logger,
682+
"Added peer {} to peer store",
683+
counterparty_node_id
684+
),
685+
Err(e) => log_error!(
686+
self.logger,
687+
"Failed to add peer {} to peer store: {}",
688+
counterparty_node_id,
689+
e
690+
),
691+
};
692+
}
644693
}
645694
Err(e) => {
646695
log_error!(

src/lib.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,13 +570,20 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
570570
.filter(|id| !pm_peers.contains(id))
571571
{
572572
if let Some(peer_info) = connect_peer_store.get_peer(&node_id) {
573-
let _ = do_connect_peer(
573+
match do_connect_peer(
574574
peer_info.node_id,
575575
peer_info.address,
576576
Arc::clone(&connect_pm),
577577
Arc::clone(&connect_logger),
578578
)
579-
.await;
579+
.await {
580+
Ok(_) => {
581+
log_info!(connect_logger, "Successfully reconnected to peer {}", node_id);
582+
}
583+
Err(e) => {
584+
log_error!(connect_logger, "Failed to connect to peer: {}", e);
585+
}
586+
}
580587
}
581588
}
582589
}
@@ -656,6 +663,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
656663
Arc::clone(&self.runtime),
657664
Arc::clone(&self.logger),
658665
Arc::clone(&self.config),
666+
Arc::clone(&self.peer_manager),
667+
Arc::clone(&self.peer_store),
659668
));
660669

661670
// Setup background processing

src/test/functional_tests.rs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use crate::builder::NodeBuilder;
22
use crate::io::test_utils::TestSyncStore;
33
use crate::test::utils::*;
4-
use crate::test::utils::{expect_channel_pending_event, expect_event, open_channel, random_config};
4+
use crate::test::utils::{
5+
expect_channel_pending_event, expect_channel_ready_event, expect_event, open_channel,
6+
random_config,
7+
};
58
use crate::{Error, Event, Node, PaymentDirection, PaymentStatus};
69

710
use bitcoin::Amount;
@@ -11,6 +14,53 @@ use lightning::util::persist::KVStore;
1114

1215
use std::sync::Arc;
1316

17+
#[test]
18+
fn persist_peer_from_inbound_channel() {
19+
// Channel A open a channel to B,
20+
// B should persist A as a peer by adding there
21+
// node_id to peer_store
22+
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
23+
let funding_amount_sat = 80_000;
24+
let (node_a, node_b) = setup_two_nodes(&electrsd, false);
25+
let addr_a = node_a.new_onchain_address().unwrap();
26+
let addr_b = node_b.new_onchain_address().unwrap();
27+
28+
let premine_amount_sat = 100_000;
29+
30+
premine_and_distribute_funds(
31+
&bitcoind,
32+
&electrsd,
33+
vec![addr_a, addr_b],
34+
Amount::from_sat(premine_amount_sat),
35+
);
36+
node_a.sync_wallets().unwrap();
37+
node_b.sync_wallets().unwrap();
38+
assert_eq!(node_a.spendable_onchain_balance_sats().unwrap(), premine_amount_sat);
39+
assert_eq!(node_b.spendable_onchain_balance_sats().unwrap(), premine_amount_sat);
40+
assert_eq!(node_a.next_event(), None);
41+
assert_eq!(node_b.next_event(), None);
42+
open_channel(&node_a, &node_b, funding_amount_sat, true, &electrsd);
43+
generate_blocks_and_wait(&bitcoind, &electrsd, 6);
44+
node_a.sync_wallets().unwrap();
45+
node_b.sync_wallets().unwrap();
46+
expect_channel_ready_event!(&node_a, Some(node_b.node_id()));
47+
expect_channel_ready_event!(&node_b, Some(node_a.node_id()));
48+
let node_b_id = node_b.node_id();
49+
let node_a_id = node_a.node_id();
50+
node_b.stop().unwrap();
51+
assert_eq!(node_b.stop(), Err(Error::NotRunning));
52+
node_b.start().unwrap();
53+
node_b.sync_wallets().unwrap();
54+
assert_eq!(node_b.is_running(), true);
55+
assert_eq!(node_b.node_id(), node_b_id);
56+
assert_eq!(node_a.is_running(), true);
57+
let node_b_peers = node_b.list_peers();
58+
let node_b_peers = node_b_peers.get(0).expect("Should have one peer");
59+
assert_eq!(node_b_peers.node_id, node_a_id);
60+
assert_eq!(node_b_peers.is_persisted, true);
61+
assert_eq!(node_b_peers.is_connected, true);
62+
}
63+
1464
#[test]
1565
fn channel_full_cycle() {
1666
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();

src/test/utils.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ macro_rules! expect_channel_pending_event {
5757

5858
pub(crate) use expect_channel_pending_event;
5959

60+
macro_rules! expect_channel_ready_event {
61+
($node: expr, $counterparty_node_id: expr) => {{
62+
match $node.wait_next_event() {
63+
ref e @ Event::ChannelReady { ref channel_id, counterparty_node_id, .. } => {
64+
println!("{} got event {:?}", $node.node_id(), e);
65+
assert_eq!(counterparty_node_id, $counterparty_node_id);
66+
$node.event_handled();
67+
channel_id
68+
}
69+
ref e => {
70+
panic!("{} got unexpected event!: {:?}", std::stringify!(node_b), e);
71+
}
72+
}
73+
}};
74+
}
75+
76+
pub(crate) use expect_channel_ready_event;
77+
6078
// Copied over from upstream LDK
6179
#[allow(dead_code)]
6280
pub struct TestLogger {

0 commit comments

Comments
 (0)