Как читать блок-эксплореры и понимать транзакции, трассировки и логи на Ethereum (EVM)

ПродвинутыйSep 13, 2024
Изучите, как читать данные исследователей, таких как Etherscan и naviGate, в этих трех ключевых структурах данных и как найти таблицы, которые вам нужно запросить.
Как читать блок-эксплореры и понимать транзакции, трассировки и логи на Ethereum (EVM)

Что включено в транзакцию?

Если вы когда-либо проводили транзакцию на Ethereum (или любом блокчейне с поддержкой смарт-контрактов), то вы, вероятно, искали ее в эксплорере блоков, например, etherscan.io, и видели этот кучу информации:

Вкладка Обзор транзакций

И если вы попытались посмотреть логи или трассировки (внутренние транзакции), вы могли видеть эти запутанные страницы:

Вкладка Журналы (вам повезло, если они красиво расшифрованы, как это)

Вкладка трасс (да, выглядит как куча ерунды)

Изучение деталей транзакции в обозревателях блоков станет основой для всех ваших анализа данных и знаний Ethereum, поэтому давайте рассмотрим все компоненты и способы работы с ними в SQL.

Я только объясняю, как понимать эти концепции на высоком уровне; если вы хотите научиться расшифровывать их вручную, то вам нужно ознакомиться с тем, как это делать.данные кодируются (то же самое для транзакций/следов/журналов) и как использовать Функции bytearray/hex в Duneпереходить между различными типами.

К концу этого руководства вы сможете понимать и навиGate таблицы данных для любого контракта с помощью этого запроса поиска таблиц транзакций:

Ссылка для запроса(Подключите любой хэш транзакции, цепь и номер блока)

После того, как вы освоите концепции в этом руководстве, вам стоит также научиться использовать мою Панель быстрого запуска EVMчтобы начать анализ любого контракта.

Как проанализировать любой протокол или продукт Ethereum за пять минут

Андрю Хонг

·

30 декабря 2022 года

Прочитать полную историю

Транзакции

Транзакции - это только вершина айсберга данных, все следы и журналы вызываются ПОСЛЕ того, как исходные данные запускают функцию верхнего уровня. Давайте сначала пометим все поля, которые вы увидите на странице транзакции в исследователе блоков:

Это те же поля, которые вы увидите, когда запросите «ethereum.transactions» на Dune. Основной момент, который нужно выучить здесь, это определить, является ли «to» контрактом или нет. Обычно контракты будут четко обозначены. Если это контракт, там должны быть «входные данные», которые содержат вызов функции.

ссылка на транзакцию

Из всех этих концепций первым, что стоит хорошо изучить, является EOA по сравнению с адресом контракта. Контракты развертываются EOA и могут быть вызваны в поле "to" транзакции. Если вы нажмете на адрес, исследователи покажут в верхнем левом углу, является ли он контрактом или учетной записью. На дюне вы можете присоединиться к таблице ethereum.creation_traces, чтобы проверить, является ли это контрактом. Обратите внимание, что только EOA может быть подписчиком tx "from".

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

пример транзакции

Первые 4 байта (8 символов) представляют собой "сигнатуру функции", котораяхэш keccakназвания функции и типы входных данных. У Etherscan есть удобная кнопка «декодировать» для некоторых контрактов, которая дает вам эту читаемую форму:

пример транзакции

Как вы можете видеть, в том длинном шестнадцатеричном строке, которую мы рассматривали ранее, упаковано множество переменных. Они кодируются в соответствии со спецификацией интерфейса бинарных приложений (ABI) для умных контрактов.

ABI - это документация API для смарт-контрактов (подобно спецификациям OpenAPI), вы можете узнать больше на технические детали здесь. Большинство разработчиков будут проверять, соответствует ли их ABI контракту, и загружать ABI для того, чтобы все остальные могли использовать его для декодирования. Многие контракты могут быть связаны с MEV/трейдингом, где разработчик хочет сохранить их закрытыми и конфиденциальными - поэтому мы не получаем от них никаких данных для декодирования.

В Dune у нас есть расшифрованные таблицына основе представленных контрактов ABIsв таблицу контрактов (т.е. ethereum.contracts), функции и события преобразуются в байтовые сигнатуры (ethereum.signatures), которые затем сопоставляются с трассами и журналами, чтобы дать вам декодированные таблицы, такие как uniswap_v2_ethereum.Pair_evt_Swap, которая хранит все обмены для всех пар контрактов, созданных фабрикой пар Uniswap v2. Вы можете фильтровать обмены для конкретной пары, просматривая таблицу contract_address для событий.

