Обновление Safe Network 🇷🇺 30 сентября 2021 г

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

Как мы упоминали несколько недель назад, старый тип данных Sequence для изменяемых данных был заменен на Register. Регистры могут делать все, что могла Sequence с точки зрения хранения предыдущих версий с дополнительным бонусом, заключающимся в том, что они также могут обрабатывать параллелизм. На этой неделе Дэвид Русу открывает загадочный мир регистров Меркла.

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

Дэвид Русу практически завершил базовую функциональность для клиента, пишущего Spentbook. Как только он будет полностью размещен, он сделает задачу Mint доступной только для чтения: Mint нужно будет только проверить Spentbook на наличие обязательств транзакций DBC, чтобы убедиться, что все входные данные привязаны к одной и той же транзакции, и проверить балансы транзакций.

@Chris.connelly продолжает бороться с qp2p. Многие из выполняемых им заданий, связанных с входящими сообщениями, вероятно, устарели, поскольку мы больше не используем пул соединений для поддержания соединений открытыми, а перенос соединений и обработка входящих сообщений внутри репозитория safe_network должны улучшить стабильность. Хотя это немного работы!

Крис также обнаружил давнюю ошибку в тестах qp2p, которая теперь исправлена.

@lionel.faber ориентирован на CI / CD и инструменты запуска, а также обновил инструменты автоматизации, чтобы создать облачную виртуальную машину для запуска полноценной тестовой сети. Любой может использовать этот инструмент при условии, что у него есть необходимые учетные данные для AWS и Digital Ocean. Инструмент настраивается и может быть запущен по мере необходимости. Внутри компании мы используем ручные триггеры и специальный комментарий «launch-testnet» в PR-обзорах.

Работа над интерфейсом командной строки и API продолжается, чтобы они были совместимы с последней версией safe_network … она уже есть, но как @Chriso упоминается во вторник все еще есть некоторые гремлины, грызущие кабели, включая некоторые проблемы, связанные с извлечением файлов с помощью CLI.

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

На этой неделе мы изменили количество повторных попыток клиентов, сделав их более разумными, и это помогло; мы исправили некоторые ложные ошибки, которые иногда возникали, что было связано с тем, что мы полагались на ошибки tokio (когда сама задача была завершена нормально). И @yogesh начал улучшать загрузку клиента в сеть, которая в настоящее время идет для любого узла, с которым можно связаться, но не пытается установить состояние сети, что позже приводит к большему количеству AE-сообщений, чем необходимо.

Регистр Меркла

На этой неделе мы хотели бы глубоко погрузиться в регистр Меркла, один из двух примитивных типов данных в безопасной сети (другой - неизменяемые блоки).

Регистр Меркла - это новый CRDT, который мы разработали для моделирования изменяемого состояния в безопасной сети, он поддерживает одновременную запись и обход истории. Они широко используются в NRS для поддержки сопоставлений имен, используются для отслеживания версий файла (ов) и любого приложения, которому требуется изменяемое состояние.

The Register CRDT Family

Регистры используются для записи и чтения значения, например, регистров ЦП. Существующие регистры CRDT - это многозначный регистр (MVReg) и регистр последней записи-выигрыша (LWWReg). Наш реестр Меркла (MerkleReg) - еще один CRDT в этом семействе.

Все регистры следуют аналогичному API.

# Вы можете прочитать текущие значения, хранящиеся в регистре
читать (reg) -> val (s)

# Вы можете записать значение в регистр, используя причинный контекст
написать (reg, val, ctx) -> reg

# Объединить два регистра
слияние (рег1, рег2) -> слияние-рег

MerkleReg построен на основе Merkle DAG. Merkle DAG - это обобщение дерева Меркла, которое ослабляет узлы, чтобы иметь несколько родителей и размещать данные в каждом узле.

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

Мы создаем MerkleReg, используя корни Merkle DAG в качестве текущих значений регистров. Например, рассмотрим следующую серию операций.

Начнем с чтения пустого DAG, мы вернем пустой набор.

читать (∅) = {}

