Обновление Safe Network 🇷🇺 30 июня 2022 г

Это машинный перевод. Оригинал на английском здесь: Update 30 June, 2022

Старейшины используют распределенную генерацию ключей (DKG), чтобы выбрать между двумя возможными альтернативными курсами действий. Каждый старший генерирует общий ключ и отправляет его вместе со своим голосом, и если получено подавляющее большинство (5 из 7) этих общих ключей, они объединяются для создания полного ключа, необходимого для проверки решения. Для этого мы разработали собственную систему с использованием криптографии BLS, которая в большинстве случаев работает нормально, но не всегда. К сожалению, когда он выходит из строя, сеть может остановиться. На этой неделе @anselme представляет руководство для начинающих по DKG, и он и @davidrusu объясняют, как мы хотим сделать нашу реализацию DKG более надежной.

Общий прогресс

@davidrusu и @joshuef углубились в то, чтобы сделать sn_node однопоточным, насколько это возможно, чтобы избавиться от проблемы, вызванной блокировкой. Это потребует небольшого рефакторинга, перемещения Comm — кода, который обрабатывает обмен сообщениями между узлами — из sn_node, чтобы он мог лучше работать сам по себе и, возможно, иметь свой собственный поток.

Тем временем @bochaco работает над чеканкой DBC начального генезиса первым сетевым узлом, обработкой потраченных книг, чтобы узлы не необходимо обсудить с другими разделами, чтобы убедиться, что транзакция действительна, и другие шаги в интеграции DBC.

@bzee застревает в алгоритмах распространения информации (IDA), как вы, возможно, помните, именно так мы сокращаем хранилище и требования к пропускной способности сети, а @roland работает над некоторыми тестами модуля записи для DKG и помогает @Anselme с новым крейтом sn_sdkg (s здесь означает синхронный).

На пути к более стабильному DKG for Safe

Генерация распределенного ключа (DKG) необходима для безопасной сети, чтобы гарантировать, что каждый старейшина в разделе имеет уникальный фрагмент ключа раздела: общий ключ. Это позволяет сети генерировать секретный ключ для каждого раздела, даже если ни один узел не знает весь ключ раздела. Это делает безопасную сеть более устойчивой к византийским узлам, поскольку ей не нужно доверять всем старейшинам.

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

В нашей текущей реализации, если узлам потребуется слишком много времени для внесения вклада в DKG, сеанс DKG завершится сбоем. Мы стремились удалить любое поведение, связанное со временем, в Safe Network, используя параллельные и асинхронные потоки по умолчанию.

Мы некоторое время искали альтернативу DKG на основе таймера, и мы думаем, что наконец нашли что-то, что будет работать, опираясь на проделанную нами работу по членству и передаче.

DKG для всех нас

Хотя DKG может показаться очень технической и сложной вещью, я чувствую, что его полезность и основные механизмы можно объяснить шестилетнему ребенку.

Представьте себе королевство с королем. У короля есть печать из слоновой кости, которую никто не может подделать. Любое письмо с королевской печатью одобрения рассматривается всем королевством как заслуживающее доверия.

печать из слоновой кости == секретный ключ
печать утверждения на письме == письмо с подписью короля

Однажды король понимает, что он стар. У короля четверо наследников, и он хочет быть честным, поэтому он просит своего мастера разбить его штамп из слоновой кости на четыре равные части, каждая из которых может отпечатать часть королевской печати. Затем он раздает одну из этих крошечных марок своим четверым детям. Теперь, чтобы воссоздать королевскую печать одобрения, дети должны использовать свои крошечные штампы из слоновой кости и каждый распечатать свои части печати рядом друг с другом, пока они снова не увидят полную печать.

4 штампа из слоновой кости == мультиподпись
крошечный штамп == совместное использование ключей

Через некоторое время наследники понимают, что этот механизм замедляет королевство, потому что каждый раз требовать все части печати - утомительная операция, некоторые из них время от времени находятся в отъезде и путешествуют, поэтому получить все части печати может быть довольно сложно. Итак, у них есть идея: они согласны с тем, что до тех пор, пока на письме видно более половины королевской печати (печать 3/4+), печать считается действительной и несет власть королевства.

3/4+ печать == пороговая криптография

Однажды наследники понимают, что мастер был нечестен и сохранил копию оригинальной королевской печати из слоновой кости и что он продавал их по всему королевству каким-то злодеям. Затем наследники решают создать новую марку для своего королевства. Но чтобы избежать ошибки прошлого раза, каждый из них нанимает мастера для создания одного нового экземпляра новой марки. У каждого наследника есть своя печать, которую они создали на своей стороне. Соединяя их вместе,y получить новую королевскую печать, которая уникальна и которую невозможно подделать ни одной печатью. Они постановляют, что союз более половины этих печатей представляет власть королевства. Поскольку полную печать никто никогда не видел, они могут быть уверены, что на этот раз никто не обманет.

