@@ -51,6 +51,7 @@ use crate::ln::features::Bolt11InvoiceFeatures;
51
51
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
52
52
use crate::ln::onion_payment::{check_incoming_htlc_cltv, create_recv_pending_htlc_info, create_fwd_pending_htlc_info, decode_incoming_update_add_htlc_onion, InboundHTLCErr, NextPacketDetails};
53
53
use crate::ln::msgs;
54
+ use crate::ln::chan_utils::CounterpartyCommitmentSecrets;
54
55
use crate::ln::onion_utils;
55
56
use crate::ln::onion_utils::{HTLCFailReason, INVALID_ONION_BLINDING};
56
57
use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
@@ -2601,6 +2602,14 @@ where
2601
2602
&self.default_configuration
2602
2603
}
2603
2604
2605
+ pub fn get_encrypted_our_peer_storage(&self) -> Vec<u8> {
2606
+ let mut peer_storage = VecWriter(Vec::new());
2607
+ self.our_peer_storage.read().unwrap().write(&mut peer_storage).unwrap();
2608
+ let mut encrypted_blob = vec![0;peer_storage.0.len() + 16];
2609
+ self.inbound_payment_key.encrypt_our_peer_storage(&mut encrypted_blob, 0u64, b"", &peer_storage.0[..]);
2610
+ encrypted_blob
2611
+ }
2612
+
2604
2613
fn create_and_insert_outbound_scid_alias(&self) -> u64 {
2605
2614
let height = self.best_block.read().unwrap().height;
2606
2615
let mut outbound_scid_alias = 0;
@@ -6797,6 +6806,73 @@ where
6797
6806
handle_new_monitor_update!(self, min_funded_chan.context.get_funding_txo().unwrap(), peer_storage_update, peer_state_lock, peer_state, per_peer_state, min_funded_chan);
6798
6807
}
6799
6808
6809
+ fn internal_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
6810
+ let per_peer_state = self.per_peer_state.read().unwrap();
6811
+ let peer_state_mutex = match per_peer_state.get(counterparty_node_id) {
6812
+ Some(peer_state_mutex) => peer_state_mutex,
6813
+ None => return,
6814
+ };
6815
+ let mut peer_state_lock = peer_state_mutex.lock().unwrap();
6816
+ let peer_state = &mut *peer_state_lock;
6817
+ let warn_msg = events::MessageSendEvent::HandleError {
6818
+ node_id: *counterparty_node_id,
6819
+ action: msgs::ErrorAction::SendWarningMessage {
6820
+ msg: msgs::WarningMessage {
6821
+ channel_id: ChannelId::from_bytes([0; 32]),
6822
+ data: "Invalid peer storage sent!".to_owned(),
6823
+ },
6824
+ log_level: Level::Trace,
6825
+ }
6826
+ };
6827
+
6828
+ if msg.data.len() < 16 {
6829
+ peer_state.pending_msg_events.push(warn_msg);
6830
+ return;
6831
+ }
6832
+ let mut res = vec![0; msg.data.len() - 16];
6833
+
6834
+ match self.inbound_payment_key.decrypt_our_peer_storage(&mut res, 0u64, b"", msg.data.as_slice()) {
6835
+ Ok(()) => {
6836
+ // Decryption successful, the plaintext is now stored in `res`
6837
+ println!("Decryption successful: {:?}", res);
6838
+ let our_peer_storage = <OurPeerStorage as Readable>::read(&mut ::std::io::Cursor::new(res)).unwrap();
6839
+ let stored_channels = self.list_channels();
6840
+
6841
+ for ps_channel in &our_peer_storage.channels {
6842
+ if let Some(_channel) = stored_channels.iter().find(|chan| chan.channel_id == ps_channel.channel_id) {
6843
+ continue;
6844
+ } else {
6845
+ let keys = self.signer_provider.derive_channel_signer(ps_channel.channel_value_stoshis, ps_channel.channel_keys_id);
6846
+ let monitor = ChannelMonitor::new_stub(self.secp_ctx.clone(), ps_channel, *self.best_block.read().unwrap(), keys);
6847
+ let monitor_res = self.chain_monitor.watch_channel(ps_channel.funding_outpoint, monitor);
6848
+ if let Ok(_persist_state) = monitor_res {
6849
+ let force_close_update = ChannelMonitorUpdate {
6850
+ update_id: CLOSED_CHANNEL_UPDATE_ID,
6851
+ counterparty_node_id: Some(ps_channel.counterparty_node_id),
6852
+ updates: vec![ChannelMonitorUpdateStep::ChannelForceClosed { should_broadcast: false }],
6853
+ channel_id: Some(ps_channel.channel_id),
6854
+ };
6855
+ let update_res = self.chain_monitor.update_channel(ps_channel.funding_outpoint, &force_close_update);
6856
+ if update_res != ChannelMonitorUpdateStatus::Completed {
6857
+ log_error!(WithContext::from(&self.logger, None, Some(ps_channel.channel_id)),
6858
+ "Critical error: failed to update channel monitor from peer storage to force close.",);
6859
+ }
6860
+ }
6861
+ else {
6862
+ unreachable!("We already checked this outpoint was not recognised by the node.");
6863
+ }
6864
+ }
6865
+ }
6866
+ }
6867
+ Err(_) => {
6868
+ // Decryption failed
6869
+ peer_state.pending_msg_events.push(warn_msg);
6870
+ return;
6871
+ }
6872
+ }
6873
+
6874
+ }
6875
+
6800
6876
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
6801
6877
let best_block = *self.best_block.read().unwrap();
6802
6878
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9186,7 +9262,10 @@ where
9186
9262
}
9187
9263
9188
9264
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
9189
- //TODO
9265
+ let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
9266
+ self.internal_your_peer_storage(counterparty_node_id, msg);
9267
+ NotifyOption::SkipPersistHandleEvents
9268
+ });
9190
9269
}
9191
9270
9192
9271
fn handle_channel_ready(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReady) {
@@ -9573,13 +9652,23 @@ where
9573
9652
}
9574
9653
9575
9654
let peer_storage = peer_state.peer_storage.clone();
9576
-
9577
- pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
9578
- node_id: counterparty_node_id.clone(),
9579
- msg: msgs::YourPeerStorageMessage {
9580
- data: peer_storage
9581
- },
9582
- });
9655
+ if peer_storage.len() > 0 {
9656
+ pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
9657
+ node_id: counterparty_node_id.clone(),
9658
+ msg: msgs::YourPeerStorageMessage {
9659
+ data: peer_storage
9660
+ },
9661
+ });
9662
+ }
9663
+ if peer_state.latest_features.supports_provide_peer_storage() {
9664
+ let our_peer_storage = self.get_encrypted_our_peer_storage();
9665
+ pending_msg_events.push(events::MessageSendEvent::SendPeerStorageMessage {
9666
+ node_id: counterparty_node_id.clone(),
9667
+ msg: msgs::PeerStorageMessage {
9668
+ data: our_peer_storage
9669
+ },
9670
+ });
9671
+ }
9583
9672
}
9584
9673
9585
9674
return NotifyOption::SkipPersistHandleEvents;
0 commit comments