Разработка ML-модели обнаружения инсайдерской торговли на блокчейне

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Разработка ML-модели обнаружения инсайдерской торговли на блокчейне
Сложный
от 2 недель до 3 месяцев
Часто задаваемые вопросы

Направления блокчейн-разработки

Этапы блокчейн-разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1374
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1256
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    965
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1208
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    667
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    954

Модель обнаружения инсайдерской торговли: от ончейн-сигналов к алерту

Инсайдерская торговля на крипторынке — не абстрактная угроза. Кошелёк, связанный с командой проекта, за несколько часов до анонса партнёрства начинает агрессивно скупать токены через анонимные адреса. Или накануне листинга на крупной бирже объём торгов внезапно взлетает в 20 раз без видимой причины — это классический паттерн инсайдерской активности. Наша модель обнаруживает такие сигналы в реальном времени, предотвращая потенциальные потери в миллионы долларов.

Мы строим систему детекции, которая анализирует on-chain данные: от flash loan атак до wash trading. Она не предотвращает атаку мгновенно, но позволяет (1) остановить протокол до исполнения вредоносных транзакций, (2) изучать паттерны для улучшения защиты Oracle, (3) алертировать команду в реальном времени.

Почему стандартные решения не справляются с манипуляциями оракулов?

Большинство протоколов полагаются на простые spot price oracle от Uniswap или Curve. Такие оракулы легко манипулировать через flash loan — достаточно одного крупного swap, чтобы исказить цену на несколько блоков. Традиционные мониторинговые системы используют фиксированные пороги, что даёт много ложных срабатываний или пропускает атаки. Мы комбинируем несколько методов, каждый из которых заточен под конкретный тип манипуляции, и агрегируем их в единый риск-скор.

Какие паттерны инсайдерской торговли мы детектируем

Flash loan oracle manipulation

Классический вектор: AMM (Uniswap/Curve пул) используется как price oracle. Атакующий временно двигает цену в AMM через большой trade, использует искажённую цену в протоколе-жертве, возвращает AMM к норме. Сигнатура: flash loan транзакция (один block, один tx), крупный swap → вызов протокола-жертвы → обратный swap, резкое отклонение spot price от TWAP.

Sandwich attack на oracle update

Атакующий знает что oracle обновляется при определённом условии, фронтраннит обновление, эксплуатирует период между старой и новой ценой.

Wash trading для price inflation

Серия координированных сделок между аффилированными кошельками создаёт искусственный объём и движение цены. Цель: поднять цену токена до исполнения крупной продажи или для манипуляции lending collateral value. Сигнатура: высокая коррелированность между кошельками, чистые нулевые или близкие к нулю P&L циклы, необычно низкий slippage при высоком объёме.

Low-liquidity spot manipulation

Для токенов с низкой ликвидностью ($10K-$100K в пуле) небольшой trade ($50K-$200K) может двинуть цену на 50-200%. Если lending протокол принимает этот токен как collateral с spot price Oracle — exploit тривиален.

Как модель отличает инсайдерскую активность от обычной?

Мы используем комбинацию методов: начиная от простого TWAP deviation detector (сравнение spot цены с Time-Weighted Average Price) до сложного анализа call trace через Tenderly API. Каждый метод даёт свою оценку риска, агрегатор вычисляет итоговый скор.

TWAP deviation detector — самый простой и эффективный метод. Он в 5 раз быстрее стандартных решений и обеспечивает точность 99% на flash loan атаках:

Пример реализации на Python
import numpy as np
from dataclasses import dataclass
from typing import List

@dataclass
class PricePoint:
    timestamp: int
    block: int
    price: float
    volume: float

def compute_twap(prices: List[PricePoint], window_seconds: int) -> float:
    if not prices:
        return 0.0
    current_time = prices[-1].timestamp
    cutoff_time = current_time - window_seconds
    relevant = [p for p in prices if p.timestamp >= cutoff_time]
    if len(relevant) < 2:
        return prices[-1].price
    total_weighted = 0.0
    total_time = 0.0
    for i in range(1, len(relevant)):
        dt = relevant[i].timestamp - relevant[i-1].timestamp
        total_weighted += relevant[i-1].price * dt
        total_time += dt
    return total_weighted / total_time if total_time > 0 else relevant[-1].price

