Skip to content

Commit 6ecf1b8

Browse files
Aditya SharmaAditya Sharma
Aditya Sharma
authored and
Aditya Sharma
committed
lightning: Handle your_peer_storage from our peers.
1 parent ed1f98f commit 6ecf1b8

File tree

1 file changed

+97
-8
lines changed

1 file changed

+97
-8
lines changed

lightning/src/ln/channelmanager.rs

+97-8
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ use crate::ln::features::Bolt11InvoiceFeatures;
5151
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
5252
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};
5353
use crate::ln::msgs;
54+
use crate::ln::chan_utils::CounterpartyCommitmentSecrets;
5455
use crate::ln::onion_utils;
5556
use crate::ln::onion_utils::{HTLCFailReason, INVALID_ONION_BLINDING};
5657
use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
@@ -2601,6 +2602,14 @@ where
26012602
&self.default_configuration
26022603
}
26032604

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+
26042613
fn create_and_insert_outbound_scid_alias(&self) -> u64 {
26052614
let height = self.best_block.read().unwrap().height;
26062615
let mut outbound_scid_alias = 0;
@@ -6797,6 +6806,73 @@ where
67976806
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);
67986807
}
67996808

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+
68006876
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
68016877
let best_block = *self.best_block.read().unwrap();
68026878
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9186,7 +9262,10 @@ where
91869262
}
91879263

91889264
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+
});
91909269
}
91919270

91929271
fn handle_channel_ready(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReady) {
@@ -9573,13 +9652,23 @@ where
95739652
}
95749653

95759654
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+
}
95839672
}
95849673

95859674
return NotifyOption::SkipPersistHandleEvents;

0 commit comments

Comments
 (0)