mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-29 18:26:41 +00:00

Use it to add multiple peer support. We try and keep 8 outbound peers active at all times. This address manager is not as complete as the one in bitcoind yet, but additional functionality is being worked on. We currently handle (in a similar manner to bitcoind): - biasing between new and already tried addresses based on number of connected peers. - rejection of non-default ports until desparate - address selection probabilities based on last successful connection and number of failures. - routability checks based on known unroutable subnets. - only connecting to each network `group' once at any one time. We currently lack support for: - tor ``addresses'' (an .onion address encoded in 64 bytes of ip address) - full state save and restore (we just save a json with the list of known addresses in it) - multiple buckets for new and tried addresses selected by a hash of address and source. The current algorithm functions the same as bitcoind would with only one bucket for new and tried (making the address cache rather smaller than it otherwise would be).
155 lines
3.6 KiB
Go
155 lines
3.6 KiB
Go
// Copyright (c) 2013 Conformal Systems LLC.
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/conformal/btcchain"
|
|
"github.com/conformal/btcdb"
|
|
"github.com/conformal/btcscript"
|
|
"github.com/conformal/seelog"
|
|
"net"
|
|
"os"
|
|
"runtime"
|
|
)
|
|
|
|
// These constants are used by the dns seed code to pick a random last seen
|
|
// time.
|
|
const (
|
|
secondsIn3Days int32 = 24 * 60 * 60 * 3
|
|
secondsIn4Days int32 = 24 * 60 * 60 * 4
|
|
)
|
|
|
|
var (
|
|
log seelog.LoggerInterface = seelog.Disabled
|
|
cfg *config
|
|
)
|
|
|
|
// newLogger creates a new seelog logger using the provided logging level and
|
|
// log message prefix.
|
|
func newLogger(level string, prefix string) seelog.LoggerInterface {
|
|
fmtstring := `
|
|
<seelog type="adaptive" mininterval="2000000" maxinterval="100000000"
|
|
critmsgcount="500" minlevel="%s">
|
|
<outputs formatid="all">
|
|
<console/>
|
|
</outputs>
|
|
<formats>
|
|
<format id="all" format="[%%Time %%Date] [%%LEV] [%s] %%Msg%%n" />
|
|
</formats>
|
|
</seelog>`
|
|
config := fmt.Sprintf(fmtstring, level, prefix)
|
|
|
|
logger, err := seelog.LoggerFromConfigAsString(config)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "failed to create logger: %v", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
return logger
|
|
}
|
|
|
|
// useLogger sets the btcd logger to the passed logger.
|
|
func useLogger(logger seelog.LoggerInterface) {
|
|
log = logger
|
|
}
|
|
|
|
// setLogLevel sets the log level for the logging system. It initialises a
|
|
// logger for each subsystem at the provided level.
|
|
func setLogLevel(logLevel string) []seelog.LoggerInterface {
|
|
var loggers []seelog.LoggerInterface
|
|
|
|
// Define sub-systems.
|
|
subSystems := []struct {
|
|
level string
|
|
prefix string
|
|
useLogger func(seelog.LoggerInterface)
|
|
}{
|
|
{logLevel, "BTCD", useLogger},
|
|
{logLevel, "BCDB", btcdb.UseLogger},
|
|
{logLevel, "CHAN", btcchain.UseLogger},
|
|
{logLevel, "SCRP", btcscript.UseLogger},
|
|
}
|
|
|
|
// Configure all sub-systems with new loggers while keeping track of
|
|
// the created loggers to return so they can be flushed.
|
|
for _, s := range subSystems {
|
|
newLog := newLogger(s.level, s.prefix)
|
|
loggers = append(loggers, newLog)
|
|
s.useLogger(newLog)
|
|
}
|
|
|
|
return loggers
|
|
}
|
|
|
|
// btcdMain is the real main function for btcd. It is necessary to work around
|
|
// the fact that deferred functions do not run when os.Exit() is called.
|
|
func btcdMain() error {
|
|
// Initialize logging and setup deferred flushing to ensure all
|
|
// outstanding messages are written on shutdown.
|
|
loggers := setLogLevel(defaultLogLevel)
|
|
defer func() {
|
|
for _, logger := range loggers {
|
|
logger.Flush()
|
|
}
|
|
}()
|
|
|
|
// Load configuration and parse command line.
|
|
tcfg, _, err := loadConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cfg = tcfg
|
|
|
|
// Change the logging level if needed.
|
|
if cfg.DebugLevel != defaultLogLevel {
|
|
loggers = setLogLevel(cfg.DebugLevel)
|
|
}
|
|
|
|
// Perform upgrades to btcd as new versions require it.
|
|
err = doUpgrades()
|
|
if err != nil {
|
|
log.Errorf("%v", err)
|
|
return err
|
|
}
|
|
|
|
// Load the block database.
|
|
db, err := loadBlockDB()
|
|
if err != nil {
|
|
log.Errorf("%v", err)
|
|
return err
|
|
}
|
|
defer db.Close()
|
|
|
|
// Ensure the database is sync'd and closed on Ctrl+C.
|
|
addInterruptHandler(func() {
|
|
db.RollbackClose()
|
|
})
|
|
|
|
// Create server and start it.
|
|
listenAddr := net.JoinHostPort("", cfg.Port)
|
|
server, err := newServer(listenAddr, db, activeNetParams.btcnet)
|
|
if err != nil {
|
|
log.Errorf("Unable to start server on %v", listenAddr)
|
|
log.Errorf("%v", err)
|
|
return err
|
|
}
|
|
server.Start()
|
|
|
|
server.WaitForShutdown()
|
|
return nil
|
|
}
|
|
|
|
func main() {
|
|
// Use all processor cores.
|
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
|
|
|
// Work around defer not working after os.Exit()
|
|
err := btcdMain()
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
}
|