Анализ блокчейна в Dune Analytics на примере Uniswap

Это одна из таких платформ аналитики блокчейна. Дюна, с помощью которого вы можете извлекать различные данные из блокчейна. В декабре 2022 года они запустили курс в сотрудничестве с Uniswap. 12 дней Дюныгде я участвовал. Я поделюсь с вами задачами первой недели курса и решениями.

В результате вы узнаете, что такое Дюна, научитесь самостоятельно проводить анализ на примере протокола децентрализованной биржи. Uniswap. Это протокол децентрализованного обмена и крупнейший сервис обмена криптовалюты (децентрализованный обмен) по ежедневному объему. 1,27 миллиарда долларов (по состоянию на 02.02.2023). Возможно, кому-то будут интересны задания второй недели, связанные с ликвидностью.

Dune — это, по сути, набор таблиц данных из блокчейна (поддерживаемый сетью Ethereum и недавно добавленный БТД), для которого можно создавать SQL-запросы, извлекать данные и строить графики, это редактор дашбордов. Таблицы:

  1. Raw (необработанные данные) — транзакции, события, трассировки (traces) — низший уровень данных блокчейна.

  2. Decoded (декодированный) — создан на основе сырых данных для более понятного представления, например uniswap_v3_ethereum.Pair_evt_Swap — таблица Swap-событий пар Uniswap (то есть можно понять, когда был произведен обмен).

  3. Книги заклинаний — это таблицы еще более высокого уровня, которые заполняются периодически запускаемыми процессами. Это, например, dex.prices, где рассчитываются и размещаются данные о ценах на токены на биржах.

  4. Community (сделано сообществом) – таблицы от других провайдеров.

  5. User-generated (custom) — в принципе все открытые запросы (queries), созданные на платформе, которые можно использовать в ваших запросах.

Квалификация

Для написания запросов в Dune нужно знать SQL, а также принципы EVM и Solidity, а в данном случае еще и Uniswap. Например, нужно понимать, что такое пул Uniswap, а также, что есть заводской смарт-контракт, который генерирует событие PoolCreated, и какие параметры передаются в событии. Если такого понимания пока нет, рекомендую прочитать 1, 2, 3, 4. Хорошая новость заключается в том, что если у вас есть опыт программирования, разобраться в этом не составит большого труда.

Задания

Результатом каждой задачи является SQL-запрос с данными. Основное внимание в курсе уделялось Uniswap V2, но по возможности я старался использовать V3 — более новую, но и более сложную версию. В v2 используется термин обменная пара (pair) с фиксированной комиссией 0,3% (напр. по WETH/USDC). V3 использует концепцию пулов с различными комиссиями и ликвидностью в пользовательских областях. Во всех заданиях (кроме 3-го) использую пул USDC/WETH с комиссией 0,05%.

Для каждой задачи я предоставлю условие и идею решения в текстовом виде. Авторы предоставляют видео для каждого решения, но иногда его легче читать. Поэтому, надеюсь, статья будет полезна, даже если вы владеете английским языком. Также не везде, на мой взгляд, была четко сформулирована задача, что я и пытался исправить. Всего мы оценим 5 заданий. Шестую красить не стал, т.к. концептуально это компиляция данных из запросов за предыдущие дни.

XBNFNM   Поток туристов из России в Индонезию в январе превысил допандемический

1 день — Подсчитайте количество пар, содержащих токены USDC и/или WETH (новички).

Идея решения
  1. Получите адреса токенов USDC и WETH через etherscan.

  2. Используйте таблицу uniswap_v2_ethereum.Factory_evt_PairCreated или uniswap_v3_ethereum.Factory_evt_PoolCreated (таблица вызова события, событие вызывается при создании пары/пула). В таблице есть столбцы token0, token1, сравните их с адресами из п.1.

  3. Подсчитайте количество созданных пар/пулов.

Обратите внимание, что в версии 3 пара была заменена пулом, и пулы USDC/WETH могут быть заменены. несколько (комиссии разные), поэтому РАЗЛИЧНЫЕ.

Мое решение для v2 и V3.

День 2 — Построить еженедельный график количества обменов в V3 ее USDC/WETH и их объем в долларах, разделенный на дни или недели (новички).

