Як читати провідники блоків і розуміти транзакції, траси та журнали на Ethereum (EVM)

Розширений9/13/2024, 10:17:49 PM
Дізнайтеся, як читати дослідників, таких як Etherscan, та навігувати даними по цим трьом ключовим структурам даних, а також як знайти таблиці, які вам знадобляться для запитів.

Що включено в транзакцію?

Якщо ви коли-небудь здійснювали транзакцію на Ethereum (або на будь-якому блокчейні з підтримкою розумних контрактів), то, ймовірно, ви переглядали її на блок-експлорері, наприклад, etherscan.io, і бачили цю купу інформації:

Вкладка Огляд транзакцій

А якщо ви спробували подивитися на журнали або сліди (внутрішні транзакції), то могли побачити ці незрозумілі сторінки:

Вкладка журналів (ви маєте щастя, якщо вони гарно декодовані, як це)

Вкладка Сліди (так, вона виглядає як купа безглуздя)

Навчання читати деталі транзакції в дослідниках блоків буде основою для всього вашого аналізу даних та знань про Ethereum, тому давайте розглянемо всі частини та способи роботи з ними в SQL.

Я лише розглядаю, як розуміти ці концепції на високому рівні; якщо ви хочете навчитися розкодовувати це вручну, то вам потрібно ознайомитися з тим, якдані кодуються (це так само для операцій / трас / журналів) та як користуватися Функції байтового рядка/шістнадцяткового запису Duneпереходити між різними типами.

До кінця цього посібника ви зможете розуміти та навігувати таблицями даних для будь-якого контракту за допомогою цього запиту пошуку таблиці транзакцій:

Посилання запиту (Вставте будь-який хеш транзакції, ланцюг та номер блоку)

Після того, як ви вивчите концепції в цьому посібнику, ви також повинні вивчити, як використовувати мійШвидкий старт панелі EVMщоб розпочати аналіз будь-якого контракту.

Як аналізувати будь-який протокол або продукт Ethereum за п'ять хвилин

Андрій Гонг

·

30 грудня 2022 року

Читати повну історію

Транзакції

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

Це ті самі поля, які ви побачите, коли надішлете запит «ethereum.transactions» на Dune. Ключовим моментом, який слід навчитися визначати, є те, чи є «до» контрактом чи ні. Як правило, контракти мають чітке маркування. Якщо це контракт, то повинні бути "вхідні дані", які містять виклик функції.

посилання на транзакцію

З усіх цих концепцій першою, яку варто добре вивчити, є EOA проти адреси контракту. Контракти розгортаються EOA, і їх можна викликати в полі "to" транзакції. Якщо ви натиснете на адресу, експлорери покажуть зліва зверху, чи це контракт чи рахунок. На дюні ви можете приєднатися до таблиці ethereum.creation_traces, щоб перевірити, чи це контракт. Зверніть увагу, що лише EOA можуть бути підписником "from" транзакції.

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

приклад транзакції

Перші 4 байти (8 символів) - це "сигнатура функції", якахеш keccakім'я функції та типи вводу. Etherscan має гарну кнопку «декодувати» для деяких контрактів, що дає вам цю зрозумілу форму:

приклад транзакції

Як бачите, є багато змінних, упакованих разом в один довгий шістнадцятковий рядок з попереднього. Спосіб їх кодування відповідає специфікації двійкового інтерфейсу додатків (ABI) смарт-контрактів.

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

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

На Dune ви хотіли б запитати цю таблицю для цього функціонального виклику oneinch_ethereum.AggregationRouterV6_call_swap. Ви побачите, що назва цієї таблиці знаходиться у верхній частині результатів запиту в пошуку таблиць на початку посібника.

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

Журнали

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

приклад транзакції

Ви побачите, що є тема 0, тема 1, тема 2 та поле даних. Тема 0 подібна до підпису функції, за винятком того, що вона складається з 32 байтів замість 4 байтів (але все ще хешується так само). Події можуть мати «індексовані» поля для швидкого фільтрування даних, які можуть з'являтися в темі 1, темі 2 або темі 3. Усі інші поля кодуються разом у об'єкті «дані». Знову ж таки, вони слідують тим самим правилам кодування, що й у операціях та слідах. «28» - це індекс події в цілому блоку. Іноді корисно приєднатися, коли вам потрібна перша обмін або переказ у транзакції.

Щоб знайти логіку того, де і як ця подія була відправлена, мені потрібно буде поринути в код solidity. Я натисну на посилання адреси події, перейду на вкладку контракту та виконаю пошук "emit swap", оскільки я знаю, що всі події мають "emit" правильно перед тим, як вони викликаються в коді.

Це контракт uniswapv3poolце завод, створений для кожної пари.

Я бачу, що це випускається в рядку 786 контракту, як частина функції «swap».