отдельно созданные штампы, составляющие уникальную печать == DKG

В безопасной сети DKG используется старейшинами для создания ключа раздела, который несет полномочия раздела. В терминологии SN ключ генезиса (ключ первого узла в сети) подобен королевской печати. Как только присоединяются новые участники, узел генезиса и новые узлы выполняют DKG для создания нового ключа раздела. Каждый из них создает свой собственный key-share (крошечные штампы), но они никогда не видели ключей друг друга, поэтому ни у кого никогда не бывает в руках всего ключа. Каждый раз, когда происходит смена старших (наследников), узлы выполняют ДКГ для создания нового ключа раздела. Это довольно безопасно, потому что нужно контролировать подавляющее большинство старших узлов, чтобы иметь полномочия раздела (более половины печати королевства).

DKG Poanetwork

Poanetwork hbbft (алгоритм консенсуса Honey Badger Byzantine Fault Tolerant) имеет довольно простую реализацию DKG, которая не использует таймеры. Их код был проверен некоторыми знающими криптографами, так что это тоже большое преимущество перед нашим.

Кратко алгоритм генерации ключей HBBFT:

  • Каждый из участников создает «Части», которые они транслируют другим
  • Участники проверяют все «Части» и генерируют «Подтверждения» (подтверждения) для каждой из них, которые также транслируются другим
  • Наконец, каждый из них может генерировать свой собственный общий ключ из «Частей» и «Подтверждений».

Однако есть одна загвоздка! Все они должны обрабатывать одинаковые наборы частей и подтверждений!

Из их документов:

Если подтверждение Алисы было обработано Бобом, а не Кэрол, Боб и Кэрол могли бы получить разные наборы открытых ключей и общие секретные ключи, которые не совпадают.
Один из способов убедиться в этом — зафиксировать сообщения в публичном реестре перед их обработкой.

Хотя таймеры не задействованы, этот алгоритм требует, чтобы узлы ждали друг друга.

Интеграция с Сейфом

Нам необходимо убедиться, что все участники имеют доступ к одним и тем же наборам «Части» и «Подтверждения». Документы Poanetwork предлагают использовать распределенный реестр, такой как блокчейн, чтобы гарантировать, что все участники имеют одинаковые наборы. У нас нет блокчейна в Safe — но это нормально. У нашей команды была идея с широковещательными подписанными сообщениями, которые не требуют полного консенсуса! Это работает следующим образом:

  • Отправить Parts в подписанном сообщении
  • Подождать, пока соберутся все 7 “Parts”, транслировать подписанный сет
  • Подождите, пока не придут все 7 одинаковых подписанных наборов «Запчастей».
  • Отправить Acks
  • Подождите, пока не придут все 7 Acks, транслируйте подписанный набор
  • Подождите, пока не поступят все 7 одинаковых подписанных наборов Acks
  • Как только узел получает 7 подписанных наборов с одинаковыми «Acks», он может сгенерировать общий ключ из согласованных «Parts» и «Acks».

Тот факт, что у нас есть этот дополнительный раунд широковещательной рассылки, чтобы все узлы видели, что все узлы видели одни и те же «Части» и «Подтверждения», делает этот алгоритм устойчивым к определенному количеству византийских узлов. Также легко доказать, что узел мошенничал, показав два разных и противоречивых сообщения, которые они подписали.

Хотя этот простой алгоритм гарантирует, что узлы согласуют одни и те же «Части» и «Подтверждения», он не гарантирует завершение в случае потери определенного количества сообщений. Это нормально, мы принимаем это и не считаем неудачей.

Если потеряно достаточно сообщений, мы предполагаем, что этот набор кандидатов изначально не подходил для того, чтобы стать старейшинами. На каждом событии оттока (узел присоединяется к секции или покидает ее) старейшины проверяют, являются ли самые старые 7 участников в секции текущими старейшинами. Если это не так, они просят самых старших членов создать DKG. Этот процесс называется Handover.

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

Этот алгоритм делает DKG пассивным процессом: это всего лишь обработка сообщений. Нет ни таймеров, ни выборки данных на других узлах, только временный набор текущих DKG, ожидающих завершения или удаления после следующей передачи.

Если по какой-то причине несколько сообщений отброшены и DKG не может быть завершен, это легко обрабатывается. Мы можем оставить это на Dysfunction, чтобы в конечном итоге отследить неактивные/медленные узлы и проголосовать за них. Это, в свою очередь, запускает churn, и этот отток запускает новый раунд DKG.

Ссылки


Полезные ссылки

Не стесняйтесь отвечать ниже со ссылками на переводы этого обновления для разработчиков, и модераторы добавят их сюда.

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