На Dune вы захотите запросить эту таблицу для вызова функции oneinch_ethereum.AggregationRouterV6_call_swap. Вы увидите, что название этой таблицы находится вверху результатов запроса в поиске таблицы в начале руководства.

Для следующих разделов о трассировке и журналах мы будем использоватьтот же обменный транзакт агрегатора 1inch. Это хороший пример, потому что маршрутизатор будет обменивать токены по множеству контрактов DEX, так что у нас будет хорошее разнообразие трасс и журналов для расследованияGate.

Журналы

Теперь давайте поговорим о журналах событий. Журналы могут быть выведены в любой момент вызова функции. Разработчики обычно выведут журнал в конце функции, после того как все трансферы/логика будут завершены без ошибок. Давайте посмотрим на событие обмена uniswap v3, выведенное из ранее совершенной транзакции:

пример транзакции

Вы увидите, что есть поле topic0, topic1, topic2 и data. topic0 аналогичен сигнатуре функции, за исключением того, что он составляет 32 байта вместо 4 байт (все равно хэшируется таким же образом). События могут иметь «индексированные» поля для более быстрой фильтрации данных, которые могут появляться в topic1, topic2 или topic3. Все остальные поля кодируются вместе в объекте «data». Опять же, они следуют тем же правилам кодирования, что и транзакции и трассировки. «28» - это индекс события во всем блоке. Иногда может быть полезно объединиться, когда вы хотите первый переход или передачу в транзакции.

Чтобы понять логику того, где и как было сгенерировано это событие, мне нужно погрузиться в код на Solidity. Я нажму на связанный адрес события, перейду на вкладку контракта и выполню поиск по запросу 'emit swap', потому что я знаю, что все события имеют префикс 'emit' перед тем, как они вызываются в коде.

Это контракт uniswapv3poolэто завод, созданный для каждой пары.

Я вижу, что это отправляется в строке 786 контракта, как часть функции «swap».

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

Для подробного примера расследования кода функций и событий,проверьте этот разбор контрактов и данных Sudoswap.

Используя ранее найденный запрос таблицы, я вижу, что таблицу, которую я должен запросить для этого свопа, называется uniswap_v3_ethereum.Pair_evt_Swap, и она генерируется после вызова функции swap().

Следы (ethereum.traces)

Следы могут быстро стать очень сложными для навигации из-за того, насколько вложенными являются вызовы между различными контрактами. Давайте сначала поймем типы следов:

  • CREATE: это трасса, излучаемая при развертывании нового контракта. Вы можете развернуть контракт непосредственно в начале транзакции, это означает, что в данных транзакции нет адреса "to". Вы также можете развернуть контракт внутри вызова функции, отсюда и существование фабрик контрактов. Посмотрите таблицу ethereum.creation_traces для более простого представления об этом.
  • DELEGateCALL: это входит в ваш мысленный список «игнорирования» при просмотре транзакции. Это можно сравнить с переадресацией запроса с одного сервера на другой без изменения логики. Это связано с прокси и хранилищем, вы можете @bansaltushar014/deleGatecall-in-solidity-4138b121cbe">подробнее здесь.
  • CALL: это наиболее распространенный и общий трейс. Вызов может быть просто передачей значения ETH без участия каких-либо контрактов. Это также может быть любой вызов функции на любом контракте.
  • STATICCALL: это вызов функции, который НЕ изменяет какое-либо состояние и используется исключительно для вычислений. Такие вещи, как оракулы ценовых лент, расчеты цен AMM, проверки коэффициентов ликвидации, проверки балансов и т. д., все происходит в рамках статических вызовов. Часто встречается в Solidity как типы функций «view» или «pure».

Вам также нужно понять столбец/индекс trace_address. Это шаблон [0,1,1,1,1], который вы часто видите. Представьте, что это похоже на маркеры, где количество чисел в массиве указывает на глубину и порядок вызовов функций.

A (null) - первый вход транзакции имеет trace_address []

CALLs B (0)

CALLs C (0,0)

CALLs D (1)

CALLs E (1,0)  CALLs F (1,0,0)CALLs G (1,1)

CALLs H (2)

Как вы можете судить по нашим предыдущим внутренним транзакциям (следам) на скриншоте, etherscan не является дружественным местом для просмотра следов. Я предпочитаю использовать вместо этого phalcon blocksec, который раскрывает транзакцию таким образом:

Ссылка на обозреватель

Это может выглядеть сложно, но на самом деле это очень простой способ исследования всех функций, событий и аргументов в ходе транзакции. Когда вы сможете понять это, тогда вы смело сможете сказать, что вы понимаете все данные в транзакции. Обратите внимание на то, что моя запрос таблицы поискапочти точная копия этого макета, я в значительной степени вдохновился ими!

Обратите внимание, что на Dune мы автоматически декодируем как вызовы транзакций, так и трассировки одного и того же имени функции в одну и ту же таблицу. Возможно, вы задаетесь вопросом, можно ли легко объединить события и трассировки/транзакции в том же порядке, что и в phalcon. На Dune вы можете объединять данные по хэшу транзакции, чтобы в целом связать данные вместе, но вы не можете объединить их по любому индексу, чтобы воссоздать точный порядок взаимодействий. Это недопустимое ограничение на данный момент, требующее настраиваемого индексатора.

Вперед, глубже в темный лес криптовалют

Если вы понимаете концепции, изложенные в этом руководстве, то вы готовы к более глубокому погружению и написанию более сложных запросов. Навигация по данным между транзакциями с использованием различных инструментов будет одним из самых важных навыков, необходимых для успешной деятельности в этой области.

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

Ссылка на руководство

Disclaimer:

  1. Эта статья взята из [ криптоданные], Все авторские права принадлежат автору оригинала [Andrew Hong]. Если у вас есть возражения против этой перепечатки, пожалуйста, свяжитесь с Gate Learnкоманду, и они оперативно справятся с этим.
  2. Отказ от ответственности: Взгляды и мнения, выраженные в этой статье, принадлежат исключительно автору и не являются какими-либо инвестиционными рекомендациями.
  3. Переводы статьи на другие языки выполняются командой Gate Learn. Если не указано иное, запрещается копирование, распространение или плагиат переведенных статей.

Как читать блок-эксплореры и понимать транзакции, трассировки и логи на Ethereum (EVM)

ПродвинутыйSep 13, 2024
Изучите, как читать данные исследователей, таких как Etherscan и naviGate, в этих трех ключевых структурах данных и как найти таблицы, которые вам нужно запросить.
Как читать блок-эксплореры и понимать транзакции, трассировки и логи на Ethereum (EVM)

Что включено в транзакцию?

Если вы когда-либо проводили транзакцию на Ethereum (или любом блокчейне с поддержкой смарт-контрактов), то вы, вероятно, искали ее в эксплорере блоков, например, etherscan.io, и видели этот кучу информации:

Вкладка Обзор транзакций

И если вы попытались посмотреть логи или трассировки (внутренние транзакции), вы могли видеть эти запутанные страницы:

Вкладка Журналы (вам повезло, если они красиво расшифрованы, как это)

Вкладка трасс (да, выглядит как куча ерунды)

Изучение деталей транзакции в обозревателях блоков станет основой для всех ваших анализа данных и знаний Ethereum, поэтому давайте рассмотрим все компоненты и способы работы с ними в SQL.

Я только объясняю, как понимать эти концепции на высоком уровне; если вы хотите научиться расшифровывать их вручную, то вам нужно ознакомиться с тем, как это делать.данные кодируются (то же самое для транзакций/следов/журналов) и как использовать Функции bytearray/hex в Duneпереходить между различными типами.

К концу этого руководства вы сможете понимать и навиGate таблицы данных для любого контракта с помощью этого запроса поиска таблиц транзакций:

Ссылка для запроса(Подключите любой хэш транзакции, цепь и номер блока)

После того, как вы освоите концепции в этом руководстве, вам стоит также научиться использовать мою Панель быстрого запуска EVMчтобы начать анализ любого контракта.

Как проанализировать любой протокол или продукт Ethereum за пять минут

Андрю Хонг

·

30 декабря 2022 года

Прочитать полную историю

Транзакции

Транзакции - это только вершина айсберга данных, все следы и журналы вызываются ПОСЛЕ того, как исходные данные запускают функцию верхнего уровня. Давайте сначала пометим все поля, которые вы увидите на странице транзакции в исследователе блоков:

Это те же поля, которые вы увидите, когда запросите «ethereum.transactions» на Dune. Основной момент, который нужно выучить здесь, это определить, является ли «to» контрактом или нет. Обычно контракты будут четко обозначены. Если это контракт, там должны быть «входные данные», которые содержат вызов функции.

ссылка на транзакцию

Из всех этих концепций первым, что стоит хорошо изучить, является EOA по сравнению с адресом контракта. Контракты развертываются EOA и могут быть вызваны в поле "to" транзакции. Если вы нажмете на адрес, исследователи покажут в верхнем левом углу, является ли он контрактом или учетной записью. На дюне вы можете присоединиться к таблице ethereum.creation_traces, чтобы проверить, является ли это контрактом. Обратите внимание, что только EOA может быть подписчиком tx "from".

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

пример транзакции

Первые 4 байта (8 символов) представляют собой "сигнатуру функции", котораяхэш keccakназвания функции и типы входных данных. У Etherscan есть удобная кнопка «декодировать» для некоторых контрактов, которая дает вам эту читаемую форму:

пример транзакции

Как вы можете видеть, в том длинном шестнадцатеричном строке, которую мы рассматривали ранее, упаковано множество переменных. Они кодируются в соответствии со спецификацией интерфейса бинарных приложений (ABI) для умных контрактов.

ABI - это документация API для смарт-контрактов (подобно спецификациям OpenAPI), вы можете узнать больше на технические детали здесь. Большинство разработчиков будут проверять, соответствует ли их ABI контракту, и загружать ABI для того, чтобы все остальные могли использовать его для декодирования. Многие контракты могут быть связаны с MEV/трейдингом, где разработчик хочет сохранить их закрытыми и конфиденциальными - поэтому мы не получаем от них никаких данных для декодирования.

В Dune у нас есть расшифрованные таблицына основе представленных контрактов ABIsв таблицу контрактов (т.е. ethereum.contracts), функции и события преобразуются в байтовые сигнатуры (ethereum.signatures), которые затем сопоставляются с трассами и журналами, чтобы дать вам декодированные таблицы, такие как uniswap_v2_ethereum.Pair_evt_Swap, которая хранит все обмены для всех пар контрактов, созданных фабрикой пар Uniswap v2. Вы можете фильтровать обмены для конкретной пары, просматривая таблицу contract_address для событий.

На Dune вы захотите запросить эту таблицу для вызова функции oneinch_ethereum.AggregationRouterV6_call_swap. Вы увидите, что название этой таблицы находится вверху результатов запроса в поиске таблицы в начале руководства.

Для следующих разделов о трассировке и журналах мы будем использоватьтот же обменный транзакт агрегатора 1inch. Это хороший пример, потому что маршрутизатор будет обменивать токены по множеству контрактов DEX, так что у нас будет хорошее разнообразие трасс и журналов для расследованияGate.

Журналы

Теперь давайте поговорим о журналах событий. Журналы могут быть выведены в любой момент вызова функции. Разработчики обычно выведут журнал в конце функции, после того как все трансферы/логика будут завершены без ошибок. Давайте посмотрим на событие обмена uniswap v3, выведенное из ранее совершенной транзакции:

пример транзакции

Вы увидите, что есть поле topic0, topic1, topic2 и data. topic0 аналогичен сигнатуре функции, за исключением того, что он составляет 32 байта вместо 4 байт (все равно хэшируется таким же образом). События могут иметь «индексированные» поля для более быстрой фильтрации данных, которые могут появляться в topic1, topic2 или topic3. Все остальные поля кодируются вместе в объекте «data». Опять же, они следуют тем же правилам кодирования, что и транзакции и трассировки. «28» - это индекс события во всем блоке. Иногда может быть полезно объединиться, когда вы хотите первый переход или передачу в транзакции.

Чтобы понять логику того, где и как было сгенерировано это событие, мне нужно погрузиться в код на Solidity. Я нажму на связанный адрес события, перейду на вкладку контракта и выполню поиск по запросу 'emit swap', потому что я знаю, что все события имеют префикс 'emit' перед тем, как они вызываются в коде.

Это контракт uniswapv3poolэто завод, созданный для каждой пары.

Я вижу, что это отправляется в строке 786 контракта, как часть функции «swap».

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

