Сервис Gossip
Служба сплетен действует как шлюз к узлам в плоскости управления. Валидаторы используют службу для обеспечения доступности информации для всех других узлов в кластере. Сервис транслирует информацию, используя Gossip протокол.
Обзор сплетен
Узлы постоянно обмениваются подписанными объектами данных между собой для управления кластером. Например, они делятся своей контактной информацией, высотой книги и голосами.
Каждую десятую долю секунды каждый узел отправляет сообщение «push» и/или сообщение «pull». Сообщения push и pull могут вызывать ответы, а push-сообщения могут пересылаться другим пользователям в кластере.
Gossip работает на хорошо известном порту UDP/IP или порте в известном диапазоне. После загрузки кластера узлы сообщают друг другу, где найти их конечную точку сплетен (адрес сокета).
Записи сплетен
Записи, распространяемые через сплетни, произвольны, но подписаны и версии (с отметкой времени) по мере необходимости, чтобы иметь смысл для принимающего их узла. Если узел получает две записи из одного и того же источника, он обновляет свою собственную копию записью с самой последней меткой времени.
Интерфейс службы сплетен
Push-сообщение
Узел отправляет push-сообщение, чтобы сообщить кластеру, что у него есть информация для совместного использования. Узлы отправляют push-сообщения push-пирам PUSH_FANOUT.
Получив push-сообщение, узел проверяет сообщение на предмет:
-
Дублирование: если сообщение было просмотрено ранее, узел отбрасывает сообщение и может ответить
PushMessagePrune
, если оно перенаправлено с узла с низкой долей. -
Новые данные: если сообщение новое для узла
-
Сохраняет новую информацию с обновленной версией в информации о своем кластере и очищает все предыдущие старые значения.
-
Сохраняет сообщение в
push_once
(используется для обнаружения дубликатов, очищается послеPUSH_MSG_TIMEOUT * 5
мс) -
Ретранслирует сообщения своим пуш-пирам
-
-
Срок действия: узлы отбрасывают push-сообщения старше PUSH_MSG_TIMEOUT.
Отправка одноранговых узлов, удаление сообщения
Узлы случайным образом выбирают своих пуш-пиров из активного набора известных пиров. Узел сохраняет этот выбор в течение относительно долгого времени. Когда получено сообщение об удалении, узел отбрасывает одноранговый узел, отправивший сообщение об удалении. Отсечение указывает на то, что к этому узлу существует другой, более взвешенный путь, чем прямой толчок.
Набор push-пиров обновляется за счет ротации нового узла в наборе каждые PUSH_MSG_TIMEOUT/2
миллисекунды.
Вытащить сообщение
Узел отправляет пулл-сообщение, чтобы узнать у кластера, есть ли какая-либо новая информация. Сообщение о вытягивании отправляется одному узлу случайным образом и содержит фильтр Блума, который представляет то, что у него уже есть. Узел, получающий сообщение о вытягивании, перебирает его значения и строит ответ на вытягивание вещей, которые не попали в фильтр и подошли бы к сообщению.
Узел строит вытягивающий фильтр Блума, перебирая текущие значения и недавно очищенные значения.
Узел обрабатывает элементы в ответе на извлечение так же, как он обрабатывает новые данные в push-сообщении.
Очистка
Узлы сохраняют предыдущие версии значений (те, которые были обновлены путем извлечения или отправки) и значения с истекшим сроком действия (те, которые старше GOSSIP_PULL_CRDS_TIMEOUT_MS
) в purged_values
(вещи, которые у меня были недавно). Узлы удаляют purged_values
, которые старше 5 * GOSSIP_PULL_CRDS_TIMEOUT_MS
.
Атаки Затмения
Атака eclipse — это попытка захватить набор соединений узла с конечными точками противника.
Это относится к нашей реализации следующим образом.
- Сообщения Pull выбирают случайный узел из сети. Атака eclipse на pull потребует от злоумышленника повлиять на случайный выбор таким образом, чтобы для извлечения выбирались только враждебные узлы.
- Push-сообщения поддерживают активный набор узлов и выбирают случайный ответвления для каждого push-сообщения. Атака затмения на push повлияет на выбор активного набора или случайный выбор разветвления.
Веса на основе времени и доли
Веса рассчитываются на основе «времени, прошедшего с момента последнего выбора» и «натурального логарифма» «веса ставки».
Взятие «ln» веса ставки позволяет дать всем узлам более справедливые шансы на покрытие сети за разумное время. Это помогает нормализовать большие возможные различия в весе доли между узлами. Таким образом, узлу с низким «весом доли» по сравнению с узлом с большим «весом доли» придется ждать всего несколько кратных ln («доля») секунд, прежде чем он будет выбран.
У противника нет возможности влиять на эти параметры.
Вытащить сообщение
Узел выбирается в качестве цели извлечения на основе весов, описанных выше.
Push-сообщение
Сообщение об удалении может только удалить злоумышленника из потенциального соединения.
Как и в случае pull message, узлы выбираются в активный набор на основе весов.
Заметные отличия от PlumTree
Описанный здесь активный протокол push-уведомлений основан на Plum Tree. Основные отличия:
- Push-сообщения имеют настенные часы, подписанные отправителем. По истечении срока действия настенных часов сообщение удаляется. Ограничение прыжков трудно реализовать в условиях состязательности.
- Lazy Push не реализован, потому что не очевидно, как предотвратить подделку злоумышленником отпечатка сообщения. Наивный подход позволил бы противнику получить приоритет для вытягивания на основе его ввода.