Архитектураdocs/architecture/state.md

Архитектура Live State

State — точный канонический объект протокола: разреженный вектор UTXO, индексированный 32-битным номером слота, и счётчики консенсуса, необходимые для однозначной интерпретации вектора. Заголовок фиксирует:

  • state_root — корень Merkle вектора;
  • log_slots — текущую степень домена слотов;
  • active_slot_count;
  • alloc_counter — следующий идентификатор создания.

State начинается с 2^24 возможных слотов и может по одному уровню расширяться до 2^32.

Расширение State по финализированному окну

Жизненный цикл слота

Занятый слот хранит сумму, владельца и creation_id. Расходование очищает его до канонического пустого значения. При выделении предпочтение отдаётся пустым позициям, поэтому новый выход может позднее использовать тот же числовой индекс.

Идентификатор создания делает повторное использование безопасным. Вход должен совпасть одновременно по slot_index и creation_id; ссылка на предыдущего обитателя слота не способна потратить заменивший его выход.

text
slot 9700063, creation 417  ── spend ──>  empty
empty slot 9700063          ─ allocate ─> slot 9700063, creation 894

Счётчик аллокатора монотонен и фиксируется в каждом заголовке.

Сегментированное хранение

Вектор разделён на сегменты по 2^16 слотов. Сегмент материализуется только при наличии активного UTXO. Пустые сегменты виртуальны, а очистка последнего занятого слота удаляет сегмент из физического хранилища.

Нода получает два полезных представления:

  • точные сырые столбцы сегментов в MDBX для запросов кошелька и материализации переходов;
  • компактное дерево корней сегментов для аутентификации State.

В исходном домене 2^24 достаточно 256 корней сегментов. Вместе с верхними узлами дерева компактный кеш точного корня занимает менее 17 КиБ. Сырые данные сегмента можно независимо загружать и вытеснять, а зафиксированный корень при этом остаётся точным.

Доказательство перехода

Майнер собирает только сегменты, которых касается выбранный блок. Публичное отношение блока доказывает, что:

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

Принятый блок раскрывает канонические записи. Остальные полные ноды проверяют HistoryStep и применяют эти записи; они не вычисляют их повторным исполнением транзакций.

Расширение

Расширение определяется жёстко финализированным окном занятости из 18 заголовков. Для дочернего блока родителя высоты H окно заканчивается на H - 18, поэтому реорганизуемый суффикс на него не влияет.

Если не менее 10 из 18 финализированных заголовков показывают занятость от 75%, дочерний блок увеличивает log_slots на единицу. Разделение 9/9 расширения не вызывает.

Существующее дерево становится левым потомком нового корня, а пустое дерево той же глубины — правым:

text
новый корень
├── предыдущий точный state_root
└── каноническое пустое поддерево

UTXO не перемещаются, сегменты не копируются, номера слотов сохраняются. Работа по обновлению корня не зависит от числа занятых слотов.

Расширение также переводит эмиссию на следующий уровень награды. Оно не меняет существующие значения и не создаёт миграционную транзакцию.

Давление на State и комиссии

Обычная работа со входами и выходами имеет фиксированную часть комиссии. Чисто новые занятые слоты дополнительно оплачивают рост State; множитель этой части увеличивается вместе с занятостью.

Занятость Множитель роста
Ниже 50%
От 50% до 75%
От 75% до 90%
90% и выше

Компонент роста сжигается. Остаток комиссии может получить майнер. Транзакция, которая уменьшает или сохраняет число занятых слотов, не платит за рост.

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

Перезапуск и реорганизация

MDBX сохраняет изменения State в одной транзакции. Для недавних блоков данные отката содержат точные предыдущие значения и счётчики, необходимые для восстановления State. Нода хранит такие данные для 36 блоков, тогда как консенсус разрешает каноническую реорганизацию максимум на 17 блоков.

При перезапуске Live State не восстанавливается от генезиса. Нода загружает сохранённый Live State, проверяет его канонические метаданные и продолжает с текущего терминального доказательства.

Нормативные правила приведены в разделе «Переход State», а аутентифицированная передача — в разделе «Синхронизация».

Техническая документация ParanO(1)dПоведение консенсуса определяется исходным кодом.