neo-go/pkg/network/server_config.go
2022-12-07 17:29:09 +03:00

152 lines
6.2 KiB
Go

package network
import (
"fmt"
"time"
"github.com/nspcc-dev/neo-go/pkg/config"
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
"go.uber.org/zap/zapcore"
)
type (
// ServerConfig holds the server configuration.
ServerConfig struct {
// MinPeers is the minimum number of peers for normal operation.
// When a node has less than this number of peers, it tries to
// connect with some new ones.
MinPeers int
// AttemptConnPeers is the number of connection to try to
// establish when the connection count drops below the MinPeers
// value.
AttemptConnPeers int
// MaxPeers is the maximum number of peers that can
// be connected to the server.
MaxPeers int
// The user agent of the server.
UserAgent string
// Addresses stores the list of bind addresses for the node.
Addresses []config.AnnounceableAddress
// The network mode the server will operate on.
// ModePrivNet docker private network.
// ModeTestNet Neo test network.
// ModeMainNet Neo main network.
Net netmode.Magic
// Relay determines whether the server is forwarding its inventory.
Relay bool
// Seeds is a list of initial nodes used to establish connectivity.
Seeds []string
// Maximum duration a single dial may take.
DialTimeout time.Duration
// The duration between protocol ticks with each connected peer.
// When this is 0, the default interval of 5 seconds will be used.
ProtoTickInterval time.Duration
// Interval used in pinging mechanism for syncing blocks.
PingInterval time.Duration
// Time to wait for pong(response for sent ping request).
PingTimeout time.Duration
// Level of the internal logger.
LogLevel zapcore.Level
// TimePerBlock is an interval which should pass between two successive blocks.
TimePerBlock time.Duration
// OracleCfg is oracle module configuration.
OracleCfg config.OracleConfiguration
// P2PNotaryCfg is notary module configuration.
P2PNotaryCfg config.P2PNotary
// StateRootCfg is stateroot module configuration.
StateRootCfg config.StateRoot
// ExtensiblePoolSize is the size of the pool for extensible payloads from a single sender.
ExtensiblePoolSize int
// BroadcastFactor is the factor (0-100) for fan-out optimization.
BroadcastFactor int
}
)
// NewServerConfig creates a new ServerConfig struct
// using the main applications config.
func NewServerConfig(cfg config.Config) (ServerConfig, error) {
appConfig := cfg.ApplicationConfiguration
protoConfig := cfg.ProtocolConfiguration
timePerBlock := protoConfig.TimePerBlock
if timePerBlock == 0 && protoConfig.SecondsPerBlock > 0 { //nolint:staticcheck // SA1019: protoConfig.SecondsPerBlock is deprecated
timePerBlock = time.Duration(protoConfig.SecondsPerBlock) * time.Second //nolint:staticcheck // SA1019: protoConfig.SecondsPerBlock is deprecated
}
dialTimeout := appConfig.P2P.DialTimeout
if dialTimeout == 0 && appConfig.DialTimeout > 0 { //nolint:staticcheck // SA1019: appConfig.DialTimeout is deprecated
dialTimeout = time.Duration(appConfig.DialTimeout) * time.Second //nolint:staticcheck // SA1019: appConfig.DialTimeout is deprecated
}
protoTickInterval := appConfig.P2P.ProtoTickInterval
if protoTickInterval == 0 && appConfig.ProtoTickInterval > 0 { //nolint:staticcheck // SA1019: appConfig.ProtoTickInterval is deprecated
protoTickInterval = time.Duration(appConfig.ProtoTickInterval) * time.Second //nolint:staticcheck // SA1019: appConfig.ProtoTickInterval is deprecated
}
pingInterval := appConfig.P2P.PingInterval
if pingInterval == 0 && appConfig.PingInterval > 0 { //nolint:staticcheck // SA1019: appConfig.PingInterval is deprecated
pingInterval = time.Duration(appConfig.PingInterval) * time.Second //nolint:staticcheck // SA1019: appConfig.PingInterval is deprecated
}
pingTimeout := appConfig.P2P.PingTimeout
if pingTimeout == 0 && appConfig.PingTimeout > 0 { //nolint:staticcheck // SA1019: appConfig.PingTimeout is deprecated
pingTimeout = time.Duration(appConfig.PingTimeout) * time.Second //nolint:staticcheck // SA1019: appConfig.PingTimeout is deprecated
}
maxPeers := appConfig.P2P.MaxPeers
if maxPeers == 0 && appConfig.MaxPeers > 0 { //nolint:staticcheck // SA1019: appConfig.MaxPeers is deprecated
maxPeers = appConfig.MaxPeers //nolint:staticcheck // SA1019: appConfig.MaxPeers is deprecated
}
attemptConnPeers := appConfig.P2P.AttemptConnPeers
if attemptConnPeers == 0 && appConfig.AttemptConnPeers > 0 { //nolint:staticcheck // SA1019: appConfig.AttemptConnPeers is deprecated
attemptConnPeers = appConfig.AttemptConnPeers //nolint:staticcheck // SA1019: appConfig.AttemptConnPeers is deprecated
}
minPeers := appConfig.P2P.MinPeers
if minPeers == 0 && appConfig.MinPeers > 0 { //nolint:staticcheck // SA1019: appConfig.MinPeers is deprecated
minPeers = appConfig.MinPeers //nolint:staticcheck // SA1019: appConfig.MinPeers is deprecated
}
extPoolSize := appConfig.P2P.ExtensiblePoolSize
if extPoolSize == 0 && appConfig.ExtensiblePoolSize > 0 { //nolint:staticcheck // SA1019: appConfig.ExtensiblePoolSize is deprecated
extPoolSize = appConfig.ExtensiblePoolSize //nolint:staticcheck // SA1019: appConfig.ExtensiblePoolSize is deprecated
}
broadcastFactor := appConfig.P2P.BroadcastFactor
if broadcastFactor > 0 && appConfig.BroadcastFactor > 0 { //nolint:staticcheck // SA1019: appConfig.BroadcastFactor is deprecated
broadcastFactor = appConfig.BroadcastFactor //nolint:staticcheck // SA1019: appConfig.BroadcastFactor is deprecated
}
addrs, err := appConfig.GetAddresses()
if err != nil {
return ServerConfig{}, fmt.Errorf("failed to parse addresses: %w", err)
}
c := ServerConfig{
UserAgent: cfg.GenerateUserAgent(),
Addresses: addrs,
Net: protoConfig.Magic,
Relay: appConfig.Relay,
Seeds: protoConfig.SeedList,
DialTimeout: dialTimeout,
ProtoTickInterval: protoTickInterval,
PingInterval: pingInterval,
PingTimeout: pingTimeout,
MaxPeers: maxPeers,
AttemptConnPeers: attemptConnPeers,
MinPeers: minPeers,
TimePerBlock: timePerBlock,
OracleCfg: appConfig.Oracle,
P2PNotaryCfg: appConfig.P2PNotary,
StateRootCfg: appConfig.StateRoot,
ExtensiblePoolSize: extPoolSize,
BroadcastFactor: broadcastFactor,
}
return c, nil
}