htlcswitch+lnd: make max cltv expiry configurable

This commit is contained in:
Wilmer Paulino 2019-07-26 18:05:58 -07:00
parent add905d17f
commit 87ff463abd
No known key found for this signature in database
GPG Key ID: 6DF57B9F9514972F
5 changed files with 28 additions and 14 deletions

@ -26,6 +26,7 @@ import (
"github.com/lightningnetwork/lnd/chanbackup" "github.com/lightningnetwork/lnd/chanbackup"
"github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/channeldb"
"github.com/lightningnetwork/lnd/discovery" "github.com/lightningnetwork/lnd/discovery"
"github.com/lightningnetwork/lnd/htlcswitch"
"github.com/lightningnetwork/lnd/htlcswitch/hodl" "github.com/lightningnetwork/lnd/htlcswitch/hodl"
"github.com/lightningnetwork/lnd/lncfg" "github.com/lightningnetwork/lnd/lncfg"
"github.com/lightningnetwork/lnd/lnrpc/routerrpc" "github.com/lightningnetwork/lnd/lnrpc/routerrpc"
@ -312,6 +313,8 @@ type config struct {
StaggerInitialReconnect bool `long:"stagger-initial-reconnect" description:"If true, will apply a randomized staggering between 0s and 30s when reconnecting to persistent peers on startup. The first 10 reconnections will be attempted instantly, regardless of the flag's value"` StaggerInitialReconnect bool `long:"stagger-initial-reconnect" description:"If true, will apply a randomized staggering between 0s and 30s when reconnecting to persistent peers on startup. The first 10 reconnections will be attempted instantly, regardless of the flag's value"`
MaxOutgoingCltvExpiry uint32 `long:"max-cltv-expiry" description:"The maximum number of blocks funds could be locked up for when forwarding payments."`
net tor.Net net tor.Net
Routing *routing.Conf `group:"routing" namespace:"routing"` Routing *routing.Conf `group:"routing" namespace:"routing"`
@ -425,6 +428,7 @@ func loadConfig() (*config, error) {
Watchtower: &lncfg.Watchtower{ Watchtower: &lncfg.Watchtower{
TowerDir: defaultTowerDir, TowerDir: defaultTowerDir,
}, },
MaxOutgoingCltvExpiry: htlcswitch.DefaultMaxOutgoingCltvExpiry,
} }
// Pre-parse the command line options to pick up an alternative config // Pre-parse the command line options to pick up an alternative config

@ -30,16 +30,16 @@ func init() {
} }
const ( const (
// maxCltvExpiry is the maximum outgoing time lock that the node accepts // DefaultMaxOutgoingCltvExpiry is the maximum outgoing time lock that
// for forwarded payments. The value is relative to the current block // the node accepts for forwarded payments. The value is relative to the
// height. The reason to have a maximum is to prevent funds getting // current block height. The reason to have a maximum is to prevent
// locked up unreasonably long. Otherwise, an attacker willing to lock // funds getting locked up unreasonably long. Otherwise, an attacker
// its own funds too, could force the funds of this node to be locked up // willing to lock its own funds too, could force the funds of this node
// for an indefinite (max int32) number of blocks. // to be locked up for an indefinite (max int32) number of blocks.
// //
// The value 5000 is based on the maximum number of hops (20), the // The value 5000 is based on the maximum number of hops (20), the
// default cltv delta (144) and some extra margin. // default cltv delta (144) and some extra margin.
maxCltvExpiry = 5000 DefaultMaxOutgoingCltvExpiry = 5000
// DefaultMinLinkFeeUpdateTimeout represents the minimum interval in // DefaultMinLinkFeeUpdateTimeout represents the minimum interval in
// which a link should propose to update its commitment fee rate. // which a link should propose to update its commitment fee rate.
@ -249,6 +249,11 @@ type ChannelLinkConfig struct {
// encrypting, and uploading of justice transactions to the daemon's // encrypting, and uploading of justice transactions to the daemon's
// configured set of watchtowers. // configured set of watchtowers.
TowerClient TowerClient TowerClient TowerClient
// MaxCltvExpiry is the maximum outgoing timelock that the link should
// accept for a forwarded HTLC. The value is relative to the current
// block height.
MaxOutgoingCltvExpiry uint32
} }
// channelLink is the service which drives a channel's commitment update // channelLink is the service which drives a channel's commitment update
@ -2337,10 +2342,10 @@ func (l *channelLink) htlcSatifiesPolicyOutgoing(policy ForwardingPolicy,
} }
// Check absolute max delta. // Check absolute max delta.
if timeout > maxCltvExpiry+heightNow { if timeout > l.cfg.MaxOutgoingCltvExpiry+heightNow {
l.errorf("outgoing htlc(%x) has a time lock too far in the "+ l.errorf("outgoing htlc(%x) has a time lock too far in the "+
"future: got %v, but maximum is %v", payHash[:], "future: got %v, but maximum is %v", payHash[:],
timeout-heightNow, maxCltvExpiry) timeout-heightNow, l.cfg.MaxOutgoingCltvExpiry)
return &lnwire.FailExpiryTooFar{} return &lnwire.FailExpiryTooFar{}
} }

@ -1692,6 +1692,7 @@ func newSingleLinkTestHarness(chanAmt, chanReserve btcutil.Amount) (
BatchSize: 10000, BatchSize: 10000,
MinFeeUpdateTimeout: 30 * time.Minute, MinFeeUpdateTimeout: 30 * time.Minute,
MaxFeeUpdateTimeout: 40 * time.Minute, MaxFeeUpdateTimeout: 40 * time.Minute,
MaxOutgoingCltvExpiry: DefaultMaxOutgoingCltvExpiry,
} }
const startingHeight = 100 const startingHeight = 100
@ -4240,6 +4241,7 @@ func (h *persistentLinkHarness) restartLink(
// Set any hodl flags requested for the new link. // Set any hodl flags requested for the new link.
HodlMask: hodl.MaskFromFlags(hodlFlags...), HodlMask: hodl.MaskFromFlags(hodlFlags...),
DebugHTLC: len(hodlFlags) > 0, DebugHTLC: len(hodlFlags) > 0,
MaxOutgoingCltvExpiry: DefaultMaxOutgoingCltvExpiry,
} }
const startingHeight = 100 const startingHeight = 100
@ -5559,6 +5561,7 @@ func TestHtlcSatisfyPolicy(t *testing.T) {
BaseFee: 10, BaseFee: 10,
}, },
FetchLastChannelUpdate: fetchLastChannelUpdate, FetchLastChannelUpdate: fetchLastChannelUpdate,
MaxOutgoingCltvExpiry: DefaultMaxOutgoingCltvExpiry,
}, },
} }

@ -1115,6 +1115,7 @@ func (h *hopNetwork) createChannelLink(server, peer *mockServer,
MaxFeeUpdateTimeout: maxFeeUpdateTimeout, MaxFeeUpdateTimeout: maxFeeUpdateTimeout,
OnChannelFailure: func(lnwire.ChannelID, lnwire.ShortChannelID, LinkFailureError) {}, OnChannelFailure: func(lnwire.ChannelID, lnwire.ShortChannelID, LinkFailureError) {},
OutgoingCltvRejectDelta: 3, OutgoingCltvRejectDelta: 3,
MaxOutgoingCltvExpiry: DefaultMaxOutgoingCltvExpiry,
}, },
channel, channel,
) )

@ -585,6 +585,7 @@ func (p *peer) addLink(chanPoint *wire.OutPoint,
MaxFeeUpdateTimeout: htlcswitch.DefaultMaxLinkFeeUpdateTimeout, MaxFeeUpdateTimeout: htlcswitch.DefaultMaxLinkFeeUpdateTimeout,
OutgoingCltvRejectDelta: p.outgoingCltvRejectDelta, OutgoingCltvRejectDelta: p.outgoingCltvRejectDelta,
TowerClient: p.server.towerClient, TowerClient: p.server.towerClient,
MaxOutgoingCltvExpiry: cfg.MaxOutgoingCltvExpiry,
} }
link := htlcswitch.NewChannelLink(linkCfg, lnChan) link := htlcswitch.NewChannelLink(linkCfg, lnChan)