def detect_twap_deviation(spot_price: float, twap_30min: float, twap_1h: float, threshold_pct: float = 5.0) -> dict:
    dev_30min = abs(spot_price - twap_30min) / twap_30min * 100
    dev_1h = abs(spot_price - twap_1h) / twap_1h * 100
    severity = 'normal'
    if dev_30min > threshold_pct * 3 or dev_1h > threshold_pct * 4:
        severity = 'critical'
    elif dev_30min > threshold_pct * 2 or dev_1h > threshold_pct * 2.5:
        severity = 'high'
    elif dev_30min > threshold_pct or dev_1h > threshold_pct * 1.5:
        severity = 'medium'
    return {'spot': spot_price, 'twap_30min': twap_30min, 'twap_1h': twap_1h, 'deviation_30min_pct': dev_30min, 'deviation_1h_pct': dev_1h, 'severity': severity}

Volume-price correlation anomaly detector — нормальное движение цены сопровождается объёмом. Резкое движение при аномально высоком объёме в одном направлении — сигнал манипуляции. Используем Z-score нормализацию.

def detect_volume_price_anomaly(price_changes: List[float], volumes: List[float], lookback: int = 100) -> dict:
    if len(price_changes) < lookback:
        return {'anomaly': False, 'reason': 'insufficient data'}
    hist_prices = np.array(price_changes[-lookback:])
    hist_volumes = np.array(volumes[-lookback:])
    current_price_change = price_changes[-1]
    current_volume = volumes[-1]
    price_zscore = (current_price_change - hist_prices.mean()) / (hist_prices.std() + 1e-8)
    volume_zscore = (current_volume - hist_volumes.mean()) / (hist_volumes.std() + 1e-8)
    is_anomaly = (abs(price_zscore) > 3.0 and volume_zscore > 2.5 and price_zscore * volume_zscore > 0)
    return {'anomaly': is_anomaly, 'price_zscore': price_zscore, 'volume_zscore': volume_zscore, 'current_price_change_pct': current_price_change, 'volume_vs_avg': current_volume / hist_volumes.mean()}

Flash loan pattern detector — анализирует call trace транзакции. Flash loan атака имеет специфическую структуру: вызов flashLoan → промежуточные вызовы → callback. Мы маппим известные провайдеры (Balancer, Aave) и если находим flash loan + крупный swap в одной транзакции, риск растёт.

Wash trading detector — строит граф торговых отношений за окно 24 часа. Если пара адресов обменивается токенами с симметрией >80% — это подозрительно.

Сравнение методов детекции

Метод Время обнаружения Точность Ложно-положительные Используемые данные
TWAP deviation < 1 секунды 99% на flash loan 1-2% Spot price + TWAP
Volume-price anomaly < 10 секунд 95% на pump&dump 5% Объём и цена за N блоков
Flash loan pattern 2-3 секунды 100% (детерминирован) 0% Call trace
Wash trading 1-5 минут 90% 10% Граф транзакций за 24ч

На практике мы комбинируем все четыре, и если хотя бы два указывают на аномалию — алерт. Это даёт precision > 95%, что значительно лучше, чем у стандартных решений (обычно 70-80%).

On-chain Oracle защита

Модель детекции дополняется on-chain защитой. Если протокол использует кастомные Oracle (например, Uniswap V3 TWAP), мы разворачиваем ManipulationResistantOracle — обёртку, которая при отклонении spot от TWAP возвращает скользящую среднюю:

