Потерянный ответ — не отказ операции#

Хост мог выполнить действие, а ответ потерялся. Новый запуск операции при каждой задержке способен повторно списать деньги или создать второй корабль.

X4FO хранит ID запроса и неизменяемый исход. Повтор получает прежний результат, а не повторяет эффект.

Минимальная модель#

Псевдокод, не вызовы API игры:

TEXT
если request_id уже известен:
    сверить исходное содержание запроса
    вернуть сохранённый исход
иначе:
    проверить контекст, владельца, ревизию и ресурсы
    выполнить операцию и прочитать её реальный эффект
    сохранить исход в том же согласованном состоянии

При том же ID и другом содержимом запрос должен быть отклонён. Для терминального отказа повтор тоже возвращает тот же отказ, если именно так определён контракт операции.

Отмена после завершения#

Нельзя превращать старое решение в новое только потому, что мир успел измениться. В сценариях отмены верфи сохранялся исходный отказ, включая повтор после выпуска корабля.

Проверены потерянный ответ отмены, повтор с новым nonce, неизвестный заказ, подмена цели, чужой владелец и полный перезапуск. Это область среза 0.50, а не доказательство всех коммерческих операций.

Проверяйте счета#

Для перевода сравнивались реальные счета до и после. Знак возвращённого transfer_money результата оказался недостаточным основанием для суммы обратного перевода. Откат по неверной интерпретации мог повторить списание.

Нативный эффект и журнал нельзя разделять произвольным ожиданием так, чтобы сохранение застало только половину операции.