Коллатор

Сборка блока

На этапе финализации коллатор собирает кандидат блока.

Состав блока

Итоговый блок объединяет результаты исполнения, обновление состояния и метаданные очередей.

  • заголовок блока
  • балансовый итог блока
  • обновление дерева Меркла между старым и новым состоянием
  • хеш разницы очереди и длина ее хвоста
  • описания входящих и исходящих сообщений, изменения аккаунтов и служебные поля

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

Порядок сборки

Сборка идет по детерминированному конвейеру и завершается формированием кандидата блока.

  1. Формируются описания входящих и исходящих сообщений.
  2. Обновляются аккаунты и строятся изменения по аккаунтам.
  3. Считается балансовый итог и проверяется его корректность.
  4. Строится новое наблюдаемое состояние цепочки, для которой собирается блок.
  5. Строится обновление дерева Меркла между старым и новым корнем состояния.
  6. Сериализуется блок и вычисляются корневой и файловый хеши.
  7. Формируется кандидат блока разницей очереди и метаданными.

Часть шагов выполняется параллельно, в том числе подготовка аккаунтов и описаний сообщений.

Обновление дерева Меркла

Перед сборкой обновления состояния коллатор подготавливает разбиение словарей аккаунтов старого и нового состояния на заданной глубине.

Такое разбиение задает стабильные точки построения и используется при параллельной сборке обновления состояния со статистикой.

Результат меркловой сборки используется в самом блоке как обновление состояния и отдельно возвращается в результате финализации со статистикой сборки.

Разница очереди

После финализации ридер возвращает разницу очереди вместе с сообщениями для сериализации.

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