Skip to content

Commit 0182349

Browse files
committed
Allow configuring different max fee rate from peer
1 parent 989304e commit 0182349

File tree

2 files changed

+44
-9
lines changed

2 files changed

+44
-9
lines changed

lightning/src/ln/channel.rs

+10-9
Original file line numberDiff line numberDiff line change
@@ -2144,19 +2144,20 @@ impl<SP: Deref> Channel<SP> where
21442144
<SP::Target as SignerProvider>::Signer: WriteableEcdsaChannelSigner
21452145
{
21462146
fn check_remote_fee<F: Deref, L: Deref>(
2147-
channel_type: &ChannelTypeFeatures, fee_estimator: &LowerBoundedFeeEstimator<F>,
2148-
feerate_per_kw: u32, cur_feerate_per_kw: Option<u32>, logger: &L
2147+
channel_type: &ChannelTypeFeatures, config: &ChannelConfig,
2148+
fee_estimator: &LowerBoundedFeeEstimator<F>, feerate_per_kw: u32,
2149+
cur_feerate_per_kw: Option<u32>, logger: &L
21492150
) -> Result<(), ChannelError> where F::Target: FeeEstimator, L::Target: Logger,
21502151
{
21512152
// We only bound the fee updates on the upper side to prevent completely absurd feerates,
2152-
// always accepting up to 25 sat/vByte or 10x our fee estimator's "High Priority" fee.
2153+
// by default accepting up to 25 sat/vByte or 10x our fee estimator's "High Priority" fee.
21532154
// We generally don't care too much if they set the feerate to something very high, but it
21542155
// could result in the channel being useless due to everything being dust. This doesn't
21552156
// apply to channels supporting anchor outputs since HTLC transactions are pre-signed with a
21562157
// zero fee, so their fee is no longer considered to determine dust limits.
21572158
if !channel_type.supports_anchors_zero_fee_htlc_tx() {
2158-
let upper_limit = cmp::max(250 * 25,
2159-
fee_estimator.bounded_sat_per_1000_weight(ConfirmationTarget::HighPriority) as u64 * 10);
2159+
let upper_limit = cmp::max(config.base_max_accepted_fee_rate as u64,
2160+
fee_estimator.bounded_sat_per_1000_weight(ConfirmationTarget::HighPriority) as u64 * config.max_accepted_fee_rate_multiplier as u64);
21602161
if feerate_per_kw as u64 > upper_limit {
21612162
return Err(ChannelError::Close(format!("Peer's feerate much too high. Actual: {}. Our expected upper limit: {}", feerate_per_kw, upper_limit)));
21622163
}
@@ -3854,7 +3855,7 @@ impl<SP: Deref> Channel<SP> where
38543855
if self.context.channel_state & (ChannelState::PeerDisconnected as u32) == ChannelState::PeerDisconnected as u32 {
38553856
return Err(ChannelError::Close("Peer sent update_fee when we needed a channel_reestablish".to_owned()));
38563857
}
3857-
Channel::<SP>::check_remote_fee(&self.context.channel_type, fee_estimator, msg.feerate_per_kw, Some(self.context.feerate_per_kw), logger)?;
3858+
Channel::<SP>::check_remote_fee(&self.context.channel_type, &self.context.config(), fee_estimator, msg.feerate_per_kw, Some(self.context.feerate_per_kw), logger)?;
38583859
let feerate_over_dust_buffer = msg.feerate_per_kw > self.context.get_dust_buffer_feerate(None);
38593860

38603861
self.context.pending_update_fee = Some((msg.feerate_per_kw, FeeUpdateState::RemoteAnnounced));
@@ -6289,7 +6290,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
62896290
if msg.htlc_minimum_msat >= full_channel_value_msat {
62906291
return Err(ChannelError::Close(format!("Minimum htlc value ({}) was larger than full channel value ({})", msg.htlc_minimum_msat, full_channel_value_msat)));
62916292
}
6292-
Channel::<SP>::check_remote_fee(&channel_type, fee_estimator, msg.feerate_per_kw, None, logger)?;
6293+
Channel::<SP>::check_remote_fee(&channel_type, &config.channel_config, fee_estimator, msg.feerate_per_kw, None, logger)?;
62936294

62946295
let max_counterparty_selected_contest_delay = u16::min(config.channel_handshake_limits.their_to_self_delay, MAX_LOCAL_BREAKDOWN_TIMEOUT);
62956296
if msg.to_self_delay > max_counterparty_selected_contest_delay {
@@ -7642,7 +7643,7 @@ mod tests {
76427643
use crate::ln::PaymentHash;
76437644
use crate::ln::channelmanager::{self, HTLCSource, PaymentId};
76447645
use crate::ln::channel::InitFeatures;
7645-
use crate::ln::channel::{Channel, ChannelState, InboundHTLCOutput, OutboundV1Channel, InboundV1Channel, OutboundHTLCOutput, InboundHTLCState, OutboundHTLCState, HTLCCandidate, HTLCInitiator, commit_tx_fee_msat};
7646+
use crate::ln::channel::{Channel, ChannelConfig, ChannelState, InboundHTLCOutput, OutboundV1Channel, InboundV1Channel, OutboundHTLCOutput, InboundHTLCState, OutboundHTLCState, HTLCCandidate, HTLCInitiator, commit_tx_fee_msat};
76467647
use crate::ln::channel::{MAX_FUNDING_SATOSHIS_NO_WUMBO, TOTAL_BITCOIN_SUPPLY_SATOSHIS, MIN_THEIR_CHAN_RESERVE_SATOSHIS};
76477648
use crate::ln::features::ChannelTypeFeatures;
76487649
use crate::ln::msgs::{ChannelUpdate, DecodeError, UnsignedChannelUpdate, MAX_VALUE_MSAT};
@@ -7691,7 +7692,7 @@ mod tests {
76917692
let fee_est = TestFeeEstimator { fee_est: 42 };
76927693
let bounded_fee_estimator = LowerBoundedFeeEstimator::new(&fee_est);
76937694
assert!(Channel::<&TestKeysInterface>::check_remote_fee(
7694-
&ChannelTypeFeatures::only_static_remote_key(), &bounded_fee_estimator,
7695+
&ChannelTypeFeatures::only_static_remote_key(), &ChannelConfig::default(), &bounded_fee_estimator,
76957696
u32::max_value(), None, &&test_utils::TestLogger::new()).is_err());
76967697
}
76977698

lightning/src/util/config.rs

+34
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,24 @@ pub struct ChannelConfig {
485485
/// [`PaymentClaimable::counterparty_skimmed_fee_msat`]: crate::events::Event::PaymentClaimable::counterparty_skimmed_fee_msat
486486
// TODO: link to bLIP when it's merged
487487
pub accept_underpaying_htlcs: bool,
488+
489+
/// When checking our channel counterparty's fee rate, we will allow any value that is up to the greater
490+
/// between [`ChannelConfig::base_max_accepted_fee_rate`] and [`ChannelConfig::max_accepted_fee_rate_multiplier`]
491+
/// times our [`HighPriority`] estimated feerate. This is only used for non-anchor channels.
492+
///
493+
/// Default value: 25 sat/vbyte.
494+
///
495+
/// [`HighPriority`]: crate::chain::chaininterface::ConfirmationTarget::HighPriority
496+
pub base_max_accepted_fee_rate: u32,
497+
498+
/// When checking our channel counterparty's fee rate, we will allow any value that is up to the greater
499+
/// between [`ChannelConfig::base_max_accepted_fee_rate`] and [`ChannelConfig::max_accepted_fee_rate_multiplier`]
500+
/// times our [`HighPriority`] estimated feerate. This is only used for non-anchor channels.
501+
///
502+
/// Default value: 10.
503+
///
504+
/// [`HighPriority`]: crate::chain::chaininterface::ConfirmationTarget::HighPriority
505+
pub max_accepted_fee_rate_multiplier: u32,
488506
}
489507

490508
impl ChannelConfig {
@@ -518,6 +536,8 @@ impl Default for ChannelConfig {
518536
max_dust_htlc_exposure: MaxDustHTLCExposure::FeeRateMultiplier(5000),
519537
force_close_avoidance_max_fee_satoshis: 1000,
520538
accept_underpaying_htlcs: false,
539+
base_max_accepted_fee_rate: 25 * 250, // 25 sat/vbyte
540+
max_accepted_fee_rate_multiplier: 10,
521541
}
522542
}
523543
}
@@ -539,6 +559,8 @@ impl crate::util::ser::Writeable for ChannelConfig {
539559
// LegacyChannelConfig. To make sure that serialization is not compatible with this one, we use
540560
// the next required type of 10, which if seen by the old serialization will always fail.
541561
(10, self.force_close_avoidance_max_fee_satoshis, required),
562+
(11, self.base_max_accepted_fee_rate, required),
563+
(13, self.max_accepted_fee_rate_multiplier, required),
542564
});
543565
Ok(())
544566
}
@@ -553,6 +575,8 @@ impl crate::util::ser::Readable for ChannelConfig {
553575
let mut max_dust_htlc_exposure_msat = None;
554576
let mut max_dust_htlc_exposure_enum = None;
555577
let mut force_close_avoidance_max_fee_satoshis = 1000;
578+
let mut base_max_accepted_fee_rate = 25 * 250;
579+
let mut max_accepted_fee_rate_multiplier = 10;
556580
read_tlv_fields!(reader, {
557581
(0, forwarding_fee_proportional_millionths, required),
558582
(1, accept_underpaying_htlcs, (default_value, false)),
@@ -562,6 +586,8 @@ impl crate::util::ser::Readable for ChannelConfig {
562586
// Has always been written, but became optionally read in 0.0.116
563587
(6, max_dust_htlc_exposure_msat, option),
564588
(10, force_close_avoidance_max_fee_satoshis, required),
589+
(11, base_max_accepted_fee_rate, (default_value, 25 * 250 as u32)),
590+
(13, max_accepted_fee_rate_multiplier, (default_value, 10_u32)),
565591
});
566592
let max_dust_htlc_fixed_limit = max_dust_htlc_exposure_msat.unwrap_or(5_000_000);
567593
let max_dust_htlc_exposure_msat = max_dust_htlc_exposure_enum
@@ -573,6 +599,8 @@ impl crate::util::ser::Readable for ChannelConfig {
573599
cltv_expiry_delta,
574600
max_dust_htlc_exposure: max_dust_htlc_exposure_msat,
575601
force_close_avoidance_max_fee_satoshis,
602+
base_max_accepted_fee_rate,
603+
max_accepted_fee_rate_multiplier,
576604
})
577605
}
578606
}
@@ -666,6 +694,8 @@ impl crate::util::ser::Readable for LegacyChannelConfig {
666694
let mut commit_upfront_shutdown_pubkey = false;
667695
let mut forwarding_fee_base_msat = 0;
668696
let mut max_dust_htlc_exposure_enum = None;
697+
let mut base_max_accepted_fee_rate = 25 * 250;
698+
let mut max_accepted_fee_rate_multiplier = 10;
669699
read_tlv_fields!(reader, {
670700
(0, forwarding_fee_proportional_millionths, required),
671701
// Has always been written, but became optionally read in 0.0.116
@@ -676,6 +706,8 @@ impl crate::util::ser::Readable for LegacyChannelConfig {
676706
(5, max_dust_htlc_exposure_enum, option),
677707
(6, commit_upfront_shutdown_pubkey, required),
678708
(8, forwarding_fee_base_msat, required),
709+
(11, base_max_accepted_fee_rate, (default_value, 25 * 250 as u32)),
710+
(13, max_accepted_fee_rate_multiplier, (default_value, 10_u32)),
679711
});
680712
let max_dust_htlc_exposure_msat_fixed_limit =
681713
max_dust_htlc_exposure_msat_fixed_limit.unwrap_or(5_000_000);
@@ -689,6 +721,8 @@ impl crate::util::ser::Readable for LegacyChannelConfig {
689721
force_close_avoidance_max_fee_satoshis,
690722
forwarding_fee_base_msat,
691723
accept_underpaying_htlcs: false,
724+
base_max_accepted_fee_rate,
725+
max_accepted_fee_rate_multiplier,
692726
},
693727
announced_channel,
694728
commit_upfront_shutdown_pubkey,

0 commit comments

Comments
 (0)