Тайм-аут на вывод не должен создавать новую идентичность

Запрос на вывод истекает. Казалось бы, простое решение: заново собрать транзакцию и отправить её повторно.

Однако на Dusk это может усложнить операционную проблему.

Для выводов через Moonlight в руководстве по интеграции сказано, что транзакцию следует собрать и подписать один раз: сохранить её сериализованные байты и transaction ID до отправки. Если при отправке происходит тайм-аут транспортного уровня, безопасный повтор — повторно передать те же самые подписанные байты. Транзакция сохраняет ту же идентичность, пока в процессе расследования проверяется её статус в блокчейне.

Почему это важно? Потому что тайм-аут не доказывает, что первая попытка не удалась. Даже 202 Accepted подтверждает только маршрутизацию, но не включение в блок или окончательность. Создание другой транзакции до разрешения этой неопределённости добавляет ещё один объект, за которым должна следить система вывода.

Moonlight делает это различие явным. Транзакции используют последовательные значения account nonce, и конфликтующая транзакция с тем же nonce заменяет существующую запись в mempool только тогда, когда её цена газа строго выше. Такая замена имеет другой transaction ID. Поэтому Dusk советует операторам биржи сопоставить оба ID и исключить двойное списание.

Таким образом, «повтор» и «замена» — не взаимозаменяемые действия на бэкенде. Повтор сохраняет идентичность платежной попытки. Замена намеренно создаёт новую идентичность для того же nonce.

Для инфраструктуры кастодиального хранения идемпотентность выходит за рамки дизайна базы данных: сборка транзакции, выделение nonce, подписанные байты и бухгалтерские записи должны описывать один и тот же вывод.

@Dusk $DUSK #dusk