Bandwidth service является сервисом для предоставления необходимых мощностей (бендвича) пользователям golos.io (например, для публикации постов). Сервис подписывает транзакции вместо пользователя, сохраняя его авторство.
Микросервис содержит 2 контроллера и 1 сервис, помимо служебных:
Storage: сервис, который является, по сути, базой данных в оперативной памяти. Его задачей является хранение имен пользователей и идентификаторов каналов, а также самоочищаться раз в один час. Предоставляет публичные методы для добавления/удаления пользователей в базу, для проверки, есть ли пользователь в базе и для удаления канала соединения при его разрыве.
-
Whitelist: контроллер, задачей которого является управление списком пользователей, которым разрешен доступ к запросу бендвича. Данный контроллер предоставляет два публичных метода класса: на бан пользователя и на проверку доступа по его имени и его идентификатору канала (channelId,cid). Когда запрашивается проверка доступа, сначала контроллер ищет пользователя в базе данных в памяти (storage service), и если он там не найден, то в базе данных монго, а если и там пользователь не найден, то контроллер делает запрос в сервис регистрации. Если пользователь найден в сервисе регистрации, то он добавляется и в монго и в базу данных в памяти, если нет, то доступ запрещается. Если пользователь забанен (что выясняется на этапе запроса к монго), то доступ запрещается. Когда запрашивается бан пользователя, то в базе данных пользователю присваивается флаг "забанен" и он удаляется из базы данных в памяти. -
Bandwidth Provider: контроллер, который предоставляет один публичный метод: предоставления бендвича. Этот метод принимает транзакцию и проверяет, есть ли в ней запрос на предоставление бендвича и совпадает ли имя пользователя, который должен предоставить бендвич с пользователем, от имени которого запущен микросервис, а также, разрешено ли пользователю запрашивать бендвич. Если транзакцию не требуется подписывать, то она передается в блокчейн. Если требуется, и у пользователя есть право это запросить, то транзакция подписывается и передается в блокчейн.
Микросервис реализует 3 метода:
- 'bandwidth.provide': метод, который принимает транзакцию, для которой требуется предоставить бендвич, подписывает и отправляет ее в блокчейн. Метод возвращает ответ от блокчейна.
- 'bandwidth.banUser': метод, который принимает имя пользователя, которого требуется исключить пользователя из списка пользователей, которым разрешено получение бендвича (вайтлист). Возвращает статус исполнения запроса.
- 'bandwidth.notifyOffline': метод, который принимает имя пользователя, статус которого поменялся на "оффлайн", а также его
channelIdи исключает его из вайтлиста, который хранится в оперативной памяти (но не из базы данных).
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 переменные.