Skip to content

Commit 3f15958

Browse files
committed
Add data_loss_protect support
1 parent a5bcd56 commit 3f15958

File tree

7 files changed

+150
-44
lines changed

7 files changed

+150
-44
lines changed

src/ln/channel.rs

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ pub(super) struct Channel {
346346

347347
channel_monitor: ChannelMonitor,
348348

349+
local_feature_flags: Option<msgs::LocalFeatures>,
350+
349351
logger: Arc<Logger>,
350352
}
351353

@@ -381,6 +383,7 @@ pub const OFFERED_HTLC_SCRIPT_WEIGHT: usize = 133;
381383
pub(super) enum ChannelError {
382384
Ignore(&'static str),
383385
Close(&'static str),
386+
CloseNoPublish(&'static str),
384387
}
385388

386389
macro_rules! secp_check {
@@ -393,6 +396,11 @@ macro_rules! secp_check {
393396
}
394397

395398
impl Channel {
399+
// get functions
400+
pub fn get_channel_id(&self) -> [u8; 32] {
401+
self.channel_id
402+
}
403+
396404
// Convert constants + channel value to limits:
397405
fn get_our_max_htlc_value_in_flight_msat(channel_value_satoshis: u64) -> u64 {
398406
channel_value_satoshis * 1000 / 10 //TODO
@@ -422,7 +430,7 @@ impl Channel {
422430
}
423431

424432
// Constructors:
425-
pub fn new_outbound(fee_estimator: &FeeEstimator, keys_provider: &Arc<KeysInterface>, their_node_id: PublicKey, channel_value_satoshis: u64, push_msat: u64, user_id: u64, logger: Arc<Logger>, config: &UserConfig) -> Result<Channel, APIError> {
433+
pub fn new_outbound(fee_estimator: &FeeEstimator, keys_provider: &Arc<KeysInterface>, their_node_id: PublicKey, channel_value_satoshis: u64, push_msat: u64, user_id: u64, logger: Arc<Logger>, config: &UserConfig, local_feature_flags: &Option<msgs::LocalFeatures>) -> Result<Channel, APIError> {
426434
let chan_keys = keys_provider.get_channel_keys(false);
427435

428436
if channel_value_satoshis >= MAX_FUNDING_SATOSHIS {
@@ -516,7 +524,7 @@ impl Channel {
516524
their_shutdown_scriptpubkey: None,
517525

518526
channel_monitor: channel_monitor,
519-
527+
local_feature_flags: local_feature_flags.clone(),
520528
logger,
521529
})
522530
}
@@ -533,7 +541,7 @@ impl Channel {
533541

534542
/// Creates a new channel from a remote sides' request for one.
535543
/// Assumes chain_hash has already been checked and corresponds with what we expect!
536-
pub fn new_from_req(fee_estimator: &FeeEstimator, keys_provider: &Arc<KeysInterface>, their_node_id: PublicKey, msg: &msgs::OpenChannel, user_id: u64, logger: Arc<Logger>, config: &UserConfig) -> Result<Channel, ChannelError> {
544+
pub fn new_from_req(fee_estimator: &FeeEstimator, keys_provider: &Arc<KeysInterface>, their_node_id: PublicKey, msg: &msgs::OpenChannel, user_id: u64, logger: Arc<Logger>, config: &UserConfig, local_feature_flags: &Option<msgs::LocalFeatures>) -> Result<Channel, ChannelError> {
537545
let chan_keys = keys_provider.get_channel_keys(true);
538546
let mut local_config = (*config).channel_options.clone();
539547

@@ -706,6 +714,7 @@ impl Channel {
706714
their_shutdown_scriptpubkey: None,
707715

708716
channel_monitor: channel_monitor,
717+
local_feature_flags: local_feature_flags.clone(),
709718

710719
logger,
711720
};
@@ -2325,6 +2334,21 @@ impl Channel {
23252334
return Err(ChannelError::Close("Peer sent a garbage channel_reestablish"));
23262335
}
23272336

2337+
//Check for dataloss fields and fail channel
2338+
if msg.next_remote_commitment_number > 0 {
2339+
if let Some(ref data_loss) = msg.data_loss_protect {
2340+
//check if provided signature is a valid signature from us
2341+
if chan_utils::build_commitment_secret(self.local_keys.commitment_seed, msg.next_remote_commitment_number-1) != data_loss.your_last_per_commitment_secret{
2342+
return Err(ChannelError::Close("Peer sent a garbage channel_reestablish with secret key not matching the commitment height provided"));
2343+
}
2344+
//check if we have fallen beind
2345+
//We should not broadcast commitment transaction or continue
2346+
if msg.next_remote_commitment_number > self.cur_local_commitment_transaction_number{
2347+
return Err(ChannelError::CloseNoPublish("We have fallen behind and we cannot catch up, need to close channel but not publish commitment"));
2348+
}
2349+
}
2350+
}
2351+
23282352
// Go ahead and unmark PeerDisconnected as various calls we may make check for it (and all
23292353
// remaining cases either succeed or ErrorMessage-fail).
23302354
self.channel_state &= !(ChannelState::PeerDisconnected as u32);
@@ -2406,6 +2430,7 @@ impl Channel {
24062430
// now!
24072431
match self.free_holding_cell_htlcs() {
24082432
Err(ChannelError::Close(msg)) => return Err(ChannelError::Close(msg)),
2433+
Err(ChannelError::CloseNoPublish(msg)) => return Err(ChannelError::CloseNoPublish(msg)),
24092434
Err(ChannelError::Ignore(_)) => panic!("Got non-channel-failing result from free_holding_cell_htlcs"),
24102435
Ok(Some((commitment_update, channel_monitor))) => return Ok((resend_funding_locked, required_revoke, Some(commitment_update), Some(channel_monitor), order, shutdown_msg)),
24112436
Ok(None) => return Ok((resend_funding_locked, required_revoke, None, None, order, shutdown_msg)),
@@ -3085,6 +3110,19 @@ impl Channel {
30853110
pub fn get_channel_reestablish(&self) -> msgs::ChannelReestablish {
30863111
assert_eq!(self.channel_state & ChannelState::PeerDisconnected as u32, ChannelState::PeerDisconnected as u32);
30873112
assert_ne!(self.cur_remote_commitment_transaction_number, INITIAL_COMMITMENT_NUMBER);
3113+
let data_loss_protect = if let Some(ref local_features) = self.local_feature_flags{
3114+
if local_features.supports_data_loss_protect() && self.their_cur_commitment_point.is_some() && self.channel_monitor.get_last_seen_secret().is_some(){
3115+
let data_loss = msgs::DataLossProtect{
3116+
your_last_per_commitment_secret: self.channel_monitor.get_last_seen_secret().unwrap(),
3117+
my_current_per_commitment_point: self.their_cur_commitment_point.unwrap(),
3118+
};
3119+
Some(data_loss)
3120+
} else {
3121+
None
3122+
}
3123+
} else{
3124+
None
3125+
};
30883126
msgs::ChannelReestablish {
30893127
channel_id: self.channel_id(),
30903128
// The protocol has two different commitment number concepts - the "commitment
@@ -3105,7 +3143,7 @@ impl Channel {
31053143
// dropped this channel on disconnect as it hasn't yet reached FundingSent so we can't
31063144
// overflow here.
31073145
next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.cur_remote_commitment_transaction_number - 1,
3108-
data_loss_protect: None,
3146+
data_loss_protect: data_loss_protect,
31093147
}
31103148
}
31113149

@@ -3640,7 +3678,7 @@ impl Writeable for Channel {
36403678
self.their_node_id.write(writer)?;
36413679

36423680
write_option!(self.their_shutdown_scriptpubkey);
3643-
3681+
write_option!(self.local_feature_flags);
36443682
self.channel_monitor.write_for_disk(writer)?;
36453683
Ok(())
36463684
}
@@ -3814,6 +3852,7 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
38143852
let their_node_id = Readable::read(reader)?;
38153853

38163854
let their_shutdown_scriptpubkey = read_option!();
3855+
let local_feature_flags = read_option!();
38173856
let (monitor_last_block, channel_monitor) = ReadableArgs::read(reader, logger.clone())?;
38183857
// We drop the ChannelMonitor's last block connected hash cause we don't actually bother
38193858
// doing full block connection operations on the internal CHannelMonitor copies
@@ -3893,7 +3932,7 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
38933932
their_shutdown_scriptpubkey,
38943933

38953934
channel_monitor,
3896-
3935+
local_feature_flags,
38973936
logger,
38983937
})
38993938
}
@@ -3985,7 +4024,7 @@ mod tests {
39854024
let their_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap());
39864025
let mut config = UserConfig::new();
39874026
config.channel_options.announced_channel = false;
3988-
let mut chan = Channel::new_outbound(&feeest, &keys_provider, their_node_id, 10000000, 100000, 42, Arc::clone(&logger), &config).unwrap(); // Nothing uses their network key in this test
4027+
let mut chan = Channel::new_outbound(&feeest, &keys_provider, their_node_id, 10000000, 100000, 42, Arc::clone(&logger), &config, &None).unwrap(); // Nothing uses their network key in this test
39894028
chan.their_to_self_delay = 144;
39904029
chan.our_dust_limit_satoshis = 546;
39914030

src/ln/channelmanager.rs

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,15 @@ impl MsgHandleErrInternal {
196196
},
197197
}),
198198
},
199+
ChannelError::CloseNoPublish(msg) => HandleError {
200+
err: msg,
201+
action: Some(msgs::ErrorAction::SendErrorMessage {
202+
msg: msgs::ErrorMessage {
203+
channel_id,
204+
data: msg.to_string()
205+
},
206+
}),
207+
},
199208
},
200209
shutdown_finish: None,
201210
}
@@ -326,6 +335,7 @@ pub struct ChannelManager {
326335
total_consistency_lock: RwLock<()>,
327336

328337
keys_manager: Arc<KeysInterface>,
338+
channels_awaiting_claiming : Mutex<HashMap<[u8; 32], Vec<bitcoin::Transaction>>>,
329339

330340
logger: Arc<Logger>,
331341
}
@@ -386,7 +396,7 @@ macro_rules! handle_error {
386396
Ok(msg) => Ok(msg),
387397
Err(MsgHandleErrInternal { err, shutdown_finish }) => {
388398
if let Some((shutdown_res, update_option)) = shutdown_finish {
389-
$self.finish_force_close_channel(shutdown_res);
399+
$self.finish_force_close_channel(shutdown_res,None);
390400
if let Some(update) = update_option {
391401
let mut channel_state = $self.channel_state.lock().unwrap();
392402
channel_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
@@ -415,6 +425,14 @@ macro_rules! break_chan_entry {
415425
}
416426
break Err(MsgHandleErrInternal::from_finish_shutdown(msg, channel_id, chan.force_shutdown(), $self.get_channel_update(&chan).ok()))
417427
},
428+
Err(ChannelError::CloseNoPublish(msg)) => {
429+
log_trace!($self, "Closing channel {} due to Close-No_publish_required error: {}", log_bytes!($entry.key()[..]), msg);
430+
let (channel_id, mut chan) = $entry.remove_entry();
431+
if let Some(short_id) = chan.get_short_channel_id() {
432+
$channel_state.short_to_id.remove(&short_id);
433+
}
434+
break Err(MsgHandleErrInternal::from_finish_shutdown(msg, channel_id, chan.force_shutdown(), $self.get_channel_update(&chan).ok()))
435+
},
418436
}
419437
}
420438
}
@@ -434,6 +452,13 @@ macro_rules! try_chan_entry {
434452
}
435453
return Err(MsgHandleErrInternal::from_finish_shutdown(msg, channel_id, chan.force_shutdown(), $self.get_channel_update(&chan).ok()))
436454
},
455+
Err(ChannelError::CloseNoPublish(msg)) => {
456+
let (channel_id, mut chan) = $entry.remove_entry();
457+
if let Some(short_id) = chan.get_short_channel_id() {
458+
$channel_state.short_to_id.remove(&short_id);
459+
}
460+
return Err(MsgHandleErrInternal::from_finish_shutdown(msg, channel_id, chan.force_shutdown(), $self.get_channel_update(&chan).ok()))
461+
},
437462
}
438463
}
439464
}
@@ -529,7 +554,7 @@ impl ChannelManager {
529554

530555
pending_events: Mutex::new(Vec::new()),
531556
total_consistency_lock: RwLock::new(()),
532-
557+
channels_awaiting_claiming : Mutex::new(HashMap::new()),
533558
keys_manager,
534559

535560
logger,
@@ -551,12 +576,12 @@ impl ChannelManager {
551576
///
552577
/// Raises APIError::APIMisuseError when channel_value_satoshis > 2**24 or push_msat is
553578
/// greater than channel_value_satoshis * 1k or channel_value_satoshis is < 1000.
554-
pub fn create_channel(&self, their_network_key: PublicKey, channel_value_satoshis: u64, push_msat: u64, user_id: u64) -> Result<(), APIError> {
579+
pub fn create_channel(&self, their_network_key: PublicKey, channel_value_satoshis: u64, push_msat: u64, user_id: u64, local_feature_flags : &Option<msgs::LocalFeatures>) -> Result<(), APIError> {
555580
if channel_value_satoshis < 1000 {
556581
return Err(APIError::APIMisuseError { err: "channel_value must be at least 1000 satoshis" });
557582
}
558583

559-
let channel = Channel::new_outbound(&*self.fee_estimator, &self.keys_manager, their_network_key, channel_value_satoshis, push_msat, user_id, Arc::clone(&self.logger), &self.default_configuration)?;
584+
let channel = Channel::new_outbound(&*self.fee_estimator, &self.keys_manager, their_network_key, channel_value_satoshis, push_msat, user_id, Arc::clone(&self.logger), &self.default_configuration, local_feature_flags)?;
560585
let res = channel.get_open_channel(self.genesis_hash.clone(), &*self.fee_estimator);
561586

562587
let _ = self.total_consistency_lock.read().unwrap();
@@ -665,20 +690,25 @@ impl ChannelManager {
665690
}
666691

667692
#[inline]
668-
fn finish_force_close_channel(&self, shutdown_res: ShutdownResult) {
693+
fn finish_force_close_channel(&self, shutdown_res: ShutdownResult,dont_claim_from_chain : Option<[u8; 32]>) {
669694
let (local_txn, mut failed_htlcs) = shutdown_res;
670695
log_trace!(self, "Finishing force-closure of channel with {} transactions to broadcast and {} HTLCs to fail", local_txn.len(), failed_htlcs.len());
671696
for htlc_source in failed_htlcs.drain(..) {
672697
self.fail_htlc_backwards_internal(self.channel_state.lock().unwrap(), htlc_source.0, &htlc_source.1, HTLCFailReason::Reason { failure_code: 0x4000 | 8, data: Vec::new() });
673698
}
674-
for tx in local_txn {
675-
self.tx_broadcaster.broadcast_transaction(&tx);
699+
if dont_claim_from_chain == None{
700+
for tx in local_txn {
701+
self.tx_broadcaster.broadcast_transaction(&tx);
702+
}
703+
} else {
704+
let mut hashmap = self.channels_awaiting_claiming.lock().unwrap();
705+
hashmap.insert(dont_claim_from_chain.unwrap(), local_txn);
676706
}
677707
}
678708

679709
/// Force closes a channel, immediately broadcasting the latest local commitment transaction to
680710
/// the chain and rejecting new HTLCs on the given channel.
681-
pub fn force_close_channel(&self, channel_id: &[u8; 32]) {
711+
pub fn force_close_channel(&self, channel_id: &[u8; 32], store_closed : bool) {
682712
let _ = self.total_consistency_lock.read().unwrap();
683713

684714
let mut chan = {
@@ -694,7 +724,12 @@ impl ChannelManager {
694724
}
695725
};
696726
log_trace!(self, "Force-closing channel {}", log_bytes!(channel_id[..]));
697-
self.finish_force_close_channel(chan.force_shutdown());
727+
if store_closed{
728+
self.finish_force_close_channel(chan.force_shutdown(),Some(chan.get_channel_id()));
729+
} else
730+
{
731+
self.finish_force_close_channel(chan.force_shutdown(),None);
732+
}
698733
if let Ok(update) = self.get_channel_update(&chan) {
699734
let mut channel_state = self.channel_state.lock().unwrap();
700735
channel_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
@@ -705,9 +740,9 @@ impl ChannelManager {
705740

706741
/// Force close all channels, immediately broadcasting the latest local commitment transaction
707742
/// for each to the chain and rejecting new HTLCs on each.
708-
pub fn force_close_all_channels(&self) {
743+
pub fn force_close_all_channels(&mut self) {
709744
for chan in self.list_channels() {
710-
self.force_close_channel(&chan.channel_id);
745+
self.force_close_channel(&chan.channel_id, false);
711746
}
712747
}
713748

@@ -1605,16 +1640,16 @@ impl ChannelManager {
16051640
self.forward_htlcs(&mut htlc_forwards[..]);
16061641

16071642
for res in close_results.drain(..) {
1608-
self.finish_force_close_channel(res);
1643+
self.finish_force_close_channel(res, None);
16091644
}
16101645
}
16111646

1612-
fn internal_open_channel(&self, their_node_id: &PublicKey, msg: &msgs::OpenChannel) -> Result<(), MsgHandleErrInternal> {
1647+
fn internal_open_channel(&self, their_node_id: &PublicKey, msg: &msgs::OpenChannel, local_feature_flags : &Option<msgs::LocalFeatures>) -> Result<(), MsgHandleErrInternal> {
16131648
if msg.chain_hash != self.genesis_hash {
16141649
return Err(MsgHandleErrInternal::send_err_msg_no_close("Unknown genesis block hash", msg.temporary_channel_id.clone()));
16151650
}
16161651

1617-
let channel = Channel::new_from_req(&*self.fee_estimator, &self.keys_manager, their_node_id.clone(), msg, 0, Arc::clone(&self.logger), &self.default_configuration)
1652+
let channel = Channel::new_from_req(&*self.fee_estimator, &self.keys_manager, their_node_id.clone(), msg, 0, Arc::clone(&self.logger), &self.default_configuration, local_feature_flags)
16181653
.map_err(|e| MsgHandleErrInternal::from_chan_no_close(e, msg.temporary_channel_id))?;
16191654
let mut channel_state_lock = self.channel_state.lock().unwrap();
16201655
let channel_state = channel_state_lock.borrow_parts();
@@ -2385,7 +2420,7 @@ impl ChainListener for ChannelManager {
23852420
});
23862421
}
23872422
for failure in failed_channels.drain(..) {
2388-
self.finish_force_close_channel(failure);
2423+
self.finish_force_close_channel(failure, None);
23892424
}
23902425
self.latest_block_height.store(height as usize, Ordering::Release);
23912426
*self.last_block_hash.try_lock().expect("block_(dis)connected must not be called in parallel") = header_hash;
@@ -2418,7 +2453,7 @@ impl ChainListener for ChannelManager {
24182453
});
24192454
}
24202455
for failure in failed_channels.drain(..) {
2421-
self.finish_force_close_channel(failure);
2456+
self.finish_force_close_channel(failure, None);
24222457
}
24232458
self.latest_block_height.fetch_sub(1, Ordering::AcqRel);
24242459
*self.last_block_hash.try_lock().expect("block_(dis)connected must not be called in parallel") = header.bitcoin_hash();
@@ -2427,9 +2462,9 @@ impl ChainListener for ChannelManager {
24272462

24282463
impl ChannelMessageHandler for ChannelManager {
24292464
//TODO: Handle errors and close channel (or so)
2430-
fn handle_open_channel(&self, their_node_id: &PublicKey, msg: &msgs::OpenChannel) -> Result<(), HandleError> {
2465+
fn handle_open_channel(&self, their_node_id: &PublicKey, msg: &msgs::OpenChannel, local_feature_flags: &Option<msgs::LocalFeatures>) -> Result<(), HandleError> {
24312466
let _ = self.total_consistency_lock.read().unwrap();
2432-
handle_error!(self, self.internal_open_channel(their_node_id, msg), their_node_id)
2467+
handle_error!(self, self.internal_open_channel(their_node_id, msg, local_feature_flags), their_node_id)
24332468
}
24342469

24352470
fn handle_accept_channel(&self, their_node_id: &PublicKey, msg: &msgs::AcceptChannel) -> Result<(), HandleError> {
@@ -2556,7 +2591,7 @@ impl ChannelMessageHandler for ChannelManager {
25562591
}
25572592
}
25582593
for failure in failed_channels.drain(..) {
2559-
self.finish_force_close_channel(failure);
2594+
self.finish_force_close_channel(failure, None);
25602595
}
25612596
for (chan_update, mut htlc_sources) in failed_payments {
25622597
for (htlc_source, payment_hash) in htlc_sources.drain(..) {
@@ -2598,11 +2633,11 @@ impl ChannelMessageHandler for ChannelManager {
25982633
if msg.channel_id == [0; 32] {
25992634
for chan in self.list_channels() {
26002635
if chan.remote_network_id == *their_node_id {
2601-
self.force_close_channel(&chan.channel_id);
2636+
self.force_close_channel(&chan.channel_id, false);
26022637
}
26032638
}
26042639
} else {
2605-
self.force_close_channel(&msg.channel_id);
2640+
self.force_close_channel(&msg.channel_id, false);
26062641
}
26072642
}
26082643
}
@@ -2981,7 +3016,7 @@ impl<'a, R : ::std::io::Read> ReadableArgs<R, ChannelManagerReadArgs<'a>> for (S
29813016
claimable_htlcs.insert(payment_hash, previous_hops);
29823017
}
29833018

2984-
let channel_manager = ChannelManager {
3019+
let mut channel_manager = ChannelManager {
29853020
genesis_hash,
29863021
fee_estimator: args.fee_estimator,
29873022
monitor: args.monitor,
@@ -3006,11 +3041,12 @@ impl<'a, R : ::std::io::Read> ReadableArgs<R, ChannelManagerReadArgs<'a>> for (S
30063041
total_consistency_lock: RwLock::new(()),
30073042
keys_manager: args.keys_manager,
30083043
logger: args.logger,
3044+
channels_awaiting_claiming : Mutex::new(HashMap::new()),
30093045
default_configuration: args.default_config,
30103046
};
30113047

30123048
for close_res in closed_channels.drain(..) {
3013-
channel_manager.finish_force_close_channel(close_res);
3049+
channel_manager.finish_force_close_channel(close_res, None);
30143050
//TODO: Broadcast channel update for closed channels, but only after we've made a
30153051
//connection or two.
30163052
}

0 commit comments

Comments
 (0)