@@ -56,6 +56,8 @@ use crate::ln::features::Bolt11InvoiceFeatures;
56
56
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
57
57
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};
58
58
use crate::ln::msgs;
59
+ use crate::ln::channel_keys::RevocationBasepoint;
60
+ use crate::ln::chan_utils::{make_funding_redeemscript, ChannelTransactionParameters, CounterpartyChannelTransactionParameters, ChannelPublicKeys};
59
61
use crate::ln::onion_utils;
60
62
use crate::ln::onion_utils::{HTLCFailReason, INVALID_ONION_BLINDING};
61
63
use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
@@ -74,8 +76,8 @@ use crate::offers::signer;
74
76
use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailable, ReleaseHeldHtlc, AsyncPaymentsMessageHandler};
75
77
use crate::onion_message::messenger::{Destination, MessageRouter, Responder, ResponseInstruction, MessageSendInstructions};
76
78
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
77
- use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
78
79
use crate::sign::ecdsa::EcdsaChannelSigner;
80
+ use crate::sign::{EntropySource, ChannelSigner, NodeSigner, Recipient, SignerProvider};
79
81
use crate::util::config::{UserConfig, ChannelConfig, ChannelConfigUpdate};
80
82
use crate::util::wakers::{Future, Notifier};
81
83
use crate::util::scid_utils::fake_scid;
@@ -7658,6 +7660,67 @@ where
7658
7660
self.peer_storage.lock().unwrap().insert(*counterparty_node_id, msg.data.clone());
7659
7661
}
7660
7662
7663
+ fn internal_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
7664
+ let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None, None);
7665
+ let our_peer_storage = self.our_peer_storage.read().unwrap();
7666
+ if msg.data.len() < 16 {
7667
+ log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
7668
+ return;
7669
+ }
7670
+
7671
+ let mut res = vec![0; msg.data.len() - 16];
7672
+
7673
+ match our_peer_storage.decrypt_our_peer_storage(&mut res, msg.data.as_slice(), self.our_peerstorage_encryption_key) {
7674
+ Ok(()) => {
7675
+ // Decryption successful, the plaintext is now stored in `res`
7676
+ log_debug!(logger, "Decryption successful");
7677
+ let our_peer_storage = <OurPeerStorage as Readable>::read(&mut ::bitcoin::io::Cursor::new(res)).unwrap();
7678
+
7679
+ for ps_channel in our_peer_storage.get_channels() {
7680
+ if self.chain_monitor.stale_or_missing_channel_monitor(&ps_channel) {
7681
+ let mut keys = self.signer_provider.derive_channel_signer(ps_channel.channel_value_stoshis, ps_channel.channel_keys_id);
7682
+ let channel_parameters = ChannelTransactionParameters{
7683
+ holder_pubkeys:keys.pubkeys().clone(),
7684
+ is_outbound_from_holder: true,
7685
+ holder_selected_contest_delay: 66,
7686
+ counterparty_parameters: Some(CounterpartyChannelTransactionParameters {
7687
+ pubkeys: ChannelPublicKeys {
7688
+ funding_pubkey: PublicKey::from_secret_key(&self.secp_ctx, &SecretKey::from_slice(&[44; 32]).unwrap()),
7689
+ revocation_basepoint: RevocationBasepoint::from(PublicKey::from_secret_key(&self.secp_ctx, &SecretKey::from_slice(&[45; 32]).unwrap())),
7690
+ payment_point: PublicKey::from_secret_key(&self.secp_ctx, &SecretKey::from_slice(&[46; 32]).unwrap()),
7691
+ delayed_payment_basepoint: ps_channel.counterparty_delayed_payment_base_key,
7692
+ htlc_basepoint: ps_channel.counterparty_htlc_base_key,
7693
+ }, selected_contest_delay: ps_channel.on_counterparty_tx_csv}),
7694
+ funding_outpoint: Some(ps_channel.funding_outpoint),
7695
+ channel_type_features: ChannelTypeFeatures::only_static_remote_key(),
7696
+ };
7697
+ keys.provide_channel_parameters(&channel_parameters);
7698
+ let pubkeys = keys.pubkeys().clone();
7699
+ let funding_redeemscript = make_funding_redeemscript(&pubkeys.funding_pubkey, counterparty_node_id);
7700
+ let funding_txo_script = funding_redeemscript.to_p2wsh();
7701
+ let destination_script = self.signer_provider.get_destination_script(ps_channel.channel_keys_id).unwrap();
7702
+ let monitor = StubChannelMonitor::new_stub(self.secp_ctx.clone(), ps_channel, *self.best_block.read().unwrap(), keys, channel_parameters, funding_txo_script, destination_script);
7703
+ let monitor_res = self.chain_monitor.panic_and_persist_stub_channel(ps_channel.funding_outpoint, monitor);
7704
+
7705
+ match monitor_res {
7706
+ Ok(()) => {
7707
+ log_trace!(logger, "Your node is up-to-date with the peer storage.")
7708
+ }
7709
+ Err(()) => {
7710
+ panic!("Not able to persist StubChannelMonitor.")
7711
+ }
7712
+ }
7713
+ }
7714
+ }
7715
+ }
7716
+ Err(_) => {
7717
+ log_debug!(logger, "Invalid YourPeerStorage received from {}", log_pubkey!(counterparty_node_id));
7718
+ return;
7719
+ }
7720
+ }
7721
+
7722
+ }
7723
+
7661
7724
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
7662
7725
let best_block = *self.best_block.read().unwrap();
7663
7726
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -10287,6 +10350,8 @@ where
10287
10350
}
10288
10351
10289
10352
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
10353
+ let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
10354
+ self.internal_your_peer_storage(counterparty_node_id, msg);
10290
10355
}
10291
10356
10292
10357
fn handle_channel_ready(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReady) {
0 commit comments