Сегодня я застрял на одной крошечной строке в рабочем процессе Babylon, и честно говоря, это меня задело больше, чем сам баг… Гонка живёт только между чтением старого состояния и записью нового. Звучит почти безобидно, если сказать это так: всего несколько мгновений внутри бэкенда, но потом я начал думать: стойте, вся безопасность тут зависит от того, что может произойти в эти моменты.

Я перестал смотреть на это как: «А вдруг кто-то сможет атаковать это?» — и начал смотреть на порядок. Сервис читает состояние, делает проверку, в это же время почти одновременно что-то ещё сдвигается, а затем обновление записывается. В большинстве случаев промежуток настолько мал, что ничего не ломается, и снаружи это выглядит полностью безопасным.

Но «очень маловероятно» и «невозможно» — это не одно и то же.

Вот что не выходило у меня из головы.

Думаю, Babylon делает довольно нормальный инженерный компромисс… Не надо тормозить всю систему тяжёлыми блокировками или лишней координацией только чтобы убрать одно маленькое окно по времени. Нужно сделать это окно настолько узким, чтобы использовать его стало крайне трудно. Возможно, это правильный выбор; а может, если убрать полностью, это создаст больше задержек и новые проблемы где-то ещё.

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

И я всё время спрашиваю себя: где проходит эта грань… насколько маленьким должно стать окно гонки, чтобы мы посчитали это приемлемым, и какие части протокола вообще никогда не должны зависеть от тайминга?

Возможно, система не убирает гонку.

Возможно, она просто делает финишную линию почти недостижимой.

@BabylonLabs_io #baby $BABY