Запишите a в регистр, мы используем пустой набор в качестве контекста.

                  ∅
напишите (∅, a, {}) = |
                  а

Одновременно другой клиент записывает в тот же регистр.

                  ∅
напишите (∅, b, {}) = |
                  б

Как только два клиента увеличат свое состояние, мы можем объединить два параллельных регистра.
текст∅ ∅ ∅
слияние (|, |) = /
а б а б
`` ‘’

Чтение объединенного регистра возвращает оба одновременных значения.

       ∅
читать (/ \) = {a, b}
     а б

Теперь мы можем разрешить параллельные значения, используя как «a», так и «b» в качестве контекста записи.

                            ∅
        ∅ / \
пишем (/ \, c, {a, b}) = a b
      а б \ /
                            c

Чтение последнего регистра возвращает только c.

        ∅
       / \
читать (a b) = {c}
       \ /
        c

Теперь приятным свойством этого MerkleReg по сравнению с некоторыми другими CRDT регистров является то, что у нас есть вся история ветвления реестра, поддерживаемая в Merkle DAG. Если мы отслеживаем документ, мы можем просмотреть его историю, чтобы увидеть, как он развивался.

MultiSets и MultiMaps

Мы можем построить MultiSets и MultiMaps поверх регистров Меркла довольно просто, воспользовавшись тем, как работают контексты записи.

Записи, записанные в регистр с пустым контекстом, появятся, когда мы прочитаем значения обратно, это имитирует Set CRDT.

Начнем с пустого регистра.

читать (∅) = {}

После написания y с пустым контекстом.

      ∅
читать (|) = {y}
      у

Затем напишите x с пустым контекстом.

        ∅
читать (/ \) = {x, y}
      х у

Написание z с пустым контекстом.

         ∅
читать (/ | \) = {x, y, z}
      x y z

Теперь мы можем имитировать удаление, назначив специальный узел “мусор”:

        ∅
читать (/ | \) = {x, y, 🗑}
     х у 🗑

Объедините y с :wastebasket:, чтобы удалить его.

        ∅
читать (/ | \) = {x, 🗑}
     х у 🗑
         \ /
          🗑

Это дает нам набор CRDT со вставками и удалениями. Чтобы получить CRDT карты, мы делаем члены набора двухкортежным ключом: значение:

          ∅
читать (/ | \) = {x: 1, y: 2, 🗑}
     x: 1 y: 2 🗑

Обновление значения x выполняется с использованием текущих записей x в качестве дочерних:
Здесь мы обновляем x, чтобы сохранить 2 вместо 1

          ∅
читать (/ | \) = {x: 2, y: 2, 🗑}
     x: 1 y: 2 🗑
      |
     х: 2

Поскольку это одновременно редактируемая структура, мы можем получить несколько значений, записанных для ключа (отсюда multi в Multi-Map):

Другой клиент одновременно пишет x: 3

          ∅
       / | \
читать (x: 1 x: 3 🗑) = {x: 2, x: 3, 🗑}
       |
      х: 2

Эти множественные записи могут быть разрешены путем обратной записи записи для x с дочерними элементами x: 2 и x: 3.

          ∅
        / | \
читать (x: 1 x: 3 🗑) = {x: 3, 🗑}
       | |
      x: 2 |
        \ /
        х: 3

Это дает нам MultiMap CRDT с историей и объединением параллельных значений!

Последствия MerkleReg

MerkleReg заменяет старый тип данных Sequence, мы обнаружили, что попытка моделирования линейных последовательностей в частично упорядоченной сети не будет иметь чистой семантики. Вместо этого мы используем вилки, в результате приложениям приходится иметь дело с параллельными значениями. Например, браузер, созданный в безопасной сети, должен учитывать возможность одновременного использования нескольких страниц index.html на веб-сайте. NRS придется иметь дело с несколькими записями для одного и того же имени.

Это не такая большая проблема, как вы думаете, большинство крупномасштабных систем уже работают с этой моделью. Например, DNS позволяет использовать несколько IP-адресов, связанных с доменом, и все (как правило) все еще работает.


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

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

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