@@ -2232,7 +2232,7 @@ where
2232
2232
entropy_source: ES,
2233
2233
node_signer: NS,
2234
2234
signer_provider: SP,
2235
-
2235
+ peer_storage: Mutex<HashMap<PublicKey, Vec<u8>>>,
2236
2236
logger: L,
2237
2237
}
2238
2238
@@ -3022,7 +3022,7 @@ where
3022
3022
entropy_source,
3023
3023
node_signer,
3024
3024
signer_provider,
3025
-
3025
+ peer_storage: Mutex::new(new_hash_map()),
3026
3026
logger,
3027
3027
}
3028
3028
}
@@ -7432,6 +7432,26 @@ where
7432
7432
}
7433
7433
}
7434
7434
7435
+ fn internal_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
7436
+ let per_peer_state = self.per_peer_state.read().unwrap();
7437
+ let peer_state_mutex = match per_peer_state.get(counterparty_node_id) {
7438
+ Some(peer_state_mutex) => peer_state_mutex,
7439
+ None => return,
7440
+ };
7441
+ let mut peer_state_lock = peer_state_mutex.lock().unwrap();
7442
+ let peer_state = &mut *peer_state_lock;
7443
+ let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None);
7444
+
7445
+ // Check if we have any channels with the peer (Currently we only provide the servie to peers we have a channel with).
7446
+ if !peer_state.channel_by_id.values().any(|phase| matches!(phase, ChannelPhase::Funded(_))) {
7447
+ log_debug!(logger, "We do not have any channel with {}", log_pubkey!(counterparty_node_id));
7448
+ return;
7449
+ }
7450
+
7451
+ log_trace!(logger, "Received Peer Storage from {}", log_pubkey!(counterparty_node_id));
7452
+ self.peer_storage.lock().unwrap().insert(*counterparty_node_id, msg.data.clone());
7453
+ }
7454
+
7435
7455
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
7436
7456
let best_block = *self.best_block.read().unwrap();
7437
7457
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9979,6 +9999,8 @@ where
9979
9999
}
9980
10000
9981
10001
fn handle_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
10002
+ let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
10003
+ self.internal_peer_storage(counterparty_node_id, msg);
9982
10004
}
9983
10005
9984
10006
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
@@ -10333,6 +10355,16 @@ where
10333
10355
let peer_state = &mut *peer_state_lock;
10334
10356
let pending_msg_events = &mut peer_state.pending_msg_events;
10335
10357
10358
+ if let Some(peer_storage) = self.peer_storage.lock().unwrap().get(counterparty_node_id) {
10359
+ pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10360
+ node_id: counterparty_node_id.clone(),
10361
+ msg: msgs::YourPeerStorageMessage {
10362
+ data: peer_storage.clone()
10363
+ },
10364
+ });
10365
+ }
10366
+
10367
+
10336
10368
for (_, phase) in peer_state.channel_by_id.iter_mut() {
10337
10369
match phase {
10338
10370
ChannelPhase::Funded(chan) => {
@@ -11360,6 +11392,13 @@ where
11360
11392
pending_payment.write(writer)?;
11361
11393
}
11362
11394
11395
+ let mut peer_storage = None;
11396
+ let peer_storage_dir = self.peer_storage.lock().unwrap();
11397
+
11398
+ if !peer_storage_dir.is_empty() {
11399
+ peer_storage = Some(peer_storage_dir);
11400
+ }
11401
+
11363
11402
// For backwards compat, write the session privs and their total length.
11364
11403
let mut num_pending_outbounds_compat: u64 = 0;
11365
11404
for (_, outbound) in pending_outbound_payments.iter() {
@@ -11432,6 +11471,7 @@ where
11432
11471
(11, self.probing_cookie_secret, required),
11433
11472
(13, htlc_onion_fields, optional_vec),
11434
11473
(14, decode_update_add_htlcs_opt, option),
11474
+ (16, peer_storage, option),
11435
11475
});
11436
11476
11437
11477
Ok(())
@@ -11892,6 +11932,7 @@ where
11892
11932
let mut events_override = None;
11893
11933
let mut in_flight_monitor_updates: Option<HashMap<(PublicKey, OutPoint), Vec<ChannelMonitorUpdate>>> = None;
11894
11934
let mut decode_update_add_htlcs: Option<HashMap<u64, Vec<msgs::UpdateAddHTLC>>> = None;
11935
+ let mut peer_storage: Option<HashMap<PublicKey, Vec<u8>>> = None;
11895
11936
read_tlv_fields!(reader, {
11896
11937
(1, pending_outbound_payments_no_retry, option),
11897
11938
(2, pending_intercepted_htlcs, option),
@@ -11906,7 +11947,9 @@ where
11906
11947
(11, probing_cookie_secret, option),
11907
11948
(13, claimable_htlc_onion_fields, optional_vec),
11908
11949
(14, decode_update_add_htlcs, option),
11950
+ (16, peer_storage, option),
11909
11951
});
11952
+ let peer_storage = peer_storage.unwrap_or_else(|| new_hash_map());
11910
11953
let mut decode_update_add_htlcs = decode_update_add_htlcs.unwrap_or_else(|| new_hash_map());
11911
11954
if fake_scid_rand_bytes.is_none() {
11912
11955
fake_scid_rand_bytes = Some(args.entropy_source.get_secure_random_bytes());
@@ -12499,6 +12542,7 @@ where
12499
12542
12500
12543
last_days_feerates: Mutex::new(VecDeque::new()),
12501
12544
12545
+ peer_storage: Mutex::new(peer_storage),
12502
12546
logger: args.logger,
12503
12547
default_configuration: args.default_config,
12504
12548
};
0 commit comments