ML-модель виявлення інсайдерської торгівлі: точність >95%

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.

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

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

Останні роботи

  • 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

ML-модель виявлення інсайдерської торгівлі: точність >95%

Інсайдерська торгівля на крипторинку — не абстрактна загроза. Гаманець, пов'язаний з командою проєкту, за кілька годин до анонсу партнерства починає агресивно скуповувати токени через анонімні адреси. Або напередодні лістингу на великій біржі обсяг торгів раптово злітає в 20 разів без видимої причини — це класичний патерн інсайдерської активності. Наша модель виявляє такі сигнали в реальному часі, запобігаючи потенційним втратам до $10 млн.

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

Чому стандартні рішення не справляються з маніпуляціями оракулів?

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

Які патерни інсайдерської торгівлі ми детектуємо

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. Кожен метод дає свою оцінку ризику, агрегатор обчислює підсумковий score.

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%). Наш метод точніший у 2 рази за стандартні рішення, а кількість хибних спрацьовувань у 3 рази менша.

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 місяць після запуску — багфікси та калібрування порогів.

Вартість впровадження починається від $15 000, що окупається за один запобігнутий інцидент. Ми маємо 5+ років досвіду в блокчейн-безпеці та реалізували понад 30 проектів з детекції аномалій. Гарантуємо точність виявлення основних патернів. Сертифіковані інженери з безпеки.

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% інцидентів, які ми тестували на форках, детектуються з першого разу. Внутрішнє тестування на основі понад 100 інцидентів.

Замовте аудит вашого протоколу вже сьогодні — ми підготуємо комерційну пропозицію з точними термінами та обсягом робіт. Зв'яжіться з нами для оцінки вашого проекту.

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

Коли протокол втрачає значні кошти через 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 має сенс для контрактів, які: керують значним TVL, оновлюються рідко, мають чітко формалізовані інваріанти. Для продуктів, що швидко ітеруються, співвідношення витрат і користі не на користь верифікації.

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

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.

Oracle manipulation через TWAP. Spot price — стандартна ціль для flash loan атаки. 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 Виведення коштів, несанкціоноване перенесення власності Завжди
High Маніпуляція, 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 понад значну суму. Гарантуємо, що в процесі ми не пропустимо жоден відомий вектор — використовуємо ліцензовані версії Slither та найкращі конфігурації fuzzer'ів. Запобігнуті збитки для клієнтів оцінюються в значну суму.

Оцініть ваш проект — ми безкоштовно проаналізуємо код і запропонуємо комерційну пропозицію протягом 2 днів. Замовте аудит з гарантією якості та отримайте знижку на re‑audit при повторному зверненні.