Идея решения
  1. Найдите адрес пула (можно использовать Google или info.uniswap.org)

  2. Смотрим таблицу uniswap_v3_ethereum.Pair_evt_Swap, куда записываются все успешные обмены (события Swap в парном контракте). Странно, что таблица называется Pair, хотя контракт называется Pool.

  3. Смотрим таблицу uniswap_v3_ethereum.Factory_evt_PoolCreated — получаем адреса токенов в пуле.

  4. Смотрим таблицу Prices.usd, где записаны минутные цены в долларах по всем токенам, для чего нужно отбросить секунды функцией date_trunc.

  5. Немного математики – посчитайте цену в долларах. Берем |количество0| это количество добавленных или «вычтенных» из пула токенов, умноженное на цену токена 0 в долларах за минуту обмена.

  6. Группировка по дням (или неделям).

Мой выбор, Авторские права. В результате получилась эта красивая диаграмма.

Данные начинаются с 1 мая 2021 года, что было началом мая, когда был развернут первый SwapRouter Uniswap V3.

День 3 — вывести список инструкций по обмену (TOK_A → TOK_B) и сколько раз он в них использовался V2 для WETH/USDC. Выведите первые 100 по номеру. Использовать UniswapV2Роутер02 (средний уровень).

Обмен может происходить через посредническую пару. Например, биржа использует пары TOK_A → WETH → USDC → TOK_B 3, где WETH/USDC — промежуточная пара. В результате должна появиться следующая таблица:

Следует читать: при обмене WETH на HEX пара WETH/USDC использовалась 28671 раз.
Следует читать: при обмене WETH на HEX пара WETH/USDC использовалась 28671 раз.
Идея решения
  1. Для выполнения обмена токенов вызывается одна из 9 функций роутера (swapExactTokensForTokens, swapTokensForExactTokens, …) — полный список есть в решении.

  2. Каждой из этих функций передается параметр пути — массив адресов токенов, по которым будет проходить биржа (пример выше).

  3. Запрашиваем таблицы uniswap_v2_ethereum.Router02_call_swapExactTokensForTokens, uniswap_v2_ethereum.Router02_call_swapTokensForExactTokens, … где путь содержит токены USDC,WETH, которые следуют друг за другом.

  4. Группируем по начальному/конечному символу в дорожке, считаем число.

  5. Мы запрашиваем таблицу tokens.erc20 для отображения символов токенов.

XBNFNM   Путин поддержал идею налогового кредита для виноградарей

Мой, Авторские права решения. В процессе нашел команда в авторском решении.

День 4 – для Пул V3 WETH/USDC определить объем в долларах и количество обменов, совершенных ботами (MEV) и обычными пользователями, вывести по дням (средний).

Результат должен выглядеть примерно так:

e7bae70bb9af322d4665fcf41d223592
Идея решения

Проблема может быть решена различными способами; анализировать шаблоны, например. Но в данном случае мы будем анализировать простое решение через размеченные данные.

  1. Ищем кто получатель обмена через цепочку таблиц uniswap_v3_ethereum.Pair_evt_Swap — ethereum.transactions

  2. Просим таблицу labels.mev_ethereum, где уже есть размеченные данные от Dune (или etherscan?), какие аккаунты MEV-боты. Если запись не найдена, мы считаем это не штрафом.

  3. Для получения цены используйте цепочку uniswap_v3_ethereum.Pair_evt_Swap – uniswap_v3_ethereum.Factory_evt_PoolCreated – price.usd

  4. Создаем серию группировок по дням (или неделям). Вы можете фильтровать по дате, чтобы сделать запрос быстрее.

Реальный объем трафика MEV, конечно, выше.

Мой, Авторские права решения.

День 5 – Для Пул V3 WETH/USDC определить объем в долларах и количество обменов, сгруппированных по тому, что вызвало обмен – кошелек (EOA – внешняя учетная запись) или смарт-контракт, отображение по неделям или дням (дополнительно).

Идея решения

Способ подсчета объема в долларах и количество обменов находится на День 2.

