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
переменные.