Якщо ви коли-небудь здійснювали транзакцію на Ethereum (або на будь-якому блокчейні з підтримкою розумних контрактів), то, ймовірно, ви переглядали її на блок-експлорері, наприклад, etherscan.io, і бачили цю купу інформації:
Вкладка Огляд транзакцій
А якщо ви спробували подивитися на журнали або сліди (внутрішні транзакції), то могли побачити ці незрозумілі сторінки:
Вкладка журналів (ви маєте щастя, якщо вони гарно декодовані, як це)
Вкладка Сліди (так, вона виглядає як купа безглуздя)
Навчання читати деталі транзакції в дослідниках блоків буде основою для всього вашого аналізу даних та знань про Ethereum, тому давайте розглянемо всі частини та способи роботи з ними в SQL.
Я лише розглядаю, як розуміти ці концепції на високому рівні; якщо ви хочете навчитися розкодовувати це вручну, то вам потрібно ознайомитися з тим, якдані кодуються (це так само для операцій / трас / журналів) та як користуватися Функції байтового рядка/шістнадцяткового запису Duneпереходити між різними типами.
До кінця цього посібника ви зможете розуміти та навігувати таблицями даних для будь-якого контракту за допомогою цього запиту пошуку таблиці транзакцій:
Посилання запиту (Вставте будь-який хеш транзакції, ланцюг та номер блоку)
Після того, як ви вивчите концепції в цьому посібнику, ви також повинні вивчити, як використовувати мійШвидкий старт панелі EVMщоб розпочати аналіз будь-якого контракту.
·
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()
Сліди можуть швидко стати дуже складними для навігації, через вкладені виклики між різними контрактами. Давайте спочатку зрозуміємо типи слідів:
Вам також потрібно розуміти стовпець / індекс 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 разів більша. Я пишу щорічний довідник, який охоплює розвиток стеку інструментів для обробки даних і як використовувати кожен з них:
Якщо ви коли-небудь здійснювали транзакцію на Ethereum (або на будь-якому блокчейні з підтримкою розумних контрактів), то, ймовірно, ви переглядали її на блок-експлорері, наприклад, etherscan.io, і бачили цю купу інформації:
Вкладка Огляд транзакцій
А якщо ви спробували подивитися на журнали або сліди (внутрішні транзакції), то могли побачити ці незрозумілі сторінки:
Вкладка журналів (ви маєте щастя, якщо вони гарно декодовані, як це)
Вкладка Сліди (так, вона виглядає як купа безглуздя)
Навчання читати деталі транзакції в дослідниках блоків буде основою для всього вашого аналізу даних та знань про Ethereum, тому давайте розглянемо всі частини та способи роботи з ними в SQL.
Я лише розглядаю, як розуміти ці концепції на високому рівні; якщо ви хочете навчитися розкодовувати це вручну, то вам потрібно ознайомитися з тим, якдані кодуються (це так само для операцій / трас / журналів) та як користуватися Функції байтового рядка/шістнадцяткового запису Duneпереходити між різними типами.
До кінця цього посібника ви зможете розуміти та навігувати таблицями даних для будь-якого контракту за допомогою цього запиту пошуку таблиці транзакцій:
Посилання запиту (Вставте будь-який хеш транзакції, ланцюг та номер блоку)
Після того, як ви вивчите концепції в цьому посібнику, ви також повинні вивчити, як використовувати мійШвидкий старт панелі EVMщоб розпочати аналіз будь-якого контракту.
·
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()
Сліди можуть швидко стати дуже складними для навігації, через вкладені виклики між різними контрактами. Давайте спочатку зрозуміємо типи слідів:
Вам також потрібно розуміти стовпець / індекс 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 разів більша. Я пишу щорічний довідник, який охоплює розвиток стеку інструментів для обробки даних і як використовувати кожен з них: