Skip to content

Commit b3e1128

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
lightning: Handle your_peer_storage from our peers.
1 parent bacff37 commit b3e1128

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;
@@ -7927,6 +7929,60 @@ where
79277929
peer_state.peer_storage = msg.data.clone();
79287930
}
79297931

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

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

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

0 commit comments

Comments
 (0)