config+pilot: define autopilot.heuristic
And validate the config set by the user.
This commit is contained in:
parent
c0fed861d2
commit
36e7694e8e
@ -142,6 +142,27 @@ type AttachmentHeuristic interface {
|
|||||||
map[NodeID]*NodeScore, error)
|
map[NodeID]*NodeScore, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// availableHeuristics holds all heuristics possible to combine for use
|
||||||
|
// with the autopilot agent.
|
||||||
|
availableHeuristics = []AttachmentHeuristic{
|
||||||
|
NewPrefAttachment(),
|
||||||
|
}
|
||||||
|
|
||||||
|
// AvailableHeuristics is a map that holds the name of available
|
||||||
|
// heuristics to the actual heuristic for easy lookup. It will be
|
||||||
|
// filled during init().
|
||||||
|
AvailableHeuristics = make(map[string]AttachmentHeuristic)
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Fill the map from heuristic names to available heuristics for easy
|
||||||
|
// lookup.
|
||||||
|
for _, h := range availableHeuristics {
|
||||||
|
AvailableHeuristics[h.Name()] = h
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ChannelController is a simple interface that allows an auto-pilot agent to
|
// ChannelController is a simple interface that allows an auto-pilot agent to
|
||||||
// open a channel within the graph to a target peer, close targeted channels,
|
// open a channel within the graph to a target peer, close targeted channels,
|
||||||
// or add/remove funds from existing channels via a splice in/out mechanisms.
|
// or add/remove funds from existing channels via a splice in/out mechanisms.
|
||||||
|
22
config.go
22
config.go
@ -142,13 +142,14 @@ type bitcoindConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type autoPilotConfig struct {
|
type autoPilotConfig struct {
|
||||||
Active bool `long:"active" description:"If the autopilot agent should be active or not."`
|
Active bool `long:"active" description:"If the autopilot agent should be active or not."`
|
||||||
MaxChannels int `long:"maxchannels" description:"The maximum number of channels that should be created"`
|
Heuristic map[string]float64 `long:"heuristic" description:"Heuristic to activate, and the weight to give it during scoring."`
|
||||||
Allocation float64 `long:"allocation" description:"The percentage of total funds that should be committed to automatic channel establishment"`
|
MaxChannels int `long:"maxchannels" description:"The maximum number of channels that should be created"`
|
||||||
MinChannelSize int64 `long:"minchansize" description:"The smallest channel that the autopilot agent should create"`
|
Allocation float64 `long:"allocation" description:"The percentage of total funds that should be committed to automatic channel establishment"`
|
||||||
MaxChannelSize int64 `long:"maxchansize" description:"The largest channel that the autopilot agent should create"`
|
MinChannelSize int64 `long:"minchansize" description:"The smallest channel that the autopilot agent should create"`
|
||||||
Private bool `long:"private" description:"Whether the channels created by the autopilot agent should be private or not. Private channels won't be announced to the network."`
|
MaxChannelSize int64 `long:"maxchansize" description:"The largest channel that the autopilot agent should create"`
|
||||||
MinConfs int32 `long:"minconfs" description:"The minimum number of confirmations each of your inputs in funding transactions created by the autopilot agent must have."`
|
Private bool `long:"private" description:"Whether the channels created by the autopilot agent should be private or not. Private channels won't be announced to the network."`
|
||||||
|
MinConfs int32 `long:"minconfs" description:"The minimum number of confirmations each of your inputs in funding transactions created by the autopilot agent must have."`
|
||||||
}
|
}
|
||||||
|
|
||||||
type torConfig struct {
|
type torConfig struct {
|
||||||
@ -312,6 +313,9 @@ func loadConfig() (*config, error) {
|
|||||||
Allocation: 0.6,
|
Allocation: 0.6,
|
||||||
MinChannelSize: int64(minChanFundingSize),
|
MinChannelSize: int64(minChanFundingSize),
|
||||||
MaxChannelSize: int64(maxFundingAmount),
|
MaxChannelSize: int64(maxFundingAmount),
|
||||||
|
Heuristic: map[string]float64{
|
||||||
|
"preferential": 1.0,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
TrickleDelay: defaultTrickleDelay,
|
TrickleDelay: defaultTrickleDelay,
|
||||||
InactiveChanTimeout: defaultInactiveChanTimeout,
|
InactiveChanTimeout: defaultInactiveChanTimeout,
|
||||||
@ -463,6 +467,10 @@ func loadConfig() (*config, error) {
|
|||||||
cfg.Autopilot.MaxChannelSize = int64(maxFundingAmount)
|
cfg.Autopilot.MaxChannelSize = int64(maxFundingAmount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, err := validateAtplCfg(cfg.Autopilot); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
// Validate the Tor config parameters.
|
// Validate the Tor config parameters.
|
||||||
socks, err := lncfg.ParseAddressString(
|
socks, err := lncfg.ParseAddressString(
|
||||||
cfg.Tor.SOCKS, strconv.Itoa(defaultTorSOCKSPort),
|
cfg.Tor.SOCKS, strconv.Itoa(defaultTorSOCKSPort),
|
||||||
|
54
pilot.go
54
pilot.go
@ -14,6 +14,60 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/tor"
|
"github.com/lightningnetwork/lnd/tor"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// validateAtplConfig is a helper method that makes sure the passed
|
||||||
|
// configuration is sane. Currently it checks that the heuristic configuration
|
||||||
|
// makes sense. In case the config is valid, it will return a list of
|
||||||
|
// WeightedHeuristics that can be combined for use with the autopilot agent.
|
||||||
|
func validateAtplCfg(cfg *autoPilotConfig) ([]*autopilot.WeightedHeuristic,
|
||||||
|
error) {
|
||||||
|
|
||||||
|
var (
|
||||||
|
heuristicsStr string
|
||||||
|
sum float64
|
||||||
|
heuristics []*autopilot.WeightedHeuristic
|
||||||
|
)
|
||||||
|
|
||||||
|
// Create a help text that we can return in case the config is not
|
||||||
|
// correct.
|
||||||
|
for _, a := range autopilot.AvailableHeuristics {
|
||||||
|
heuristicsStr += fmt.Sprintf(" '%v' ", a.Name())
|
||||||
|
}
|
||||||
|
availStr := fmt.Sprintf("Avaiblable heuristcs are: [%v]", heuristicsStr)
|
||||||
|
|
||||||
|
// We'll go through the config and make sure all the heuristics exists,
|
||||||
|
// and that the sum of their weights is 1.0.
|
||||||
|
for name, weight := range cfg.Heuristic {
|
||||||
|
a, ok := autopilot.AvailableHeuristics[name]
|
||||||
|
if !ok {
|
||||||
|
// No heuristic matching this config option was found.
|
||||||
|
return nil, fmt.Errorf("Heuristic %v not available. %v",
|
||||||
|
name, availStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this heuristic was among the registered ones, we add it
|
||||||
|
// to the list we'll give to the agent, and keep track of the
|
||||||
|
// sum of weights.
|
||||||
|
heuristics = append(
|
||||||
|
heuristics,
|
||||||
|
&autopilot.WeightedHeuristic{
|
||||||
|
Weight: weight,
|
||||||
|
AttachmentHeuristic: a,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
sum += weight
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check found heuristics. We must have at least one to operate.
|
||||||
|
if len(heuristics) == 0 {
|
||||||
|
return nil, fmt.Errorf("No active heuristics. %v", availStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if sum != 1.0 {
|
||||||
|
return nil, fmt.Errorf("Heuristic weights must sum to 1.0")
|
||||||
|
}
|
||||||
|
return heuristics, nil
|
||||||
|
}
|
||||||
|
|
||||||
// chanController is an implementation of the autopilot.ChannelController
|
// chanController is an implementation of the autopilot.ChannelController
|
||||||
// interface that's backed by a running lnd instance.
|
// interface that's backed by a running lnd instance.
|
||||||
type chanController struct {
|
type chanController struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user