Skip to content

Commit dd85c77

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
lightning: Handle peer storage message, it's persistance and send it to the respective peer upon reconnection.
1 parent 0865eca commit dd85c77

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2232,7 +2232,7 @@ where
22322232
entropy_source: ES,
22332233
node_signer: NS,
22342234
signer_provider: SP,
2235-
2235+
peer_storage: Mutex<HashMap<PublicKey, Vec<u8>>>,
22362236
logger: L,
22372237
}
22382238

@@ -3022,7 +3022,7 @@ where
30223022
entropy_source,
30233023
node_signer,
30243024
signer_provider,
3025-
3025+
peer_storage: Mutex::new(new_hash_map()),
30263026
logger,
30273027
}
30283028
}
@@ -7432,6 +7432,26 @@ where
74327432
}
74337433
}
74347434

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+
74357455
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
74367456
let best_block = *self.best_block.read().unwrap();
74377457
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9979,6 +9999,8 @@ where
99799999
}
998010000

998110001
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);
998210004
}
998310005

998410006
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
@@ -10333,6 +10355,16 @@ where
1033310355
let peer_state = &mut *peer_state_lock;
1033410356
let pending_msg_events = &mut peer_state.pending_msg_events;
1033510357

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+
1033610368
for (_, phase) in peer_state.channel_by_id.iter_mut() {
1033710369
match phase {
1033810370
ChannelPhase::Funded(chan) => {
@@ -11360,6 +11392,13 @@ where
1136011392
pending_payment.write(writer)?;
1136111393
}
1136211394

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+
1136311402
// For backwards compat, write the session privs and their total length.
1136411403
let mut num_pending_outbounds_compat: u64 = 0;
1136511404
for (_, outbound) in pending_outbound_payments.iter() {
@@ -11432,6 +11471,7 @@ where
1143211471
(11, self.probing_cookie_secret, required),
1143311472
(13, htlc_onion_fields, optional_vec),
1143411473
(14, decode_update_add_htlcs_opt, option),
11474+
(16, peer_storage, option),
1143511475
});
1143611476

1143711477
Ok(())
@@ -11892,6 +11932,7 @@ where
1189211932
let mut events_override = None;
1189311933
let mut in_flight_monitor_updates: Option<HashMap<(PublicKey, OutPoint), Vec<ChannelMonitorUpdate>>> = None;
1189411934
let mut decode_update_add_htlcs: Option<HashMap<u64, Vec<msgs::UpdateAddHTLC>>> = None;
11935+
let mut peer_storage: Option<HashMap<PublicKey, Vec<u8>>> = None;
1189511936
read_tlv_fields!(reader, {
1189611937
(1, pending_outbound_payments_no_retry, option),
1189711938
(2, pending_intercepted_htlcs, option),
@@ -11906,7 +11947,9 @@ where
1190611947
(11, probing_cookie_secret, option),
1190711948
(13, claimable_htlc_onion_fields, optional_vec),
1190811949
(14, decode_update_add_htlcs, option),
11950+
(16, peer_storage, option),
1190911951
});
11952+
let peer_storage = peer_storage.unwrap_or_else(|| new_hash_map());
1191011953
let mut decode_update_add_htlcs = decode_update_add_htlcs.unwrap_or_else(|| new_hash_map());
1191111954
if fake_scid_rand_bytes.is_none() {
1191211955
fake_scid_rand_bytes = Some(args.entropy_source.get_secure_random_bytes());
@@ -12499,6 +12542,7 @@ where
1249912542

1250012543
last_days_feerates: Mutex::new(VecDeque::new()),
1250112544

12545+
peer_storage: Mutex::new(peer_storage),
1250212546
logger: args.logger,
1250312547
default_configuration: args.default_config,
1250412548
};

0 commit comments

Comments
 (0)