@@ -6393,137 +6393,155 @@ where
6393
6393
should_persist
6394
6394
}
6395
6395
6396
- fn process_forward_htlcs(
6397
- &self, short_chan_id: u64, pending_forwards: &mut Vec<HTLCForwardInfo>,
6398
- failed_forwards: &mut Vec<FailedHTLCForward>,
6396
+ /// Fail the list of provided HTLC forwards because the channel they were to be forwarded over does no longer exist.
6397
+ #[rustfmt::skip]
6398
+ fn forwarding_channel_not_found(
6399
+ &self, forward_infos: impl Iterator<Item = HTLCForwardInfo>, short_chan_id: u64,
6400
+ forwarding_counterparty: Option<PublicKey>, failed_forwards: &mut Vec<FailedHTLCForward>,
6399
6401
phantom_receives: &mut Vec<PerSourcePendingForward>,
6400
6402
) {
6401
- let mut forwarding_counterparty = None;
6402
- macro_rules! forwarding_channel_not_found {
6403
- ($forward_infos: expr) => {
6404
- for forward_info in $forward_infos {
6405
- match forward_info {
6406
- HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
6407
- prev_short_channel_id, prev_htlc_id, prev_channel_id, prev_funding_outpoint,
6408
- prev_user_channel_id, prev_counterparty_node_id, forward_info: PendingHTLCInfo {
6409
- routing, incoming_shared_secret, payment_hash, outgoing_amt_msat,
6410
- outgoing_cltv_value, ..
6411
- }
6412
- }) => {
6413
- let cltv_expiry = routing.incoming_cltv_expiry();
6414
- macro_rules! failure_handler {
6415
- ($msg: expr, $reason: expr, $err_data: expr, $phantom_ss: expr, $next_hop_unknown: expr) => {
6416
- let logger = WithContext::from(&self.logger, forwarding_counterparty, Some(prev_channel_id), Some(payment_hash));
6417
- log_info!(logger, "Failed to accept/forward incoming HTLC: {}", $msg);
6418
-
6419
- let htlc_source = HTLCSource::PreviousHopData(HTLCPreviousHopData {
6420
- short_channel_id: prev_short_channel_id,
6421
- user_channel_id: Some(prev_user_channel_id),
6422
- channel_id: prev_channel_id,
6423
- outpoint: prev_funding_outpoint,
6424
- counterparty_node_id: prev_counterparty_node_id,
6425
- htlc_id: prev_htlc_id,
6426
- incoming_packet_shared_secret: incoming_shared_secret,
6427
- phantom_shared_secret: $phantom_ss,
6428
- blinded_failure: routing.blinded_failure(),
6429
- cltv_expiry,
6430
- });
6403
+ for forward_info in forward_infos {
6404
+ match forward_info {
6405
+ HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
6406
+ prev_short_channel_id, prev_htlc_id, prev_channel_id, prev_funding_outpoint,
6407
+ prev_user_channel_id, prev_counterparty_node_id, forward_info: PendingHTLCInfo {
6408
+ routing, incoming_shared_secret, payment_hash, outgoing_amt_msat,
6409
+ outgoing_cltv_value, ..
6410
+ }
6411
+ }) => {
6412
+ let cltv_expiry = routing.incoming_cltv_expiry();
6413
+ macro_rules! failure_handler {
6414
+ ($msg: expr, $reason: expr, $err_data: expr, $phantom_ss: expr, $next_hop_unknown: expr) => {
6415
+ let logger = WithContext::from(&self.logger, forwarding_counterparty, Some(prev_channel_id), Some(payment_hash));
6416
+ log_info!(logger, "Failed to accept/forward incoming HTLC: {}", $msg);
6417
+
6418
+ let htlc_source = HTLCSource::PreviousHopData(HTLCPreviousHopData {
6419
+ short_channel_id: prev_short_channel_id,
6420
+ user_channel_id: Some(prev_user_channel_id),
6421
+ channel_id: prev_channel_id,
6422
+ outpoint: prev_funding_outpoint,
6423
+ counterparty_node_id: prev_counterparty_node_id,
6424
+ htlc_id: prev_htlc_id,
6425
+ incoming_packet_shared_secret: incoming_shared_secret,
6426
+ phantom_shared_secret: $phantom_ss,
6427
+ blinded_failure: routing.blinded_failure(),
6428
+ cltv_expiry,
6429
+ });
6431
6430
6432
- let reason = if $next_hop_unknown {
6433
- HTLCHandlingFailureType::InvalidForward { requested_forward_scid: short_chan_id }
6434
- } else {
6435
- HTLCHandlingFailureType::Receive{ payment_hash }
6436
- };
6431
+ let reason = if $next_hop_unknown {
6432
+ HTLCHandlingFailureType::InvalidForward { requested_forward_scid: short_chan_id }
6433
+ } else {
6434
+ HTLCHandlingFailureType::Receive{ payment_hash }
6435
+ };
6437
6436
6438
- failed_forwards.push((htlc_source, payment_hash,
6439
- HTLCFailReason::reason($reason, $err_data),
6440
- reason
6441
- ));
6442
- continue;
6443
- }
6444
- }
6445
- macro_rules! fail_forward {
6446
- ($msg: expr, $reason: expr, $err_data: expr, $phantom_ss: expr) => {
6447
- {
6448
- failure_handler!($msg, $reason, $err_data, $phantom_ss, true);
6449
- }
6450
- }
6437
+ failed_forwards.push((htlc_source, payment_hash,
6438
+ HTLCFailReason::reason($reason, $err_data),
6439
+ reason
6440
+ ));
6441
+ continue;
6442
+ }
6443
+ }
6444
+ macro_rules! fail_forward {
6445
+ ($msg: expr, $reason: expr, $err_data: expr, $phantom_ss: expr) => {
6446
+ {
6447
+ failure_handler!($msg, $reason, $err_data, $phantom_ss, true);
6451
6448
}
6452
- macro_rules! failed_payment {
6453
- ($msg: expr, $reason: expr, $err_data: expr, $phantom_ss: expr) => {
6454
- {
6455
- failure_handler! ($msg, $reason, $err_data, $phantom_ss, false);
6456
- }
6457
- }
6449
+ }
6450
+ }
6451
+ macro_rules! failed_payment {
6452
+ ($msg: expr , $reason: expr , $err_data: expr , $phantom_ss: expr) => {
6453
+ {
6454
+ failure_handler!($msg, $reason, $err_data, $phantom_ss, false);
6458
6455
}
6459
- if let PendingHTLCRouting::Forward { ref onion_packet, .. } = routing {
6460
- let phantom_pubkey_res = self.node_signer.get_node_id(Recipient::PhantomNode);
6461
- if phantom_pubkey_res.is_ok() && fake_scid::is_valid_phantom(&self.fake_scid_rand_bytes, short_chan_id, &self.chain_hash) {
6462
- let decode_res = onion_utils::decode_next_payment_hop(
6463
- Recipient::PhantomNode, &onion_packet.public_key.unwrap(), &onion_packet.hop_data,
6464
- onion_packet.hmac, payment_hash, None, &*self.node_signer
6465
- );
6466
- let next_hop = match decode_res {
6467
- Ok(res) => res,
6468
- Err(onion_utils::OnionDecodeErr::Malformed { err_msg, reason }) => {
6469
- let sha256_of_onion = Sha256::hash(&onion_packet.hop_data).to_byte_array();
6470
- // In this scenario, the phantom would have sent us an
6471
- // `update_fail_malformed_htlc`, meaning here we encrypt the error as
6472
- // if it came from us (the second-to-last hop) but contains the sha256
6473
- // of the onion.
6474
- failed_payment!(err_msg, reason, sha256_of_onion.to_vec(), None);
6475
- },
6476
- Err(onion_utils::OnionDecodeErr::Relay { err_msg, reason, shared_secret, .. }) => {
6477
- let phantom_shared_secret = shared_secret.secret_bytes();
6478
- failed_payment!(err_msg, reason, Vec::new(), Some(phantom_shared_secret));
6479
- },
6480
- };
6481
- let phantom_shared_secret = next_hop.shared_secret().secret_bytes();
6482
- let current_height: u32 = self.best_block.read().unwrap().height;
6483
- let create_res = create_recv_pending_htlc_info(next_hop,
6484
- incoming_shared_secret, payment_hash, outgoing_amt_msat,
6485
- outgoing_cltv_value, Some(phantom_shared_secret), false, None,
6486
- current_height);
6487
- match create_res
6488
- {
6489
- Ok(info) => phantom_receives.push((
6490
- prev_short_channel_id, prev_counterparty_node_id, prev_funding_outpoint,
6491
- prev_channel_id, prev_user_channel_id, vec![(info, prev_htlc_id)]
6492
- )),
6493
- Err(InboundHTLCErr { reason, err_data, msg }) => failed_payment!(msg, reason, err_data, Some(phantom_shared_secret))
6494
- }
6495
- } else {
6496
- fail_forward!(format!("Unknown short channel id {} for forward HTLC", short_chan_id),
6497
- LocalHTLCFailureReason::UnknownNextPeer, Vec::new(), None);
6498
- }
6499
- } else {
6500
- fail_forward!(format!("Unknown short channel id {} for forward HTLC", short_chan_id),
6501
- LocalHTLCFailureReason::UnknownNextPeer, Vec::new(), None);
6456
+ }
6457
+ }
6458
+ if let PendingHTLCRouting::Forward { ref onion_packet, .. } = routing {
6459
+ let phantom_pubkey_res = self.node_signer.get_node_id(Recipient::PhantomNode);
6460
+ if phantom_pubkey_res.is_ok() && fake_scid::is_valid_phantom(&self.fake_scid_rand_bytes, short_chan_id, &self.chain_hash) {
6461
+ let decode_res = onion_utils::decode_next_payment_hop(
6462
+ Recipient::PhantomNode, &onion_packet.public_key.unwrap(), &onion_packet.hop_data,
6463
+ onion_packet.hmac, payment_hash, None, &*self.node_signer
6464
+ );
6465
+ let next_hop = match decode_res {
6466
+ Ok(res) => res,
6467
+ Err(onion_utils::OnionDecodeErr::Malformed { err_msg, reason }) => {
6468
+ let sha256_of_onion = Sha256::hash(&onion_packet.hop_data).to_byte_array();
6469
+ // In this scenario, the phantom would have sent us an
6470
+ // `update_fail_malformed_htlc`, meaning here we encrypt the error as
6471
+ // if it came from us (the second-to-last hop) but contains the sha256
6472
+ // of the onion.
6473
+ failed_payment!(err_msg, reason, sha256_of_onion.to_vec(), None);
6474
+ },
6475
+ Err(onion_utils::OnionDecodeErr::Relay { err_msg, reason, shared_secret, .. }) => {
6476
+ let phantom_shared_secret = shared_secret.secret_bytes();
6477
+ failed_payment!(err_msg, reason, Vec::new(), Some(phantom_shared_secret));
6478
+ },
6479
+ };
6480
+ let phantom_shared_secret = next_hop.shared_secret().secret_bytes();
6481
+ let current_height: u32 = self.best_block.read().unwrap().height;
6482
+ let create_res = create_recv_pending_htlc_info(next_hop,
6483
+ incoming_shared_secret, payment_hash, outgoing_amt_msat,
6484
+ outgoing_cltv_value, Some(phantom_shared_secret), false, None,
6485
+ current_height);
6486
+ match create_res
6487
+ {
6488
+ Ok(info) => phantom_receives.push((
6489
+ prev_short_channel_id, prev_counterparty_node_id, prev_funding_outpoint,
6490
+ prev_channel_id, prev_user_channel_id, vec![(info, prev_htlc_id)]
6491
+ )),
6492
+ Err(InboundHTLCErr { reason, err_data, msg }) => failed_payment!(msg, reason, err_data, Some(phantom_shared_secret))
6502
6493
}
6503
- },
6504
- HTLCForwardInfo::FailHTLC { .. } | HTLCForwardInfo::FailMalformedHTLC { .. } => {
6505
- // Channel went away before we could fail it. This implies
6506
- // the channel is now on chain and our counterparty is
6507
- // trying to broadcast the HTLC-Timeout, but that's their
6508
- // problem, not ours.
6494
+ } else {
6495
+ fail_forward!(format!("Unknown short channel id {} for forward HTLC", short_chan_id),
6496
+ LocalHTLCFailureReason::UnknownNextPeer, Vec::new(), None);
6509
6497
}
6498
+ } else {
6499
+ fail_forward!(format!("Unknown short channel id {} for forward HTLC", short_chan_id),
6500
+ LocalHTLCFailureReason::UnknownNextPeer, Vec::new(), None);
6510
6501
}
6502
+ },
6503
+ HTLCForwardInfo::FailHTLC { .. } | HTLCForwardInfo::FailMalformedHTLC { .. } => {
6504
+ // Channel went away before we could fail it. This implies
6505
+ // the channel is now on chain and our counterparty is
6506
+ // trying to broadcast the HTLC-Timeout, but that's their
6507
+ // problem, not ours.
6511
6508
}
6512
6509
}
6513
6510
}
6511
+ }
6512
+
6513
+ fn process_forward_htlcs(
6514
+ &self, short_chan_id: u64, pending_forwards: &mut Vec<HTLCForwardInfo>,
6515
+ failed_forwards: &mut Vec<FailedHTLCForward>,
6516
+ phantom_receives: &mut Vec<PerSourcePendingForward>,
6517
+ ) {
6518
+ let mut forwarding_counterparty = None;
6519
+
6514
6520
let chan_info_opt = self.short_to_chan_info.read().unwrap().get(&short_chan_id).cloned();
6515
6521
let (counterparty_node_id, forward_chan_id) = match chan_info_opt {
6516
6522
Some((cp_id, chan_id)) => (cp_id, chan_id),
6517
6523
None => {
6518
- forwarding_channel_not_found!(pending_forwards.drain(..));
6524
+ self.forwarding_channel_not_found(
6525
+ pending_forwards.drain(..),
6526
+ short_chan_id,
6527
+ forwarding_counterparty,
6528
+ failed_forwards,
6529
+ phantom_receives,
6530
+ );
6519
6531
return;
6520
6532
},
6521
6533
};
6522
6534
forwarding_counterparty = Some(counterparty_node_id);
6523
6535
let per_peer_state = self.per_peer_state.read().unwrap();
6524
6536
let peer_state_mutex_opt = per_peer_state.get(&counterparty_node_id);
6525
6537
if peer_state_mutex_opt.is_none() {
6526
- forwarding_channel_not_found!(pending_forwards.drain(..));
6538
+ self.forwarding_channel_not_found(
6539
+ pending_forwards.drain(..),
6540
+ short_chan_id,
6541
+ forwarding_counterparty,
6542
+ failed_forwards,
6543
+ phantom_receives,
6544
+ );
6527
6545
return;
6528
6546
}
6529
6547
let mut peer_state_lock = peer_state_mutex_opt.unwrap().lock().unwrap();
@@ -6618,7 +6636,13 @@ where
6618
6636
} else {
6619
6637
let fwd_iter =
6620
6638
core::iter::once(forward_info).chain(draining_pending_forwards);
6621
- forwarding_channel_not_found!(fwd_iter);
6639
+ self.forwarding_channel_not_found(
6640
+ fwd_iter,
6641
+ short_chan_id,
6642
+ forwarding_counterparty,
6643
+ failed_forwards,
6644
+ phantom_receives,
6645
+ );
6622
6646
break;
6623
6647
}
6624
6648
},
@@ -6673,8 +6697,12 @@ where
6673
6697
failure_type,
6674
6698
));
6675
6699
} else {
6676
- forwarding_channel_not_found!(
6677
- core::iter::once(forward_info).chain(draining_pending_forwards)
6700
+ self.forwarding_channel_not_found(
6701
+ core::iter::once(forward_info).chain(draining_pending_forwards),
6702
+ short_chan_id,
6703
+ forwarding_counterparty,
6704
+ failed_forwards,
6705
+ phantom_receives,
6678
6706
);
6679
6707
break;
6680
6708
}
@@ -6694,8 +6722,12 @@ where
6694
6722
log_trace!(logger, "Failing HTLC back to channel with short id {} (backward HTLC ID {}) after delay", short_chan_id, htlc_id);
6695
6723
Some((chan.queue_fail_htlc(htlc_id, err_packet.clone(), &&logger), htlc_id))
6696
6724
} else {
6697
- forwarding_channel_not_found!(
6698
- core::iter::once(forward_info).chain(draining_pending_forwards)
6725
+ self.forwarding_channel_not_found(
6726
+ core::iter::once(forward_info).chain(draining_pending_forwards),
6727
+ short_chan_id,
6728
+ forwarding_counterparty,
6729
+ failed_forwards,
6730
+ phantom_receives,
6699
6731
);
6700
6732
break;
6701
6733
}
@@ -6716,8 +6748,12 @@ where
6716
6748
);
6717
6749
Some((res, htlc_id))
6718
6750
} else {
6719
- forwarding_channel_not_found!(
6720
- core::iter::once(forward_info).chain(draining_pending_forwards)
6751
+ self.forwarding_channel_not_found(
6752
+ core::iter::once(forward_info).chain(draining_pending_forwards),
6753
+ short_chan_id,
6754
+ forwarding_counterparty,
6755
+ failed_forwards,
6756
+ phantom_receives,
6721
6757
);
6722
6758
break;
6723
6759
}
0 commit comments