Здатність навігації функцій та лінійності подій через контракти буде ключовою навичкою, яку вам потрібно опанувати, щоб точно розуміти послідовність даних, які ви запитуєте. Вам не потрібно глибоко вивчати solidity, щоб навігувати цими файлами, просто знати, як розумітиінтерфейси контракту і коли викликаються функції/події (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)

ВИКЛИКи C (0,0)

CALLs D (1)

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

ДЗВІНКИ H (2)

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

Посилання на провідник

Це може виглядати приголомшливо, але насправді це дуже простий спосіб дослідження всіх функцій, подій та аргументів у потоці транзакції. Якщо ви зможете зрозуміти це, то можете з впевненістю сказати, що розумієте всі дані у транзакції. Зверніть увагу, що мої запитник таблиціце майже точна копія цього макету, я дуже багато вдихновився ними!

Зверніть увагу, що на Dune ми автоматично розкодовуємо як виклики транзакцій, так і сліди тієї ж назви функції в ту саму таблицю. Ви, можливо, думаєте, чи можете ви легко приєднати події і сліди/транзакції в гарному порядку, показаному в phalcon. На Dune ви можете приєднатися до хешу транзакції, щоб загалом зв'язати дані, але ви не можете приєднатися до будь-якого індексу, щоб відтворити точний порядок взаємодій. Це невдачливе обмеження на даний момент, яке потребує власного індексатора.

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

Якщо ви розумієте концепції, які я виклав у цьому посібнику, то ви готові копати глибше й писати більш складні запити. Навігація даними через транзакції за допомогою кількох різних інструментів буде однією з найважливіших навичок, які вам доведеться вдосконалити в цій галузі.

Ймовірно, я використовую 10 різних дослідників щотижня, а кількість інструментів в 10 разів більша. Я пишу щорічний довідник, який охоплює розвиток стеку інструментів для обробки даних і як використовувати кожен з них:

Посилання на путівник

Disclaimer:

  1. Ця стаття є перепублікована з [ криптоданих], Усі авторські права належать оригінальному авторові [Andrew Hong]. Якщо є зауваження до цього повторення, будь ласка, зв'яжіться з Gate Learnкоманда, і вони оперативно цим займуться.
  2. Відповідальність за відмову: Погляди та думки, висловлені в цій статті, є виключно тими, хто написав її, і не становлять жодної інвестиційної поради.
  3. Переклади статті на інші мови виконуються командою Gate Learn. Якщо не зазначено, копіювання, поширення або плагіат перекладених статей заборонено.

Як читати провідники блоків і розуміти транзакції, траси та журнали на Ethereum (EVM)

Розширений9/13/2024, 10:17:49 PM
Дізнайтеся, як читати дослідників, таких як Etherscan, та навігувати даними по цим трьом ключовим структурам даних, а також як знайти таблиці, які вам знадобляться для запитів.

Що включено в транзакцію?

Якщо ви коли-небудь здійснювали транзакцію на Ethereum (або на будь-якому блокчейні з підтримкою розумних контрактів), то, ймовірно, ви переглядали її на блок-експлорері, наприклад, etherscan.io, і бачили цю купу інформації:

Вкладка Огляд транзакцій

А якщо ви спробували подивитися на журнали або сліди (внутрішні транзакції), то могли побачити ці незрозумілі сторінки:

Вкладка журналів (ви маєте щастя, якщо вони гарно декодовані, як це)

Вкладка Сліди (так, вона виглядає як купа безглуздя)

Навчання читати деталі транзакції в дослідниках блоків буде основою для всього вашого аналізу даних та знань про Ethereum, тому давайте розглянемо всі частини та способи роботи з ними в SQL.

Я лише розглядаю, як розуміти ці концепції на високому рівні; якщо ви хочете навчитися розкодовувати це вручну, то вам потрібно ознайомитися з тим, якдані кодуються (це так само для операцій / трас / журналів) та як користуватися Функції байтового рядка/шістнадцяткового запису Duneпереходити між різними типами.

До кінця цього посібника ви зможете розуміти та навігувати таблицями даних для будь-якого контракту за допомогою цього запиту пошуку таблиці транзакцій:

Посилання запиту (Вставте будь-який хеш транзакції, ланцюг та номер блоку)

Після того, як ви вивчите концепції в цьому посібнику, ви також повинні вивчити, як використовувати мійШвидкий старт панелі EVMщоб розпочати аналіз будь-якого контракту.

Як аналізувати будь-який протокол або продукт Ethereum за п'ять хвилин

Андрій Гонг

·

30 грудня 2022 року

Читати повну історію

Транзакції

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

Це ті самі поля, які ви побачите, коли надішлете запит «ethereum.transactions» на Dune. Ключовим моментом, який слід навчитися визначати, є те, чи є «до» контрактом чи ні. Як правило, контракти мають чітке маркування. Якщо це контракт, то повинні бути "вхідні дані", які містять виклик функції.

посилання на транзакцію

