Проверка отметок
Это разработка критериев и проверка тиков в слоте. В нем также описывается обработка ошибок и условия сокращения, охватывающие то, как система обрабатывает передачи, которые не соответствуют этим требованиям.
Структура слота
Каждый слот должен содержать ожидаемое количество тиков ticks_per_slot
. Последний фрагмент в слоте должен содержать только весь последний тик и ничего более. Лидер также должен пометить этот фрагмент, содержащий последний тик, флагом LAST_SHRED_IN_SLOT
. Между тиками должно быть количество хэшей hashes_per_tick.
Обработка плохих передач
Вредоносные передачи T
обрабатываются двумя способами:
- Если лидер может сгенерировать некоторую ошибочную передачу «T», а также некоторую альтернативную передачу «T» для одного и того же слота, не нарушая никаких правил косой черты для дублирующих передач (например, если «T» является подмножеством «T») , тогда кластер должен обработать возможность того, что обе передачи будут активными.
Таким образом, это означает, что мы не можем пометить ошибочную передачу «T» как мертвую, потому что кластер, возможно, достиг консенсуса по «T». Эти случаи требуют убедительных доказательств, чтобы наказать за это плохое поведение.
- В противном случае мы можем просто пометить слот как мертвый и неиграбельный. Доказательство косой черты может или не может быть необходимым в зависимости от осуществимости.
Blockstore получает фрагменты
Когда блокстор получает новый фрагмент s
, возможны два случая:
-
s
помечен какLAST_SHRED_IN_SLOT
, затем проверьте, существует ли фрагментs'
в блочном хранилище для этого слота, гдеs'.index > s.index
Если да, то вместеs
иs'
представляют собой убедительное доказательство. -
Blockstore уже получил фрагмент
s', помеченный как
LAST_SHRED_IN_SLOTс индексом
i. Если
s.index > i, то вместе
sи
s' составляют доказательство косой черты. В этом случае blockstore также не будет вставлятьs
. -
Повторяющиеся фрагменты для одного и того же индекса игнорируются. Неповторяющиеся фрагменты для одного и того же индекса являются условием сокращения. Подробности для этого случая описаны в разделе «Слешинг дубликатов блоков выноски».
Воспроизведение и проверка тиков
- Этап воспроизведения воспроизводит записи из хранилища блоков, отслеживая количество тиков, которые он видел в каждом слоте, и проверяя количество хэшей
hashes_per_tick
между тиками. После воспроизведения тика из этого последнего фрагмента этап воспроизведения проверяет общее количество тиков.
Сценарий сбоя 1: если есть два последовательных тика, между которыми количество хэшей равно != hashes_per_tick
, пометить этот слот как мертвый.
Сценарий сбоя 2: если количество тиков != ticks_per_slot
, пометить слот как мертвый.
Сценарий сбоя 3: если количество тиков достигает ticks_per_slot
, но мы все еще не видим LAST_SHRED_IN_SLOT
, помечаем этот слот как мертвый.
- Когда ReplayStage достигает фрагмента, отмеченного как последний фрагмент, он проверяет, является ли этот последний фрагмент галочкой.
Сценарий сбоя: если подписанный фрагмент с флагом LAST_SHRED_IN_SLOT
не может быть десериализован в тик (либо не может быть десериализован, либо десериализован в запись), пометьте этот слот как мертвый.