⚠️ Инструмент устарел (deprecated). Инструмент Flashbots для анализа MEV (Maximal Extractable Value): обнаружение arbitrage, liquidations, sandwich-атак и front-running в блоках Ethereum. Парсит транзакции, классифицирует MEV-стратегии и вычисляет прибыль. Исторические данные доступны на datasets.flashbots.net.
git clone https://github.com/flashbots/mev-inspect-py cd mev-inspect-py # Через Docker (рекомендуется — требует PostgreSQL) cp .env.example .env # вписать ETH_RPC_URL docker-compose up -d # Inspect конкретного блока poetry run inspect-block --block-number 12965000 # Inspect диапазона блоков poetry run inspect-many-blocks --start-block 12965000 --end-block 12965100
⚠️ Этот инструмент устарел. Вы можете посетить Flashbots Data для исторических данных mev-inspect по Ethereum и присоединиться к нам на форуме Flashbots. ⚠️
Инспектор максимально извлекаемой стоимости (MEV) для Ethereum, призванный просветить "тёмный лес" 🌲💡
При заданном блоке mev-inspect находит: - выплаты майнеру (газ + coinbase) - переводы токенов и прибыль - обмены и арбитражи - ...и многое другое
Данные хранятся в Postgres для анализа.
mev-inspect-py создан для запуска на kubernetes локально и в продакшене.
Создайте новый кластер с помощью:
kind create cluster
Установите переменную окружения RPC_URL на RPC-узел для получения блоков.
В настоящее время mev-inspect-py требует узел с поддержкой трейсов и квитанций Erigon (пока не geth 😔).
Хорошим хостинг-вариантом является "Ethereum Mainnet Archival with trace calls" от pokt.network.
Пример:
export RPC_URL="http://111.111.111.111:8546"
Далее запустите все сервисы с помощью:
tilt up
Нажмите "пробел", чтобы увидеть в браузере запуск сервисов.
При первом запуске вам потребуется применить миграции базы данных:
./mev exec alembic upgrade head
И загрузить данные о ценах
./mev prices fetch-all
Для альтернативного способа запуска mev-inspect-py для более простых конфигураций или целей отладки см. инструкции по монолитной установке.
Проверка блока 12914944:
./mev inspect 12914944
Проверка блоков 12914944 по 12914954:
./mev inspect-many 12914944 12914954
Запустите слушатель блоков с помощью:
./mev listener start
По умолчанию он возобновит работу с того места, где вы остановились. При первом запуске слушатель начинает с самого нового блока.
Просматривайте логи слушателя с помощью:
./mev listener tail
И остановите слушатель с помощью:
./mev listener stop
Для крупномасштабного дозаполнения вы можете проверять множество блоков параллельно.
Чтобы проверить блоки 12914944 по 12915044, выполните
./mev backfill 12914944 12915044
Это поставит блоки в очередь Redis для последующей обработки сервисом mev-inspect-worker.
Чтобы увеличить или уменьшить степень параллелизма, обновите значение replicaCount для helm-чарта mev-inspect-workers.
Локально это можно сделать, отредактировав Tiltfile и изменив "replicaCount=1" на желаемую степень параллелизма:
k8s_yaml(helm(
'./k8s/mev-inspect-workers',
name='mev-inspect-workers',
set=["replicaCount=1"],
))
Вы можете наблюдать за запуском и завершением воркер-подов, отслеживая статус всех подов
watch kubectl get pods
Чтобы видеть прогресс и неудачные партии, подключитесь к Redis с помощью
./mev redis
Для общего количества сообщений выполните запрос:
HLEN dramatiq:default.msgs
Для сообщений, которые не удалось обработать и которые ожидают повторной попытки в очереди задержки (DQ), выполните запрос:
HGETALL dramatiq:default.DQ.msgs
Для сообщений, окончательно не обработанных в очереди мертвых писем (XQ), выполните запрос:
HGETALL dramatiq:default.XQ.msgs
Чтобы очистить очередь, удалите ключи основной очереди и очереди задержки
DEL dramatiq:default.msgs
DEL dramatiq:default.DQ.msgs
Для получения дополнительной информации о очередях см. спецификацию, опубликованную dramatiq
Дозаполнение списка блоков
Создайте файл, содержащий по одному блоку в строке, например, blocks.txt с содержимым:
12500000
12500001
12500002
Затем поставьте блоки в очередь с помощью
cat blocks.txt | ./mev block-list
Чтобы просматривать логи для конкретного воркер-под, возьмите его имя пода, используя приведенный выше метод, а затем выполните:
kubectl logs -f pod/mev-inspect-worker-abcdefg
(где mev-inspect-worker-abcdefg — это ваше фактическое имя пода)
Все результаты проверки хранятся в Postgres.
Чтобы подключиться к локальной базе данных Postgres для запросов, запустите клиентский контейнер с помощью:
./mev db
Когда вы увидите приглашение:
mev_inspect=#
Вы готовы выполнять запросы!
Попробуйте найти общее количество обменов, декодированных с помощью UniswapV3Pool:
SELECT COUNT(*) FROM swaps WHERE abi_name='UniswapV3Pool';
или топ-10 арбитражей по валовой прибыли, полученными в WETH:
SELECT *
FROM arbitrages
WHERE profit_token_address = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'
ORDER BY profit_amount DESC
LIMIT 10;
Совет по Postgres: введите \x, чтобы перейти в "Расширенный режим отображения", который выглядит лучше для результатов со множеством столбцов.
Остановите систему, если она запущена:
tilt down
Удалите их с помощью:
kubectl delete pvc data-postgresql-postgresql-0
Запустите снова:
tilt up
И повторно запустите миграции, чтобы снова создать таблицы:
./mev exec alembic upgrade head
Снова добавьте старый файл docker-compose.yml в каталог mev-inspect-py.
Копию можно найти здесь
Уничтожьте ресурсы docker-compose:
docker compose down
Затем выполните шаги из текущей инструкции по установке для kubernetes.
Это означает, что контейнер клиент postgres не завершился корректно.
Удалите его с помощью:
kubectl delete pod/postgres-client
Затем запустите его снова.
Flashbots — это исследовательско-разработческий коллектив, работающий над смягчением негативных внешних эффектов децентрализованных экономик. Мы вносим свой вклад вместе с более широким сообществом свободного ПО, чтобы просветить тёмный лес.
Вы приветствуетесь здесь <3.
Если вы обнаружите уязвимость в безопасности в этом проекте или в любой другой инициативе, связанной с Flashbots, дайте нам знать, отправив электронное письмо на security@flashbots.net.
Сделано с ☀️ коллективом ⚡🤖.