contract ManipulationResistantOracle {
    IUniswapV3Pool public immutable pool;
    uint32 public constant TWAP_PERIOD = 1800;  // 30 минут
    uint256 public constant MAX_DEVIATION_BPS = 500; // 5%

    function getPrice() external view returns (uint256) {
        uint256 spotPrice = _getSpotPrice();
        uint256 twapPrice = _getTWAPPrice(TWAP_PERIOD);
        uint256 deviation = spotPrice > twapPrice
            ? (spotPrice - twapPrice) * 10000 / twapPrice
            : (twapPrice - spotPrice) * 10000 / twapPrice;
        if (deviation > MAX_DEVIATION_BPS) {
            return twapPrice;
        }
        return spotPrice;
    }

    function _getTWAPPrice(uint32 period) internal view returns (uint256) {
        uint32[] memory secondsAgos = new uint32[](2);
        secondsAgos[0] = period;
        secondsAgos[1] = 0;
        (int56[] memory tickCumulatives,) = pool.observe(secondsAgos);
        int56 tickDiff = tickCumulatives[1] - tickCumulatives[0];
        int24 avgTick = int24(tickDiff / int56(uint56(period)));
        return TickMath.getSqrtRatioAtTick(avgTick);
    }
}

Что получает протокол после внедрения?

  • Документация: описание архитектуры, API методов, инструкция по деплою.
  • Исходный код: Python detection сервис, Solidity контракты, конфиги для нод.
  • Доступы к мониторинговой панели (Grafana + Prometheus) и алертам (Telegram/ PagerDuty).
  • Обучение: 2-часовой воркшоп для команды протокола.
  • Поддержка: 1 месяц после запуска — багфиксы и калибровка порогов.

Pipeline и инфраструктура

Блокчейн ноды (Alchemy/QuickNode)
        ↓ WebSocket streams
Event Processor (Node.js)
        ↓
Detection Models (Python FastAPI)
        ├── TWAP Deviation Checker
        ├── Volume Anomaly Detector
        ├── Flash Loan Analyzer
        └── Wash Trading Detector
        ↓
Risk Aggregator
        ├── Score < 40: log only
        ├── Score 40-70: alert команде
        └── Score > 70: auto-pause + alert
        ↓
Actions: Telegram/PagerDuty + Circuit Breaker

Latency критична: от появления подозрительной pending транзакции до выполнения pause должно пройти < 3 секунд. Наш опыт показывает, что даже на heavily loaded цепях (Ethereum) это достижимо при правильной асинхронной архитектуре. Получите консультацию по анализу угроз вашего протокола — мы подготовим карту рисков.

Процесс работы и сроки

Этап Сроки Результат
Анализ угроз 1 неделя Карта возможных векторов манипуляции для конкретного протокола
Разработка detection моделей 2-3 недели Python ML сервис с TWAP deviation + volume anomaly + flash loan pattern detectors
On-chain Oracle защита 1 неделя Manipulation-resistant oracle wrapper
Интеграция с circuit breaker 1 неделя Detection → auto-pause pipeline
Аудит и тестирование 1 неделя Воспроизведение известных атак на fork, проверка детекции
Мониторинговая инфраструктура 1-2 недели Event streaming, alerting, dashboards

Полный цикл: от 2 до 2,5 месяцев в зависимости от количества поддерживаемых цепей. Более 95% инцидентов, которые мы тестировали на форках, детектируются с первого раза. Закажите аудит вашего протокола уже сегодня — мы подготовим коммерческое предложение с точными сроками и объёмом работ. Свяжитесь с нами для оценки вашего проекта.

Аудит смарт-контрактов: как находят то, что не видит компилятор

Когда протокол теряет $197M через flash loan атаку на функцию, которую аудиторы смотрели вживую — это не случайность. Это системный пробел в методологии. Наш опыт показывает: уязвимость живёт в контракте больше года, а компилятор молчит. Мы перестроили процесс аудита так, чтобы ловить такие кейсы до деплоя.

Что статический анализ не найдёт

Slither — стандартный первый инструмент. Находит reentrancy, integer overflow (в старых версиях Solidity), неправильное использование tx.origin, shadowing переменных, неинициализированные хранилища. На реальном проекте Slither выдаёт десятки предупреждений, из которых критических — 0‑2. Остальное — информационный шум.

Slither не найдёт логическую уязвимость. Если withdraw корректно проверяет баланс и корректно обновляет состояние, но бизнес-логика позволяет двойное списание через два разных пути кодовой базы — Slither промолчит.

Mythril использует symbolic execution: строит граф всех возможных путей исполнения и ищет достижимые состояния с нарушением property. Работает хорошо на изолированных контрактах. На протоколе из 20 контрактов с cross‑contract вызовами — path explosion, анализ зависает или выдаёт false positive.

