Карантин повторного использования на 256 корзин и упакованные идентификаторы поколений UTXO были реализованы против одной угрозы: физический слот может позднее содержать выход с тем же видимым значением, но уже другой идентичностью. Идентификаторы различают последовательные выходы, разрешают повторное использование в том же блоке, отклоняют старые открытия и устраняют второй корень State вместе с соответствующими семействами доказательств. Идентификатор остаётся локальным для ветви и однозначно связывается с канонической историей.
Проблема повторного использования слота
UTXO — непотраченный выход транзакции. ParanO(1)d хранит текущие 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 и входного листа |
| Расходование → создание в одном блоке | Новый выход использует следующий ID | Однозначно |
| Создание → расходование в одном блоке | Дочерний вход указывает созданный ID | Однозначно |
| Пропущенные, повторные или переставленные ID | Отклонить | Отклонено |
Счётчик u64::MAX | Не допустить переполнения | Отклонено по правилам консенсуса |
Прототип также проверил, что creation_id = 0 сохраняет базовые последовательности хеширования. Идентификатор поколения поместился в существующей координате поля: дополнительный лист, корень заголовка или семейство доказательств не понадобились.
Границы конструкции
Идентификатор локален для ветви. Откат восстанавливает счётчик распределения вместе со State, поэтому конкурирующие ветви могут назначить одинаковый числовой идентификатор разным выходам. Привязка к ветви и эпохе остаётся обязанностью канонической истории. Конструкция решает проблему устаревших открытий точного State внутри одной канонической ветви, но не создаёт глобальное пространство имён выходов транзакций.
Результат
Идентификаторы поколений заменили карантинное кольцо и позволили удалить отношения доказательств ReuseGuard. В общем случае, когда повторно используемое физическое место представляет последовательные логические объекты, проще включить монотонный идентификатор поколения непосредственно в криптографическое обязательство к объекту, чем поддерживать вторую структуру консенсуса, запоминающую момент разрешённого повторного использования.