Skip to content

Commit 5e256e9

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
lightning: Handle your_peer_storage from our peers.
1 parent 58108f1 commit 5e256e9

File tree

1 file changed

+69
-11
lines changed

1 file changed

+69
-11
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 69 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ use crate::ln::features::Bolt11InvoiceFeatures;
5252
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
5353
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};
5454
use crate::ln::msgs;
55+
use crate::ln::chan_utils::{CounterpartyCommitmentSecrets, make_funding_redeemscript};
5556
use crate::ln::onion_utils;
5657
use crate::ln::onion_utils::{HTLCFailReason, INVALID_ONION_BLINDING};
5758
use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
@@ -67,7 +68,7 @@ use crate::offers::parse::Bolt12SemanticError;
6768
use crate::offers::refund::{Refund, RefundBuilder};
6869
use crate::onion_message::messenger::{Destination, MessageRouter, PendingOnionMessage, new_pending_onion_message};
6970
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
70-
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
71+
use crate::sign::{EntropySource, ChannelSigner, NodeSigner, Recipient, SignerProvider};
7172
use crate::sign::ecdsa::WriteableEcdsaChannelSigner;
7273
use crate::util::config::{UserConfig, ChannelConfig, ChannelConfigUpdate};
7374
use crate::util::wakers::{Future, Notifier};
@@ -3267,6 +3268,14 @@ where
32673268
&self.default_configuration
32683269
}
32693270

3271+
pub fn get_encrypted_our_peer_storage(&self) -> Vec<u8> {
3272+
let mut peer_storage = VecWriter(Vec::new());
3273+
self.our_peer_storage.read().unwrap().write(&mut peer_storage).unwrap();
3274+
let mut encrypted_blob = vec![0;peer_storage.0.len() + 16];
3275+
self.inbound_payment_key.encrypt_our_peer_storage(&mut encrypted_blob, 0u64, b"", &peer_storage.0[..]);
3276+
encrypted_blob
3277+
}
3278+
32703279
fn create_and_insert_outbound_scid_alias(&self) -> u64 {
32713280
let height = self.best_block.read().unwrap().height;
32723281
let mut outbound_scid_alias = 0;
@@ -7470,6 +7479,42 @@ where
74707479
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);
74717480
}
74727481

7482+
fn internal_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
7483+
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None);
7484+
7485+
if msg.data.len() < 16 {
7486+
log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
7487+
return;
7488+
}
7489+
7490+
let mut res = vec![0; msg.data.len() - 16];
7491+
7492+
match self.inbound_payment_key.decrypt_our_peer_storage(&mut res, 0u64, b"", msg.data.as_slice()) {
7493+
Ok(()) => {
7494+
// Decryption successful, the plaintext is now stored in `res`
7495+
log_debug!(logger, "Decryption successful");
7496+
let our_peer_storage = <OurPeerStorage as Readable>::read(&mut ::std::io::Cursor::new(res)).unwrap();
7497+
7498+
for ps_channel in &our_peer_storage.channels {
7499+
let keys: <<SP as Deref>::Target as SignerProvider>::EcdsaSigner = self.signer_provider.derive_channel_signer(ps_channel.channel_value_stoshis, ps_channel.channel_keys_id);
7500+
let pubkeys: crate::ln::chan_utils::ChannelPublicKeys = keys.pubkeys().clone();
7501+
let funding_redeemscript = make_funding_redeemscript(&pubkeys.funding_pubkey, counterparty_node_id);
7502+
let funding_txo_script = funding_redeemscript.to_v0_p2wsh();
7503+
let monitor = ChannelMonitor::new_stub(self.secp_ctx.clone(), ps_channel, *self.best_block.read().unwrap(), keys, funding_txo_script);
7504+
let monitor_res = self.chain_monitor.watch_dummy(ps_channel.funding_outpoint, monitor);
7505+
if let Ok(_persist_state) = monitor_res {
7506+
log_trace!(logger, "Dummy channel persisted!");
7507+
}
7508+
}
7509+
}
7510+
Err(_) => {
7511+
log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
7512+
return;
7513+
}
7514+
}
7515+
7516+
}
7517+
74737518
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
74747519
let best_block = *self.best_block.read().unwrap();
74757520
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9884,7 +9929,8 @@ where
98849929
}
98859930

98869931
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
9887-
//TODO
9932+
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
9933+
self.internal_your_peer_storage(counterparty_node_id, msg);
98889934
}
98899935

98909936
fn handle_channel_ready(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReady) {
@@ -10232,7 +10278,28 @@ where
1023210278
if let Some(peer_state_mutex) = per_peer_state.get(counterparty_node_id) {
1023310279
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1023410280
let peer_state = &mut *peer_state_lock;
10281+
let num_channels = peer_state.total_channel_count();
1023510282
let pending_msg_events = &mut peer_state.pending_msg_events;
10283+
let peer_storage = peer_state.peer_storage.clone();
10284+
10285+
if peer_storage.len() > 0 {
10286+
pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10287+
node_id: counterparty_node_id.clone(),
10288+
msg: msgs::YourPeerStorageMessage {
10289+
data: peer_storage
10290+
},
10291+
});
10292+
}
10293+
10294+
if peer_state.latest_features.supports_provide_peer_storage() && num_channels > 0 {
10295+
let our_peer_storage = self.get_encrypted_our_peer_storage();
10296+
pending_msg_events.push(events::MessageSendEvent::SendPeerStorageMessage {
10297+
node_id: counterparty_node_id.clone(),
10298+
msg: msgs::PeerStorageMessage {
10299+
data: our_peer_storage
10300+
},
10301+
});
10302+
}
1023610303

1023710304
for (_, phase) in peer_state.channel_by_id.iter_mut() {
1023810305
match phase {
@@ -10277,15 +10344,6 @@ where
1027710344
},
1027810345
}
1027910346
}
10280-
10281-
let peer_storage = peer_state.peer_storage.clone();
10282-
10283-
pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10284-
node_id: counterparty_node_id.clone(),
10285-
msg: msgs::YourPeerStorageMessage {
10286-
data: peer_storage
10287-
},
10288-
});
1028910347
}
1029010348

1029110349
return NotifyOption::SkipPersistHandleEvents;

0 commit comments

Comments
 (0)