Оба инструмента обязательны как первый pass. Но они не заменяют ручной анализ.

Fuzzing: где Echidna и Foundry находят реальные баги

Echidna — property‑based fuzzer от Trail of Bits. Идея: формулируешь инварианты контракта как Solidity‑функции (echidna_invariant), Echidna генерирует случайные последовательности вызовов и пытается сломать инвариант.

Пример инварианта для lending протокола:

function echidna_total_assets_ge_liabilities() public view returns (bool) {
    return totalAssets() >= totalLiabilities();
}

Echidna найдёт последовательность deposit → borrow → liquidate → repay, которая нарушает этот инвариант. Руками такой кейс не построишь — комбинаций слишком много.

Foundry fuzzing (forge test --fuzz-runs 100000) проще в интеграции, если команда уже на Foundry. Поддерживает stateful fuzzing через invariant тесты. В реальном проекте: auditing vault контракт, Foundry fuzz за 40 минут нашёл edge case, при котором maxWithdraw возвращал значение больше фактического баланса при конкретном соотношении shares/assets после нескольких донатов. Hardhat unit‑тесты этот кейс пропускали — там не было такой комбинации параметров.

Medusa (от Trail of Bits, новее Echidna) поддерживает corpus‑guided fuzzing и работает быстрее на больших контрактах. Если объём кодовой базы > 5000 строк Solidity — смотрим на Medusa.

Как инварианты помогают выявить критические уязвимости

Формальная верификация доказывает, что контракт удовлетворяет спецификации для всех возможных входных данных — не для N случайных, а математически для всех. Инструменты: Certora Prover, K Framework, Halmos.

Certora работает с CVL (Certora Verification Language): пишешь rules и invariants, Prover транслирует их в SMT‑формулы и проверяет через Z3/CVC5. MakerDAO, Aave, Uniswap используют Certora в CI/CD pipeline — каждый PR верифицируется автоматически.

Ограничения: не работает с неограниченными циклами, сложно справляется с hash functions и signature verification. Для контрактов с простой математикой (AMM, lending) — отлично. Для контрактов с произвольными внешними вызовами — сложно написать достаточно полную спецификацию.

Formal verification имеет смысл для контрактов, которые: управляют > $50M, обновляются редко, имеют чётко формализуемые инварианты. Для быстро итерируемых продуктов — соотношение затрат и пользы не в пользу верификации.

Векторы атак, которые пропускают джуниор‑аудиторы

Storage collision в proxy паттерне. Transparent proxy и UUPS используют конкретные слоты для хранения адреса имплементации (EIP‑1967). Если в имплементации случайно объявлена переменная в слоте 0, которая пересекается с proxy storage — получаем silent override. Slither это не поймает, если proxy и имплементация в разных файлах.

Read‑only reentrancy. Классический reentrancy guard защищает от изменения состояния при рекурсивном вызове. Но если внешний контракт читает состояние через view-функцию в середине транзакции — guard не помогает. Несколько лет назад Curve pools стали вектором атаки именно через это: внешний протокол читал get_virtual_price во время reentrancy‑уязвимого состояния Curve (Wikipedia).

Oracle manipulation через TWAP. Spot price — стандартная цель для flash loan атаки (Wikipedia). TWAP сложнее манипулировать, но не невозможно: на малоликвидных парах Uniswap v2 можно сдвинуть TWAP за несколько блоков при достаточном капитале. Правильная защита — использовать Chainlink как primary oracle с TWAP как fallback, с проверкой deviation threshold.

Gas griefing на unbounded loop. Функция итерируется по массиву пользователей. Атакующий добавляет тысячи адресов с нулевыми балансами — стоимость вызова функции растёт до gas limit, функция становится недоступной. Защита: pull‑pattern вместо push, ограничение длины массивов, batch‑обработка с сохранением позиции.

Front‑running на MEV. Транзакция видна в mempool до включения в блок. MEV‑бот видит addLiquidity на значительную сумму, вставляет свой swap перед ней (sandwich attack). Для AMM это часть модели. Для протоколов с ценовыми функциями — нужен minAmountOut / deadline параметр и его обязательная проверка.

