
Бессерверный сетевой протокол, предназначенный для устойчивой синхронизации состояния между автономными агентами в фрагментированных сетях с низкой пропускной способностью
Экспериментальный бессерверный сетевой протокол для устойчивой синхронизации состояний между автономными агентами во фрагментированных сетях с низкой пропускной способностью. Построен на Merkle-CRDT и криптографической идентичности — без центрального органа, без глобального DNS, всегда доступен для записи.
| # | Версия | Название | Ссылка |
|---|---|---|---|
| 1 | v0.1.0 | Merkle-CRDT Protocol (L1/L2) | ResearchGate |
| 2 | v0.2.0 | Epistemic Layer (L3) | ResearchGate |
| 3 | v0.3.0 | Correlation-Aware Aggregation (L3) | ResearchGate |
| 4 | v0.4.0 | Deterministic Semantic Topologies (L3) | ResearchGate |
Профили авторов: ResearchGate · ResearchHub
L3 v0.3.0 требовал от приложений ручного построения графа знаний (рёбра Supports/Contradicts). v0.4.0 устраняет это узкое место с помощью автономной генерации рёбер:
QuantizedEmbedding([u64; 4]) — 256-битный SimHash, вычисляемый на стороне приложения из канонической модели эмбеддинга.max_k_nearest ограничивает плотность рёбер до O(N), предотвращая взрыв распространения доверия.embedding_version: u32 изолирует непересекающиеся латентные пространства для обновлений модели на уровне протокола.// Автономное обнаружение истины: 10 000 утверждений → сканирование за 50 мс, O(N) рёбер
// Без чисел с плавающей запятой. Без координации. Без центрального органа.
let edges = auto_edge_generator.generate_edges(&epoch_claims);
L3 v0.2.0 предполагает, что все источники свидетельств статистически независимы (наивный Байес). Это приводит к патологической сверхуверенности, когда физически коррелированные сенсоры (например, 100 устройств IoT на одной крыше) или семантически коррелированные агенты (например, LLM, дообученные на одном наборе данных) сообщают согласованные наблюдения.
v0.3.0 вводит дисконтирование корреляции с помощью сеточных ячеек (Grid-Cell Correlation Discounting):
CorrelationCell(u64) — дискретную координату для пространственной, семантической или временной близости.discount_bps^rank / 10000^rank (по умолчанию 30%).(temporal_grid, fingerprint, correlation_cell), гарантируя атомарное вычисление над полным набором.correlation_cell: None ведут себя идентично v0.2.0 (нулевая регрессия).// 100 со-локализованных сенсоров, уверенность 70% каждый:
// v0.2.0 (наивный): 100 × 847 = 84 700 милли-лог-шансов → ~100% (сверхуверенность)
// v0.3.0 (30%): 847 × Σ(0.3^i) ≈ 1 207 милли-лог-шансов → ~77% (реалистично)
aimp_node/ Эталонная реализация на Rust (член рабочей области Cargo)
src/
crdt/ Движок Merkle-DAG, модель акторов, аллокатор arena, консенсус кворума
crypto/ Идентичность Ed25519, хеширование BLAKE3, межсетевой экран с нулевым доверием
network/ UDP gossip, сессии Noise Protocol XX, ограничение скорости на пира
protocol/ Формат провода (MessagePack), типизированное перечисление полезной нагрузки
epistemic.rs Эпистемический слой L3 (v0.3.0): лог-шансы, распространение доверия, дисконтирование корреляции
semantic_topology.rs Семантическая топология L3 (v0.4.0): эмбеддинги SimHash, авто-генерация рёбер
decision_engine.rs Подключаемый детерминированный движок принятия решений (trait + движок правил + горячая перезагрузка)
error.rs Единая иерархия типов AimpError
dashboard/ TUI на Ratatui
config.rs Динамическая конфигурация с валидацией
event/ Структурированное логирование + метрики Prometheus (счётчики + гистограммы)
tests/ Интеграционные тесты
benches/ Бенчмарки Criterion
aimp_testbed/ Python SDK (aimp-client) + CLI-инструмент + тестирование хаоса
deploy/ Systemd-сервис, Firecracker microVM, скрипт установки
formal/ Спецификация TLA+ для сходимости, безопасности кворума и сходимости убеждений
docs/ Статья 1 (исходник Typst + PDF)
v0.2.0/ Статья 2: Эпистемический слой (исходник Typst + PDF)
v0.3.0/ Статья 3: Агрегация с учётом корреляции (исходник Typst + PDF)
tokio::mpscDecisionEngine с реализацией RuleEngineaimp_rules.json (без перезапуска)Payload по коду операции (безопасность на этапе компиляции)/health с подпроверками и HTTP-кодами состоянияSystemEvent с TUI-панельюAimpError (больше никакого Box<dyn Error>)Измерены с помощью Criterion на Apple Silicon (M-серия), однопоточный режим, fast-crypto:
Симуляция кластера из 5 узлов с антиэнтропийной синхронизацией (внутрипроцессно, Apple Silicon):
Сходимость при симулированных потере пакетов, задержке и разделении (5 узлов, 50 мутаций/узел):
AIMP сходится при потерях пакетов до ~80% в течение нескольких раундов антиэнтропии, деградируя плавно.
Docker ARM64 Linux с ограничениями ресурсов класса RPi:
Даже на оборудовании класса RPi Zero пропускная способность на 3 порядка выше предела скорости.
То же оборудование, те же операции, однопоточный режим, target-cpu=native:
AIMP с ring превосходит Automerge в 1,37 раза по мутациям (с Ed25519 на каждую запись) и в 2,4 раза по слиянию. Yrs быстрее всего по мутациям (без криптографии), но слияние AIMP отстаёт от Yrs всего на 26%.
# Включить бэкенд ring для максимальной пропускной способности
RUSTFLAGS="-C target-cpu=native" cargo run --release --features fast-crypto,fast-alloc
Запустить бенчмарки локально:
cargo bench --manifest-path aimp_node/Cargo.toml # Микро-бенчмарки
cargo run --release -p aimp_node --example bench_convergence # Системные бенчмарки
cargo run --release -p aimp_node --example bench_netem # Сетевые помехи
docker build -f Dockerfile.bench -t aimp-bench . && \
docker run --rm --memory=1g --cpus=1 aimp-bench # ARM64 с ограничениями
| Свойство | Описание |
|---|
TLC исследовал 46 063 состояния (9 558 уникальных) на глубину 16 менее чем за 1 секунду с 10 параллельными рабочими и нулевыми нарушениями. Найденные ошибки: 2 ошибки корректности (головы не по порядку, двойное голосование в кворуме). Обе исправлены.
| Свойство | Описание | Статус |
|---|
Исчерпывающая ограниченная верификация: 199 902 конфигурации (5 свойств, до N=6 узлов). Найденные ошибки: 1 ошибка в формуле распространения доверия (t_{k+1} = t_k + At_k вместо правильного t_{k+1} = t_0 + At_k). Исправлена.
cargo run -- --port 1337 --name node1
cd aimp_testbed
pip install -e .
aimp-cli health --target 127.0.0.1 --metrics-port 9090
aimp-cli infer "Проверить давление клапана в северном секторе"
make test # Свойственные и интеграционные тесты
make bench # Бенчмарки Criterion
make lint # Форматирование + clippy
make docs # Сгенерировать rustdoc
AIMP спроектирован для работы как один статический бинарник с нулевыми зависимостями времени выполнения. Без Docker, без контейнерного рантайма, без JVM.
# Скачать бинарник для вашей архитектуры
curl -LO https://github.com/fabriziosalmi/aimp/releases/latest/download/aimp_node-aarch64-linux
chmod +x aimp_node-aarch64-linux
# Установить как systemd-сервис
sudo deploy/install.sh ./aimp_node-aarch64-linux
# Запустить
sudo systemctl start aimp-node
curl localhost:9090/health
make install-cross-targets # Однократно: установить цели musl
make edge-arm64 # ARM64 (RPi 4/5, Jetson, Graviton)
make edge-armv7 # ARMv7 (RPi 2/3, промышленные ПЛК)
make edge-x86 # x86_64 (периферийные шлюзы)
make edge-all # Все три
Для периферийных шлюзов, выполняющих несколько ненадёжных нагрузок:
sudo make microvm-rootfs # Собирает ~15 МБ Alpine rootfs с AIMP
firecracker --no-api --config-file deploy/firecracker/vm-config.json
Время загрузки: ~125 мс. Память: 64 МБ. vCPU: 1.
Прилагаемый файл службы (deploy/systemd/aimp-node.service) обеспечивает:
Конфигурация загружается из (в порядке убывания приоритета):
--port, --name)AIMP_PORT, AIMP_NOISE_REQUIRED, AIMP_PEER_RATE_LIMIT, ...)aimp.toml (опционально)graph TD
UDP[UDP-сокет] -->|Конверт| RL[Ограничитель скорости]
RL -->|Разрешено| NP[Noise Protocol]
NP -->|Расшифровка| FW[Безопасность - межсетевой экран]
FW -->|Допустимо| BP[Семафор обратного давления]
BP -->|Разрешение| Parser[Парсер протокола]
Parser -->|AimpData| CRDT[Актор CRDT]
CRDT -->|Мутация| DAG[Merkle-DAG + redb]
DAG -->|Очистка| GC[Эпохальный GC]
CRDT -->|Запрос на оценку| DE[Движок решений]
DE -->|Решение + свидетельство| CRDT
CRDT -->|Голос кворума| QM[Менеджер кворума]AIMP опирается на концепции из следующих областей исследований распределённых систем:
snow для шаблона рукопожатия XXMIT — Fabrizio Salmi, 2026.
| Уровень | Версия | Назначение |
|---|
| L1/L2 | v0.1.0 | Merkle-DAG CRDT, подпись Ed25519, транспорт Noise Protocol, кворум BFT |
| L3 | v0.2.0 | Эпистемический слой: целочисленные лог-шансы, двухпроходное распространение доверия, Sybil-устойчивая репутация |
| L3 | v0.3.0 | Агрегация с учётом корреляции: геометрическое дисконтирование для коррелированных сенсоров/LLM |
| L3 | v0.4.0 | Детерминированные семантические топологии: автономное построение рёбер через 256-битный SimHash |
| Особенность | AIMP (Merkle-CRDT) | Традиционные (Raft/Paxos) |
|---|
| Топология | P2P Mesh / Децентрализованная | Лидер / Кворум |
| Доступность | AP (всегда доступен для записи) | CP (требуется большинство) |
| Упорядочивание | Причинное (векторные часы) | Полное (последовательное) |
| Целостность | Криптографическая (Merkle-DAG) | Основанная на журнале |
| Оборудование | Оптимизировано для Edge/IoT | Уровень дата-центра |
| Операция | Время | Пропускная способность |
|---|
append_mutation (100 операций) | 41,8 мкс | ~2,4 млн мутаций/с |
get_merkle_root (кешированный) | 4,8 нс | O(1) |
| Хеш BLAKE3 (1 КБ) | 925 нс | ~1,08 ГБ/с |
| MessagePack сериализация / десериализация | 204 / 210 нс | — |
| Подпись Ed25519 (ring) | 9,3 мкс | ~108 тыс. операций/с |
| Проверка Ed25519 | 25,0 мкс | ~40 тыс. операций/с |
| Сценарий | Результат |
|---|
| Пропускная способность (5 узлов × 1000 мутаций, с подписью Ed25519) | 96 289 мутаций/с |
| Сходимость (5 расходящихся узлов, по 250 DAG каждый) | 0,68 мс (1 раунд синхронизации) |
| Разделение/Слияние (2 группы, 30 мутаций/группа, полное слияние) | 0,21 мс |
| Крипто-горячий путь (подпись + проверка на сообщение) | 45,0 мкс → 22 тыс. сообщений/с макс |
| Бюджет криптографии при rate_limit=50/с | 0,23% загрузки |
| Условие | Сошёлся | Раунды |
|---|
| Базовый (0% потерь) | ДА | 1 |
| 10% потерь пакетов | ДА | 2 |
| 30% потерь пакетов | ДА | 2 |
| 50% потерь пакетов | ДА | 2 |
| 20% потерь + 100 мс задержки + 30 мс дрожания | ДА | 2 |
| Разделение (10 раундов), затем слияние | ДА | 1 |
| Разделение (50 раундов), затем слияние с 20% потерь | ДА | 1 |
| 80% потерь пакетов (стресс) | ДА | 4 |
| Метрика | macOS ARM64 | Linux 1C/1ГБ (RPi 4) | Linux 1C/256МБ (RPi Zero) |
|---|
| Пропускная способность | 96 289 мутаций/с | 24 802 мутаций/с | 29 709 мутаций/с |
| Сходимость | 0,68 мс | 3,06 мс | 1,30 мс |
| Подпись Ed25519 | 8,7 мкс | 16,2 мкс | 15,1 мкс |
| Проверка Ed25519 | 20,5 мкс | 34,6 мкс | 45,2 мкс |
| Макс. сообщений/с | 34 329 | 19 695 | 16 573 |
| Бюджет криптографии @50/с | 0,15% | 0,25% | 0,30% |
| Бенчмарк | AIMP (ring) | Automerge | Yrs (Yjs) |
|---|
| Мутации (1000 операций) | 129 тыс. операций/с | 94 тыс. операций/с | 632 тыс. операций/с |
| Слияние 2 реплик | 0,48 мс | 1,17 мс | 0,38 мс |
| Слияние 5 реплик | 2,16 мс | 3,89 мс | — |
| Размер состояния (1000 операций) | ~18 КБ | 4 КБ | — |
| Статус |
|---|
| Convergence | Если два узла владеют одним и тем же хранилищем, они вычисляют одинаковые головы Меркла | Подтверждено |
| QuorumSafety | Если кворум достигнут для запроса, решение уникально (нет конфликтующих решений) | Подтверждено |
| QuorumLiveness | Если все узлы голосуют за одно и то же решение, порог кворума в конечном счёте будет достигнут | Подтверждено |
| BeliefDeterminism | Одинаковые утверждения + граф → идентичное BeliefState на всех узлах | Подтверждено |
| NoOscillation | Значения доверия сходятся монотонно (нет обратной связи с Pass 2 → Pass 1) | Подтверждено |
| ContradictionSafety | Одиночное противоречие не может перевести Accepted → Rejected за один шаг | Подтверждено |
| Укрепление | Значение |
|---|
| Изоляция пользователя | Выделенный пользователь aimp, без оболочки входа |
| Файловая система | ProtectSystem=strict, ProtectHome=yes |
| Лимит памяти | MemoryMax=128M |
| Лимит ЦП | CPUQuota=80% |
| Привилегии | NoNewPrivileges=yes, MemoryDenyWriteExecute=yes |
| Фильтр системных вызовов | Белый список @system-service |
| Перезапуск | При сбое с экспоненциальной задержкой |
| Завершение | SIGTERM → 10 с ожидания → SIGKILL |
| Параметр | По умолчанию | Описание |
|---|
port | 1337 | Порт прослушивания UDP |
metrics_port | 9090 | HTTP-порт Prometheus |
noise_required | true | Принудительное шифрование Noise Protocol |
peer_rate_limit | 50 | Макс. сообщений/с на пира |
peer_rate_burst | 100 | Ёмкость пакета token bucket |
gc_mutation_threshold | 1000 | Количество мутаций до очистки GC |
quorum_threshold | 2 | Узлов, необходимых для консенсуса BFT |
dag_history_depth | 100 | Макс. глубина DAG, сохраняемая после GC |