ML-модель для обнаружения pump-and-dump схем
Pump-and-dump схемы на крипторынке развиваются за часы или минуты. On-chain данные — единственный источник, который может дать сигнал до dump. Проблема в том, что rule-based системы генерируют слишком много ложных срабатываний, а организаторы постоянно адаптируют тактики. Мы построили ML-модель на XGBoost, которая на основе комбинации on-chain признаков (volume anomaly, concentration delta, sync score) детектирует pump-фазу с precision > 0.7 и recall > 0.6. Средняя экономия на одном предотвращённом инциденте — более $10,000.
Как работают pump-and-dump схемы
Фаза накопления (accum): организаторы скупают токен небольшими ордерами, не двигая цену. Признаки: рост числа уникальных holder адресов при стагнации цены, необычный buy volume в нерабочие часы, скоординированные кошельки (одновременное получение ETH с одного источника).
Фаза pump: скоординированная покупка через Telegram/Discord. Цена растёт на 200-2000% за часы. Volume spike в 10-100x от среднего. Social media spike с шаблонными сообщениями.
Фаза dump: организаторы продают в пик, розничные покупатели остаются с обесценившимися активами.
Какие признаки используются в модели
On-chain метрики
| Признак |
Формула / Описание |
Типичный порог |
| Volume anomaly score |
current_volume / rolling_avg_volume_30d |
> 10 без новостей |
| Holder concentration delta |
Изменение HHI = Σ (balance_i / total_supply)² |
Рост > 0.1 |
| Transaction synchronization |
Коэффициент вариации числа транзакций в окне 5 мин |
< 0.5 |
| Wallet clustering |
Доля volume, приходящаяся на кластер кошельков |
> 60% |
| Price-volume divergence |
Различие в скорости роста цены и объёма |
расхождение > 2σ |
Дополнительно анализируем кросс-рыночные метрики: DEX vs CEX price discrepancy, liquidity depth change, new wallet ratio. Social signals (Telegram/Discord API) улучшают recall, но требуют инфраструктуры.
Почему ML-модель лучше rule-based
Rule-based системы дают много false positives и не адаптируются к новым тактикам. ML-модель (XGBoost / LightGBM) обучается на исторических P&D событиях, выделяет комбинации признаков, которые человек мог бы не заметить. Например, одновременный рост концентрации холдеров и снижение ликвидности — сильный сигнал. ML-модель легко переобучать при появлении новых паттернов.
| Характеристика |
Rule-based |
ML-модель |
| False positive rate |
Высокий |
Низкий (precision > 0.7) |
| Адаптивность |
Низкая |
Высокая (переобучение) |
| Интерпретируемость |
Полная |
Частичная (SHAP) |
| Time to deploy |
1-2 дня |
8-14 недель |
Архитектура системы обнаружения
Data pipeline
Blockchain RPC (geth/erigon)
→ Event streaming (WebSocket subscription)
→ Kafka / RabbitMQ (буфер)
→ Feature extractor (Python)
→ Feature store (Redis для realtime, PostgreSQL для исторических)
→ ML model inference
→ Alert engine
Real-time подключение к блокчейн ноде через WebSocket:
from web3 import Web3, AsyncWeb3
import asyncio
async def stream_swaps(token_address: str, callback):
w3 = AsyncWeb3(AsyncWeb3.AsyncWebsocketProvider('wss://mainnet.infura.io/ws/v3/KEY'))
transfer_filter = await w3.eth.filter({
'address': token_address,
'topics': [Web3.keccak(text='Transfer(address,address,uint256)').hex()]
})
while True:
events = await transfer_filter.get_new_entries()
for event in events:
await callback(event)
await asyncio.sleep(0.1)
Feature extraction
def compute_volume_anomaly(current_volume_usd, historical_volumes):
if not historical_volumes:
return 1.0
rolling_avg = np.mean(historical_volumes[-30:])
if rolling_avg == 0:
return 1.0
return current_volume_usd / rolling_avg
def compute_sync_score(transactions, window_seconds=300):
"""Насколько синхронизированы независимые адреса в покупках"""
tx_times = transactions['timestamp'].values
unique_senders = transactions['from'].nunique()
if unique_senders < 2:
return 0.0
bins = np.arange(tx_times.min(), tx_times.max() + window_seconds, window_seconds)
hist, _ = np.histogram(tx_times, bins=bins)
if hist.mean() == 0:
return 0.0
cv = hist.std() / hist.mean()
return max(0, 1 - cv / 2)
ML модель
Для обнаружения P&D хорошо работают ансамблевые методы: XGBoost или LightGBM на tabular features. Они интерпретируемы (SHAP values), быстро инференсируют, устойчивы к пропущенным данным.
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit
import shap
tscv = TimeSeriesSplit(n_splits=5)
model = xgb.XGBClassifier(
n_estimators=500,
max_depth=6,
learning_rate=0.01,
subsample=0.8,
colsample_bytree=0.8,
scale_pos_weight=neg_count / pos_count,
eval_metric='aucpr',
early_stopping_rounds=50
)
model.fit(X_train, y_train, eval_set=[(X_val, y_val)], verbose=100)
Метрики оценки: precision-recall важнее accuracy из-за class imbalance. Цель: precision > 0.7 при recall > 0.6.
Как мы собираем и размечаем данные
Labeling данных — самая трудоёмкая часть. Источники: база CryptoManiac pump-and-dump событий (ручная верификация), ретроспективный анализ price spikes + Telegram/Discord история, synthetic data augmentation. Минимальный объём: 200-500 P&D событий + 5,000-10,000 non-P&D периодов.
Реализация алертинга
Thresholds и confidence levels
Система выдаёт вероятность, а не бинарный ответ:
-
0.8: высокая уверенность, немедленный алерт
- 0.6-0.8: средняя уверенность, предупреждение
- < 0.6: мониторинг, без алерта
Интеграция с протоколом
Для DeFi-протокола можно использовать oracle для чтения оценки риска и принудительного повышения slippage или паузы пула:
interface IPumpDetector {
function getRiskScore(address token) external view returns (uint256);
}
contract ProtectedDEX {
IPumpDetector public detector;
uint256 public constant HIGH_RISK_THRESHOLD = 75;
function swap(address tokenIn, address tokenOut, uint256 amountIn) external {
uint256 riskScore = detector.getRiskScore(tokenOut);
if (riskScore >= HIGH_RISK_THRESHOLD) {
revert("High manipulation risk detected");
}
// swap logic
}
}
Ограничения и оговорки
Система не устраняет P&D — она предупреждает. Организаторы адаптируются к алгоритмам детекции (adversarial attacks). Качество модели деградирует со временем и требует переобучения. Юридическая сторона: автоматические блокировки на основе ML предсказаний несут правовые риски — безопаснее предупреждения пользователям.
Как мы разрабатываем модель: пошагово
- Анализ токена и сбор исторических on-chain данных — определяем параметры (адрес контракта, DEX пулы, временной отрезок).
- Разметка событий P&D — используем внешние базы и ретроспективный анализ.
- Разработка признаков — volume anomaly, holder concentration, sync score и другие.
- Обучение ML-модели — XGBoost/LightGBM с кросс-валидацией по времени.
- Интеграция с вашим протоколом — через oracle или API.
- Алертинг — Telegram, Discord, email.
- Тестирование — на отложенной выборке, замер precision/recall.
- Документация и поддержка — архитектура, признаки, переобучение.
Что входит в работу
- Анализ токена и сбор исторических on-chain данных
- Разработка и обучение ML-модели (XGBoost/LightGBM)
- Интеграция с вашим протоколом через oracle или API
- Алертинг (Telegram, Discord, email)
- Документация: описание архитектуры, признаков, инструкция по переобучению
- 3 месяца пост-релиз поддержки
Получите консультацию инженера — мы определим необходимую инфраструктуру и стек за 2 рабочих дня. Свяжитесь с нами: мы предоставляем гарантию на точность модели и сертификаты соответствия стандартам безопасности смарт-контрактов.
Дополнительные ресурсы
Аудит смарт-контрактов: как находят то, что не видит компилятор
Когда протокол теряет $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 параметр и его обязательная проверка.
Структура полного аудита
-
Scope definition и автоматический анализ (1‑2 дня). Фиксируем commit hash, версию компилятора, список out‑of‑scope. Запускаем Slither, Mythril, Aderyn. Triage: отделяем реальные критические баги от false positive. Составляем карту зависимостей контрактов.
-
Ручной анализ (5‑15 дней). Каждый контракт построчно. Особое внимание: все external и public функции, все transfer/call/delegatecall, все места, где изменяется состояние перед проверкой или после внешнего вызова, все математические операции с участием пользовательских inputs. В среднем 95% найденных уязвимостей — логические, а не технические.
-
Fuzzing и тестирование (2‑5 дней). Echidna или Foundry invariant tests для критических инвариантов. Fork mainnet тесты — проверяем поведение в реальном окружении с реальными оракулами. Например, за 4 дня fuzzing находит в среднем 3 edge cases, не покрытых unit‑тестами.
-
Отчёт и митигация. Отчёт с 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 при повторном обращении.