Карантин повторного использования на 256 корзин и упакованные идентификаторы поколений UTXO были реализованы против одной угрозы: физический слот может позднее содержать выход с тем же видимым значением, но уже другой идентичностью. Идентификаторы различают последовательные выходы, отклоняют старые открытия и устраняют второй корень State вместе с соответствующими семействами доказательств. Повторное использование физического слота внутри одного блока по-прежнему запрещает правило уникальности операций. Идентификатор остаётся локальным для ветви и однозначно связывается с канонической историей.
Проблема повторного использования слота
UTXO — непотраченный выход транзакции. Parano1d хранит текущие UTXO в ограниченном State, где физический слот служит повторно используемым индексом, а не постоянным именем выхода. Точное открытие State — доказательство Merkle, аутентифицирующее полное содержимое листа в таком слоте. Если позднее тот же слот снова содержит ту же сумму и того же владельца, старое открытие не должно подтверждать новый выход. Это классическая последовательность A→B→A, или проблема ABA: видимое значение вернулось к A, хотя логический объект уже другой.
Эксперимент 1. Карантин консенсуса
Первая конструкция использовала ReuseGuard — вторую структуру State, определявшую момент, когда освобождённый слот снова разрешалось занять. Она была организована как кольцо из 256 корзин. Слот оставался в карантине на один блок дольше окна финальности протокола; консенсус нёс отдельный корень этой структуры, пути корзин и отношения доказательств.
ReuseGuard предотвращал немедленное повторное использование, но создавал расходы, не связанные с самим значением UTXO:
- дополнительный корень State в консенсусе и отдельный домен отката;
- три компонента доказательства для корзин
ReuseGuardи привязки корня State; - два пути перехода, обязанные одинаково обновлять
ReuseGuard.
Тест эквивалентности прототипа намеренно запускал оба пути перехода и отклонял расхождения в правиле обновления ReuseGuard. Пути можно было сделать идентичными, но эквивалентность пришлось бы доказывать постоянно из-за второго автомата State.
Эксперимент 2. Поместить идентичность в значение
Альтернатива упаковывает сумму и монотонный идентификатор создания в существующую 128-битную координату значения:
Каждый обычный создаваемый выход получает следующий локальный для ветви creation_id. Основная награда за блок тоже увеличивает счётчик распределения, но записывает идентификатор, образованный из высоты блока и принадлежащий отдельному пространству имён. Поэтому лист точного State и входной лист фиксируют криптографическим обязательством логическое поколение выхода вместе со слотом, владельцем и суммой.
Негативные и граничные тесты
| Сценарий | Ожидаемое свойство | Результат |
|---|---|---|
| Тот же слот, владелец и сумма; новый ID | Старое точное открытие должно завершиться ошибкой | Разные хеши State и входного листа |
| Один физический слот участвует в двух действующих операциях одного блока | Отклонить до применения перехода | BlockSlotConflict |
| Пропущенные, повторные или переставленные ID | Отклонить | Отклонено |
Следующий ID распределителя попадает в пространство наград или переполняет u64 | Не допустить пересечения пространств имён и переполнения | Отклонено по правилам консенсуса |
Прототип также проверил, что creation_id = 0 сохраняет базовые последовательности хеширования. Идентификатор поколения поместился в существующей координате поля: дополнительный лист, корень заголовка или семейство доказательств не понадобились.
Границы конструкции
Идентификатор локален для ветви. Откат восстанавливает счётчик распределения вместе со State, поэтому конкурирующие ветви могут назначить одинаковый числовой идентификатор разным выходам. Привязка к ветви и эпохе остаётся обязанностью канонической истории. Конструкция решает проблему устаревших открытий точного State внутри одной канонической ветви, но не создаёт глобальное пространство имён выходов транзакций.
Результат
Идентификаторы поколений заменили карантинное кольцо и позволили удалить отношения доказательств ReuseGuard. В общем случае, когда повторно используемое физическое место представляет последовательные логические объекты, проще включить монотонный идентификатор поколения непосредственно в криптографическое обязательство к объекту, чем поддерживать вторую структуру консенсуса, запоминающую момент разрешённого повторного использования.