Чтобы понять, кто инициировал обмен (EOA или смарт-контракт), требуется

  1. Найдите вызов UniswapV3Pool.swap() в ethereum.track

  2. Выясните, кто вызвал эту функцию (обычно это другой смарт-контракт, например маршрутизатор).

  3. Найдите, что вызывал этот смарт-контракт (EOA или смарт-контракт) — это и будет группировка.

Отвечать:

  1. Смотрим сделанные свопы в uniswap_v3_ethereum.Pair_call_swap

  2. Просим ethereum.traces (команды, из которых состоит транзакция). Для этого ищем tx_hash и адрес отслеживания команда, в которой был сделан своп (мы используем uniswap_v3_ethereum.Pair_call_swap). В итоге на шаге 2 мы нашли строку вызова метода в ethereum.traces UniswapV3Pool.swap() – назовем это tr_swap.

  3. Каждая команда имеет поля от (кто звонил) до (кто звонил). Для команды, найденной на предыдущем шаге, ищем команду, вызвавшую ее, назовем ее tr_swap_caller. Мы используем поля from, to, trace_address (tr_swap_caller.trace_address будет меньше или равен tr_swap.trace_address по длине). В результате шага 3 поле tr_swap_caller.from содержит желаемый источник вызывающего абонента.

  4. Запрашиваем таблицу ethereum.creation_traces для tr_swap_caller.from и если такая запись там есть то это смарт контракт, иначе это EOA (кошелек).

  5. Далее запрашиваем Prices.usd для цен в долларах.

  6. В качестве бонуса можно подключиться к таблице labels.contracts, где находятся названия смарт-контрактов, используя поле address=tr_swap_caller.from. Отсюда можно понять, распространяется ли контракт на Uniswap, Paraswap, Oneinch и т. д. (исходный столбец в таблице labels.contracts)

XBNFNM   Названа европейская страна с самой дорогой ипотекой

Мой, авторское решение. Видно, что большинство обменов осуществляется кошельками (EOA) (на 2023 год):

63708575fb869e5ddd6e5eac8a48f916

В авторском решении нашел команда – количество обменов было занижено. Тоже вроде нашел ошибка данных когда я пытался проверить количество обменов в день с задачей 2. Я потратил много времени на этот запрос, потому что эти две ошибки пересекались.

Очень важная рекомендация — всегда проверять результаты вашего запроса с помощью тестового запроса. В этом случае метод подкачки() причины событие подкачки() во всех успешных вызовах и количество записей в uniswap_v3_ethereum.Pair_call_swap uniswap_v3_ethereum.Pair_evt_Swap должно быть то же самое, но как будто это не.

Советы по оптимизации

Dune — это база данных OLAP, поэтому вам нужно разбираться в деталях, вы можете прочитать Здесь. Некоторые практические моменты:

  1. Поиск хэшей (например tx_hash) идет медленно, по возможности его следует включать в номер блока или условие времени блока (из-за хранения данных в формате паркеткогда минимальное/максимальное значение номера блока хранится в группах строк, чтобы ненужные быстро отсекались).

  2. При поиске на монотонном интервале лишние данные лучше отсечь условием «больше/меньше» (например, block_time >= DATE '2023-01-01' на случай, если вам нужны данные только за 2023 год), что опять же связано с особенностью сохранения в паркетном формате.

выводы

Вот мы и научились получать статистику Uniswap в Dune Analytics. При желании вы можете продолжить исследование дальше, разбирая день 6 и задачи второй недели, связанные с ликвидностью.

В целом Dune Analytics оказалась интересной платформой. С другой стороны, запросы часто падали — пробежка по 30 секунд на следующий день могла пробежать по 10 минут. Поэтому, если вам нужно написать запрос, умножьте расчетное время на пять, просто на всякий случай. Также возможно ошибка данных, исследование, которое может занять довольно много времени. Я связываю это с текущим переходом на третью версию движка (Dune SQL), платформа должна стабилизироваться. Хочу пожелать ребятам удачи в этом деле!

PS Минутка саморекламы – веду тг канал веб3 разработчик. Я пишу короткие заметки о проблемах блокчейна/криптографии, которые я решаю. Буду рад видеть среди подписчиков!



Source