Распространение блока турбины

Кластер Solana использует многоуровневый механизм распространения блоков под названием Turbine для широковещательной рассылки фрагментов транзакций всем узлам с минимальным количеством повторяющихся сообщений. Кластер делится на небольшие наборы узлов, называемые neighborhoods. Каждый узел отвечает за совместное использование любых данных, которые он получает, с другими узлами в своем районе, а также за распространение данных на небольшой набор узлов в других районах. Таким образом, каждый узел должен взаимодействовать только с небольшим количеством узлов.

Во время своего слота узел-лидер распределяет кусочки между узлами-валидаторами в первой окрестности (уровень 0). Каждый валидатор делится своими данными в своем окружении, но также повторно передает фрагменты на один узел в некоторых соседствах на следующем уровне (уровень 1). Каждый из узлов уровня 1 делится своими данными со своими одноранговыми узлами по соседству и повторно передает их узлам следующего уровня и т. д., пока все узлы в кластере не получат все фрагменты.

Назначение соседства — взвешенный выбор

Чтобы разветвление плоскости данных работало, весь кластер должен согласовать, как кластер делится на окрестности. Для этого все признанные узлы валидатора (одноранговые узлы TVU) сортируются по доле и сохраняются в списке. Затем этот список индексируется различными способами для определения границ соседства и повторной передачи одноранговых узлов. Например, лидер просто выберет первые узлы, составляющие уровень 0. Они автоматически станут держателями самых высоких ставок, что позволит лидеру первым вернуться к лидеру с наибольшим количеством голосов. Узлы уровня 0 и нижнего уровня используют одну и ту же логику для поиска своих соседей и одноранговых узлов следующего уровня.

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

Слой и структура окружения

Текущий лидер делает свои начальные широковещательные рассылки не более чем узлам DATA_PLANE_FANOUT. Если этот уровень 0 меньше, чем количество узлов в кластере, то механизм разветвления плоскости данных добавляет слои ниже. Последующие слои следуют этим ограничениям для определения пропускной способности слоя: Каждое соседство содержит узлы DATA_PLANE_FANOUT. Слой 0 начинается с 1 окрестности с узлами разветвления. Количество узлов в каждом дополнительном слое увеличивается на коэффициент разветвления.

Как упоминалось выше, каждый узел на уровне должен транслировать свои фрагменты только своим соседям и ровно 1 узлу в некоторых окрестностях следующего уровня, а не каждому узлу TVU в кластере. Хороший способ представить это так: уровень 0 начинается с 1 соседства с узлами разветвления, слой 1 добавляет соседства разветвления, каждое из которых имеет узлы разветвления, а слой 2 будет иметь «разветвление * количество узлов в слое 1» и так далее.

Таким образом, каждый узел должен взаимодействовать не более чем с 2 * DATA_PLANE_FANOUT - 1 узлами.

На следующей диаграмме показано, как Лидер отправляет фрагменты с разветвлением 2 в Окрестность 0 на уровне 0 и как узлы в Окрестности 0 обмениваются своими данными друг с другом.

Leader sends shreds to Neighborhood 0 in Layer 0

На следующей диаграмме показано, как Окрестности 0 разветвляются на Окрестности 1 и 2.

Neighborhood 0 Fanout to Neighborhood 1 and 2

Наконец, на следующей диаграмме показан двухуровневый кластер с разветвлением, равным 2.

Two layer cluster with a Fanout of 2

Значения конфигурации

DATA_PLANE_FANOUT — определяет размер слоя 0. Последующие слои увеличиваются с коэффициентом DATA_PLANE_FANOUT. Количество узлов в окрестности равно значению разветвления. Районы заполнятся до предела, прежде чем будут добавлены новые, т. е. если район не заполнен, он должен быть последним.

В настоящее время конфигурация задается при запуске кластера. В будущем эти параметры могут быть размещены в сети, что позволит изменять их на лету по мере изменения размеров кластера.

Расчет требуемой скорости FEC

Turbine полагается на повторную передачу пакетов между валидаторами. Из-за повторной передачи, любая потеря пакетов в сети усугубляется, и увеличивается вероятность того, что пакет не достигнет адресата на каждом прыжке. Скорость FEC должна учитывать всю сеть. потеря пакетов и глубина распространения.

Уничтоженная группа — это набор данных и пакетов кодирования, которые можно использовать. реконструировать друг друга. У каждой группы клоков есть шанс провала, на основе вероятности того, что количество пакетов курс ФЭК. Если валидатору не удается восстановить группу уничтожения, тогда блок не может быть реконструирован, и валидатору приходится полагаться на ремонте починить блоки.

Вероятность отказа группы уничтожения может быть вычислена с помощью биномиальное распределение. Если скорость FEC равна «16:4», то размер группы равно 20, и по крайней мере 4 фрагмента должны выйти из строя, чтобы группа вышла из строя. Что равно сумме вероятностей отказа 4 или более трасс. из 20.

Вероятность успеха блока в турбине:

Например:

Со скоростью FEC: 16:4

Со скоростью FEC 16:16

Со скоростью FEC 32:32

Окрестности

На следующей диаграмме показано, как взаимодействуют две окрестности в разных слоях. Чтобы повредить соседство, достаточное количество узлов (коды стирания +1) из соседства выше должны выйти из строя. Поскольку каждое соседство получает фрагменты от нескольких узлов в соседстве на верхнем уровне, нам потребуется большой сбой сети на верхних уровнях, чтобы получить неполные данные.

Inner workings of a neighborhood