htlcswitch+lnd: make max cltv expiry configurable
This commit is contained in:
parent
add905d17f
commit
87ff463abd
@ -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,
|
||||||
)
|
)
|
||||||
|
1
peer.go
1
peer.go
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user