Цели главы. Короткая глава для полноты картины: что меняется, когда узлы не просто падают, а лгут. Мы установим цену недоверия — 3f+1 узла вместо 2f+1 и квадратичный трафик вместо линейного, — разберём идею классического протокола PBFT и посмотрим на блокчейны как на византийский консенсус с открытым членством. Главный практический вывод главы противоположен её эффектной теме: в подавляющем большинстве систем византийская защита не нужна, и знать надо прежде всего границу, за которой она становится нужна.
До сих пор (глава 1) худшим отказом узла была остановка. Византийский узел ведёт себя произвольно: шлёт противоречивые сообщения разным адресатам, подделывает данные, вступает в сговор с другими отказавшими, соблюдает протокол ровно настолько, чтобы вредить незаметно. Модель покрывает и злонамеренность (взломанный узел, недобросовестный участник), и предельно причудливые сбои (перевёрнутый бит памяти, прошивка с багом) — исторически она и родилась в аэрокосмической отрасли, где датчик может не «молчать», а «врать».
Название — от задачи византийских генералов (Лэмпорт, Шостак, Пиз, 1982): генералы согласуют атаку через гонцов, но часть генералов — предатели, рассылающие разным коллегам разное. Требуется, чтобы все лояльные пришли к одному решению, что бы ни делали предатели.
Классическая граница (там же, 1982): в синхронной модели устных сообщений, где отправителя можно определить, но чужое сообщение нельзя доказуемо переслать, византийское соглашение при f предателях требует не меньше 3f+1 узлов. Та же численность используется практическими частично синхронными BFT-протоколами. Сравните с 2f+1 для crash-отказов — недоверие стоит дополнительной трети кластера.
Интуиция нижней границы на минимальном случае n=3, f=1. Узел A получает от B «значение 1», от C — «значение 0»; кто-то из них лжёт (или лжёт сам источник, рассылая разное). Для A ситуации «лжёт B» и «лжёт C» симметричны и неразличимы: любой протокол, заставляющий A решить, ошибётся в одном из зеркальных миров — а решать надо, согласие с лояльным обязательно. Четвёртый узел ломает симметрию: лояльных трое против одного лжеца, перекрёстный обмен «а что тебе сказал X?» вскрывает противоречия большинством. Общий принцип: кворумы берутся размером 2f+1 из 3f+1 — два таких кворума пересекаются в 2f+1+2f+1−(3f+1) = f+1 узлах, то есть хотя бы в одном честном: сама арифметика пересечения из главы 6, усиленная на толщину лжи.
Криптография меняет модель. Цифровые подписи лишают предателя возможности незаметно переврать чужие слова: утверждение «B сказал 1» можно предъявить с подписью B. В синхронном authenticated Byzantine agreement это снимает классическую границу 3f+1. В полностью асинхронной модели детерминированный консенсус всё равно запрещён FLP; рандомизированные асинхронные BFT-протоколы обычно требуют n > 3f. Конкретный порог всегда нужно читать вместе с предположениями о времени, аутентификации и противнике.
PBFT (Кастро, Лисков, 1999) — первый протокол, сделавший византийский консенсус практичным; идейный каркас всех современных наследников (Tendermint/CometBFT, HotStuff и др.). Схема узнаваема после главы 6: реплицируемый автомат, лидер (primary) упорядочивает запросы, эпохи (view) с протоколом смены лидера, — но каждое «поверил лидеру» заменено на «проверил кворумом»:
Клиент принимает ответ, получив f+1 одинаковых аутентифицированных ответов от разных реплик (хотя бы один — от честной). Цена очевидна из структуры: два раунда «все-всем» — O(n²) сообщений на запрос (у Raft — O(n)). При этом классический PBFT ради производительности заменяет большинство цифровых подписей в нормальном режиме векторами MAC, называемыми authenticators; утверждение «все подписывают всё» было бы неверным. Современные протоколы вроде HotStuff сокращают нормальный обмен с помощью пороговых и агрегированных подписей, но модель остаётся существенно дороже crash-консенсуса.
PBFT предполагает известный список участников. Публичные блокчейны решают более дикую задачу: консенсус между кем угодно, без списка, где противник может завести тысячу узлов (атака Сивиллы). Ответ Накамото (биткойн, 2008) — сделать влияние дорогим: вероятность предложить блок пропорциональна выполненной вычислительной работе, а цепочка с наибольшей накопленной работой побеждает. Согласие вероятностное: чем глубже блок, тем дороже и менее вероятен откат при доле мощности противника меньше половины. Proof-of-Stake связывает влияние с поставленным под риск капиталом и во многих системах комбинируется с BFT-финализацией комитетов. Для нашего курса блокчейн — это точка в пространстве компромиссов: открытое членство и максимальное недоверие куплены ценой пропускной способности и задержек, существенно худших, чем у небольшого Raft-кластера.
Внутри одной организации обычно выбирают crash-модель: типичные узлы падают и зависают, целостность каналов дают TLS и аутентификация, случайную порчу обнаруживают контрольные суммы. Но это не универсальный закон: если модель угроз включает одновременный компромисс части реплик, ошибочную прошивку общего происхождения или недоверенные административные домены, crash-консенсуса недостаточно. BFT оправдан там, где участники — разные стороны с несовпадающими интересами, либо критичность системы требует переживать компромисс реплик. Правило для архитектора: сначала честно назвать противника и общие причины отказа; модель протокола выводится из модели угроз, а не из моды.
Ответы и указания. 1: разделите три узла так, чтобы A получал одинаковые сообщения в двух исполнениях, но в одном B честен и C лжёт, а в другом роли поменяны. Если B и C сообщают A разные предложения, локальная история A одинакова, однако условие обоснованности требует выбрать разные значения в двух мирах. Значит, протокол не может одновременно обеспечить согласие и обоснованность при n=3,f=1 в модели устных сообщений. 2: при f отказавших живы 2f+1 — ровно кворум; два кворума пересекаются минимум по f+1 узлам, среди которых есть честный. Для размера 2f пересечение может целиком состоять из византийских узлов. 3: PBFT при f=2 требует n=7. У Raft нормальная фиксация требует O(n) сообщений и один раунд репликации после установления лидера; у классического PBFT обмен prepare/commit между репликами даёт O(n²) сообщений и больше раундов. При удвоении n линейный трафик примерно удваивается, квадратичный — учетверяется. 4: двойной голос допускает два лидерских большинства, ложное подтверждение разрушает долговечность фиксации, выдуманный ответ — клиентскую корректность. Raft предполагает честное исполнение кода узла и защищает от crash-отказов, а не от захваченной реплики. 5: Raft у оператора дешевле, но все банки доверяют оператору не подменять историю; BFT распределяет доверие и переносит до f злонамеренных участников при 3f+1 узлах, платя сложным членством, ключами и квадратичным либо агрегированным обменом. Даже BFT оставляет доверие к клиентской аутентификации, реализации и правилам допуска участников. 6: конкурент может тайно строить альтернативную ветвь и догнать публичную; k блоков лишь увеличивают требуемую работу. При доле мощности меньше 1/2 вероятность догоняющего отката убывает примерно экспоненциально с k, но не становится строго нулевой.