@@ -2206,7 +2206,7 @@ where
2206
2206
entropy_source: ES,
2207
2207
node_signer: NS,
2208
2208
signer_provider: SP,
2209
-
2209
+ peer_storage: Mutex<HashMap<PublicKey, Vec<u8>>>,
2210
2210
logger: L,
2211
2211
}
2212
2212
@@ -2985,7 +2985,7 @@ where
2985
2985
entropy_source,
2986
2986
node_signer,
2987
2987
signer_provider,
2988
-
2988
+ peer_storage: Mutex::new(new_hash_map()),
2989
2989
logger,
2990
2990
}
2991
2991
}
@@ -7395,6 +7395,25 @@ where
7395
7395
}
7396
7396
}
7397
7397
7398
+ fn internal_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
7399
+ let per_peer_state = self.per_peer_state.write().unwrap();
7400
+ let peer_state_mutex = match per_peer_state.get(counterparty_node_id) {
7401
+ Some(peer_state_mutex) => peer_state_mutex,
7402
+ None => return,
7403
+ };
7404
+ let mut peer_state_lock = peer_state_mutex.lock().unwrap();
7405
+ let peer_state = &mut *peer_state_lock;
7406
+ let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None);
7407
+
7408
+ // Check if we have any channels with the peer (Currently we only provide the servie to peers we have a channel with).
7409
+ if peer_state.total_channel_count() == 0 {
7410
+ log_debug!(logger, "We do not have any channel with {}", log_pubkey!(counterparty_node_id));
7411
+ return;
7412
+ }
7413
+ log_trace!(logger, "Received Peer Storage from {}", log_pubkey!(counterparty_node_id));
7414
+ self.peer_storage.lock().unwrap().insert(*counterparty_node_id, msg.data.clone());
7415
+ }
7416
+
7398
7417
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
7399
7418
let best_block = *self.best_block.read().unwrap();
7400
7419
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9942,6 +9961,8 @@ where
9942
9961
}
9943
9962
9944
9963
fn handle_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
9964
+ let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
9965
+ self.internal_peer_storage(counterparty_node_id, msg);
9945
9966
}
9946
9967
9947
9968
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
@@ -10295,6 +10316,17 @@ where
10295
10316
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
10296
10317
let peer_state = &mut *peer_state_lock;
10297
10318
let pending_msg_events = &mut peer_state.pending_msg_events;
10319
+ let peer_storage = self.peer_storage.lock().unwrap().get(counterparty_node_id).unwrap_or(&Vec::<u8>::new()).clone();
10320
+
10321
+ if peer_storage.len() > 0 {
10322
+ pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10323
+ node_id: counterparty_node_id.clone(),
10324
+ msg: msgs::YourPeerStorageMessage {
10325
+ data: peer_storage
10326
+ },
10327
+ });
10328
+ }
10329
+
10298
10330
10299
10331
for (_, phase) in peer_state.channel_by_id.iter_mut() {
10300
10332
match phase {
@@ -11323,6 +11355,13 @@ where
11323
11355
pending_payment.write(writer)?;
11324
11356
}
11325
11357
11358
+ let peer_storage = self.peer_storage.lock().unwrap();
11359
+ (peer_storage.len() as u64).write(writer)?;
11360
+ for (node_id, peer_data) in peer_storage.iter() {
11361
+ node_id.write(writer)?;
11362
+ peer_data.write(writer)?;
11363
+ }
11364
+
11326
11365
// For backwards compat, write the session privs and their total length.
11327
11366
let mut num_pending_outbounds_compat: u64 = 0;
11328
11367
for (_, outbound) in pending_outbound_payments.iter() {
@@ -11828,6 +11867,14 @@ where
11828
11867
}
11829
11868
}
11830
11869
11870
+ let peer_storage_count: u64 = Readable::read(reader)?;
11871
+ let mut peer_storage: HashMap<PublicKey, Vec<u8>> = hash_map_with_capacity(cmp::min(peer_storage_count as usize, MAX_ALLOC_SIZE/(3*32)));
11872
+ for _ in 0..peer_storage_count {
11873
+ if peer_storage.insert(Readable::read(reader)?, Readable::read(reader)?).is_some() {
11874
+ return Err(DecodeError::InvalidValue);
11875
+ }
11876
+ }
11877
+
11831
11878
let pending_outbound_payments_count_compat: u64 = Readable::read(reader)?;
11832
11879
let mut pending_outbound_payments_compat: HashMap<PaymentId, PendingOutboundPayment> =
11833
11880
hash_map_with_capacity(cmp::min(pending_outbound_payments_count_compat as usize, MAX_ALLOC_SIZE/32));
@@ -12462,6 +12509,7 @@ where
12462
12509
12463
12510
last_days_feerates: Mutex::new(VecDeque::new()),
12464
12511
12512
+ peer_storage: Mutex::new(peer_storage),
12465
12513
logger: args.logger,
12466
12514
default_configuration: args.default_config,
12467
12515
};
0 commit comments