Как устроена платформа
Механизм создания снимка данных¶
Механизм создания снимка данных – это вспомогательный механизм блокчейн-платформы, который позволяет сохранить данные работающей блокчейн-сети для последующего изменения параметров конфигурации сети и ее запуска с сохраненными данными.
Механизм создания снимка данных позволяет изменять параметры конфигурации блокчейн-сети без потери данных. Процесс изменения параметров конфигурации сети при помощи снимка данных называется миграцией.
Снимок данных включает следующие данные:
стейты адресов сети: балансы, роли в сети, ключи;
стейты смарт-контрактов, загруженных в сеть: данные, полученные в результате исполнения смарт-контрактов и прикрепленные к ним при помощи транзакций 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 для работы со снимками данных¶
GET /snapshot/status – возвращает актуальный статус снимка данных на ноде:
Exists
– снимок данных существует / загружен;
NotExists
– снимок данных не существует / еще не загружен;
Failed
– ошибка распаковки или верификации снимка данных;
Verified
– снимок данных успешно верифицирован.
GET /snapshot/genesis-config – возвращает в ответе конфиг genesis-блока для новой сети;
POST /snapshot/swap-state – приостанавливает работу ноды и подменяет ее стейт на снимок данных. В запросе указывается параметр backupOldState
, предназначенный для сохранения или удаления текущего стейта:
true
– сохранить текущий стейт в директорию нодыPreSnapshotBackup
;
false
– удалить текущий стейт.
Сетевые сообщения¶
SnapshotNotification(sender)
– сообщение ноды о наличии у нее снимка данных, отправляется с публичным ключом ноды;SnapshotRequest(sender)
– запрос ноды на получение снимка данных, также отправляется с публичным ключом ноды.