Сервис Gossip

Служба сплетен действует как шлюз к узлам в плоскости управления. Валидаторы используют службу для обеспечения доступности информации для всех других узлов в кластере. Сервис транслирует информацию, используя Gossip протокол.

Обзор сплетен

Узлы постоянно обмениваются подписанными объектами данных между собой для управления кластером. Например, они делятся своей контактной информацией, высотой книги и голосами.

Каждую десятую долю секунды каждый узел отправляет сообщение «push» и/или сообщение «pull». Сообщения push и pull могут вызывать ответы, а push-сообщения могут пересылаться другим пользователям в кластере.

Gossip работает на хорошо известном порту UDP/IP или порте в известном диапазоне. После загрузки кластера узлы сообщают друг другу, где найти их конечную точку сплетен (адрес сокета).

Записи сплетен

Записи, распространяемые через сплетни, произвольны, но подписаны и версии (с отметкой времени) по мере необходимости, чтобы иметь смысл для принимающего их узла. Если узел получает две записи из одного и того же источника, он обновляет свою собственную копию записью с самой последней меткой времени.

Интерфейс службы сплетен

Push-сообщение

Узел отправляет push-сообщение, чтобы сообщить кластеру, что у него есть информация для совместного использования. Узлы отправляют push-сообщения push-пирам PUSH_FANOUT.

Получив push-сообщение, узел проверяет сообщение на предмет:

  1. Дублирование: если сообщение было просмотрено ранее, узел отбрасывает сообщение и может ответить PushMessagePrune, если оно перенаправлено с узла с низкой долей.

  2. Новые данные: если сообщение новое для узла

    • Сохраняет новую информацию с обновленной версией в информации о своем кластере и очищает все предыдущие старые значения.

    • Сохраняет сообщение в push_once (используется для обнаружения дубликатов, очищается после PUSH_MSG_TIMEOUT * 5 мс)

    • Ретранслирует сообщения своим пуш-пирам

  3. Срок действия: узлы отбрасывают 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 — это попытка захватить набор соединений узла с конечными точками противника.

Это относится к нашей реализации следующим образом.

Веса на основе времени и доли

Веса рассчитываются на основе «времени, прошедшего с момента последнего выбора» и «натурального логарифма» «веса ставки».

Взятие «ln» веса ставки позволяет дать всем узлам более справедливые шансы на покрытие сети за разумное время. Это помогает нормализовать большие возможные различия в весе доли между узлами. Таким образом, узлу с низким «весом доли» по сравнению с узлом с большим «весом доли» придется ждать всего несколько кратных ln («доля») секунд, прежде чем он будет выбран.

У противника нет возможности влиять на эти параметры.

Вытащить сообщение

Узел выбирается в качестве цели извлечения на основе весов, описанных выше.

Push-сообщение

Сообщение об удалении может только удалить злоумышленника из потенциального соединения.

Как и в случае pull message, узлы выбираются в активный набор на основе весов.

Заметные отличия от PlumTree

Описанный здесь активный протокол push-уведомлений основан на Plum Tree. Основные отличия: