Это машинный перевод. Оригинал на английском здесь: Update 17 November, 2022
Византийская отказоустойчивость, основанная на проблеме византийских генералов, является обязательной для децентрализованных сетей, где узлы должны прийти к соглашению, даже если некоторые из них являются вредоносными. @dirvine рассказывает, что такое BFT, и, что особенно важно, что он упускает.
Общий прогресс
@davidrusu Работал над отделением AE от сообщений о присоединении и добился в этом хорошего прогресса, теперь код присоединения стал немного проще.
@joshuef также рассматривает возможность соединения узлов и обнаружил некоторые аномалии. Когда получено более трети ответов от старейшин, присоединяющийся узел снова запрашивает. При пяти старейшинах, получив два ответа, узел повторяет попытку и получает еще два ответа. Но на этом этапе он получает ответ с первой попытки, что вызывает ситуацию остановки/призрачного узла.
Он также успешно удалил больше блокировок, а это означает, что взрослые теперь могут писать напрямую в файловую систему без каких-либо промежуточных этапов. Важное упрощение.
И в качестве еще одной оптимизации @bzee преобразовал часть qp2p в API, более похожий на Quinn, где нет отдельной структуры данных, необходимой для входящих соединений или потоков.
Византийская отказоустойчивость
Проблема византийских генералов в реальных условиях
В задаче византийских генералов армия держит город Византия в осаде. Генералы, командующие этими силами, должны определить время для атаки. Если все генералы поведут свои войска для атаки города одновременно, победа обеспечена, но если они атакуют в разное время, они проиграют. Генералы не имеют прямой связи друг с другом, а носители сообщений могут быть вражескими шпионами, могут быть убиты обороняющимися или сами сообщения могли быть изменены. Плюс, конечно, некоторые из генералов сами могут быть предателями. Как генералы обеспечивают одновременную атаку всех своих сил?
Это проблема, которую должны решить децентрализованные сети.
Применяя аналогию к децентрализованным системам, получаем:
- Лояльные генералы ==> честные узлы
- Предательские генералы ==> неисправные узлы
- Вражеская армия, мы отправляем сообщения через ==> ненадежную асинхронную сеть, которая может отбрасывать и задерживать сообщения
Эта история — удобоваримое прикрытие для довольно тяжелой математики, в которой выясняется, что пока не более трети генералов вероломны, честные генералы могут успешно согласовывать свои планы — византийская отказоустойчивость (BFT).
У нас есть несколько узлов, некоторые из которых могут быть нечестными, а некоторые могут страдать от сбоев связи между ними.
Классическая проблема византийских генералов — это проблема локальной синхронизации состояний, «несмотря на» предательских генералов, пытающихся разойтись. Чтобы немного расширить это, и «АТАКА», и «ОТСТУПАНИЕ» были бы правильными (действительными) ответами… до тех пор, пока все лояльные силы делают то же самое.
Для наших целей классическая задача о византийских полководцах является ограниченным представлением BFT. Он сосредоточен исключительно на консенсусе, поэтому ему нужно иметь дело с большим количеством типов ошибок.
Есть и другие понятия BFT, на которые мы можем обратить внимание, чтобы решить проблемы с членством.
Здесь проблема в том, что у нас есть вилка. Когда взрослые и пожилые люди уходят или присоединяются к узлам, они могут иметь разные представления о разделе. Хотя эта вилка в конечном итоге будет разрешена, решения, принятые во время разделенного просмотра, например. расходы DBC, трудно справиться. Таким образом, мы пытаемся избежать этого раскола во взглядах посредством консенсуса.
Один из вариантов, над которым работают Мостафа и @Davidrusu, — это широковещательный протокол под названием «Проверяемая непротиворечивая широковещательная передача» (VCBC).
Протоколы вещания BFT
Широковещательный протокол пытается распространить сообщение от узла к сети. Версия BFT пытается убедиться, что все узлы согласны с сообщением, отправленным этим узлом:
Слева у нас есть честный узел «1», транслирующий «msg» на 2,3,4,5. Справа у нас есть неисправный узел «1», транслирующий «a» на 2,3 и «b» на 4,5.
Широковещательный протокол BFT защищает от разветвления во втором случае, гарантируя, что все честные узлы либо соглашаются на одно и то же сообщение от «узла 1», либо отказываются принимать любое сообщение от «узла 1».
В VCBC это делается с помощью трехэтапного протокола:
- Узел 1 транслирует сообщение, которое он хочет, чтобы все увидели
- Все узлы проверяют, является ли узел 1 отправкой сообщения впервые, и если это так, то он отвечает с помощью подписи на сообщение:
sigma_j(m)
- Узел 1 ждет, пока он не получит> 2/3 доли подписи для объединения в полную подпись, а затем передает полную подпись в сеть, убеждая всех, что у них у всех одно и то же сообщение.
Давайте посмотрим, как работает этот алгоритм.
VCBC в решающей степени полагается на то, что более 2/3 сети точно следуют протоколу. Мы можем спросить себя: «Какой ущерб может быть нанесен, если 1/3 или более узлов неисправны?»
Если неисправны более 1/3, но менее 2/3 + 1, то самое худшее, что они могут сделать, это застопорить сеть.работать, отказываясь от участия в подписных акциях.
Если неисправно более 2/3, то неисправные узлы могут подписывать любые сообщения, которые им нравятся.
Однако этот факт верен только в том случае, если узлы BFT вступают в сговор. то есть, если они не являются одним и тем же злоумышленником, то они не имеют большого значения. Они не будут создавать форк.
Таким образом, критической частью избегания BFT является слово COLLUDING.
Отличный мысленный эксперимент решает проблему BFT, имея МНОЖЕСТВО злоумышленников. Таким образом, единственный злоумышленник, вступивший в сговор, разбавляется другими злоумышленниками и честными узлами.
Что это значит в реальной жизни?
Если рассматривать разум злоумышленника. Что бы он предпочел?
- Сеть все еще работает
- Его враг взял под контроль сеть
Ясно, что ответ в том, что сеть все еще работает честно. Таким образом, если злоумышленник не имеет контрольного большинства (2f+1, где f = количество плохих узлов, вступивших в сговор), он не может захватить сеть.
Итак, если у нас есть N == 9 и атакующие узлы == 9, но сговорившиеся узлы == 0, то у нас нет проблем?
Так что 100% узлов, являющихся атакующими, — это нормально.
Проблемы возникают только тогда, когда у нас есть плохие узлы в сговоре. Здесь есть два пути/порога. Если мы рассмотрим злоумышленника, вступившего в сговор, то пороговые значения будут следующими:
- Злоумышленник контролирует >=1/3 узлов
- Злоумышленник контролирует >=2f+1 узлов.
1 Это атака вандализма, когда он может застопорить решения и сеть.
2 Есть захват раздела как минимум.
Так что здесь важна перспектива. Чем больше у нас злоумышленников, тем безопаснее наша сеть! Мы можем уменьшить влияние злоумышленника, имея много злоумышленников и/или много честных узлов.
Так что же такое BFT-атака на широковещательный протокол
Когда мы обсуждаем атаку BFT, мы имеем в виду злоумышленника, вступившего в сговор. Отдельные нападающие в порядке.
Мы можем допустить менее 1/3 плохих узлов, вступающих в сговор. Несмотря на то, что плохих узлов может быть много, мы защищены до тех пор, пока ни одна группа сговора не превышает 1/3 лиц, принимающих решения (остановка) или 2f+1 для создания форка (поглощение).
Полезные ссылки
Не стесняйтесь отвечать ниже со ссылками на переводы этого обновления для разработчиков, и модераторы добавят их сюда.
Как проект с открытым исходным кодом, мы всегда ждем отзывов, комментариев и предложений сообщества - так что не стесняйтесь, присоединяйтесь и давайте вместе создадим безопасную сеть!