Если вы когда-либо проводили транзакцию на Ethereum (или любом блокчейне с поддержкой смарт-контрактов), то вы, вероятно, искали ее в эксплорере блоков, например, etherscan.io, и видели этот кучу информации:
Вкладка Обзор транзакций
И если вы попытались посмотреть логи или трассировки (внутренние транзакции), вы могли видеть эти запутанные страницы:
Вкладка Журналы (вам повезло, если они красиво расшифрованы, как это)
Вкладка трасс (да, выглядит как куча ерунды)
Изучение деталей транзакции в обозревателях блоков станет основой для всех ваших анализа данных и знаний Ethereum, поэтому давайте рассмотрим все компоненты и способы работы с ними в SQL.
Я только объясняю, как понимать эти концепции на высоком уровне; если вы хотите научиться расшифровывать их вручную, то вам нужно ознакомиться с тем, как это делать.данные кодируются (то же самое для транзакций/следов/журналов) и как использовать Функции bytearray/hex в Duneпереходить между различными типами.
К концу этого руководства вы сможете понимать и навиGate таблицы данных для любого контракта с помощью этого запроса поиска таблиц транзакций:
Ссылка для запроса(Подключите любой хэш транзакции, цепь и номер блока)
После того, как вы освоите концепции в этом руководстве, вам стоит также научиться использовать мою Панель быстрого запуска EVMчтобы начать анализ любого контракта.
·
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().
Следы могут быстро стать очень сложными для навигации из-за того, насколько вложенными являются вызовы между различными контрактами. Давайте сначала поймем типы следов:
Вам также нужно понять столбец/индекс 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 раз превышает это количество. Я пишу ежегодное руководство, в котором рассказывается о том, как развивается стек инструментов для работы с данными, и для чего следует использовать каждый инструмент:
Если вы когда-либо проводили транзакцию на Ethereum (или любом блокчейне с поддержкой смарт-контрактов), то вы, вероятно, искали ее в эксплорере блоков, например, etherscan.io, и видели этот кучу информации:
Вкладка Обзор транзакций
И если вы попытались посмотреть логи или трассировки (внутренние транзакции), вы могли видеть эти запутанные страницы:
Вкладка Журналы (вам повезло, если они красиво расшифрованы, как это)
Вкладка трасс (да, выглядит как куча ерунды)
Изучение деталей транзакции в обозревателях блоков станет основой для всех ваших анализа данных и знаний Ethereum, поэтому давайте рассмотрим все компоненты и способы работы с ними в SQL.
Я только объясняю, как понимать эти концепции на высоком уровне; если вы хотите научиться расшифровывать их вручную, то вам нужно ознакомиться с тем, как это делать.данные кодируются (то же самое для транзакций/следов/журналов) и как использовать Функции bytearray/hex в Duneпереходить между различными типами.
К концу этого руководства вы сможете понимать и навиGate таблицы данных для любого контракта с помощью этого запроса поиска таблиц транзакций:
Ссылка для запроса(Подключите любой хэш транзакции, цепь и номер блока)
После того, как вы освоите концепции в этом руководстве, вам стоит также научиться использовать мою Панель быстрого запуска EVMчтобы начать анализ любого контракта.
·
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().
Следы могут быстро стать очень сложными для навигации из-за того, насколько вложенными являются вызовы между различными контрактами. Давайте сначала поймем типы следов:
Вам также нужно понять столбец/индекс 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 раз превышает это количество. Я пишу ежегодное руководство, в котором рассказывается о том, как развивается стек инструментов для работы с данными, и для чего следует использовать каждый инструмент: