Сборка блока
На этапе финализации коллатор собирает кандидат блока.
Состав блока
Итоговый блок объединяет результаты исполнения, обновление состояния и метаданные очередей.
- заголовок блока
- балансовый итог блока
- обновление дерева Меркла между старым и новым состоянием
- хеш разницы очереди и длина ее хвоста
- описания входящих и исходящих сообщений, изменения аккаунтов и служебные поля
Для мастер-блока дополнительно добавляются данные по рабочей цепочке, комиссии и конфигурация, если мастер-блок ключевой.
Порядок сборки
Сборка идет по детерминированному конвейеру и завершается формированием кандидата блока.
- Формируются описания входящих и исходящих сообщений.
- Обновляются аккаунты и строятся изменения по аккаунтам.
- Считается балансовый итог и проверяется его корректность.
- Строится новое наблюдаемое состояние цепочки, для которой собирается блок.
- Строится обновление дерева Меркла между старым и новым корнем состояния.
- Сериализуется блок и вычисляются корневой и файловый хеши.
- Формируется кандидат блока разницей очереди и метаданными.
Часть шагов выполняется параллельно, в том числе подготовка аккаунтов и описаний сообщений.
Обновление дерева Меркла
Перед сборкой обновления состояния коллатор подготавливает разбиение словарей аккаунтов старого и нового состояния на заданной глубине.
Такое разбиение задает стабильные точки построения и используется при параллельной сборке обновления состояния со статистикой.
Результат меркловой сборки используется в самом блоке как обновление состояния и отдельно возвращается в результате финализации со статистикой сборки.
Разница очереди
После финализации ридер возвращает разницу очереди вместе с сообщениями для сериализации.
В блок записываются только хеш этой разницы и длина хвоста, поэтому блок хранит компактную ссылку на изменения очереди, а не полную копию очереди.