Великий баг (08.09.2018) aka ценник 300.000.000



  • Опишите пожалуйста, что произошло, как восстановили, как исправили, как это работает сейчас и самое главное, будет ли компенсация автору бага (мне) за его нахождение?)


  • administrators

    Баг был в коде market бота. Причина в округлении суммы новой цены. Например, если ордер бота на продажу обработался, он создаёт новый ордер для выкупа равного количества голдов по заниженной цене. Цена уменьшалась на 0,1% * (random от 1 до 5). Итоговая цена округлялась, чтобы в стакане у ордеров бота были круглые цены: 973 вместо 973,12. Из-за этого при подходе к 100, новая уменьшенная цена получалась, например 99,95 и округлялась до 100. Сначала новые ордеры бота стремились к 100, а потом перекрылся спред и ордера бота стали отклоняться в связи с попыткой совершить операцию с самим собой. Точно не выяснено, но похоже игрок Александр разом продал объём превышающий общую сумму bid ордеров бота, потому что при низкой цене он стал меньше 100000 кешей. В итоге market бот лишился всех ордеров. Crowd бот и ядро биржи работало в штатном режиме.

    Сделано:

    • Убрано округление. Теперь цены ордеров бота не ровные, зато нет проблем с масштабом цены.
    • Максимальный объём рыночного cash ордера вычисляется динамически: maxCashOrder = 100 * price. Предположительно, теперь общее предложение market бота будет всегда больше максимального рыночного cash ордера.
    • Протестировано снижение цены до 0,01. Если кто-то опять догонит, то сможет закрыть все bid ордеры бота. При этом ask ордеры остаются.
    • Пришлось восстановить базу на начало суток.

    Выводы:

    • Плохо тестировали поведение бота при низких ценах. Не удосужились посмотреть, что будет если слить 10000 голдов.

    Большое спасибо Александру за постоянную проверку игры на прочность и за нахождение этого бага! Ваши затраты полностью компенсированы при восстановлении базы:)

    Есть побочный эффект восстановления базы. Клиентские данные содержат связанные списки (нотификации и чаты). Контроль целостности данных жёсткий, поэтому возможны ошибки при отправлении сообщения в чат. Лечится путём Profile > Logout и входа заново. Если в процессе соединения произошла ошибка (при загрузке новых уведомлений), то автоматом происходит logout и при новом входе все клиентские данные загружаются заново. В общем если что-то пошло не так, делаем выход и новый вход. Удаление процесса приложения и новый запуск не поможет.


  • administrators

    Еще был вопрос про максимальную цену голда. Никаких ограничений нет. Но максимальная цена в ордере ограничена текущей ценой * 3, и минимальная текущая цена / 3. Недавно уменьшили этот коэффициент с 4 до 3.