З усіх цих концепцій першою, яку варто добре вивчити, є EOA проти адреси контракту. Контракти розгортаються EOA, і їх можна викликати в полі "to" транзакції. Якщо ви натиснете на адресу, експлорери покажуть зліва зверху, чи це контракт чи рахунок. На дюні ви можете приєднатися до таблиці ethereum.creation_traces, щоб перевірити, чи це контракт. Зверніть увагу, що лише EOA можуть бути підписником "from" транзакції.

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

приклад транзакції

Перші 4 байти (8 символів) - це "сигнатура функції", якахеш keccakім'я функції та типи вводу. Etherscan має гарну кнопку «декодувати» для деяких контрактів, що дає вам цю зрозумілу форму:

приклад транзакції

Як бачите, є багато змінних, упакованих разом в один довгий шістнадцятковий рядок з попереднього. Спосіб їх кодування відповідає специфікації двійкового інтерфейсу додатків (ABI) смарт-контрактів.

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

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

На Dune ви хотіли б запитати цю таблицю для цього функціонального виклику oneinch_ethereum.AggregationRouterV6_call_swap. Ви побачите, що назва цієї таблиці знаходиться у верхній частині результатів запиту в пошуку таблиць на початку посібника.

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

Журнали

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

приклад транзакції

Ви побачите, що є тема 0, тема 1, тема 2 та поле даних. Тема 0 подібна до підпису функції, за винятком того, що вона складається з 32 байтів замість 4 байтів (але все ще хешується так само). Події можуть мати «індексовані» поля для швидкого фільтрування даних, які можуть з'являтися в темі 1, темі 2 або темі 3. Усі інші поля кодуються разом у об'єкті «дані». Знову ж таки, вони слідують тим самим правилам кодування, що й у операціях та слідах. «28» - це індекс події в цілому блоку. Іноді корисно приєднатися, коли вам потрібна перша обмін або переказ у транзакції.

Щоб знайти логіку того, де і як ця подія була відправлена, мені потрібно буде поринути в код solidity. Я натисну на посилання адреси події, перейду на вкладку контракту та виконаю пошук "emit swap", оскільки я знаю, що всі події мають "emit" правильно перед тим, як вони викликаються в коді.

Це контракт uniswapv3poolце завод, створений для кожної пари.

Я бачу, що це випускається в рядку 786 контракту, як частина функції «swap».

Здатність навігації функцій та лінійності подій через контракти буде ключовою навичкою, яку вам потрібно опанувати, щоб точно розуміти послідовність даних, які ви запитуєте. Вам не потрібно глибоко вивчати solidity, щоб навігувати цими файлами, просто знати, як розумітиінтерфейси контракту і коли викликаються функції/події (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)

ВИКЛИКи C (0,0)

CALLs D (1)

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

ДЗВІНКИ H (2)

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

Посилання на провідник

Це може виглядати приголомшливо, але насправді це дуже простий спосіб дослідження всіх функцій, подій та аргументів у потоці транзакції. Якщо ви зможете зрозуміти це, то можете з впевненістю сказати, що розумієте всі дані у транзакції. Зверніть увагу, що мої запитник таблиціце майже точна копія цього макету, я дуже багато вдихновився ними!

Зверніть увагу, що на Dune ми автоматично розкодовуємо як виклики транзакцій, так і сліди тієї ж назви функції в ту саму таблицю. Ви, можливо, думаєте, чи можете ви легко приєднати події і сліди/транзакції в гарному порядку, показаному в phalcon. На Dune ви можете приєднатися до хешу транзакції, щоб загалом зв'язати дані, але ви не можете приєднатися до будь-якого індексу, щоб відтворити точний порядок взаємодій. Це невдачливе обмеження на даний момент, яке потребує власного індексатора.

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

Якщо ви розумієте концепції, які я виклав у цьому посібнику, то ви готові копати глибше й писати більш складні запити. Навігація даними через транзакції за допомогою кількох різних інструментів буде однією з найважливіших навичок, які вам доведеться вдосконалити в цій галузі.

Ймовірно, я використовую 10 різних дослідників щотижня, а кількість інструментів в 10 разів більша. Я пишу щорічний довідник, який охоплює розвиток стеку інструментів для обробки даних і як використовувати кожен з них:

Посилання на путівник

Disclaimer:

  1. Ця стаття є перепублікована з [ криптоданих], Усі авторські права належать оригінальному авторові [Andrew Hong]. Якщо є зауваження до цього повторення, будь ласка, зв'яжіться з Gate Learnкоманда, і вони оперативно цим займуться.
  2. Відповідальність за відмову: Погляди та думки, висловлені в цій статті, є виключно тими, хто написав її, і не становлять жодної інвестиційної поради.
  3. Переклади статті на інші мови виконуються командою Gate Learn. Якщо не зазначено, копіювання, поширення або плагіат перекладених статей заборонено.
Розпочати зараз
Зареєструйтеся та отримайте ваучер на
$100
!