Для подробного примера расследования кода функций и событий,проверьте этот разбор контрактов и данных Sudoswap.

Используя ранее найденный запрос таблицы, я вижу, что таблицу, которую я должен запросить для этого свопа, называется uniswap_v3_ethereum.Pair_evt_Swap, и она генерируется после вызова функции swap().

Следы (ethereum.traces)

Следы могут быстро стать очень сложными для навигации из-за того, насколько вложенными являются вызовы между различными контрактами. Давайте сначала поймем типы следов:

  • CREATE: это трасса, излучаемая при развертывании нового контракта. Вы можете развернуть контракт непосредственно в начале транзакции, это означает, что в данных транзакции нет адреса "to". Вы также можете развернуть контракт внутри вызова функции, отсюда и существование фабрик контрактов. Посмотрите таблицу ethereum.creation_traces для более простого представления об этом.
  • DELEGateCALL: это входит в ваш мысленный список «игнорирования» при просмотре транзакции. Это можно сравнить с переадресацией запроса с одного сервера на другой без изменения логики. Это связано с прокси и хранилищем, вы можете @bansaltushar014/deleGatecall-in-solidity-4138b121cbe">подробнее здесь.
  • CALL: это наиболее распространенный и общий трейс. Вызов может быть просто передачей значения ETH без участия каких-либо контрактов. Это также может быть любой вызов функции на любом контракте.
  • STATICCALL: это вызов функции, который НЕ изменяет какое-либо состояние и используется исключительно для вычислений. Такие вещи, как оракулы ценовых лент, расчеты цен AMM, проверки коэффициентов ликвидации, проверки балансов и т. д., все происходит в рамках статических вызовов. Часто встречается в Solidity как типы функций «view» или «pure».

Вам также нужно понять столбец/индекс trace_address. Это шаблон [0,1,1,1,1], который вы часто видите. Представьте, что это похоже на маркеры, где количество чисел в массиве указывает на глубину и порядок вызовов функций.

A (null) - первый вход транзакции имеет trace_address []

CALLs B (0)

CALLs C (0,0)

CALLs D (1)

CALLs E (1,0)  CALLs F (1,0,0)CALLs G (1,1)

CALLs H (2)

Как вы можете судить по нашим предыдущим внутренним транзакциям (следам) на скриншоте, etherscan не является дружественным местом для просмотра следов. Я предпочитаю использовать вместо этого phalcon blocksec, который раскрывает транзакцию таким образом:

Ссылка на обозреватель

Это может выглядеть сложно, но на самом деле это очень простой способ исследования всех функций, событий и аргументов в ходе транзакции. Когда вы сможете понять это, тогда вы смело сможете сказать, что вы понимаете все данные в транзакции. Обратите внимание на то, что моя запрос таблицы поискапочти точная копия этого макета, я в значительной степени вдохновился ими!

Обратите внимание, что на Dune мы автоматически декодируем как вызовы транзакций, так и трассировки одного и того же имени функции в одну и ту же таблицу. Возможно, вы задаетесь вопросом, можно ли легко объединить события и трассировки/транзакции в том же порядке, что и в phalcon. На Dune вы можете объединять данные по хэшу транзакции, чтобы в целом связать данные вместе, но вы не можете объединить их по любому индексу, чтобы воссоздать точный порядок взаимодействий. Это недопустимое ограничение на данный момент, требующее настраиваемого индексатора.

Вперед, глубже в темный лес криптовалют

Если вы понимаете концепции, изложенные в этом руководстве, то вы готовы к более глубокому погружению и написанию более сложных запросов. Навигация по данным между транзакциями с использованием различных инструментов будет одним из самых важных навыков, необходимых для успешной деятельности в этой области.

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

Ссылка на руководство

Disclaimer:

  1. Эта статья взята из [ криптоданные], Все авторские права принадлежат автору оригинала [Andrew Hong]. Если у вас есть возражения против этой перепечатки, пожалуйста, свяжитесь с Gate Learnкоманду, и они оперативно справятся с этим.
  2. Отказ от ответственности: Взгляды и мнения, выраженные в этой статье, принадлежат исключительно автору и не являются какими-либо инвестиционными рекомендациями.
  3. Переводы статьи на другие языки выполняются командой Gate Learn. Если не указано иное, запрещается копирование, распространение или плагиат переведенных статей.
Comece agora
Registe-se e ganhe um cupão de
100 USD
!