func NewServer(c *ServerConfig) (s *Server, err error) {
	if c == nil {
		c = &ServerConfig{
			Conn:               mustListen(":0"),
			NoSecurity:         true,
			StartingNodes:      GlobalBootstrapAddrs,
			ConnectionTracking: conntrack.NewInstance(),
		}
	}
	if c.Conn == nil {
		return nil, errors.New("non-nil Conn required")
	}
	if missinggo.IsZeroValue(c.NodeId) {
		c.NodeId = RandomNodeID()
		if !c.NoSecurity && c.PublicIP != nil {
			SecureNodeId(&c.NodeId, c.PublicIP)
		}
	}
	s = &Server{
		config:      *c,
		ipBlockList: c.IPBlocklist,
		tokenServer: tokenServer{
			maxIntervalDelta: 2,
			interval:         5 * time.Minute,
			secret:           make([]byte, 20),
		},
		transactions: make(map[transactionKey]*Transaction),
		table: table{
			k: 8,
		},
	}
	if s.config.ConnectionTracking == nil {
		s.config.ConnectionTracking = conntrack.NewInstance()
	}
	rand.Read(s.tokenServer.secret)
	s.socket = c.Conn
	s.id = int160FromByteArray(c.NodeId)
	s.table.rootID = s.id
	go s.serveUntilClosed()
	return
}
func NewServer(c *ServerConfig) (s *Server, err error) {
	if c == nil {
		c = &ServerConfig{
			Conn:               mustListen(":0"),
			NoSecurity:         true,
			StartingNodes:      GlobalBootstrapAddrs,
			ConnectionTracking: conntrack.NewInstance(),
		}
	}
	if c.Conn == nil {
		return nil, errors.New("non-nil Conn required")
	}
	if missinggo.IsZeroValue(c.NodeId) {
		c.NodeId = RandomNodeID()
		if !c.NoSecurity && c.PublicIP != nil {
			SecureNodeId(&c.NodeId, c.PublicIP)
		}
	}
	s = &Server{
		config:      *c,
		ipBlockList: c.IPBlocklist,
		tokenServer: tokenServer{
			maxIntervalDelta: 2,
			interval:         5 * time.Minute,
			secret:           make([]byte, 20),
		},
		transactions: make(map[transactionKey]*Transaction),
		table: table{
			k: 8,
		},
	}
	if s.config.ConnectionTracking == nil {
		s.config.ConnectionTracking = conntrack.NewInstance()
	}
	rand.Read(s.tokenServer.secret)
	s.socket = c.Conn
	s.id = int160FromByteArray(c.NodeId)
	s.table.rootID = s.id
	go s.serveUntilClosed()
	return
}
func NewServer ( c * ServerConfig ) ( s * Server , err error ) { if c == nil { c = & ServerConfig { Conn : mustListen ( " " ) , NoSecurity : true , StartingNodes : GlobalBootstrapAddrs , ConnectionTracking : conntrack . NewInstance ( ) , } } if c . Conn == nil { return nil , errors . New ( " " ) } if missinggo . IsZeroValue ( c . NodeId ) { c . NodeId = RandomNodeID ( ) if ! c . NoSecurity && c . PublicIP != nil { SecureNodeId ( & c . NodeId , c . PublicIP ) } } s = & Server { config : * c , ipBlockList : c . IPBlocklist , tokenServer : tokenServer { maxIntervalDelta : 2 , interval : 5 * time . Minute , secret : make ( [ ] byte , 20 ) , } , transactions : make ( map [ transactionKey ] * Transaction ) , table : table { k : 8 , } , } if s . config . ConnectionTracking == nil { s . config . ConnectionTracking = conntrack . NewInstance ( ) } rand . Read ( s . tokenServer . secret ) s . socket = c . Conn s . id = int160FromByteArray ( c . NodeId ) s . table . rootID = s . id go s . serveUntilClosed ( ) return }
// NewServer initializes a new DHT node server.
NewServer initializes a new DHT node server .