Переход State
State — разреженный Merkle-вектор записей UTXO вместе со счётчиками
консенсуса. Его активный домен содержит 2^log_slots листьев, где log_slots
изменяется от 24 до 32. После каждого блока заголовок фиксирует корень, число
активных записей и счётчик аллокатора.
Состояния листа
Лист либо канонически пуст, либо содержит:
{amount: u64, creation_id: u64, owner: 32 bytes}
Криптографическое обязательство упаковывает сумму и идентификатор создания в
один элемент (lane) GF(2^128) и
хеширует его вместе с владельцем под доменом UTXO-листа.
Порядок перехода
Консенсус выводит из блока один упорядоченный переход:
- проверить и выделить основную награду;
- при наступлении срока проверить и выделить выплату фондам развития;
- обработать пользовательские группы
PagedSpendв порядке блока; - очистить каждый использованный вход;
- назначить новые идентификаторы создания и установить выходы;
- обновить корни сегментов, число активных записей и счётчик аллокатора;
- восстановить глобальный корень
State.
Атомарность логической транзакции сохраняется, хотя её физические страницы являются последовательными записями блока.
Правила входов
Каждый активный пользовательский вход обязан:
- находиться в домене родительского
State; - указывать на занятый в данный момент слот;
- совпадать по заявленной сумме и общему владельцу;
- совпадать с текущим
creation_id; - встречаться в блоке только один раз;
- быть авторизован доказательством кошелька своей группы.
Записи награды и выплаты фондам развития не имеют входов и проверяются по системному расписанию.
Правила выходов
Каждый активный пользовательский выход обязан:
- находиться в домене дочернего
State; - указывать на слот, пустой с учётом более ранних действий блока;
- иметь ненулевое значение;
- встречаться в блоке только один раз.
Аллокатор выбирает новый монотонный creation_id. Подсказки выходных слотов
лишь помогают при построении; блок всё равно обязан доказать их пустоту
относительно точного родителя.
Сохранение значений
Внутри каждой логической пользовательской группы:
sum(inputs) = sum(outputs) + fee
Во всём блоке созданное значение ограничено субсидией протокола. Верхняя
граница основной награды включает долю майнера и доступные ему комиссии.
Сожжённая комиссия за рост State из этой границы исключается.
Во всех агрегированных денежных вычислениях используется целочисленный тип,
достаточно широкий, чтобы сумма допустимых полей u64 не могла незаметно
достичь предельного значения.
Сегменты
Листья объединены в сегменты по 2^16 слотов. Один блок может затронуть не
более 256 разных сегментов. Эта консенсусная граница доступности данных
проверяется до загрузки сегментов.
Пустые сегменты используют канонический корень пустого поддерева и не требуют отдельного столбца MDBX. Сегмент удаляется после расходования последнего активного UTXO.
Правило расширения
Для дочернего кандидата родителя высоты H используются 18 жёстко
финализированных заголовков, заканчивающихся на высоте H - 18. Первое полное
окно доступно при высоте родителя 35 и покрывает высоты 0–17.
Подсчитываются заголовки, удовлетворяющие:
active_slot_count × 4 >= 2^log_slots × 3
Если условие выполняется как минимум для 10 из 18 заголовков и
log_slots < 32, дочерний блок обязан установить
log_slots = parent.log_slots + 1. Иначе он сохраняет значение родителя.
При расширении предыдущий корень становится левым потомком нового корня, а каноническое пустое поддерево — правым. Существующие индексы слотов и записи не перемещаются.
Данные реорганизации
Недавние записи отката сохраняют предыдущее значение каждого затронутого слота, корня сегмента и счётчика. Они хранятся 36 блоков, тогда как консенсус допускает откат не более 17 блоков.
Запись отката — это локальные данные восстановления, а не альтернативный свидетель консенсуса. Замещающей ветви всё равно нужны корректные заголовки, работа и терминальные доказательства.