Skip to content

mysteriumnetwork/discovery

Folders and files

NameName
Last commit message
Last commit date
May 31, 2023
Oct 23, 2024
Jul 15, 2024
Jul 15, 2024
Feb 6, 2023
Jul 15, 2024
Nov 28, 2023
May 31, 2023
Nov 5, 2021
Jul 28, 2022
Jun 1, 2023
Jun 12, 2024
Oct 23, 2024
Oct 23, 2024
Feb 29, 2024
Mar 30, 2021
Aug 26, 2022
May 31, 2023
May 31, 2023
May 31, 2023
May 31, 2023
Mar 30, 2021
Jul 15, 2024
Jul 15, 2024
Jan 9, 2024
Jan 9, 2024
Mar 30, 2021
Jul 15, 2024
Mar 30, 2021

Repository files navigation

Discovery Service

Main principles and features described

Features

  • Fetch MYST prices from the public API
  • Create prices for nodes based on the load and multiplier in the countries
  • Listen for proposals from NATS Broker and enhance them with quality metrics
  • Run proposal expiration job
  • Update price config by Universe Admin
  • Use Postgres to save proposals, configs, and country multipliers
  • Uses single REDIS instance for storing price configuration

Architecture & Project structure

Achitecture

Project structure

Envs

Discovery
MYSTERIUM_LOG_MODE=json
PORT=8080
QUALITY_ORACLE_URL=https://testnet3-quality.mysterium.network
QUALITY_CACHE_TTL=20s
BROKER_URL=nats://testnet3-broker.mysterium.network
UNIVERSE_JWT_SECRET=Some_Secret
REDIS_ADDRESS=redis:6379
REDIS_DB=0
REDIS_PASS=
Sidecar
MYSTERIUM_LOG_MODE=json
QUALITY_ORACLE_URL=https://testnet3-quality.mysterium.network
BROKER_URL=nats://testnet3-broker.mysterium.network
REDIS_ADDRESS=redis:6379
REDIS_DB=0
REDIS_PASS=
GECKO_URL=http://wiremock:8080
COINRANKING_URL=http://wiremock:8080
COINRANKING_TOKEN=Some_Token

NATS Msg Broker channels

  • *.proposal-register.v3 - Register new Node proposal
  • *.proposal-ping.v3 - Node Ping
  • *.proposal-unregister.v3 - Unregister Node proposal

Entries

  • cmd/main.go - Discovery service
  • sidecar/cmd/main.go - Sidecar Pricing Parser service

Code structure

  • /config - [Discovery] config parser. Env params
  • /docs - [Discovery] Auto generated Swagger for REST API
  • /e2e - e2e tests
  • /health - [Discovery] health checker REST API
  • /listener - [Discovery] NATS listener
  • /price/api.go - [Discovery] Pricing REST API
  • /price/config.go - [Discovery, Sidecar] Pricing config
  • /price/market.go - [Sidecar] Scheduled price fetcher from different APIs (Gecko, Coinmarket)
  • /price/network_load_calculator.go - [Sidecar] Updating countries multipliers based on load (sessions/providers)
  • /price/price_getter.go - [Discovery] Fetch prices from Redis
  • /price/price_updater.go - [Sidecar] Scheduled price updater to Redis
  • /proposal/metrics/echnancer.go - [Discovery] Proposal quality enhancer
  • /proposal/v3 - [Discovery] Proposal structs
  • /proposal/api.go - [Discovery] Proposal REST API
  • /proposal/repository.go - [Discovery] Mappings for Postgres
  • /proposal/service.go - [Discovery] Proposal service with scheduled expiration job
  • /quality/oracleapi - [Discovery] Quality Oracle REST API client
  • /quality/service.go - [Discovery] Caching layer with BigCache for Quality Oracle responses

Development

What toolset needed for development

https://docs.mysterium.network/developers/

How to build it

mage build - Builds Discovery service

mage buildsidecar - Builds Sidecar Prices Parser

Or for docker

docker build -t discovery:local .

docker build -t discosidecar:local ./sidecar

How to run it

mage up - will run docker-compose with all needed services

Or

docker-compose up - this should fire up all discovery service dependencies and the discovery it'self. (use --force-recreate to rebuild discovery image)

And if you wish to run discovery service from your IDE, then idea is to use

docker-compose up dev - This should only fire up dependencies (redis, etc...) for the discovery (or discosidecar).

How to test it locally

mage e2edev

Generate custom marshaller

easyjson -all -output_filename proposal/v3/proposal_json.go proposal/v3/proposal.go easyjson -all -output_filename proposal/v3/metadata_json.go proposal/v3/metadata.go

API

Docs: http://localhost:8080/swagger/index.html

API: http://localhost:8080/api/v3