code: 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
  }
docs: // NewServer initializes a new DHT node server.