Bandwidth service

Bandwidth service является сервисом для предоставления необходимых мощностей (бендвича) пользователям golos.io (например, для публикации постов). Сервис подписывает транзакции вместо пользователя, сохраняя его авторство.

Основное

Микросервис содержит 2 контроллера и 1 сервис, помимо служебных:

Сервисы:

  • Storage: сервис, который является, по сути, базой данных в оперативной памяти. Его задачей является хранение имен пользователей и идентификаторов каналов, а также самоочищаться раз в один час. Предоставляет публичные методы для добавления/удаления пользователей в базу, для проверки, есть ли пользователь в базе и для удаления канала соединения при его разрыве.

Контроллеры:

  • Whitelist: контроллер, задачей которого является управление списком пользователей, которым разрешен доступ к запросу бендвича. Данный контроллер предоставляет два публичных метода класса: на бан пользователя и на проверку доступа по его имени и его идентификатору канала (channelId, cid). Когда запрашивается проверка доступа, сначала контроллер ищет пользователя в базе данных в памяти (storage service), и если он там не найден, то в базе данных монго, а если и там пользователь не найден, то контроллер делает запрос в сервис регистрации. Если пользователь найден в сервисе регистрации, то он добавляется и в монго и в базу данных в памяти, если нет, то доступ запрещается. Если пользователь забанен (что выясняется на этапе запроса к монго), то доступ запрещается. Когда запрашивается бан пользователя, то в базе данных пользователю присваивается флаг "забанен" и он удаляется из базы данных в памяти.

  • Bandwidth Provider: контроллер, который предоставляет один публичный метод: предоставления бендвича. Этот метод принимает транзакцию и проверяет, есть ли в ней запрос на предоставление бендвича и совпадает ли имя пользователя, который должен предоставить бендвич с пользователем, от имени которого запущен микросервис, а также, разрешено ли пользователю запрашивать бендвич. Если транзакцию не требуется подписывать, то она передается в блокчейн. Если требуется, и у пользователя есть право это запросить, то транзакция подписывается и передается в блокчейн.

Микросервис реализует 3 метода:

  • 'bandwidth.provide': метод, который принимает транзакцию, для которой требуется предоставить бендвич, подписывает и отправляет ее в блокчейн. Метод возвращает ответ от блокчейна.
  • 'bandwidth.banUser': метод, который принимает имя пользователя, которого требуется исключить пользователя из списка пользователей, которым разрешено получение бендвича (вайтлист). Возвращает статус исполнения запроса.
  • 'bandwidth.notifyOffline': метод, который принимает имя пользователя, статус которого поменялся на "оффлайн", а также его channelId и исключает его из вайтлиста, который хранится в оперативной памяти (но не из базы данных).
API JSON-RPC
  • bandwidth.provide: принимает параметры вида {transaction, chainId}, возвращает ответ от блокчейна либо ошибку
  • bandwidth.banUser: принимает параметры вида {user, channelId}, возвращает статус либо ошибку
  • bandwidth.notifyOffline: принимает параметры вида {user, channelId}, возвращает статус либо ошибку

Переменные окружения

Возможные переменные окружения ENV:

  • GLS_CONNECTOR_HOST (обязательно) - адрес, который будет использован для входящих подключений связи микросервисов. Дефолтное значение при запуске без докера - 127.0.0.1

  • GLS_CONNECTOR_PORT (обязательно) - адрес порта, который будет использован для входящих подключений связи микросервисов. Дефолтное значение при запуске без докера - 3000, пересекается с GLS_FRONTEND_GATE_PORT

  • GLS_METRICS_HOST (обязательно) - адрес хоста для метрик StatsD. Дефолтное значение при запуске без докера - 127.0.0.1

  • GLS_METRICS_PORT (обязательно) - адрес порта для метрик StatsD. Дефолтное значение при запуске без докера - 8125

  • GLS_MONGO_CONNECT (обязательно) - ссылка на подключение к MongoDB

  • GLS_CYBERWAY_HTTP_URL (обязательно) - ссылка на подключение к блокчейну Cyberway

  • GLS_PROVIDER_PUBLIC_KEY (обязательно) - публичный ключ провайдера бендвича

  • GLS_PROVIDER_WIF (обязательно) - приватный ключ провайдера бендвича

  • GLS_PROVIDER_USERNAME (обязательно) - имя пользователя провайдера бендвича

  • GLS_PRISM_CONNECT (обязательно) - ссылка для подключения к сервису призма

  • GLS_REGISTRATION_CONNECT (обязательно) - ссылка для подключения к сервису регистрации

  • GLS_CHANNEL_TTL (обязательно) - время жизни канала (время, которое будет хранится channelId в базе данных в памяти). Важно: _storage проверяет, не превышено ли это значение лишь раз в определенное время, поэтому между тем, как данный лимит будет превышен, и тем, как канал будет фактически удален из памяти, может пройти существенное количество времени

  • GLS_STORAGE_CLEANUP_TIMEOUT - значение равных промежутков времени (в миллисекундах), через которые сервис очищает каналы с истекшим TTL из базы в памяти. Дефолтное значение равняется одному часу

Запуск

Для запуска достаточно вызвать команду docker-compose up в корне проекта, предварительно указав необходимые ENV переменные.