From 8f68d0e6051646f426b0f09994aefad5da85ee54 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Tue, 5 Jun 2018 17:50:45 -0700 Subject: [PATCH] funding+htlcswitch: enforce min fee rate of 253 sat/kw on commitments In this commit, we add and enforce a min fee rate for commitment transactions created, and also any updates we propose to the remote party. It's important to note that this is only a temporary patch, as nodes can dynamically raise their min fee rate whenever their mempool is saturated. Fixes #1330. --- fundingmanager.go | 20 ++++++++++++++++---- htlcswitch/link.go | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/fundingmanager.go b/fundingmanager.go index 5039f2af..df68f0fe 100644 --- a/fundingmanager.go +++ b/fundingmanager.go @@ -67,6 +67,11 @@ const ( // currently accepted on the Litecoin chain within the Lightning // Protocol. maxLtcFundingAmount = maxBtcFundingAmount * btcToLtcConversionRate + + // minCommitFeePerKw is the smallest fee rate that we should propose + // for a new fee update. We'll use this as a fee floor when proposing + // and accepting updates. + minCommitFeePerKw = 253 ) var ( @@ -2520,12 +2525,19 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) { return } - // The protocol currently operates on the basis of fee-per-kw, so we'll - // multiply the computed sat/weight by 1000 to arrive at fee-per-kw. + // If the converted fee-per-kw is below the current widely used policy + // floor, then we'll use the floor instead. commitFeePerKw := feePerVSize.FeePerKWeight() + if commitFeePerKw < minCommitFeePerKw { + fndgLog.Infof("Proposed fee rate of %v sat/kw is below min "+ + "of %v sat/kw, using fee floor", int64(commitFeePerKw), + int64(minCommitFeePerKw)) - // We set the channel flags to indicate whether we want this channel - // to be announced to the network. + commitFeePerKw = minCommitFeePerKw + } + + // We set the channel flags to indicate whether we want this channel to + // be announced to the network. var channelFlags lnwire.FundingFlag if !msg.openChanReq.private { // This channel will be announced. diff --git a/htlcswitch/link.go b/htlcswitch/link.go index 156e2d93..51f52ab3 100644 --- a/htlcswitch/link.go +++ b/htlcswitch/link.go @@ -30,6 +30,11 @@ const ( // // TODO(roasbeef): must be < default delta expiryGraceDelta = 2 + + // minCommitFeePerKw is the smallest fee rate that we should propose + // for a new fee update. We'll use this as a fee floor when proposing + // and accepting updates. + minCommitFeePerKw = 253 ) // ForwardingPolicy describes the set of constraints that a given ChannelLink @@ -476,6 +481,16 @@ func (l *channelLink) sampleNetworkFee() (lnwallet.SatPerKWeight, error) { // Once we have this fee rate, we'll convert to sat-per-kw. feePerKw := feePerVSize.FeePerKWeight() + // If the returned feePerKw is less than the current widely used + // policy, then we'll use that instead as a floor. + if feePerKw < minCommitFeePerKw { + log.Debugf("Proposed fee rate of %v sat/kw is below min "+ + "of %v sat/kw, using fee floor", int64(feePerKw), + int64(minCommitFeePerKw)) + + feePerKw = minCommitFeePerKw + } + log.Debugf("ChannelLink(%v): sampled fee rate for 3 block conf: %v "+ "sat/kw", l, int64(feePerKw))