Как устроена платформа

Механизм создания снимка данных

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

Механизм создания снимка данных позволяет изменять параметры конфигурации блокчейн-сети без потери данных. Процесс изменения параметров конфигурации сети при помощи снимка данных называется миграцией.

Снимок данных включает следующие данные:

  • стейты адресов сети: балансы, роли в сети, ключи;

  • стейты смарт-контрактов, загруженных в сеть: данные, полученные в результате исполнения смарт-контрактов и прикрепленные к ним при помощи транзакций 105;

  • данные майнеров прошедших раундов;

  • данные групп доступа к конфиденциальным данным.

В снимке данных не сохраняется история транзакций, банов и блоков сети.

При выполнении миграции снимок данных становится начальным стейтом блокчейн-сети с новыми параметрами, сама сеть перезапускается с формированием нового генезис-блока.

Механизм создания снимка данных включается и настраивается в секции node.consensual-snapshot конфигурационного файла ноды.

Компоненты механизма создания снимка данных

SnapshotBroadcaster – компонент, предназначенный для рассылки сообщений SnapshotNotification, обработки запросов на создание снимка данных (SnapshotRequest) и последующей отдачи снимка данных. Так как снимки данных могут быть большими по размеру, в один момент компонентом обрабатывается не более 2 запросов.

SnapshotLoader – компонент, предназначенный для регистрации входящих сообщений SnapshotNotification на ноде, отправки запросов на получение снимка данных (SnapshotRequest) и его загрузки. Если на ноду приходит сообщение SnapshotNotification, то адрес, отправивший его, записывается в массив адресов, у которых есть снепшот (снимок данных). Затем сообщение пересылается другим пирам ноды.

SnapshotLoader периодически проверяет массив адресов на наличие адреса со снимком данных. При наличии такого адреса и открытого сетевого канала с ним, адресу отправляется сообщение SnapshotRequest на загрузку снимка данных. Время ожидания ответа на сообщение составляет 10 секунд. Если нода, у которой есть снимок данных, не отвечает в течение этого времени, она исключается из массива адресов. В этом случае выбирается следующий доступный владелец снимка данных с отправкой ему сообщения SnapshotRequest.

В случае успешного получения снимка данных, он распаковывается, после чего запускается его верификация со стейтом ноды. В случае успешной верификации нода, получившая снимок данных, рассылает своим пирам сообщения SnapshotNotification.

SnapshotApiRoute – контроллер REST API для работы со снимками данных.

Процесс создания и распространения снимка данных в работающей сети

1. Нода, назначенная для майнинга блока на высоте snapshot-height, также назначается создателем снимка данных. На высоте snapshot-height + 1 стартует создание снимка данных в директорию snapshot-directory. На период создания снимка данных поступление новых транзакций в UTX-пул блокируется. После успешного создания снимка нода создает пустой genesis-блок с типом консенсуса новой сети (consensus-type) и сохраняет его в снимке данных.

2. При достижении высоты блокчейна snapshot-height + wait-blocks-count нода, создавшая снимок данных, архивирует его и распространяет своим пирам уведомления о готовности снимка (SnapshotNotification).

3. Ноды при получении SnapshotNotification инициируют запрос на получение снимка данных (SnapshotRequest). В случае истечения таймаута по получению снимка данных или ошибки при его загрузке, нода выбирает другого пира и запрашивает снимок у него.

4. Каждая нода, получившая архив со снимком данных, сохраняет его в директорию snapshot-directory, распаковывает и проверяет корректность снимка: сверяет балансы адресов и ключи, проверяет целостность смарт-контрактов, состав и параметры групп доступа к конфиденциальным данным, роли участников. При успешной верификации снимка данных, нода рассылает своим пирам сообщение о наличии снимка (SnapshotNotification). После этого пиры ноды могут посылать ей запрос о загрузке снимка данных себе.

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

После создания снимка вы можете запустить вашу ноду с измененными параметрами и созданным снимком. Подробнее см. статью Запуск ноды с созданным снимком данных.

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

Методы REST API для работы со снимками данных

https://img.shields.io/badge/auth-required-orange.svg

GET /snapshot/status – возвращает актуальный статус снимка данных на ноде:

  • Exists – снимок данных существует / загружен;

  • NotExists – снимок данных не существует / еще не загружен;

  • Failed – ошибка распаковки или верификации снимка данных;

  • Verified – снимок данных успешно верифицирован.

GET /snapshot/genesis-config – возвращает в ответе конфиг genesis-блока для новой сети;

POST /snapshot/swap-state – приостанавливает работу ноды и подменяет ее стейт на снимок данных. В запросе указывается параметр backupOldState, предназначенный для сохранения или удаления текущего стейта:

  • true – сохранить текущий стейт в директорию ноды PreSnapshotBackup;

  • false – удалить текущий стейт.

Сетевые сообщения

  • SnapshotNotification(sender) – сообщение ноды о наличии у нее снимка данных, отправляется с публичным ключом ноды;

  • SnapshotRequest(sender) – запрос ноды на получение снимка данных, также отправляется с публичным ключом ноды.