Потерянный ответ — не отказ операции#
Хост мог выполнить действие, а ответ потерялся. Новый запуск операции при каждой задержке способен повторно списать деньги или создать второй корабль.
X4FO хранит ID запроса и неизменяемый исход. Повтор получает прежний результат, а не повторяет эффект.
Минимальная модель#
Псевдокод, не вызовы API игры:
если request_id уже известен:
сверить исходное содержание запроса
вернуть сохранённый исход
иначе:
проверить контекст, владельца, ревизию и ресурсы
выполнить операцию и прочитать её реальный эффект
сохранить исход в том же согласованном состоянииПри том же ID и другом содержимом запрос должен быть отклонён. Для терминального отказа повтор тоже возвращает тот же отказ, если именно так определён контракт операции.
Отмена после завершения#
Нельзя превращать старое решение в новое только потому, что мир успел измениться. В сценариях отмены верфи сохранялся исходный отказ, включая повтор после выпуска корабля.
Проверены потерянный ответ отмены, повтор с новым nonce, неизвестный заказ, подмена цели, чужой владелец и полный перезапуск. Это область среза 0.50, а не доказательство всех коммерческих операций.
Проверяйте счета#
Для перевода сравнивались реальные счета до и после. Знак возвращённого transfer_money результата оказался недостаточным основанием для суммы обратного перевода. Откат по неверной интерпретации мог повторить списание.
Нативный эффект и журнал нельзя разделять произвольным ожиданием так, чтобы сохранение застало только половину операции.