e327ffe954
This commit overhauls the routing package significantly to simplify the code, conform to the rest of the coding style within the package, and observe the new authenticated gossiping scheme outlined in BOLT07. As a major step towards a more realistic path finding algorithm, fees are properly calculated and observed during path finding. If a path has sufficient capacity _before_ fees are applied, but afterwards the finalized route would exceed the capacity of a single link, the route is marked as invalid. Currently a naive weighting algorithm is used which only factors in the time-lock delta at each hop, thereby optimizing for the lowest time lock. Fee calculation also isn’t finalized since we aren’t yet using milli-satoshi throughout the daemon. The final TODO item within the PR is to properly perform a multi-path search and rank the results based on a summation heuristic rather than just return the first (out of many) route found. On the server side, once nodes are initially connected to the daemon, our routing table will be synced with the peer’s using a naive “just send everything scheme” to hold us over until I spec out some a efficient graph reconciliation protocol. Additionally, the routing table is now pruned by the channel router itself once new blocks arrive rather than depending on peers to tell us when a channel flaps or is closed. Finally, the validation of peer announcements aren’t yet fully implemented as they’ll be implemented within the pending discovery package that was blocking on the completion of this package. Most off the routing message processing will be moved out of this package and into the discovery package where full validation will be carried out.
71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
package routing
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
|
|
"github.com/btcsuite/btclog"
|
|
)
|
|
|
|
// log is a logger that is initialized with no output filters. This
|
|
// means the package will not perform any logging by default until the caller
|
|
// requests it.
|
|
var log btclog.Logger
|
|
|
|
// The default amount of logging is none.
|
|
func init() {
|
|
DisableLog()
|
|
}
|
|
|
|
// DisableLog disables all library log output. Logging output is disabled
|
|
// by default until either UseLogger or SetLogWriter are called.
|
|
func DisableLog() {
|
|
log = btclog.Disabled
|
|
}
|
|
|
|
// UseLogger uses a specified Logger to output package logging info.
|
|
// This should be used in preference to SetLogWriter if the caller is also
|
|
// using btclog.
|
|
func UseLogger(logger btclog.Logger) {
|
|
log = logger
|
|
}
|
|
|
|
// SetLogWriter uses a specified io.Writer to output package logging info.
|
|
// This allows a caller to direct package logging output without needing a
|
|
// dependency on seelog. If the caller is also using btclog, UseLogger should
|
|
// be used instead.
|
|
func SetLogWriter(w io.Writer, level string) error {
|
|
if w == nil {
|
|
return errors.New("nil writer")
|
|
}
|
|
|
|
lvl, ok := btclog.LogLevelFromString(level)
|
|
if !ok {
|
|
return errors.New("invalid log level")
|
|
}
|
|
|
|
l, err := btclog.NewLoggerFromWriter(w, lvl)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
UseLogger(l)
|
|
return nil
|
|
}
|
|
|
|
// logClosure is used to provide a closure over expensive logging operations
|
|
// so don't have to be performed when the logging level doesn't warrant it.
|
|
type logClosure func() string
|
|
|
|
// String invokes the underlying function and returns the result.
|
|
func (c logClosure) String() string {
|
|
return c()
|
|
}
|
|
|
|
// newLogClosure returns a new closure over a function that returns a string
|
|
// which itself provides a Stringer interface so that it can be used with the
|
|
// logging system.
|
|
func newLogClosure(c func() string) logClosure {
|
|
return logClosure(c)
|
|
}
|