Skip to content

Commit 44483f8

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
lightning: Handle your_peer_storage from our peers.
1 parent e3b2ac9 commit 44483f8

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ use crate::ln::features::Bolt11InvoiceFeatures;
5757
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
5858
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};
5959
use crate::ln::msgs;
60+
use crate::ln::channel_keys::RevocationBasepoint;
61+
use crate::ln::chan_utils::{make_funding_redeemscript, ChannelTransactionParameters, CounterpartyChannelTransactionParameters, ChannelPublicKeys};
6062
use crate::ln::onion_utils;
6163
use crate::ln::onion_utils::{HTLCFailReason, INVALID_ONION_BLINDING};
6264
use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
@@ -77,8 +79,8 @@ use crate::offers::static_invoice::StaticInvoice;
7779
use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailable, ReleaseHeldHtlc, AsyncPaymentsMessageHandler};
7880
use crate::onion_message::messenger::{Destination, MessageRouter, Responder, ResponseInstruction, MessageSendInstructions};
7981
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
80-
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
8182
use crate::sign::ecdsa::EcdsaChannelSigner;
83+
use crate::sign::{EntropySource, ChannelSigner, NodeSigner, Recipient, SignerProvider};
8284
use crate::util::config::{UserConfig, ChannelConfig, ChannelConfigUpdate};
8385
use crate::util::wakers::{Future, Notifier};
8486
use crate::util::scid_utils::fake_scid;
@@ -7928,6 +7930,60 @@ where
79287930
peer_state.peer_storage = msg.data.clone();
79297931
}
79307932

7933+
fn internal_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
7934+
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None, None);
7935+
if msg.data.len() < 16 {
7936+
log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
7937+
return;
7938+
}
7939+
7940+
let mut res = vec![0; msg.data.len() - 16];
7941+
{
7942+
let our_peer_storage = self.our_peer_storage.read().unwrap();
7943+
match our_peer_storage.decrypt_our_peer_storage(&mut res, msg.data.as_slice(), self.our_peerstorage_encryption_key) {
7944+
Ok(()) => {
7945+
// Decryption successful, the plaintext is now stored in `res`
7946+
log_debug!(logger, "Received a peer storage from peer {}", log_pubkey!(counterparty_node_id));
7947+
}
7948+
Err(_) => {
7949+
log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
7950+
return;
7951+
}
7952+
}
7953+
}
7954+
7955+
let our_peer_storage = <OurPeerStorage as Readable>::read(&mut ::bitcoin::io::Cursor::new(res)).unwrap();
7956+
let per_peer_state = self.per_peer_state.read().unwrap();
7957+
7958+
for ps_channel in our_peer_storage.get_channels() {
7959+
let peer_state_mutex = match per_peer_state.get(&ps_channel.counterparty_node_id) {
7960+
Some(mutex) => mutex,
7961+
None => {
7962+
log_debug!(logger, "Not able to find peer_state for the counterparty {}, channelId {}", log_pubkey!(ps_channel.counterparty_node_id), ps_channel.channel_id);
7963+
panic!("Found a missing channel {} through peer storage", ps_channel.channel_id);
7964+
}
7965+
};
7966+
7967+
let peer_state_lock = peer_state_mutex.lock().unwrap();
7968+
let peer_state = &*peer_state_lock;
7969+
7970+
match peer_state.channel_by_id.get(&ps_channel.channel_id) {
7971+
Some(ChannelPhase::Funded(chan)) => {
7972+
if chan.context.get_commitment_secret().get_min_seen_secret() > ps_channel.get_min_seen_secret() {
7973+
panic!("Lost channel state for channel {}.
7974+
Received peer storage with a more recent state than what our node had.
7975+
Use the FundRecoverer to initiate a force close and sweep the funds.", ps_channel.channel_id);
7976+
}
7977+
},
7978+
Some(_) => {}
7979+
None => {
7980+
panic!("Found a missing channel {} through peer storage", ps_channel.channel_id);
7981+
}
7982+
}
7983+
}
7984+
7985+
}
7986+
79317987
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
79327988
let best_block = *self.best_block.read().unwrap();
79337989
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -10586,6 +10642,8 @@ where
1058610642
}
1058710643

1058810644
fn handle_your_peer_storage(&self, counterparty_node_id: PublicKey, msg: &msgs::YourPeerStorageMessage) {
10645+
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
10646+
self.internal_your_peer_storage(&counterparty_node_id, msg);
1058910647
}
1059010648

1059110649
fn handle_channel_ready(&self, counterparty_node_id: PublicKey, msg: &msgs::ChannelReady) {

0 commit comments

Comments
 (0)