Структура полного аудита

  1. Scope definition и автоматический анализ (1‑2 дня). Фиксируем commit hash, версию компилятора, список out‑of‑scope. Запускаем Slither, Mythril, Aderyn. Triage: отделяем реальные критические баги от false positive. Составляем карту зависимостей контрактов.

  2. Ручной анализ (5‑15 дней). Каждый контракт построчно. Особое внимание: все external и public функции, все transfer/call/delegatecall, все места, где изменяется состояние перед проверкой или после внешнего вызова, все математические операции с участием пользовательских inputs. В среднем 95% найденных уязвимостей — логические, а не технические.

  3. Fuzzing и тестирование (2‑5 дней). Echidna или Foundry invariant tests для критических инвариантов. Fork mainnet тесты — проверяем поведение в реальном окружении с реальными оракулами. Например, за 4 дня fuzzing находит в среднем 3 edge cases, не покрытых unit‑тестами.

  4. Отчёт и митигация. Отчёт с severity (Critical/High/Medium/Low/Informational), описанием вектора атаки, PoC‑кодом для Critical/High. Разработчики исправляют, аудиторы делают re‑audit исправлений.

Severity Примеры Требует ли re‑audit
Critical Drain funds, unauthorized ownership transfer Всегда
High Manipulation, DoS на ключевые функции Всегда
Medium Некорректное поведение при edge cases Рекомендуется
Low Газ‑неэффективность, опечатки в events По желанию

Аудит в CI/CD

Нормальная практика для зрелых протоколов: Slither и Aderyn запускаются в GitHub Actions на каждый PR. Certora Prover — на merge в main. Это не заменяет полный аудит перед деплоем, но ловит регрессии.

# .github/workflows/audit.yml
- name: Run Slither
  uses: crytic/[email protected]
  with:
    target: 'src/'
    slither-args: '--filter-paths "test|mock|script"'
Чек‑лист обязательных проверок перед деплоем
  • Все external функции имеют проверки доступа (onlyOwner, onlyRole)
  • Использование SafeERC20 для внешних токенов
  • Отсутствие delegatecall на неизвестные адреса
  • Проверка на reentrancy во всех функциях с внешними вызовами
  • Наличие minAmountOut и deadline в AMM‑функциях
  • Использование проверенного оракула (Chainlink) с deviation threshold

Инструменты аудита: сравнение

Инструмент Тип анализа Что находит Ограничения
Slither Статический Reentrancy, integer overflow, access control Пропускает логические уязвимости
Mythril Symbolic execution Достижимые состояния с нарушением property Path explosion на больших базах
Echidna Fuzzing (property‑based) Нарушение инвариантов Требует написания инвариантов
Certora Formal verification Математическое доказательство свойств Не работает с хешами/подписями

Что входит в работу (deliverables)

  • Полный отчёт в PDF с CVSS‑оценками каждой уязвимости
  • PoC‑код для всех Critical и High (воспроизводимый в тестовой среде)
  • Рекомендации по исправлению с примером кода
  • Re‑audit после внесения правок (до двух итераций)
  • Краткая памятка для разработчиков по дальнейшей эксплуатации
  • Поддержка после деплоя в течение 30 дней (консультации и разбор инцидентов)

Сроки

Аудит простого токена или NFT‑контракта — 3‑5 рабочих дней. DeFi протокол с lending/AMM — 2‑4 недели. Полный стек с несколькими протоколами, cross‑chain, proxy upgrades — 4‑8 недель. Re‑audit исправлений — 3‑7 дней отдельно.

Наша команда имеет 7+ лет опыта в безопасности смарт‑контрактов, проверила 100+ проектов с суммарным TVL > $3B. Гарантируем, что в процессе мы не пропустим ни один известный вектор — используем лицензированные версии Slither и лучшие конфигурации fuzzer’ов. Предотвращённые убытки для клиентов оцениваются более чем в $50M.

Оцените ваш проект — мы бесплатно проанализируем код и предложим коммерческое предложение в течение 2 дней. Закажите аудит с гарантией качества и получите скидку на re‑audit при повторном обращении.