@@ -2303,7 +2303,7 @@ where
2303
2303
entropy_source: ES,
2304
2304
node_signer: NS,
2305
2305
signer_provider: SP,
2306
-
2306
+ peer_storage: Mutex<HashMap<PublicKey, Vec<u8>>>,
2307
2307
logger: L,
2308
2308
}
2309
2309
@@ -3108,7 +3108,7 @@ where
3108
3108
entropy_source,
3109
3109
node_signer,
3110
3110
signer_provider,
3111
-
3111
+ peer_storage: Mutex::new(new_hash_map()),
3112
3112
logger,
3113
3113
}
3114
3114
}
@@ -7621,6 +7621,26 @@ where
7621
7621
}
7622
7622
}
7623
7623
7624
+ fn internal_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
7625
+ let per_peer_state = self.per_peer_state.read().unwrap();
7626
+ let peer_state_mutex = match per_peer_state.get(counterparty_node_id) {
7627
+ Some(peer_state_mutex) => peer_state_mutex,
7628
+ None => return,
7629
+ };
7630
+ let mut peer_state_lock = peer_state_mutex.lock().unwrap();
7631
+ let peer_state = &mut *peer_state_lock;
7632
+ let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None);
7633
+
7634
+ // Check if we have any channels with the peer (Currently we only provide the servie to peers we have a channel with).
7635
+ if !peer_state.channel_by_id.values().any(|phase| matches!(phase, ChannelPhase::Funded(_))) {
7636
+ log_debug!(logger, "We do not have any channel with {}", log_pubkey!(counterparty_node_id));
7637
+ return;
7638
+ }
7639
+
7640
+ log_trace!(logger, "Received Peer Storage from {}", log_pubkey!(counterparty_node_id));
7641
+ self.peer_storage.lock().unwrap().insert(*counterparty_node_id, msg.data.clone());
7642
+ }
7643
+
7624
7644
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
7625
7645
let best_block = *self.best_block.read().unwrap();
7626
7646
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -10203,6 +10223,8 @@ where
10203
10223
}
10204
10224
10205
10225
fn handle_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
10226
+ let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
10227
+ self.internal_peer_storage(counterparty_node_id, msg);
10206
10228
}
10207
10229
10208
10230
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
@@ -10557,6 +10579,16 @@ where
10557
10579
let peer_state = &mut *peer_state_lock;
10558
10580
let pending_msg_events = &mut peer_state.pending_msg_events;
10559
10581
10582
+ if let Some(peer_storage) = self.peer_storage.lock().unwrap().get(counterparty_node_id) {
10583
+ pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10584
+ node_id: counterparty_node_id.clone(),
10585
+ msg: msgs::YourPeerStorageMessage {
10586
+ data: peer_storage.clone()
10587
+ },
10588
+ });
10589
+ }
10590
+
10591
+
10560
10592
for (_, phase) in peer_state.channel_by_id.iter_mut() {
10561
10593
match phase {
10562
10594
ChannelPhase::Funded(chan) => {
@@ -11614,6 +11646,13 @@ where
11614
11646
pending_payment.write(writer)?;
11615
11647
}
11616
11648
11649
+ let mut peer_storage = None;
11650
+ let peer_storage_dir = self.peer_storage.lock().unwrap();
11651
+
11652
+ if !peer_storage_dir.is_empty() {
11653
+ peer_storage = Some(peer_storage_dir);
11654
+ }
11655
+
11617
11656
// For backwards compat, write the session privs and their total length.
11618
11657
let mut num_pending_outbounds_compat: u64 = 0;
11619
11658
for (_, outbound) in pending_outbound_payments.iter() {
@@ -11686,6 +11725,7 @@ where
11686
11725
(11, self.probing_cookie_secret, required),
11687
11726
(13, htlc_onion_fields, optional_vec),
11688
11727
(14, decode_update_add_htlcs_opt, option),
11728
+ (16, peer_storage, option),
11689
11729
});
11690
11730
11691
11731
Ok(())
@@ -12146,6 +12186,7 @@ where
12146
12186
let mut events_override = None;
12147
12187
let mut in_flight_monitor_updates: Option<HashMap<(PublicKey, OutPoint), Vec<ChannelMonitorUpdate>>> = None;
12148
12188
let mut decode_update_add_htlcs: Option<HashMap<u64, Vec<msgs::UpdateAddHTLC>>> = None;
12189
+ let mut peer_storage: Option<HashMap<PublicKey, Vec<u8>>> = None;
12149
12190
read_tlv_fields!(reader, {
12150
12191
(1, pending_outbound_payments_no_retry, option),
12151
12192
(2, pending_intercepted_htlcs, option),
@@ -12160,7 +12201,9 @@ where
12160
12201
(11, probing_cookie_secret, option),
12161
12202
(13, claimable_htlc_onion_fields, optional_vec),
12162
12203
(14, decode_update_add_htlcs, option),
12204
+ (16, peer_storage, option),
12163
12205
});
12206
+ let peer_storage = peer_storage.unwrap_or_else(|| new_hash_map());
12164
12207
let mut decode_update_add_htlcs = decode_update_add_htlcs.unwrap_or_else(|| new_hash_map());
12165
12208
if fake_scid_rand_bytes.is_none() {
12166
12209
fake_scid_rand_bytes = Some(args.entropy_source.get_secure_random_bytes());
@@ -12753,6 +12796,7 @@ where
12753
12796
12754
12797
last_days_feerates: Mutex::new(VecDeque::new()),
12755
12798
12799
+ peer_storage: Mutex::new(peer_storage),
12756
12800
logger: args.logger,
12757
12801
default_configuration: args.default_config,
12758
12802
};
0 commit comments