From 2869e50d67ad5fc18b9434c771d7c227ead800ce Mon Sep 17 00:00:00 2001 From: Antoine Riard Date: Wed, 10 Jul 2019 15:48:23 -0400 Subject: [PATCH] Support option_data_loss_protect for remote peer In case of sending channel_reestablish message, we join our current per_commitment_point and their highest revocation secret we know about We set data_loss_protect by default and adjust encoding_init test in consequence --- src/ln/channel.rs | 18 ++++++++++++++++-- src/ln/msgs.rs | 12 ++++-------- src/ln/peer_handler.rs | 4 ---- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/ln/channel.rs b/src/ln/channel.rs index 5abbd4a2..72b9fab1 100644 --- a/src/ln/channel.rs +++ b/src/ln/channel.rs @@ -16,7 +16,7 @@ use secp256k1::{Secp256k1,Signature}; use secp256k1; use ln::msgs; -use ln::msgs::{DecodeError, OptionalField, LocalFeatures}; +use ln::msgs::{DecodeError, OptionalField, LocalFeatures, DataLossProtect}; use ln::channelmonitor::ChannelMonitor; use ln::channelmanager::{PendingHTLCStatus, HTLCSource, HTLCFailReason, HTLCFailureMsg, PendingForwardHTLCInfo, RAACommitmentOrder, PaymentPreimage, PaymentHash, BREAKDOWN_TIMEOUT, MAX_LOCAL_BREAKDOWN_TIMEOUT}; use ln::chan_utils::{TxCreationKeys,HTLCOutputInCommitment,HTLC_SUCCESS_TX_WEIGHT,HTLC_TIMEOUT_TX_WEIGHT}; @@ -3256,6 +3256,20 @@ impl Channel { pub fn get_channel_reestablish(&self) -> msgs::ChannelReestablish { assert_eq!(self.channel_state & ChannelState::PeerDisconnected as u32, ChannelState::PeerDisconnected as u32); assert_ne!(self.cur_remote_commitment_transaction_number, INITIAL_COMMITMENT_NUMBER); + let data_loss_protect = if self.cur_remote_commitment_transaction_number + 1 < INITIAL_COMMITMENT_NUMBER { + let remote_last_secret = self.channel_monitor.get_secret(self.cur_remote_commitment_transaction_number + 2).unwrap(); + log_trace!(self, "Enough info to generate a Data Loss Protect with per_commitment_secret {}", log_bytes!(remote_last_secret)); + OptionalField::Present(DataLossProtect { + your_last_per_commitment_secret: remote_last_secret, + my_current_per_commitment_point: PublicKey::from_secret_key(&self.secp_ctx, &self.build_local_commitment_secret(self.cur_local_commitment_transaction_number + 1)) + }) + } else { + log_debug!(self, "We don't seen yet any revoked secret, if this channnel has already been updated it means we are fallen-behind, you should wait for other peer closing"); + OptionalField::Present(DataLossProtect { + your_last_per_commitment_secret: [0;32], + my_current_per_commitment_point: PublicKey::from_secret_key(&self.secp_ctx, &self.build_local_commitment_secret(self.cur_local_commitment_transaction_number)) + }) + }; msgs::ChannelReestablish { channel_id: self.channel_id(), // The protocol has two different commitment number concepts - the "commitment @@ -3276,7 +3290,7 @@ impl Channel { // dropped this channel on disconnect as it hasn't yet reached FundingSent so we can't // overflow here. next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.cur_remote_commitment_transaction_number - 1, - data_loss_protect: OptionalField::Absent, + data_loss_protect, } } diff --git a/src/ln/msgs.rs b/src/ln/msgs.rs index f6968c5d..0e6c4b95 100644 --- a/src/ln/msgs.rs +++ b/src/ln/msgs.rs @@ -63,23 +63,19 @@ impl LocalFeatures { #[cfg(not(feature = "fuzztarget"))] pub(crate) fn new() -> LocalFeatures { LocalFeatures { - flags: vec![1 << 5], + flags: vec![2 | 1 << 5], } } #[cfg(feature = "fuzztarget")] pub fn new() -> LocalFeatures { LocalFeatures { - flags: vec![1 << 5], + flags: vec![2 | 1 << 5], } } pub(crate) fn supports_data_loss_protect(&self) -> bool { self.flags.len() > 0 && (self.flags[0] & 3) != 0 } - pub(crate) fn requires_data_loss_protect(&self) -> bool { - self.flags.len() > 0 && (self.flags[0] & 1) != 0 - } - pub(crate) fn initial_routing_sync(&self) -> bool { self.flags.len() > 0 && (self.flags[0] & (1 << 3)) != 0 } @@ -2018,9 +2014,9 @@ mod tests { target_value.append(&mut hex::decode("0000").unwrap()); } if initial_routing_sync { - target_value.append(&mut hex::decode("000128").unwrap()); + target_value.append(&mut hex::decode("00012a").unwrap()); } else { - target_value.append(&mut hex::decode("000120").unwrap()); + target_value.append(&mut hex::decode("000122").unwrap()); } assert_eq!(encoded_value, target_value); } diff --git a/src/ln/peer_handler.rs b/src/ln/peer_handler.rs index 03aeedcd..0e390bd3 100644 --- a/src/ln/peer_handler.rs +++ b/src/ln/peer_handler.rs @@ -621,10 +621,6 @@ impl PeerManager { log_info!(self, "Peer local features required unknown version bits"); return Err(PeerHandleError{ no_connection_possible: true }); } - if msg.local_features.requires_data_loss_protect() { - log_info!(self, "Peer local features required data_loss_protect"); - return Err(PeerHandleError{ no_connection_possible: true }); - } if peer.their_global_features.is_some() { return Err(PeerHandleError{ no_connection_possible: false }); } -- 2.30.2