Проблема: почему анализ систем — это боль
Представьте, что у вас есть система, которая может находиться в разных состояниях.
Вот примеры из реальной жизни:
-
Банк — состояние: обычный пользователь, оператор, администратор
-
Автопилот БПЛА — состояние: взлёт, набор высоты, патрулирование, возврат, авария
-
Сетевое соединение — состояние: установка связи, передача данных, ошибка, закрытие
-
Смарт-контракт — состояние: ожидание, выполнение, заблокирован
-
Лифт в небоскрёбе — состояние: этаж, открыты/закрыты двери, есть ли вызовы
Главный вопрос, который постоянно нужно задавать:
«Если система сейчас в состоянии X, может ли она когда-нибудь попасть в состояние Y?»
Зачем это нужно знать:
-
Банку — может ли пользователь получить права администратора? (взлом безопасности)
-
Атомной станции — может ли реактор попасть в опасный режим? (предотвращение катастрофы)
-
БПЛА — может ли миссия войти в аварийный цикл? (спасение дрона)
-
Смарт-контракту — можно ли навсегда заблокировать средства? (аудит безопасности)
В чём проблема:
Состояний может быть миллионы, миллиарды. Каждый раз запускать поиск в ширину (BFS) или глубину (DFS) — слишком долго. А если нужно задать миллион таких вопросов? А если система меняется в реальном времени?
Как решают сегодня (классический подход):
// Классика: BFS из начального состоянияbool CanReachBad(int start, bool[] bad, int[][] graph){ var queue = new Queue<int>(); var visited = new bool[n]; queue.Enqueue(start); visited[start] = true; while (queue.Count > 0) { int u = queue.Dequeue(); if (bad[u]) return true; foreach (int v in graph[u]) if (!visited[v]) { visited[v] = true; queue.Enqueue(v); } } return false;}// Для каждого запроса — новый BFS (очень медленно!)foreach (var start in thousandQueries){ bool answer = CanReachBad(start, badStates, graph);}
Сложность: O(Q × (V+E)). Для миллиона запросов на графе из миллиона вершин — это миллиарды операций.
Идея: а что если один раз всё предвычислить?
Мы рассуждали так:
Если система детерминированная (из каждого состояния ровно один переход), то можно предвычислить таблицы прыжков — как в быстром возведении в степень, но для переходов между состояниями.
Тогда вопрос «где будет система через N шагов?» решается за O(log N) вместо O(N). Ускорение — тысячи раз.
Если система недетерминированная (из состояния несколько выходов), то можно один раз построить обратный индекс достижимости — как поисковый индекс Google, только для графов состояний.
Тогда миллионы запросов «достижимо ли B из A?» отвечаются за O(1) — просто проверкой массива.
Аналогия из жизни:
Без предвычисления — как искать книгу в библиотеке, каждый раз проходя между рядами и просматривая каждую полку.
С предвычислением — как Google: один раз проиндексировали все книги, а потом поиск занимает доли секунды.
Что получилось: платформа SymFSM
Мы построили платформу, которая умеет:
-
Принимать на вход любую дискретную систему — протокол, программу, робота, БПЛА, цифровой двойник
-
Строить индекс — один раз, тяжело (секунды для миллионов состояний)
-
Отвечать на вопросы — миллионы раз, легко (наносекунды)
Типы вопросов:
|
Тип |
Что спрашиваем |
Сложность |
|---|---|---|
|
Reach(A,B) |
Можно ли попасть из A в B? |
O(1) |
|
Distance(A,B) |
За сколько шагов? |
O(log N) |
|
Attractor(A) |
В какой цикл попадёт система? |
O(1) |
|
Future(A,N) |
Где будет система через N шагов? |
O(log N) |
Как это выглядит в коде:
// Клиент загружает автоматvar e = new SymFsmEngine(stateCount, symbolCount);e.SetTransitionTable(symbol, transitions);e.BuildJumpTables(24); // один раз построили индекс// Анализ достижимости (недетерминированный случай)var ra = new ReachabilityAnalyzer(succ);bool[] canReachBad = ra.ReverseReachable(badStates);// Миллионы запросов — мгновенноforeach (var start in queries){ bool dangerous = canReachBad[start]; // O(1) — наносекунды! int distance = dist[start];}
Как мы тестировали: не синтетика, а реальные системы
Мы не использовали случайные графы — они могут давать завышенные результаты. Вместо этого мы взяли реальные системы из промышленности:
-
Протоколы: TLS 1.3, QUIC (HTTP/3), HTTP/2, OPC-UA (промстандарт), MQTT (IoT)
-
Алгоритмы синхронизации: Peterson, Bakery, Обедающие философы (классика OS)
-
Кибербезопасность: Snort (100 000 сигнатур), Suricata, CFG вредоносного ПО
-
Компиляторы: DFA регулярных выражений, LR/LALR парсеры, лексеры
-
Робототехника: мобильные роботы, манипуляторы, складские рои
-
БПЛА: миссии дронов, рои из 10 000 дронов, перехват целей
-
Оборона: многоэшелонированная ПВО, радиолокация, РЭБ
-
Цифровые двойники: энергосети, ж/д сети, заводы
Всего — 47 бенчмарков, от 5 состояний (MQTT) до 4.8 миллионов состояний (14 философов).
Результаты тестирования
Первые тесты (без RaaS)
Мы начали с простых вещей — проверили ускорение на классических задачах: DFA, Aho-Corasick, сетевые протоколы, Game of Life.
Вот что получилось:
|
Направление |
Что делали |
Ускорение |
|---|---|---|
|
DFA / Regex (F^16M) |
16 млн шагов вперёд |
x616 028 |
|
Game of Life 4×4 (F^16M) |
16 млн поколений |
x444 558 |
|
Сетевые протоколы (F^1M) |
миллион тактов симуляции |
x67 442 |
|
Aho-Corasick (100k сигн.) |
поиск по автомату |
x3 987 |
|
Model Checking |
анализ всех циклов |
x249 |
|
Reachability (BFS vs reverse) |
проверка достижимости |
x23 556 |
Ключевые выводы первых тестов:
-
Детерминированные системы (DFA, Life, протоколы) ускоряются в сотни тысяч раз за счёт jump-таблиц
-
Недетерминированные системы (reachability) ускоряются в десятки тысяч раз за счёт амортизации
-
Даже на малых размерах (Aho-Corasick, парсеры) ускорение стабильно держится на уровне тысяч раз
Оборонные и аэрокосмические системы
Мы подумали: а что если проверить на том, где каждая миллисекунда на счету? Взяли автопилот БПЛА, системы ПВО, рои дронов.
Результаты:
|
Направление |
Что проверяли |
Ускорение |
Вердикт |
|---|---|---|---|
|
Автопилот БПЛА (F^16M) |
посадка через 16 млн шагов |
x1 385 382 |
посадка достижима ✅ |
|
Анализ миссий UAV |
262 тыс. конфигураций |
x174 |
132 зацикленных миссии ⚠️ |
|
Рой роботов |
131 тыс. конфигураций |
x74 |
1 deadlock, 69 livelock ⚠️ |
|
Радиоканал (потеря связи) |
50 тыс. состояний |
x26 160 |
потеря связи из 100% 🔴 |
|
Промышленный PLC |
40 тыс. состояний |
x125 391 |
авария из 100% 🔴 |
|
Космический аппарат |
128 состояний |
x10 |
SAFE MODE из 100% ✅ |
|
Радарное сопровождение |
65 тыс. конфигураций |
x125 |
44 цикла потери трека ⚠️ |
Что это значит для оборонки:
SymFSM позволяет за миллисекунды доказывать безопасность систем, где раньше требовались часы и дни верификации. Автопилот БПЛА — безопасен (посадка достижима). Радиоканал — опасен (потеря связи из любого состояния). Промышленный контроллер — опасен (авария из любого состояния).
Код проверки автопилота:
// Построение модели автопилота (64 состояния)var flightController = BuildFlightControllerModel();var fsm = new SymFsmEngine(64, 1);fsm.SetTransitionTable(0, flightController);fsm.BuildJumpTables(24);// Проверка: достижима ли посадка через 16 млн шагов?int state = 0; // INITint finalState = fsm.Jump(0, 16_777_216, 0);bool landingReachable = (finalState & 7) == 7; // DONE = 7
Сенсорные и трекинговые системы
Потом проверили системы, которые следят за целями — радары, сенсорная интеграция, обнаружение роев.
Результаты:
|
Направление |
Что делали |
Ускорение |
Вердикт |
|---|---|---|---|
|
Multi-Sensor Track (F^16M) |
16 млн шагов трека |
x469 726 |
51.6% треков теряются |
|
Радарное управление треком |
анализ всех состояний |
x99 |
5 циклических режимов |
|
Сенсорная интеграция (R/EO/IR/RF) |
проверка ложных треков |
x58 |
ложный трек из 9% |
|
Обнаружение роя (10 млн дронов) |
предсказание распределения |
x106 587 |
рой распределяется по 8 фазам |
|
Классификация траекторий |
262 тыс. траекторий |
x417 |
10 устойчивых, 158 неустойчивых |
|
Раннее предупреждение |
анализ ложных тревог |
x24 062 |
ложная тревога из 100% 🔴 |
|
Распределённая сеть |
131 тыс. конфигураций |
x348 |
10 отказовых, 151 восстановление |
Код предсказания роя дронов:
// Построение модели роя (1 млн дронов)var swarmModel = BuildSwarmModel(1_000_000);var fsm = BuildFN(swarmModel, 20);// Распределение после миллиона тактовvar distribution = new int[8];for (int i = 0; i < 100000; i++){ int startState = random.Next(1_000_000); int finalState = fsm.Jump(startState, 1_000_000, 0); distribution[finalState & 7]++; // 3 бита фазы}// Результат: ph0:18%, ph1:16%, ph2:11%, ph3:8%, ph4:6%, ph5:10%, ph6:14%, ph7:16%
Reachability-as-a-Service (RaaS) — главный результат
И вот тут началось самое интересное. Мы поняли, что платформа может больше, чем просто ускорять отдельные задачи. Она может стать сервисом, который отвечает на любые вопросы о будущем системы.
Что такое RaaS:
Облачная платформа, которая принимает на вход граф состояний (FSM, протокол, программу, робота, БПЛА), один раз строит индекс, а затем отвечает на миллиарды запросов о достижимости, расстоянии, аттракторах и будущем состоянии.
Четыре типа запросов, которые поддерживает RaaS:
|
Запрос |
Что спрашиваем |
Пример |
|---|---|---|
|
Reach(A,B) |
Можно ли попасть из A в B? |
«Может ли пользователь стать админом?» |
|
Distance(A,B) |
За сколько шагов? |
«Через сколько тактов робот столкнётся?» |
|
Attractor(A) |
В какой цикл попадёт система? |
«Закрутится ли дрон?» |
|
Future(A,N) |
Где будет система через N шагов? |
«Где будет БПЛА через час?» |
Код RaaS для клиента:
// Клиент загружает автомат (1 млн состояний)var e = new SymFsmEngine(stateCount, symbolCount);e.SetTransitionTable(symbol, transitions);e.BuildJumpTables(24); // один раз построили индекс// Анализ достижимости (недетерминированный случай)var ra = new ReachabilityAnalyzer(succ);bool[] canReachBad = ra.ReverseReachable(badStates);int[] distanceToBad = ra.ReverseDistance(badStates);// Миллионы запросов — наносекундыforeach (var start in millionQueries){ bool dangerous = canReachBad[start]; int steps = distanceToBad[start]; var attractor = e.GetAttractor(start, 0); int future = e.Jump(start, 1_000_000_000_000L, 0);}
Результаты RaaS-тестирования (47 бенчмарков):
A. Ядро RaaS (масштабируемость)
|
Бенчмарк |
Состояний |
Ускорение |
Пропускная способность |
|---|---|---|---|
|
Динамическая смена цели |
1 млн |
x123 430 |
108 млн q/с |
|
База данных достижимости |
1 млн |
x122 457 |
166 млн q/с |
|
Динамический Unsafe Atlas |
1 млн |
x207 594 |
186 млн q/с |
B. Model Checking (SPIN) — верификация алгоритмов
|
Алгоритм |
Состояний |
Ускорение |
Вердикт |
|---|---|---|---|
|
Peterson (8 проц.) |
390 625 |
x301 |
нарушение из 100% |
|
Dining Philosophers (12) |
531 441 |
x270 796 |
deadlock из 100% |
|
Dining Philosophers (13) |
1.59 млн |
x693 044 |
deadlock из 100% |
|
Dining Philosophers (14) |
4.78 млн |
x1 377 723 |
deadlock из 100% |
|
Producer-Consumer |
100 003 |
x124 443 |
overflow из 100% |
|
Elevator Controller |
768 |
x2 612 |
безопасен ✅ |
C. Сетевые протоколы
|
Протокол |
Состояний |
Ускорение |
Вердикт |
|---|---|---|---|
|
TLS 1.3 |
13 |
x17 |
ERROR из 92% |
|
QUIC |
7 |
x32 |
LOST из 71% |
|
HTTP/2 |
7 |
x15 |
deadlock из 86% |
|
OPC-UA |
12 |
x26 |
Faulted из 100% |
|
MQTT |
5 |
x24 |
session loss из 100% |
D. Кибербезопасность
|
Система |
Состояний |
Ускорение |
Вердикт |
|---|---|---|---|
|
Snort IDS (100k сигн.) |
303 088 |
x50 159 |
alert из 100% |
|
Suricata (100k сигн.) |
377 565 |
x107 353 |
alert из 100% |
|
Malware CFG |
500 000 |
x218 605 |
payload из 100% |
|
Exploit RCE |
500 000 |
x1 192 953 |
RCE из 100% |
|
Binary Vuln Atlas |
1 млн |
x34 091 |
уязвимость из 100% |
E. Компиляторы
|
Система |
Размер |
Ускорение |
Вердикт |
|---|---|---|---|
|
Regex DFA (F^16M) |
1 млн |
x910 462 |
91 нс вместо 90 мс |
|
LR/LALR парсер |
100 000 |
x146 175 |
ошибка из 100% |
|
Lexer Reachability |
50 000 |
x991 990 |
все токены достижимы ✅ |
F. Программный код (CFG, LLVM, Smart Contracts)
|
Система |
Состояний |
Ускорение |
Вердикт |
|---|---|---|---|
|
Linux kernel CFG |
1 млн |
x25 233 |
unsafe из 100% |
|
LLVM IR UB |
800 000 |
x57 376 |
UB из 100% |
|
Smart Contract |
100 000 |
x69 003 |
reentrancy из 100% |
|
EVM loss of funds |
200 000 |
x72 528 |
loss из 100% |
G. Робототехника
|
Система |
Состояний |
Ускорение |
Вердикт |
|---|---|---|---|
|
Mobile Robot |
262 144 |
x141 337 |
collision из 100% |
|
Warehouse Fleet |
1 млн |
x412 468 |
collision из 100% |
H. БПЛА и оборона
|
Система |
Состояний |
Ускорение |
Вердикт |
|---|---|---|---|
|
Swarm (10 000 дронов) |
1 млн |
x814 340 |
collapse из 100% |
|
Multi-Layer Air Defense |
500 000 |
x554 442 |
прорыв из 100% |
|
Radar Track (F^16M) |
65 536 |
x726 592 |
потеря сопровождения |
I. Цифровые двойники
|
Система |
Состояний |
Ускорение |
Вердикт |
|---|---|---|---|
|
Smart Grid |
500 000 |
x270 068 |
каскад из 100% |
|
Railway Network |
300 000 |
x202 652 |
deadlock из 100% |
|
Factory Twin |
400 000 |
x177 109 |
останов из 100% |
Флагманские демонстрации RaaS
Демо 1: 1 миллиард запросов за 29 секунд
Построили индекс на 4 млн состояний (0.9 секунды). Затем выполнили 1 000 000 000 (миллиард) запросов четырёх типов (Reach, Distance, Attractor, Future).
Результат: 1 миллиард запросов за 28.93 секунды. Пропускная способность — 34.6 млн запросов в секунду. Средняя латенси — 28.9 наносекунды.
// 1 миллиард запросов за 29 секундfor (long q = 0; q < 1_000_000_000; q++){ int a = probe[q & mask]; switch (q & 3) { case 0: answer = reach[a]; break; // Reach case 1: answer = dist[a]; break; // Distance case 2: answer = e.GetAttractor(a, 0); break; // Attractor case 3: answer = e.Jump(a, 1_000_000, 0); break; // Future }}
Демо 2: «Поисковик по будущему» (10¹² шагов вперёд)
Отвечаем на вопрос «где будет система через 1 триллион (10¹²) шагов?» — 5.28 млн запросов в секунду. Классический подход физически невозможен: триллион итераций никто не будет ждать.
Демо 3: Универсальный API для всех систем
Один и тот же API запускается на 9 разнородных системах — от DFA до роя дронов. Везде работает одинаково.
|
Система |
Состояний |
QPS (Reach) |
Вердикт |
|---|---|---|---|
|
DFA |
200 000 |
246 млн |
0% дост. |
|
TLS 1.3 |
13 |
219 млн |
92% дост. |
|
QUIC |
7 |
251 млн |
71% дост. |
|
HTTP/2 |
7 |
189 млн |
86% дост. |
|
Dining Philosophers |
59 049 |
228 млн |
100% дост. |
|
Aho-Corasick |
20 502 |
256 млн |
100% дост. |
|
Robotics |
50 000 |
254 млн |
100% дост. |
|
UAV |
50 000 |
256 млн |
100% дост. |
|
Air Defense |
50 000 |
255 млн |
100% дост. |
Итоговая сводка
Общая статистика
|
Показатель |
Значение |
|---|---|
|
Всего бенчмарков |
47 |
|
NFA-REACH: среднее ускорение |
x222 219 |
|
NFA-REACH: максимальное ускорение |
x1 377 723 |
|
FUNC-JUMP: среднее ускорение |
x818 527 |
|
Максимальная пропускная способность |
1.06 млрд запросов/сек |
|
Минимальная латенси |
0.9 наносекунды |
|
Самый большой граф |
4.78 млн состояний |
|
Рекорд ускорения (F^N) |
x1 388 204 (автопилот БПЛА) |
Что мы доказали
-
Детерминированные системы (DFA, протоколы, трекинг) — jump-таблицы дают ускорение до 1.4 миллиона раз. Вопрос «где будет система через 16 млн шагов?» — ответ за 100 наносекунд.
-
Недетерминированные системы (NFA, SPIN, CFG, оборона) — амортизация индекса даёт ускорение до 1.38 миллиона раз. Один предварительный обход (секунды), затем миллионы запросов за наносекунды.
-
RaaS как сервис — миллиард запросов к базе достижимости за 29 секунд. Это первый в мире «поисковик по будущему» для дискретных систем.
-
Универсальность — один API работает на всех типах систем: от протоколов до роёв дронов и ПВО.
Применение в реальном мире
|
Область |
Что даёт RaaS |
|---|---|
|
Банки и финансы |
Проверка эскалации привилегий, миллионы запросов в секунду |
|
Атомные станции |
Доказательство безопасности реактора за миллисекунды |
|
БПЛА и оборона |
Предсказание прорыва ПВО, состояния роя дронов за наносекунды |
|
Медицина |
Анализ сердечного ритма, детекция аритмии |
|
Смарт-контракты |
Аудит уязвимостей, поиск reentrancy |
|
Компиляторы |
Доказательство достижимости всех токенов языка |
|
Кибербезопасность |
Анализ CFG вредоносного ПО, поиск RCE-гаджетов |
|
Автопилоты |
Предсказание аварийных сценариев |
Что дальше? Открыты к сотрудничеству
На данный момент библиотека SymFSM не опубликована в открытых репозиториях (NuGet, GitHub). Это связано с тем, что мы продолжаем активные исследования и доработки платформы.
Мы открыты к сотрудничеству в интересных и значимых проектах, где требуется:
-
Верификация критических систем (атомная энергетика, авионика, медицинское ПО)
-
Анализ безопасности (банки, блокчейн, кибербезопасность)
-
Оптимизация высоконагруженных систем (сети, протоколы, компиляторы)
-
Цифровые двойники и промышленная автоматизация
-
Оборонные и аэрокосмические проекты
Если у вас есть задача, где:
-
Есть конечный автомат, протокол, программа или любая другая дискретная система
-
Нужно отвечать на миллионы вопросов о достижимости, расстоянии, циклах
-
Классические BFS/DFS/SAT/SMT работают слишком медленно
Будем рады новым гипотезам и экспериментам.
ссылка на оригинал статьи https://habr.com/ru/articles/1046303/