Block-эксплореры

Концепции: What Is Explorer, Etherscan, Solscan, Reading Txs, Tracking Wallets, Contract View

:::section{mins=3} Что такое блок-эксплорер :::

:::lead Эксплорер – это не блокчейн. Это сайт, который держит полную ноду, индексирует всё, что эта нода видит, и отдаёт результат как страницы с поиском. Цепь вам ничем не обязана. Эксплорер – компания. В большинстве случаев одно и то же показывают и нода, и эксплорер, но интересны как раз моменты, когда показывают разное. :::

:::p{html} Вы открывали Etherscan по ссылке десятки раз. Кошелёк показывает хеш транзакции, вы по нему кликаете, открывается страница с пятнадцатью полями и четырьмя вкладками. Большая часть полей уже знакома из 3.3 §1: from, to, value, [[gloss:gas|gas]], [[gloss:nonce|nonce]]. Часть из них декодирована из data в читаемый вызов функции. Часть – нет: поле «Input Data» так и осталось сырым hex, потому что Etherscan не узнал контракт. Эта карточка – та инструкция, которую вы никогда не читали к этой странице, и к её соседям: к странице адреса, контракта, блока, токена. :::

:::p{html} Сам блокчейн – это плотный двоичный поток. Каждый блок это список транзакций; каждая транзакция это RLP-закодированные поля и [[gloss:ecdsa|ECDSA]]-подпись; каждый storage-слот контракта это 32-байтовое слово без подписи, которая объясняла бы, что оно значит. Полная нода это всё проверяет и хранит локально. Если смотреть на это через ноду напрямую, придётся звать JSON-RPC методы вроде eth_getTransactionByHash и получать сырые структуры, которые никто не читает ради удовольствия. Эксплорер делает то же, что библиотекарь делает с библиотекой: берёт книги, которые уже стоят на полках, и строит каталог с поиском, перекрёстными ссылками и человеческими аннотациями. Книги – то есть сама цепь – существуют независимо. Каталог это разница между «любой может прочитать» в теории и «любой может прочитать» на практике. :::

:::p{html} Эксплорер устроен из трёх слоёв. Снизу – полная нода, обычно Geth, Reth, Erigon или их managed-эквивалент, которая участвует в сети и хранит каноническую цепь. Посередине – индексатор: своя база данных, которая слушает ноду, декодирует events и call traces и пишет их в таблицы, удобные для запросов вроде «все переводы этого токена за последний час» или «все адреса, которые когда-либо вызывали эту функцию». Сверху – веб-интерфейс и публичный API. Etherscan, доминирующий эксплорер [[gloss:ethereum|Ethereum]], держит этот стек с 2015 года из Куала-Лумпура как частная компания; Blockscout – открытый (open-source) движок-эксплорер, который ему конкурент и который любой проект может развернуть у себя на своей цепи. Solscan делает ту же работу для [[gloss:solana|Solana]] и был куплен командой Etherscan в начале 2024 года. [[gloss:mempool|Mempool]].space – для [[gloss:bitcoin|Bitcoin]], с упором на [[gloss:utxo|UTXO]]-модель и публичный [[gloss:mempool|mempool]]. Эксплорер это не нейтральная утилита, это софт, который запускает организация со своим аптаймом, рекламой и интересами. :::

:::p{html} Раз это софт, эксплорер может быть не прав. Чаще всего скучным способом: задержка в 5-15 секунд относительно канонического хеда, логотип токена не подгрузился, контракт ещё не верифицирован. Иногда – интереснее. В апреле 2024 Etherscan какое-то время крутил фишинговые объявления, агрегированные через рекламные сети Coinzilla и Persona; ссылки вели на сайты-дрейнеры – поддельные страницы, которые после подключения кошелька выманивают подпись и выкачивают с него средства. Объявления сняли в течение нескольких часов, но на короткое окно самый посещаемый эксплорер в крипто своими руками вёл пользователей на страницы, созданные чтобы их обокрасть. В феврале 2024 группа Angel Drainer воспользовалась тем, что Etherscan автоматически помечает Safe (Gnosis Safe) vault контракты как verified: они задеплоили вредоносный Safe vault, заставили 128 кошельков подписать Permit2-сообщения на него и увели $403 000. Контракт был verified. Контракт был вредоносный. Verification в смысле Etherscan доказывает только то, что опубликованный исходник совпадает с байткодом на цепи. Это низкая планка. Всё остальное – проаудитен, безопасен, владельцы отказались от прав, это не drainer – это вывод, который вы делаете уже сверху, поверх того одного факта. :::

:::p{html} В повседневном использовании это различие не важно: Etherscan и цепь согласны, страница грузится, всё на месте. Различие становится важным, когда на кону что-то есть: крупная транзакция, подозрительный airdrop, незнакомый контракт, инцидент в реальном времени. В такие моменты полезно помнить, что вы читаете чью-то одну версию цепи, и что саму цепь можно прочитать другими способами: другим эксплорером (Blockscout, открытый конкурент Etherscan на той же цепи), своей нодой через RPC, агрегатором из нескольких источников. Остальная часть карточки про то, как стать беглым в этом одном виде; но под ним лежит вот это: источник истины это цепь, а эксплорер это один из способов её отрисовать. :::

:::callout{icon=💡} Каталог в большой публичной библиотеке. Книги настоящие, стоят на полках в конкретных местах; любой с читательским билетом может зайти и найти нужную. Но именно каталог делает библиотеку пригодной для использования: база данных названий, авторов, предметных рубрик и шифров хранения, которую библиотекари каждый день обходят и поддерживают в актуальном состоянии. Когда каталог ошибается – карточка попала не под ту рубрику, книга помечена как «на месте», хотя на самом деле в переплётной мастерской – сами книги от этого не меняются. Можно встать и дойти до полки, проверить руками. Каталог удобен; полка каноническая. Эксплорер это каталог. Цепь это полка. Почти всегда они согласны, а когда нет – важна полка. :::

:::keypoints{label="Ключевые моменты"}

  • Каждая поверхность, что показывает баланс – кошелёк, Etherscan, портфельное приложение – читает свой снимок в свой момент, и они расходятся на секунды. Поэтому, когда двое не сходятся, инстинкт «обновить ещё раз» неверный; вопрос в том, какой источник прямо сейчас ближе к цепи. Ход, который закрывает спор – спросить независимый RPC напрямую и самому вызвать balanceOf: это попадание в каноническое состояние, которое ничьему индексатору ничего не должно.
  • У каждой крупной [[gloss:evm|EVM]]-сети есть свой эксплорер из семьи Etherscan: Arbiscan для Arbitrum, Basescan для Base, Optimistic Etherscan для Optimism, Polygonscan для Polygon, BscScan для BNB Chain. Тот же UI, те же вкладки, та же поисковая строка. Solscan покрывает [[gloss:solana|Solana]], и с 2024 года это тот же владелец. Навык переносится; меняется account-модель под капотом, а не разметка страницы.
  • Главное, что даёт верификация – это панель Read Contract, и она полезнее самой галочки. Бесплатно, без подключения кошелька, можно вызвать owner() (за контрактом стоит один приватный ключ или мультисиг?), paused(), проверить, есть ли метод upgradeTo, прочитать своё текущее allowance. За пять секунд вы узнаёте, кто и как может изменить контракт под вами – ровно то, о чём «verified» не сообщает в принципе. Не читай галочку как ответ; используй её как ключ от двери, за которой ответы лежат.
  • Второй источник – для моментов, которые стоят возни, а не для повседневных проверок: когда двигаешь объём, подписываешь то, чего не узнаёшь, или наблюдаешь разворачивающийся инцидент. Навык – прочитать результат: два независимых источника (конкурирующий эксплорер вроде Blockscout или сырой eth_getTransactionByHash из своего RPC), которые сходятся, повышают уверенность; а вот их расхождение – сигнал ценнее: значит, как минимум один врёт, и ты не действуешь ни по одному, пока не выяснишь, который. Цена – минута; защищает весь твой баланс. :::

:::details{badge=Практика title="Как проверить, что интерфейс эксплорера не подменён"} :::p{html} Подмена на стороне браузера случается редко, но случается. Заражённое расширение, перехваченный DNS или вредоносное объявление, показанное самим эксплорером (история апреля 2024 у Etherscan), могут отрендерить вам страницу, которая выглядит правильно, но на деле подделана. Самый дешёвый кросс-чек – открыть ту же транзакцию на другом источнике и сравнить два конкретных поля: пару from/to и value (или сумму трансфера на вкладке Token Transfers). :::

:::p{html} 浏览器端篡改很少见但确实存在。被入侵的浏览器扩展、被劫持的DNS、或浏览器本身提供的恶意广告(2024年4月Etherscan事件)都可能显示一个看起来正确但实际不正确的页面。最便宜的交叉检查是在不同来源上打开同一笔交易,比较两个特定字段:from/to对和value。 :::

:::p{html} Выбираем второй источник. Blockscout для [[gloss:ethereum|Ethereum]] [[gloss:l1|L1]] живёт на [[gloss:ethereum|eth]].blockscout.com и индексирует из независимой инфраструктуры. Для [[gloss:layer 2|L2]] Blockscout обычно и есть каноническая альтернатива: arbitrum.blockscout.com, base.blockscout.com, optimism.blockscout.com. Если есть ключ от Alchemy или Ankr, можно вставить хеш транзакции в curl-запрос к eth_getTransactionByHash и прочитать JSON напрямую: from, to, value, input – всё там, неотрисованное. Согласие двух источников – сильный сигнал. Несогласие двух источников – сигнал ещё сильнее: значит, как минимум один из них врёт, и действовать на основании любого из них до выяснения нельзя. :::

:::p{html} 选择第二个来源。[[gloss:ethereum|Ethereum]] [[gloss:l1|L1]]的Blockscout位于[[gloss:ethereum|eth]].blockscout.com,从独立基础设施索引。对于[[gloss:layer 2|L2]],Blockscout通常是规范替代方案。如果你有Alchemy或Ankr API密钥,可以将交易哈希粘贴到eth_getTransactionByHash的curl请求中直接读取JSON。两个来源一致是强信号。两个来源不一致是更强的信号––意味着至少一个是错的。 ::: :::

:::details{badge=Глубже title="Проблема индексатора: почему эксплорер всегда отстаёт от цепи"} :::p{html} Эксплорер не просто отзеркаливает ноду – он обрабатывает её вывод. Каждый новый блок запускает работу: декодировать каждую транзакцию, развернуть internal call traces, разобрать event logs по известным ABI, обновить снимки токенов-балансов, пересчитать статистику по адресу, разослать пуш-уведомления и вебхуки. На обычном блоке [[gloss:ethereum|Ethereum]] (12 секунд, 150-200 транзакций, несколько тысяч events) у Etherscan это занимает 3-8 секунд. На загруженном блоке [[gloss:layer 2|L2]] – например, Arbitrum, который агрегирует сотни транзакций в секунду – индексатор структурно отстаёт сильнее: обычно 5-15 секунд, в пиковые [[gloss:nft|NFT]]-минты дольше. :::

:::p{html} 浏览器不仅仅是镜像节点––它处理节点的输出。每个新区块触发工作:解码每笔交易、展开内部调用追踪、解析事件日志、更新代币余额快照、刷新地址统计。在正常的[[gloss:ethereum|Ethereum]]区块(12秒,150-200笔交易)上,Etherscan基础设施需要3-8秒。在繁忙的[[gloss:layer 2|L2]]区块上,索引器结构性地更落后––通常5-15秒。 :::

:::p{html} Практическое следствие: «я только что отправил, а на Etherscan ещё ничего нет» – почти всегда нормально. Транзакция в [[gloss:mempool|mempool]] или уже в блоке, индексатор просто не догнал. Тыкать F5 чаще не помогает. Правильный ход – выждать один-два блока (около 30 секунд на [[gloss:mainnet|mainnet]], дольше на нагруженном [[gloss:layer 2|L2]]), и если всё ещё не появилась, открыть тот же хеш на втором эксплорере или сходить в RPC напрямую. Обратный случай – Etherscan показывает транзакцию, которой в цепи нет – возможен только если эксплорер «галлюцинирует»; это исключительно редкая история, и заметна она сразу. :::

:::p{html} 实际后果是"我刚发送了但Etherscan上还没有"几乎总是正常的。交易在内存池中或已经在区块中;索引器还没跟上。正确的做法是等一两个区块时间(主网约30秒),如果仍然没有,在第二个浏览器上打开相同哈希或直接查询RPC。 ::: :::

:::quiz{id=q-3-4-s1 correct=3 explanation="Верно. MetaMask читает через тот RPC, что у него прописан (по умолчанию Infura); Etherscan читает из своего индексатора над своей нодой. Оба могут отставать на 5-15 секунд от блока, и оба могут ошибаться – Etherscan во время сбоев индексатора, MetaMask если выставленный RPC отстаёт или отдаёт устаревшие данные. Правильный ход – спросить независимый RPC напрямую (любой ключ от Alchemy/Ankr или публичный endpoint) и вызвать balanceOf на контракте USDC. Это попадание в каноническое состояние. На практике расхождение почти всегда оказывается коротким лагом индексатора и пропадает в течение блока; дисциплина – не считать ни один из экранов «истиной по умолчанию»."} Вы открываете один и тот же адрес в MetaMask и на Etherscan. MetaMask показывает баланс USDC 1 200. Etherscan – 1 400. Какому числу верить?

  • Etherscan, потому что у него собственная архивная нода с индексатором, а MetaMask лишь ретранслирует вызовы через сторонний RPC
  • MetaMask, потому что он хранит ваш приватный ключ и считывает баланс непосредственно из состояния вашего кошелька
  • Тот источник, чьи данные обновились позже, потому что более свежий кэш ближе к реальному состоянию цепи
  • Ни тот, ни другой автоматически: каждый читает свой источник; каноническая истина – в цепи, через RPC :::

:::section{mins=5} Etherscan: мастер-класс :::

:::lead Etherscan обрабатывает порядка миллиона запросов в час, и большинство его пользователей трогают малую часть того, что он умеет. Поисковая строка принимает не только адреса, вкладки показывают разное, а метки – это мнение Etherscan, а не факт с цепи, и полагаться на них как на доказательство нельзя. При этом тот же интерфейс работает на Arbitrum, Base, Polygon и [[gloss:solana|Solana]] под другими доменами. Задача этого раздела – чтобы дальше Etherscan читался сходу, а не приходилось его расшифровывать. :::

:::p{html} Открываем etherscan.io – страница делится на три зоны. Сверху лента сетевой статистики: последний блок, текущая цена газа в Gwei, цена [[gloss:ethereum|ETH]], market cap. Фактически это украшение лендинга, через неделю на неё перестаёшь смотреть. По центру – поисковая строка, единственное, чем реально пользуешься. Снизу – лента активности: живой список последних блоков и транзакций, в основном шум. Сама стартовая страница – узкая дверь. Всё полезное начинается после того, как вставишь что-нибудь в поиск. :::

:::p{html} То, что вы пихаете в поисковую строку, говорит Etherscan, что делать. Система автоматически определяет формат ввода и ведёт на нужный тип страницы; типов по сути пять: :::

:::p{html}

ВводФорматКуда попадаете
Хеш транзакции0x… 66 символовСтраница [[gloss:transaction|TX]] (разбор в §3)
Адрес или контракт0x… 42 символаСтраница адреса (разбор в §4)
Номер блокачисло, например 22500000Страница блока со всеми его транзакциями
Символ или имя токенаUSDC, WETHСтраница токена (держатели, переводы, контракт)
ENS-имяvitalik.[[gloss:ethereum|eth]]Адрес, в который это имя резолвится
:::

:::p{html} Работают и менее известные форматы – стоит разобраться с ними один раз, дальше пригодятся. Function selector – первые четыре байта вызова контракта, например 0xa9059cbb для transfer(address,uint256) – вставленный в поиск, возвращает сигнатуру функции и недавние транзакции, которые её вызывали. Полезно, когда кошелёк показывает сырые data, а хочется понять, какую функцию зовут. Method ID с аргументами уводит на страницу декодера. Сырая подписанная транзакция (редко, но бывает) декодируется в свои поля. Поисковая строка – это скорее интерфейс запросов, чем «найти страницу»: Etherscan смотрит на то, что вы вставили, как на вопрос, и пытается понять, какого он типа. :::

:::p{html} Когда вы попали на страницу адреса или контракта, вкладки показывают не пересекающуюся, а разную информацию об одних и тех же данных, и пропуск этого – главная ошибка новичков. Три, которые путают друг с другом: :::

:::p{html}

  • [[gloss:transaction|Transactions]] – транзакции, в которых этот адрес стоит в поле from (отправитель) или to (получатель) самого верхнего, внешнего вызова. Это исключает большую часть активности, в которой адрес участвует лишь косвенно.
  • Internal [[gloss:transaction|Transactions]] – вызовы контрактов друг другу, в которых этот адрес где-то проходит: адрес получил [[gloss:ethereum|ETH]] от контракта, либо контракт что-то сделал от его имени.
  • ERC-20 Token Transfers – любые движения токенов с участием этого адреса, кем бы они ни были инициированы.
:::

:::p{html} Если вы отправили 1 000 USDC через DEX-роутер, на основной вкладке [[gloss:transaction|Transactions]] виден ваш вызов роутера, Internal [[gloss:transaction|Transactions]] пустая ([[gloss:ethereum|ETH]]-внутрь-наружу у вас не было), а на ERC-20 виден отток USDC. Три вкладки, три разных вида, все три верные. Новички смотрят на первую, не находят ожидаемого и делают вывод «Etherscan ошибается». Не ошибается. :::

:::p{html} Метки, которые Etherscan вешает на адреса, – самая редакционно нагруженная поверхность страницы. Зелёная галка рядом с адресом значит, что контракт verified: исходник совпадает с байткодом. Метка вида «Binance: Hot [[gloss:wallet|Wallet]] 14» или «Uniswap V3: Router 2» – редакторская: команда Etherscan добавила её на основании публичной информации, on-chain анализа или заявки от самой сущности. Метка «Phish/Hack» на адресе ставится после того, как сообщество сообщило об активности и Etherscan её подтвердил. Отсутствие phish-метки не означает безопасности: многие живые drainer-контракты вообще без меток, потому что свежие. Метки удобны для подтверждения того, что вы и так подозреваете, и не годятся для оправдания того, чего не знаете. Они ещё и сети-специфичные: помеченный на Etherscan адрес может быть без метки на Arbiscan, хотя это тот же адрес с тем же байткодом – команды лейблов работают независимо. :::

:::p{html} И последнее, о чём полезно знать: у Etherscan есть API. Те же данные, что показывает UI, доступны на api.etherscan.io через эндпоинты вроде module=account&action=txlist (транзакции по адресу), module=contract&action=getabi (ABI верифицированного контракта), module=gastracker (текущие цены газа). Бесплатный тариф допускает пять запросов в секунду; платные тарифы доходят до 100 req/s. Большинство кошельков, которыми вы пользуетесь, под капотом ходят именно туда: «проверка безопасности контракта» в Rabby перед транзакцией читает у Etherscan возраст и статус верификации. Знание о том, что API существует, превращает «хорошо бы получить список всех ERC-20-переводов адреса свыше $10 000 за месяц» из пожелания в однострочный скрипт. UI – это отполированное лицо; API – те же данные сырьём, и для любого повторяемого workflow API – правильная поверхность. :::

:::callout{icon=💡} Полный анализ крови, который врач распечатывает после планового приёма. Сорок цифр на пяти страницах: общий анализ, липидный профиль, маркеры почек, печёночные ферменты, щитовидка. Все настоящие, все из одного забора, сделанного в одно утро. Пациент, который смотрит на первую страницу и видит «общий холестерин: 195», делает вывод, что всё нормально. Врач знает, что нужно пролистать на третью и прочитать соотношение HDL/LDL, потому что заголовочное число прячет реальную картину. Данные не врут; читатель неопытен. С Etherscan так же: каждая вкладка реальная, каждое поле верное, и разница между беглым читателем и сбитым с толку - знание, на какую вкладку перейти под какой вопрос. :::

:::keypoints{label="Ключевые моменты"}

  • Относитесь к строке поиска как к бесплатному декодеру того, что кошелёк объяснять отказывается. Когда запрос на подпись показывает невнятный hex и ни одного человекочитаемого действия, скопируйте первые четыре байта в поиск: Etherscan назовёт функцию и покажет реальные вызовы, которые её использовали – и вы поймёте, что собираетесь авторизовать, не подписывая ради того, чтобы выяснить. Почти всем, что есть на Etherscan, пользуешься уже после транзакции, разбирая случившееся; этот приём – наоборот, до подписи, пока подтверждать ещё нечего.
  • Пустая вкладка – самый часто неправильно прочитанный сигнал на Etherscan. Человек смотрит на первую вкладку, не видит ожидаемого и решает, что эксплорер сломан или транзакция не прошла – хотя на деле он навёл не ту линзу на нужное событие. Выработайте против этого один рефлекс: прежде чем заключить «ничего не произошло», спросите, какая вкладка зафиксировала бы то, что вы ищете, и проверьте именно её. Пустота на той вкладке, что открылась случайно, не доказывает ничего.
  • Позволяйте меткам двигать вас только в одну сторону. Наличие предупреждающей метки должно вас останавливать намертво – чтобы её заработать, кто-то уже понёс потерю, так что отнеситесь к ней всерьёз. Но отсутствие метки не должно вас продвигать ни на шаг: оно значит «об этом пока никто не сообщил» – состояние по умолчанию для любого свежего drainer'а, а не справка о здоровье. Вся суть в асимметрии – красный флаг это информация, пустое место это просто тишина.
  • Сигнал, что вы переросли UI – повторение: как только вы во второй раз кликаете по тем же вкладкам ради того же вопроса, этот вопрос уже однострочный запрос к API. Переформулировать «хорошо бы видеть все переводы свыше $10k за месяц» из страницы, которую листают, в запрос, который запускают – вот настоящий скачок навыка. И это не требует нового доверия: API отдаёт те же данные цепи, что рисует UI, просто без кликов, так что в вашей дисциплине проверки ничего не меняется. :::

:::details{badge=Практика title="URL-параметры Etherscan: быстрая навигация без кликов"} :::p{html}

  • etherscan.io/address/0xABC...?a=0xDEF – filters the address page to interactions with a second address 0xDEF. Useful when you want every [[gloss:transaction|transaction]] between yourself and a specific contract.
  • etherscan.io/txs?[[gloss:block|block]]=22500000 – all [[gloss:transaction|transactions]] in one specific [[gloss:block|block]].
  • etherscan.io/txs?a=0xABC&p=3 – page 3 of the [[gloss:transaction|transactions]] tab. Pagination is in the URL, which lets you write scripts that walk history without scraping.
  • etherscan.io/tokentxns?a=0xABC&toaddress=0xDEF – every ERC-20 transfer where 0xABC sent tokens to 0xDEF.
  • etherscan.io/advanced-filter – the full filter UI: by method, by token, by amount range, by date. The same filters appear in URL parameters after you apply them, so you can bookmark a complex query.
:::

:::p{html} У Etherscan есть пригодная к использованию URL-грамматика. Если знать параметры, можно собирать глубокие ссылки руками вместо того, чтобы кликать по UI. Самые полезные живут на маршрутах /txs и /address. :::

:::p{html}

  • etherscan.io/address/0xABC...?a=0xDEF – фильтр страницы адреса по взаимодействиям со вторым адресом 0xDEF. Удобно, когда нужны все транзакции между вами и конкретным контрактом.
  • etherscan.io/txs?[[gloss:block|block]]=22500000 – все транзакции одного конкретного блока.
  • etherscan.io/txs?a=0xABC&p=3 – страница 3 вкладки транзакций. Пагинация в URL – значит, можно писать скрипты, которые проходят историю без скрейпинга.
  • etherscan.io/tokentxns?a=0xABC&toaddress=0xDEF – все ERC-20 переводы, где 0xABC отправил токены 0xDEF.
  • etherscan.io/advanced-filter – полноценный UI фильтра: по методу, по токену, по диапазону сумм, по дате. После применения фильтры остаются в URL-параметрах, и сложный запрос можно сохранить в закладки.
:::

:::p{html} Экономия копится. «Покажи все взаимодействия моего адреса с Uniswap V3 Router» – это один URL, а не пять вкладок и постраничная пролистка. Воспринимайте это как клавиатурные сокращения: незаметны, пока не выучил, и не хочется без них жить, когда выучил. ::: :::

:::details{badge=Глубже title="Семья Etherscan: кто стоит за Arbiscan, Basescan, Polygonscan"} :::p{html} «Etherscan» – это бренд для [[gloss:ethereum|Ethereum]] [[gloss:l1|L1]], но компания за ним (Etherscan Pte Ltd, Куала-Лумпур, основана в 2015 году Мэттью Таном) держит целое созвездие chain-specific эксплореров под разными доменами. Arbiscan (Arbitrum), Basescan (Base), Optimistic Etherscan (Optimism), Polygonscan (Polygon [[gloss:proof of stake|PoS]]), BscScan (BNB Chain), FtmScan (Fantom), Snowtrace ([[gloss:avalanche|Avalanche]]) – одна команда, одна кодовая база, тот же UI, отдельные базы данных и метки на каждую цепь. В начале 2024 года та же компания купила Solscan, расширив бренд на [[gloss:solana|Solana]] (не-[[gloss:evm|EVM]]-цепь, которой нужна другая модель данных – см. §5). :::

:::p{html} Практическое следствие: освоить Etherscan – это действительно переносимый навык по крайней мере на десяток цепей. Та же поисковая строка, те же вкладки, тот же механизм «verified contract». Где семья расходится – это в лейблах: на каждой цепи lapeling – это отдельная редакторская работа, и покрытие, скажем, [[gloss:mev|MEV]]-ботов у Arbiscan обычно беднее, чем у Etherscan. Второе место, где расходится – там, где [[gloss:layer 2|L2]] предпочёл держать свой канонический эксплорер вместо Etherscan-семейного: explorer.zksync.io у zkSync Era и starkscan.co у Starknet – first-party, не из семейства Etherscan. Они всё ещё выглядят знакомо, но у каждого свои особенности. ::: :::

:::quiz{id=q-3-4-s2 correct=2 explanation="Верно. Основная вкладка [[gloss:transaction|Transactions]] показывает транзакции, в которых этот адрес – внешний from или to: то есть [[gloss:ethereum|ETH]]-style переводы и прямые вызовы контрактов. ERC-20 перевод – это вызов контракта токена; адрес получателя зашит в аргументах вызова, а не в поле to самой транзакции. С точки зрения Etherscan, «транзакция» – это отправитель, вызвавший transfer() на контракте USDC, и адрес получателя на главной вкладке вообще не появится. Он появится на вкладке ERC-20 Token Transfers, которая индексирует любые движения токенов с участием адреса. Это самое частое непонимание у новичков, и это не баг – это буквальное чтение цепи."} Открыли адрес на Etherscan. Баланс 0 [[gloss:ethereum|ETH]], на вкладке [[gloss:transaction|Transactions]] пусто, но вы точно отправили туда 1 000 USDC вчера. Что происходит?

  • Индексатор Etherscan отстаёт – обновите страницу
  • Транзакция упала в revert и откатилась
  • USDC-переводы не появляются на главной вкладке [[gloss:transaction|Transactions]] – они на вкладке ERC-20 Token Transfers
  • USDC, отправленный через DEX, на Etherscan вообще не виден :::

:::section{mins=4} Чтение транзакции :::

:::lead Страница транзакции плотная: пятнадцать полей в overview, вкладка Internal [[gloss:transaction|Transactions]], вкладка ERC-20 Token Transfers, вкладка State и вкладка Logs, в которой и живёт большая часть реальной истории. Поля, которые мы видели в 3.3 §1, здесь все, но читаются они уже после факта, с ответами на руках. Раздел про то, какое поле отвечает на какой вопрос. :::

:::p{html} Вставляете хеш транзакции в поиск Etherscan – попадаете на страницу из пяти вкладок. По умолчанию открыта Overview, заголовочная сводка. Она говорит, удалась ли транзакция, в каком блоке оказалась, кто её отправил, кому, сколько заплачено и что вызвано. Это десятисекундная версия. Остальные вкладки – Internal [[gloss:transaction|Transactions]], ERC-20 Token Transfers, State, Logs, Comments – каждая разворачивает свой слой той же транзакции. Чтение их по порядку, когда оно нужно, – это переход от «оно случилось» к «вот ровно что и с кем случилось». :::

:::p{html} Раскладку Overview стоит запомнить – каждая страница [[gloss:transaction|TX]] выглядит одинаково: сверху два больших индикатора ([[gloss:transaction|Transaction]] [[gloss:hash|Hash]] и Status), посередине учётная часть, а снизу – Input Data, самое важное поле на странице, с кнопкой для его декодирования. Большинство останавливается на From / To / Value посередине и не листает ниже, а зря – должно быть ровно наоборот. Таблица ниже – справочник по полям; единственная привычка, которую из неё стоит вынести: нужный ответ обычно лежит ниже, чем останавливается взгляд, и почти всегда это Input Data, а не сумма перевода вверху. :::

:::p{html}

Поле в OverviewНа что реально отвечает
StatusТранзакция исполнилась или упала в revert (газ всё равно списан – см. 3.3 §6)
[[gloss:block|Block]]В какой блок попала, плюс сколько подтверждений с тех пор накопилось
From / ToОтправитель и получатель внешнего вызова. Не получатель токена – для этого вкладка Token Transfers
ValueСколько [[gloss:ethereum|ETH]] ушло с вызовом. Ноль для операций только с токенами
[[gloss:transaction|Transaction]] FeeРеально заплачено (gasUsed × effectiveGasPrice). Списывается и на Success, и на Failed
[[gloss:gas|Gas]] Used / [[gloss:gas|Gas]] LimitСколько газа потрачено относительно потолка. «98% использовано» близко к лимиту – red flag, что были out-of-[[gloss:gas|gas]]-revert'ы
Input DataФактический вызов функции. Декодирован в functionName(args), если контракт верифицирован, иначе сырой hex
Burnt & Txn SavingsРазбивка после [[gloss:eip|EIP]]-1559: сколько fee сожжено (baseFee × gasUsed) и сколько ушло валидатору (priorityFee)
:::

:::p{html} Status: Success не значит, что произошло то, чего вы хотели. Транзакция может быть Success на внешнем уровне, при том что какой-то шаг внутри неё молча отработал вхолостую (выполнился, но ничего не изменил) или увёл средства не туда. Классический случай – multicall: один вызов, в который завёрнуто несколько действий, и при определённой обработке ошибок один подвызов может не сработать, не вызвав revert всей транзакции. Etherscan покажет «Success», потому что внешний вызов вернулся без revert'а. Чтобы убедиться, что «то самое, что я хотел, действительно случилось», нужно идти во вкладку Logs и искать конкретное событие, которого вы ждали: Transfer на ваш адрес, Swap на правильном пуле. Overview сообщает, что вызов вернулся; только логи говорят, что вызов сделал. :::

:::p{html} Input Data – источник истины «что реально вызвано». Etherscan показывает его дважды: сырой hex и декодированный вид, если контракт верифицирован и его ABI у Etherscan есть. Декодированный вид превращает 0xa9059cbb000000000000000000000000abc... в transfer(0xAbc..., 1000000): получатель и сумма по-человечески. Подвох в том, что декодирование зависит от наличия ABI у Etherscan. Для неверифицированного контракта вы увидите только hex, но первые четыре байта можно прочитать как function selector (вставив в поиск – см. §2). Даже для верифицированных контрактов декодированный вид может прятать динамику: multicall(bytes[]) покажет «multicall был вызван с такими N параметрами», а сами параметры – это закодированные вызовы, которые надо декодировать отдельно. Сырой hex однозначен; декодированный вид удобен. Когда что-то выглядит не так, возвращайтесь к hex. :::

:::p{html} Вкладка Logs – самая недоиспользуемая часть страницы и при этом главная для всего, что читает блокчейн со стороны. По ходу исполнения функция контракта может оставлять события (events) – короткие структурированные записи в духе «случилось вот это»: перевод USDC оставляет запись Transfer (кто, кому, сколько), своп на Uniswap – запись Swap, продажа [[gloss:nft|NFT]] – OrderFulfilled. Важно, что внешние сервисы – кошельки, портфельные трекеры, аналитические дашборды, поисковые индексы вроде The Graph – читают именно эти события, а не сами транзакции. Поэтому на практике: чтобы убедиться, что своп реально прошёл по ожидаемой цене, смотреть нужно в Logs – Overview лишь скажет, что вызов вернулся без ошибки. :::

:::callout{icon=💡} Детальный чек после долгого ужина в ресторане. Сверху итог: $187.50. Снизу - что в итоге списалось с карты. Между ними собственно позиции: закуски, основные блюда, бутылка вина, гарнир из картошки, который кто-то заказал и забыл, плюс строка с НДС и чаевые. Итог - то, что вы запомнили, а позиции - то, что говорит, послала ли кухня именно ту тарелку, разлил ли бармен нужный год, заметил ли официант замену. Вкладка Overview у транзакции - итог. Вкладка Logs - список позиций. То, чего вы хотели, есть в списке позиций; либо его там нет, и тогда итог сходится, а ужин - нет. :::

:::keypoints{label="Ключевые моменты"}

  • Прежде чем счесть транзакцию выполненной, заранее решите, какое одно событие это докажет – ожидаемый входящий Transfer или Swap на том самом пуле, что вы выбрали – и откройте Logs, чтобы убедиться, что оно там есть. Зелёный бейдж – самое слабое доказательство на странице; предсказанное вами событие – самое сильное. Эта привычка ловит тихие сбои (завёрнутый вызов, который отработал вхолостую; средства, ушедшие не туда), которые «Success» по своей природе прячет.
  • Failed-транзакция всё равно списывает газ. Etherscan показывает revert reason в поле Status, когда контракт его эмитировал: строки вроде «Insufficient allowance», «Slippage too high», «ERC20: transfer exceeds balance». Если причины нет – либо старый контракт, который не пишет revert-строки, либо low-level revert по out-of-[[gloss:gas|gas]]; в этом случае смотрим процент использованного газа.
  • Когда декодированный вызов выглядит не так, не доверяйте красивому виду – он честен ровно настолько, насколько честна ABI за ним. Есть проверка, которая не подведёт никогда: первые четыре байта – это function selector, и вставка их в поиск назовёт функцию даже на контракте, который никто не верифицировал. Значит, «красивый» декод, который не сходится с этими четырьмя байтами, – это и есть декод, которому верить нельзя; а multicall прячет реальные действия слоем ниже, где каждый внутренний вызов придётся декодировать самому.
  • Если кошелёк, маркетплейс или портфельное приложение уверяют, что чего-то не было, а вы уверены, что было – рассудит лог событий: эти инструменты верят логам, а не вашей памяти и не бейджу Success. Обратная сторона – тихое правило: действие, не эмитировавшее ни одного лога, для всего, что ниже по стеку, фактически не произошло, что бы ни говорил Overview. Когда вы и дашборд расходитесь, откройте Logs и дайте событиям рассудить. :::

:::details{badge=Практика title="Чтение swap'а на Uniswap V3 по его логам"} :::p{html}

  • Transfer from your address to the Pool – the USDC moving in. Topic 0 is the keccak [[gloss:hash|hash]] of Transfer(address,address,uint256); the indexed args are from and to; the data is the amount.
  • Swap emitted by the Pool – the actual exchange event with amount0, amount1, the new pool price, and the liquidity. This is the line that confirms execution at a specific price.
  • Transfer from WETH to the Pool, or Pool to WETH – depending on which side is the input, this is the wrapping/unwrapping step. WETH is an ERC-20 wrapper around [[gloss:ethereum|ETH]].
  • Withdrawal on WETH – when the router unwraps WETH back to [[gloss:ethereum|ETH]] at the end.
  • Transfer from the router to your address – the final [[gloss:ethereum|ETH]] (or its WETH form) delivered.
:::

:::p{html} Возьмите любую транзакцию swap на Uniswap V3 и откройте вкладку Logs. Увидите от шести до девяти event-записей в порядке исполнения. Паттерн повторяется на разных DEX, так что, научившись читать одну, прочитаете большинство. Типичный USDC→[[gloss:ethereum|ETH]] swap через V3 router даёт: :::

:::p{html}

  • Transfer с вашего адреса в Pool – USDC уходит. Topic 0 это keccak-хеш Transfer(address,address,uint256); индексированные аргументы – from и to; data – сумма.
  • Swap, эмитированный Pool'ом – собственно событие обмена с amount0, amount1, новой ценой пула и ликвидностью. Это строка, которая подтверждает исполнение по конкретной цене.
  • Transfer с WETH в Pool или с Pool в WETH – в зависимости от того, какая сторона входная, это шаг wrap/unwrap. WETH это ERC-20 обёртка над [[gloss:ethereum|ETH]].
  • Withdrawal на WETH – когда роутер в конце разворачивает WETH обратно в [[gloss:ethereum|ETH]].
  • Transfer от роутера на ваш адрес – финальный [[gloss:ethereum|ETH]] (или его WETH-форма), доставленный.
:::

:::p{html} Если swap попал под sandwich-атаку, в том же блоке появятся ещё два swap'а (front-run покупка атакующего и back-run продажа), но они в других транзакциях того же блока – не в логах вашей. Читайте Swap event у Pool'а для реализованной цены, сравнивайте с тем, что показал кошелёк при подписи; разница и есть стоимость вашего slippage. ::: :::

:::details{badge=Глубже title="Internal Transactions vs полный CALL-трейс"} :::p{html} Вкладка «Internal [[gloss:transaction|Transactions]]» у Etherscan показывает не все внутренние вызовы транзакции, а только отобранную часть – те, что двигают [[gloss:ethereum|ETH]], плюс SELFDESTRUCT и создания контрактов. Это покрывает большую часть того, что пользователю хочется увидеть, но это не полный call trace. У транзакции могут быть десятки внутренних CALL, DELEGATECALL и STATICCALL, которые не двигают [[gloss:ethereum|ETH]] и в эту вкладку не попадают. Полная картина – это geth debug trace: каждый опкод, каждый кадр call stack, каждое чтение storage и каждая запись. Etherscan показывает «Geth Debug Trace» на вкладке State для верифицированных контрактов, но это плотно и без инструментов читать тяжело. :::

:::p{html} Для большинства revert'ов и большинства вопросов «почему оно упало» правильный ответ – взять хеш транзакции и идти в Tenderly (разбор в §6), который отрисует полный трейс со state changes и стоимостью газа по шагам. Tenderly делает ту же работу, что Etherscan, но повёрнутый на отладку, а не на просмотр. Ментальная модель: Etherscan Internal [[gloss:transaction|Transactions]] = «движения [[gloss:ethereum|ETH]] между контрактами в рамках этого вызова». Tenderly call trace = «всё, что [[gloss:evm|EVM]] делал в рамках этого вызова». Первое отвечает на большинство пользовательских вопросов. Второе – на «почему именно оно упало на шаге 17». ::: :::

:::quiz{id=q-3-4-s3 correct=1 explanation="Верно. Status: Success подтверждает только то, что внешний вызов не упал в revert. В multicall'е или в контракте, который ловит ошибки подвызовов, отдельные шаги могут тихо упасть без отката всей транзакции. Канонический способ убедиться, что «то, чего я хотел, действительно случилось», – посмотреть в event logs. Клейм USDC должен эмитировать Transfer(from, your_address, 500e6). Если этого event'а нет, claim-функция вернулась без перевода – скорее всего из-за проверки внутри контракта (например, «уже заклеймили», «vesting ещё не наступил»), которую контракт поймал и просто вернулся вместо revert'а. Вкладка Internal [[gloss:transaction|Transactions]] для [[gloss:ethereum|ETH]]-движений между контрактами, не для ERC-20 переводов; ERC-20 живут на Token Transfers, но именно Logs – авторитетное место, потому что показывает события, которые читают off-chain системы."} Транзакция на Etherscan показывает Status: Success. Использовано 75% газа. Но баланс USDC не изменился – вы ждали 500 USDC от vesting-клейма. Куда смотреть в первую очередь?

  • Обновить страницу – индексатор просто отстаёт
  • Вкладка Logs – искать Transfer event с USDC на ваш адрес; если его нет, claim-функция отработала вхолостую внутри multicall'а
  • Вкладка Internal [[gloss:transaction|Transactions]] – там показываются ERC-20 переводы
  • Доверять Status: Success – клейм произошёл, врёт UI кошелька :::

:::section{mins=5} Чтение адреса и контракта :::

:::lead Страница адреса – это публичное досье. Страница контракта – это досье плюс исходный код программы и консоль, из которой её можно вызвать прямо из браузера. Беглое чтение обоих – это разница между «надо ли мне это подписывать?» и «у меня нет способа узнать». Навык небольшой, а отдача от него огромная. :::

:::p{html} Вставляете любой адрес в Etherscan – открывается страница, которая зависит от того, [[gloss:eoa|EOA]] это или контракт. [[gloss:eoa|EOA]] – это обычный кошелёк, управляемый приватным ключом; контракт управляется кодом. Разделение бинарное на уровне протокола, и Etherscan определяет его по одной проверке: есть ли у адреса непустой байткод в последнем блоке? Пустой – [[gloss:eoa|EOA]]. Непустой – контракт. После [[gloss:eip-7702|EIP-7702]] в мае 2025 это бинарное разделение стало интересным: обычный [[gloss:eoa|EOA]] может временно прикрепить себе код на одну транзакцию (см. 3.3 §1). Но для страницы адреса наверху будет либо «[[gloss:eoa|EOA]]», либо «Contract», и дальше страница меняется по этому признаку. :::

:::p{html} Для [[gloss:eoa|EOA]] страница в основном про историю. Сверху – баланс [[gloss:ethereum|ETH]] и примерный долларовый эквивалент, плюс боковая панель со всеми ERC-20 токенами, которые есть у адреса, с их долларовой ценой (это виджет «Token Holdings»: он опрашивает балансы по каждому известному контракту токена). Ниже – вкладки: [[gloss:transaction|Transactions]] (разобрана в §2), Internal [[gloss:transaction|Transactions]], ERC-20 Token Txns, ERC-721 ([[gloss:nft|NFT]]), ERC-1155, и в более продвинутом виде ссылка Multichain Portfolio. В шапке стоит замечать два таймстампа: First seen (когда адрес получил первую транзакцию – фактически, когда кошелёк стал активным на этой цепи) и Last activity. Кошелёк, впервые увиденный вчера, без истории, который внезапно получает $500K – это другой тип адреса, чем тот, у которого пять лет активности за плечами. История публична; как её взвешивать – ваше дело. :::

:::p{html} Для контрактного адреса появляется дополнительная структура. Наверху висит метка «Contract» вместо иконки кошелька. Рядом с [[gloss:transaction|Transactions]] появляется новая вкладка – Contract. Внутри неё четыре подвкладки, и они и есть сердце анализа контракта: Code, Read Contract, Write Contract, и (для прокси) Read as Proxy / Write as Proxy. Подвкладка Code показывает верифицированный исходник, если он есть, версию компилятора, оптимизации, объявленную лицензию и аргументы конструктора. Если контракт не верифицирован, вся подвкладка сворачивается в надпись-заглушку «Are you the contract creator? Verify and Publish your contract source code today!» («Вы создатель контракта? Верифицируйте и опубликуйте его исходный код») плюс кнопку Decompile [[gloss:bytecode|Bytecode]] (попытка восстановить подобие кода из байткода). Неверифицированность сама по себе не фатальна – многие настоящие контракты не верифицированы – но это сильный сигнал быть осторожнее перед взаимодействием. :::

:::p{html} Подвкладка Read Contract – самая недоиспользуемая фича Etherscan и один из инструментов, дающих наибольшую отдачу за наименьшее усилие. Она перечисляет каждую view или pure функцию контракта – функции, которые читают состояние, но не меняют его – и любую из них можно вызвать прямо из браузера, бесплатно, без подключения кошелька. Можно посмотреть owner контракта, текущий totalSupply токена, allowance, которое конкретный адрес выдал на spender'а, состояние paused, адрес implementation у proxy. Прежде чем подписывать транзакцию с участием незнакомого контракта, контракту можно задать серию бесплатных вопросов – и ответы приходят прямо из блокчейна, это факты самого контракта, а не чья-то проставленная вручную метка. Подвкладка Write Contract – то же самое, но для функций, меняющих состояние: для использования нужен подключённый кошелёк и реальная транзакция. Фактически это запасной dApp-UI, встроенный в Etherscan: если официальный фронт не работает или подменён, контракт всё ещё можно вызвать руками. :::

:::p{html} Proxy-контракты заслуживают отдельного абзаца, потому что путают каждого с первого раза. Proxy – это контракт-пересылка: сам он почти ничего не делает, а каждый вызов перенаправляет на другой контракт, где лежит настоящая логика (его называют implementation). Адрес proxy при этом не меняется, а логику за ним можно подменить на новую версию – ради этого приёма proxy и придуман: все обращаются по одному адресу, а команда обновляет код «под ним». Etherscan распознаёт стандартные паттерны ([[gloss:eip|EIP]]-1967, [[gloss:eip|EIP]]-1822 UUPS, Diamond/[[gloss:eip|EIP]]-2535) и показывает баннер «This contract is a proxy». Когда баннер есть, открывай Read as Proxy – там показаны функции настоящей логики, которая лежит в implementation (см. 3.3 §4). Обычный Read Contract у proxy почти бесполезен: он показывает только функции самой обёртки, а их почти нет. Два следствия. Первое: при разборе proxy надо смотреть и сам proxy, и implementation. Второе: «верифицирован сегодня» не значит «верифицирован завтра» – админ может подменить implementation на неверифицированный, и любой allowance, который вы выдали proxy, теперь указывает на новую логику. Не теоретическая угроза – это механизм февральского хака Bybit 2025: атакующий заставил подписантов Safe-мультисига сделать delegatecall на контракт, переписавший implementation у самого Safe. :::

:::callout{icon=💡} Inspection report перед покупкой дома. Структурный раздел подтверждает, что фундамент совпадает с поданным разрешением на строительство: дом построен там, где написан. Это и есть verification. Она ничего не говорит о том, соответствует ли проводка нормам, не закопал ли прежний хозяин цистерну во дворе, не топит ли подвал весной. Поданное разрешение не равно «дом хороший». Возраст здания, история ремонтов, число владельцев и сколько каждый прожил, имя архитектора – всё это в досье, отдельно от проверки разрешения. Verified-контракт на Etherscan – разрешение. Возраст, число держателей, другие деплои создателя, права у владельца – всё остальное досье. Покупать дом по одному разрешению – не то, как делает кто-либо компетентный. :::

:::keypoints{label="Ключевые моменты"}

  • Верификация – первая проверка, не последняя. Прежде чем что-либо подписывать на незнакомом контракте, смотрите три числа вместе: дата деплоя (контракт, созданный пару часов назад – подозрительно), число держателей для токенов (10 держателей = почти всегда скам) и число транзакций (однозначное число = свежак, который никто не успел проверить). «Verified + молодой + крошечная база держателей» – рецепт паттерна Angel Drainer из §1.
  • Read Contract – это ваш бесплатный оракул. Прежде чем выдавать allowance на spender'а – или прежде чем подписывать сам approve – откройте контракт spender'а на Etherscan и вызовите его публичные read-функции: кто owner? Контракт на paused? Есть ли метод upgradeTo? Для ERC-20 токенов можно прочитать текущий allowance(spender, your_address) и узнать, что выдано ранее. Бесплатно, моментально, без транзакции, без подключения кошелька.
  • У proxy два исходника – собственно proxy (редко меняется) и implementation (можно подменить). Кнопка «Read as Proxy» – это то, что выводит функции implementation; обычный «Read Contract» показывает лишь тонкую оболочку proxy. Поведение обоих может поменяться за ночь, если админ переведёт proxy на новую логику. Allowance, выданный proxy вчера, действует на ту логику, что стоит за ним сегодня, и этот приём «подменить логику» – механизм за несколькими громкими захватами контрактов.
  • Поле owner или admin у контракта говорит, кто может его обновить, поставить на паузу или поменять параметры. Если owner – [[gloss:eoa|EOA]], эти полномочия – за одним приватным ключом. Если owner – мультисиг (например, адрес Safe), threshold говорит, сколько из N подписантов должны согласиться. Если owner = 0x000…000, владельцы отказались от прав и никто ничего поменять не может. Read Contract → вызов owner() занимает пять секунд и это самый информативный бесплатный запрос, который можно сделать к смарт-контракту. :::

:::details{badge=Практика title="Верификация контракта, который вы написали – и что верификация на самом деле проверяет"} :::p{html} Если вы задеплоили контракт и хотите, чтобы пользователи (или сервисы, читающие данные из Etherscan – Rabby, Tenderly, security-сканеры) могли читать его исходник, его надо отправить на верификацию. Страница – etherscan.io/verifyContract. Вы указываете адрес, точную версию компилятора [[gloss:solidity|Solidity]] (с патчем – v0.8.24+commit.e11b9ed9, не просто 0.8.24), настройки оптимизации (был ли контракт скомпилирован с оптимизатором? при каком значении runs?) и сам исходник. Etherscan компилирует ваш исходник с этими настройками и сравнивает получившийся байткод с тем, что задеплоен на цепи. Если совпали байт в байт (с поправкой на различие в metadata-хеше в конце) – вы получаете зелёную галку. :::

:::p{html} Что это реально доказывает: задеплоенный код совпадает с кодом на странице. Что это не доказывает: что код делает то, что подсказывают имена его функций. ERC-20 с именем «USDC» и верифицированным контрактом всё ещё может иметь transfer, который тихо отщипывает 10% в пользу деплоера. Имена и комментарии бесплатны; поведение – в теле. Читатель, который дошёл до «Verified ✓» и закрыл вкладку, подтвердил ровно один технический факт и сделал очень много выводов, под которые у него нет оснований. Бейдж верификации – это инструмент для code review, а не его замена. ::: :::

:::details{badge=Глубже title="Storage-слоты EIP-1967 – как найти implementation вручную"} :::p{html} Etherscan автоматически распознаёт большинство proxy, заглядывая в общеизвестные storage-слоты. [[gloss:eip|EIP]]-1967 стандартизирует два конкретных слота – производные от keccak-хешей человекочитаемых строк – в которых proxy хранит адрес implementation и адрес admin. Слот implementation: 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc (keccak256("eip1967.proxy.implementation") − 1). Слот admin: 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103. Когда автодетект Etherscan не срабатывает (бывает на кастомных proxy), эти слоты можно прочитать напрямую через eth_getStorageAt у любого RPC или через Read-интерфейс Etherscan, если есть обёрточный ABI. :::

:::p{html} Практически: в [[gloss:node|Node]] REPL с ethers.js provider.getStorage('0xProxyAddress', '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc') вернёт адрес implementation как последние 20 байт 32-байтного слова. Снимаете ведущие нули – и вот он. Если [[gloss:node|Node]] не настроен, тот же вызов работает curl'ом к любому публичному [[gloss:ethereum|Ethereum]] RPC через JSON-RPC метод eth_getStorageAt – данные в цепи, proxy просто прячет, какой контракт сейчас implementation, и storage-слот – это адрес этой спрятанной информации. Большинству пользователей это перебор; для нестандартных proxy и для проверки автодетекта Etherscan – каноническая обходка. ::: :::

:::quiz{id=q-3-4-s4 correct=3 explanation="Верно. Каждый red flag по отдельности можно проглотить; вместе – это сигнатурный паттерн. Verified доказывает только то, что исходник совпадает с байткодом – вредоносный контракт может быть верифицирован, и Angel Drainer в феврале 2024 сделал ровно это с вредоносным Safe vault. 4 часа возраста – у сообщества не было времени что-либо найти. 32 держателя для токена пары – это однозначное число серьёзных пользователей плюс собственные кошельки деплоера. Owner с одним ключом – один приватный ключ управляет апгрейдами, параметрами и любыми pause/blacklist-правами, которые у контракта могут быть. Новый + verified + крошечный + single-key – это не «DEX, который вы открыли первым», это staging-окружение запланированного drainer'а. Правильно – подождать неделю, посмотреть, что делают другие адреса, и переоценить. Возможность редко настоящая; риск обычно настоящий."} Вы собираетесь сделать swap на новом DEX, на который пришли по ссылке из Twitter. Etherscan говорит, что контракт роутера verified. Держателей токена пары: 32. Деплой контракта: 4 часа назад. Owner (прочитан из Read Contract) – «мультисиг» 1 из 1, то есть один [[gloss:eoa|EOA]]. Идти?

  • Да – контракт verified, это главная проверка
  • Да, если на маленькую сумму – 32 держателя это достаточный community-фильтр
  • Да – ссылки в Twitter от людей, на которых вы подписаны, обычно безопасны
  • Нет – verified это самая низкая планка; 4 часа возраста + 32 держателя + единственный ключ-владелец – это ровно профиль свежего drainer'а :::

:::section{mins=3} Эксплореры других сетей :::

:::lead [[gloss:evm|EVM]]-[[gloss:layer 2|L2]] переиспользуют UI Etherscan почти без изменений, и навык из §2 переносится моментально. У [[gloss:bitcoin|Bitcoin]], [[gloss:solana|Solana]], [[gloss:cosmos|Cosmos]] и [[gloss:ton|TON]] свои модели данных, и их эксплореры это отражают. Этот раздел – карта: какой инструмент читает какую цепь и что между ними меняется, кроме косметики. :::

:::p{html} В рамках [[gloss:evm|EVM]]-семьи навык один. Та же поисковая строка, те же вкладки, та же подвкладка «Read Contract», та же панель «Token Holdings», та же инфраструктура меток. Что меняется – сеть, которую индексируют, единицы газа (Gwei на [[gloss:mainnet|mainnet]], доли Gwei на большинстве [[gloss:layer 2|L2]]) и база меток (адрес, помеченный «Binance» на Etherscan, может ещё не быть помечен на свежем [[gloss:layer 2|L2]]). Доминирующие пары на середину 2026 ниже. :::

:::p{html}

СетьОсновной эксплорерПримечание
[[gloss:ethereum|Ethereum]] [[gloss:l1|L1]]Etherscan (etherscan.io)Оригинал; Blockscout ([[gloss:ethereum|eth]].blockscout.com) как open-source альтернатива
Arbitrum OneArbiscan (arbiscan.io)Семья Etherscan; Blockscout тоже держит инстанс
BaseBasescan (basescan.org)Семья Etherscan; цепь от Coinbase
OP [[gloss:mainnet|Mainnet]]Optimistic Etherscan (optimistic.etherscan.io)Семья Etherscan
Polygon [[gloss:proof of stake|PoS]]Polygonscan (polygonscan.com)Семья Etherscan
zkSync ErazkSync Explorer (explorer.zksync.io)First-party, не из семьи Etherscan; другой стиль
StarknetStarkscan (starkscan.co), Voyager[[gloss:cairo vm|Cairo VM]], не [[gloss:evm|EVM]]; другие названия полей
[[gloss:solana|Solana]]Solscan (solscan.io), [[gloss:solana|Solana]] Explorer, SolanaFMSolscan с 2024 года под Etherscan
[[gloss:bitcoin|Bitcoin]][[gloss:mempool|Mempool]].space, Blockstream.info[[gloss:utxo|UTXO]]-модель; [[gloss:mempool|mempool]].space – лучший UI [[gloss:mempool|mempool]]'а в крипто
[[gloss:cosmos|Cosmos]]Mintscan (mintscan.io)Валидатор-центричный; [[gloss:ibc|IBC]]-переводы между цепями
[[gloss:ton|TON]]Tonscan, TonviewerАсинхронная модель сообщений; «транзакция» означает другое
:::

:::p{html} [[gloss:bitcoin|Bitcoin]] читается иначе, потому что [[gloss:bitcoin|Bitcoin]] и есть иной. У адреса в [[gloss:bitcoin|Bitcoin]] нет «баланса», хранящегося где-то на цепи; у него есть набор unspent outputs ([[gloss:utxo|UTXO]]), заблокированных на нём, и баланс – сумма этих outputs в каждый конкретный момент. [[gloss:mempool|Mempool]].space показывает это напрямую: страница адреса перечисляет каждый [[gloss:utxo|UTXO]] с высотой блока и суммой, а «потратить» – это момент, когда один [[gloss:utxo|UTXO]] используется как вход в новой транзакции. Ментальный сдвиг от «у аккаунта 1.5 [[gloss:bitcoin|BTC]]» к «у аккаунта три [[gloss:utxo|UTXO]] по 0.7, 0.5 и 0.3» имеет значение: каждая [[gloss:bitcoin|Bitcoin]]-транзакция выбирает конкретные [[gloss:utxo|UTXO]] для траты, а сдача уходит на новый адрес, который вы контролируете. У [[gloss:mempool|Mempool]].space ещё и лучший публичный UI [[gloss:mempool|mempool]]'а в крипто – heat map fee-per-vbyte, который визуализирует, какие транзакции конкурируют за следующий блок. Читать его быстрее, чем любой [[gloss:l1|L1]] fee-oracle, и бесплатно. :::

:::p{html} [[gloss:solana|Solana]] читается ещё иначе. Единица у [[gloss:solana|Solana]] – не вызов контракта, а программная инструкция; транзакция – это список инструкций, каждая вызывает program (так в [[gloss:solana|Solana]] называется смарт-контракт) с набором аккаунтов, которые она прочитает или запишет. Solscan и остальные рендерят это как последовательность «Inner Instructions» внутри представления транзакции. Swap на Jupiter трогает пять-шесть программ (Jupiter aggregator → отдельные DEX → token program → associated token accounts), и обычный [[gloss:evm|EVM]]-style эксплорер этого не покажет: вы увидите плоский вызов без структуры. [[gloss:solana|Solana]]-нативные эксплореры умеют разворачивать структуру, лейблить каждую программу и показывать, какие аккаунты тронула каждая инструкция. Когнитивная нагрузка выше, потому что данных больше. Solscan с 2024 года под Etherscan; SolanaFM был куплен Jupiter в сентябре 2024, после чего независимая разработка замедлилась; Orb от Helius и официальный [[gloss:solana|Solana]] Explorer на explorer.[[gloss:solana|solana]].com – другие серьёзные варианты. :::

:::p{html} Кросс-чейн портфельные виды – отдельная категория. Debank агрегирует [[gloss:evm|EVM]]-позиции – [[gloss:ethereum|Ethereum]] [[gloss:l1|L1]], все крупные [[gloss:layer 2|L2]] и крупные сайдчейны – в одну страницу с полной [[gloss:defi|DeFi]]-картиной: балансы токенов, lending-позиции, LP, застейканное, [[gloss:nft|NFT]]. Zerion делает похожую работу с чуть другим составом цепей и отполированным мобильным приложением. DefiLlama поднимается на уровень выше и показывает [[gloss:tvl|TVL]] по цепям и протоколам – полезно для проверки «реальна ли эта цепь», прежде чем переводить туда значимые суммы. Это не эксплореры в строгом смысле – это агрегаторы, которые читают из индексаторов эксплореров (и из RPC, и из собственной индексации). Они хороши для обзора, не очень для аудита: когда с одной из подлежащих цепей что-то не так, агрегатор тихо это наследует. Для вопроса «сколько у меня вообще вложено и где» они незаменимы. А чтобы понять, что именно сделала конкретная транзакция, открывайте основной эксплорер той цепи, где она прошла. :::

:::callout{icon=💡} Общественный транспорт в разных городах. Внутри [[gloss:evm|EVM]]-семьи одна и та же система в разной краске: метро Нью-Йорка и метро Вашингтона – везде станции, линии, пересадочные узлы и турникеты со свайпом; научились одному – едете в обоих. [[gloss:bitcoin|Bitcoin]] и [[gloss:solana|Solana]] – не метро. [[gloss:bitcoin|Bitcoin]] – это парк такси: каждая поездка это отдельная машина со счётчиком, и городская администрация не ведёт реестр «у кого сколько такси прямо сейчас». [[gloss:solana|Solana]] ближе к высокочастотной электричке с общими платформами: один поезд (транзакция) везёт инструкции на несколько направлений, и нужно смотреть в табло, какой вагон выходит где. Карта – та же идея «добраться из A в B», но сама схема, обозначения на ней и расписание устроены совершенно иначе. :::

:::keypoints{label="Ключевые моменты"}

  • Одна семья цепей – один навык эксплорера. Arbiscan, Basescan, Optimistic Etherscan, Polygonscan, BscScan, FtmScan – одна команда, один интерфейс, одни паттерны. Если читаете Etherscan, на каждой новой [[gloss:layer 2|L2]] остаётся выучить только специфику самой цепи: статус-страница [[gloss:sequencer|sequencer]]'а, механизм вывода, UI нативного моста. Сам эксплорер переносится бесплатно.
  • [[gloss:bitcoin|Bitcoin]]-эксплореры показывают [[gloss:utxo|UTXO]]-модель, а не баланс на адрес. То, что выглядит как «баланс», на деле – кучка непотраченных выходов, лежащих на адресе; трата берёт конкретные из них, а остаток отправляет обратно на свежий ваш адрес. [[gloss:mempool|Mempool]].space показывает эту структуру напрямую и добавляет острейший в крипто взгляд на комиссии – heat map с ценой за vbyte, которая точнее любого [[gloss:l1|L1]] fee-oracle предсказывает, что пройдёт в следующий блок.
  • На [[gloss:solana|Solana]]-эксплорере ваши рефлексы от Etherscan дают осечку: нет единого адреса «to», за который можно зацепиться, и нет вкладки Read Contract, чтобы допросить контракт. Переносится дисциплина, а не кнопки – ищите действие по его инструкциям и явному списку аккаунтов, который несёт каждая, и ждите, что одно действие пользователя (swap на Jupiter) затронет сразу пять-шесть программ. Если читать это в ожидании одного вызова к одному контракту, вы решите, что эксплорер сломан; он нет – другая модель.
  • Кросс-чейн портфельные трекеры (Debank, Zerion) агрегируют, читая исходные эксплореры и RPC. Они хороши для обзора («сколько у меня сейчас всего вложено в [[gloss:defi|DeFi]]?»), но наследуют любые ошибки источников. Для одного конкретного вопроса – «эта транзакция сделала то, что я думаю?» – всегда идите в главный эксплорер исходной цепи. Агрегатор – это дашборд, а не источник истины. :::

:::details{badge=Практика title="Mempool.space – чтение Bitcoin-fee-market в реальном времени"} :::p{html} Открываете [[gloss:mempool|mempool]].space – лендинг показывает ряд предстоящих блоков как цветные прямоугольники, каждый – стопка транзакций, размер которой задан их fee rate (сатоши на виртуальный байт). Самый левый блок – «следующий»: тот, который майнер вот-вот замайнит. Блоки правее – «очередь»: при текущих ставках это порядок, в котором транзакции должны включаться. Наводите на блок – видите диапазон комиссий в нём; кликаете – видите каждую транзакцию, которая туда попадёт. Эта визуализация – это то, что имеют в виду, когда говорят «блок-пространство это рынок». Рынок виден в движении. :::

:::p{html} Для оценки правильной комиссии у [[gloss:bitcoin|Bitcoin]]-транзакции кнопки приоритета (Low / Medium / High / No Priority) справа отдают satoshi-per-vbyte, нужную для попадания на соответствующую глубину очереди. Ставка «No Priority» – это та, при которой вы попадаете в блок за ближайшие несколько часов, полезно для несрочных транзакций. Ставка «High Priority» – следующий блок, но платите соответственно. Heat map обновляется в реальном времени и честнее любого fee-oracle, который возвращает число, потому что его данные – это реальный [[gloss:mempool|mempool]] ровно в эту секунду, а не сглаженное среднее. Для любого, кто держит [[gloss:bitcoin|Bitcoin]]-кошелёк, [[gloss:mempool|mempool]].space заменяет три других инструмента. ::: :::

:::details{badge=Глубже title="Почему эксплореры Solana не ощущаются как Etherscan"} :::p{html} Три вещи делают [[gloss:solana|Solana]]-эксплореры структурно отличными от Etherscan. Первое: нет per-contract storage в смысле [[gloss:evm|EVM]]. [[gloss:solana|Solana]] program – это stateless-код; данные, с которыми он работает, живут в отдельных аккаунтах, которые caller указывает в инструкции. Чтобы «прочитать storage контракта», нужно знать, какой аккаунт хранит данные и какая у него раскладка – Anchor IDL или задокументированная схема. Без IDL Solscan покажет сырые байты аккаунта. С ним – декодированную структуру. Второе: транзакции – не единичные вызовы, а списки инструкций, и у каждой инструкции своя программа, свои аккаунты и свой бюджет compute-units. «Swap» отрисовывается как последовательность вложенных inner instructions, а не как один декодированный вызов функции. Третье: event logs в [[gloss:ethereum|Ethereum]]-смысле отсутствуют. Программы [[gloss:solana|Solana]] эмитируют «program logs» – printf-style строки, записанные в боковой канал транзакции – и они best-effort, не несущая инфраструктура. Чтобы отслеживать активность на [[gloss:solana|Solana]], индексаторы парсят логи и inner instructions; на [[gloss:ethereum|Ethereum]] они парсят Transfer и Swap events из receipt'ов. :::

:::p{html} Практическое следствие: вид транзакции в Solscan многословнее, чем эквивалент в Etherscan, и требует больше интерпретации. Особенно Jupiter-swap'ы – они могут разворачиваться в десять и больше inner instructions через несколько программ (Jupiter v6 → Whirlpool → Token program → ATA program → wrap/unwrap [[gloss:solana|SOL]]). Беглость достижима, но строится дольше, и паттерны [[gloss:solana|Solana]]-специфичные – короткой дорожки «читай как Etherscan и норм» здесь нет. Orb от Helius пытается перекинуть мост через AI-сводки («Swapped 10 [[gloss:solana|SOL]] for 1,500 BONK via Jupiter»), что удобно для повседневности, но не должно заменять чтение собственно инструкций, когда ставки реальные. ::: :::

:::quiz{id=q-3-4-s5 correct=2 explanation="Верно. [[gloss:solana|Solana]]-адреса – это 32-байтные [[gloss:ed25519|ed25519]] публичные ключи в base58, они вообще не похожи на 20-байтные hex-адреса [[gloss:ethereum|Ethereum]], и Etherscan их даже не распарсит. У цепи своя семья эксплореров: Solscan (теперь под Etherscan, самый отполированный general-purpose), официальный [[gloss:solana|Solana]] Explorer на explorer.[[gloss:solana|solana]].com (минималистичный, но канонический), SolanaFM (с покупки Jupiter в 2024 году развивается медленнее) и Orb от Helius (более новый, с AI-сводками транзакций). На любом из них страница адреса показывает [[gloss:spl|SPL]]-токены по token account – USDC на [[gloss:solana|Solana]] это [[gloss:spl|SPL]]-токен с mint'ом EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, и владения вашего друга этим токеном живут в associated token account, а не прямо на адресе кошелька. Инструменты Etherscan здесь ломаются на каждом слое; нужна [[gloss:solana|Solana]]-нативная инфраструктура."} Вы хотите отследить USDC-активность друга на [[gloss:solana|Solana]]. Он прислал адрес. Куда идёте?

  • Etherscan – вставить адрес в поиск и посмотреть активность USDC
  • [[gloss:mempool|Mempool]].space – у него лучший UI для отслеживания токенов
  • Solscan или официальный [[gloss:solana|Solana]] Explorer – [[gloss:solana|Solana]]-адреса не работают в [[gloss:ethereum|Ethereum]]-инструментах, а Solscan показывает [[gloss:spl|SPL]]-токены по аккаунту
  • DeBank агрегирует портфели по всем цепям, включая [[gloss:solana|Solana]], и покажет полную картину токенной активности :::

:::section{mins=4} Продвинутые инструменты :::

:::lead Etherscan показывает, что произошло. Tenderly показывает, что произойдёт, если отправить конкретную транзакцию. Arkham показывает, кто стоит за адресом. Nansen показывает, за чьими кошельками стоит следить. в Dune можно писать SQL, когда нужного дашборда ещё нет. Ни один из этих инструментов не заменяет Etherscan; каждый отвечает на вопрос, на который Etherscan отвечает плохо или никак. :::

:::p{html} Когда Etherscan перестаёт быть ограничителем – когда вкладки читаются бегло, верифицированные контракты находятся, логи декодируются – начинает окупаться второй эшелон инструментов. Каждый из них специализирован: они не пытаются быть универсальным эксплорером, они пытаются быть лучшим ответом на один конкретный вопрос. Стоит знать четыре: Tenderly (симуляция), Arkham (метки сущностей и intelligence), Nansen (поток Smart Money) и Dune (свой SQL по индексированным данным цепи). DeBank и Zerion для агрегации портфеля сюда тоже относятся – разобраны в §5. :::

:::p{html} Tenderly – это симулятор. Вставляете хеш транзакции, и он переисполняет её на форкнутой копии цепи в её исходном блоке, показывая каждый internal call, каждое изменение состояния и стоимость газа пошагово. Уже это закрывает большую часть отладки. Полезнее обратное направление: вставляете пока не отправленную транзакцию (или собираете руками – from, to, value, calldata), и Tenderly показывает, что произойдёт если её отправить. Ответ приходит с полным call trace и state diff после исполнения, ещё до того, как потрачен хоть один Gwei. Для подозрительной транзакции, которую кошелёк предлагает подписать – неожиданный [[gloss:permit|permit]], approve на незнакомый контракт – прогон через Tenderly это ближайший аналог try-before-you-buy в [[gloss:evm|EVM]]. На 2026 бесплатный тариф Tenderly даёт около 50 симуляций в месяц и поддерживает 109 сетей, что покрывает разумное потребление любого индивидуального пользователя; платные тарифы целятся в протоколы и инфраструктурные команды. :::

:::p{html} Arkham – это слой меток сущностей. Etherscan лейблит горстку известных адресов; Arkham – сотни миллионов. Продукт построен вокруг утверждений вида «этот адрес принадлежит Джастину Сану» или «эти 47 адресов все контролируются Wintermute» – метки выведены из on-chain кластеризации, публичных документов, утечек бирж и ручного research'а. Бесплатный тариф на 2026 показывает entity-метки прямо на страницах адресов и поддерживает базовую фильтрацию; платформа перешла планку 3 миллионов пользователей в феврале 2026. Подвох в том, что метки – это выводы, а не доказательства. Уровень уверенности Arkham в конкретной атрибуции не показывается как вероятность; адрес, помеченный «Alameda Research», – лучшая догадка аналитика Arkham по имеющимся данным, и эти данные иногда очень сильные, иногда косвенные. Для расследований Arkham – самый быстрый способ перейти от «незнакомый адрес» к «кандидатная сущность»; шаг верификации всё ещё ваш. У платформы есть свой токен (ARKM) и bounty-рынок, где пользователи могут предлагать атрибуции за вознаграждение – полезный контекст, чтобы понять, какую доказательную базу платформа ценит. :::

:::p{html} Nansen продаёт другой товар: какие кошельки стоит смотреть. Их флагман – это лейбл Smart Money: курируемый набор адресов (институциональные desks, прибыльные [[gloss:defi|DeFi]]-пользователи, [[gloss:nft|NFT]]-whales), которые на длинной дистанции показали хорошие результаты. Подача такая: в реальном времени видно, когда Smart Money начинает покупать или продавать токен, часто раньше, чем это заметит широкий рынок. Реальность в том, что «Smart Money» – это leading indicator только иногда: эти кошельки тоже ошибаются, тоже бывают exit-ликвидностью, тоже подвержены стадному поведению. Как сигнал – один из входов; как замена мышлению – хуже, чем ничего. У Nansen есть бесплатный тариф, введённый в конце 2024 с ограниченным набором фич; платный – $49 в месяц при годовой оплате или $69 в месяц при помесячной на 2026, что относит его к категории «дискреционный инструмент» для индивидуала. :::

:::p{html} Dune Analytics – это SQL-слой над индексированной цепью. Где Etherscan имеет ручные дашборды на предопределённые views, в Dune можно написать запрос к декодированным таблицам (транзакции [[gloss:ethereum|Ethereum]], ERC-20-переводы, каждый swap на Uniswap V3 как структурированные строки) и собрать свой дашборд. Язык – стандартный PostgreSQL с парой расширений. Данные предекодированы командой Dune для больших протоколов, и запрос вида «все swap'ы Uniswap V4 за последние 30 дней с output больше $100K» – это один SQL-стейтмент, а не скрейпинг-пайплайн. Сообщество публикует тысячи дашбордов – большинство публичные, форкабельные и редактируемые. Для разовых вопросов («какой объём прошёл через этот пул в час вокруг хака?») Dune быстрее любого UI. Для активного workflow он окупается за неделю. Бесплатный тариф щедрый; платные есть под большую частоту запросов. :::

:::p{html} Порядок, в котором тянешься к этим инструментам, примерно повторяет шкалу стоимости. Etherscan и Read Contract – первыми: бесплатно, быстро, для большинства вопросов достаточно. Tenderly – когда «что произойдёт» важнее «что произошло»: для индивидуальных объёмов всё ещё бесплатно. Arkham и Nansen – когда вопросом становится «кто это» или «кто ещё двигается»: бесплатные тарифы полезны, платные – серьёзный инструмент для профессионального workflow. Dune – когда вопрос настолько новый, что ни один дашборд на него не отвечает, и нужно собирать свой: бесплатный тариф хватит, платный – для постоянной работы. Каждый – конкретное лезвие, более острое для своей задачи, чем любой универсальный инструмент. :::

:::callout{icon=💡} Отдел убийств, подтягивающий инструменты на серьёзное расследование. У патрульного есть рация и журнал – Etherscan, базовый и присутствующий на любой сцене. Дальше подъезжают специалисты: баллистик с сравнительным микроскопом (Tenderly – симулирует, что подразумевает конкретная улика), архивный аналитик с доступом к базе сущностей (Arkham – даёт имена лицам), оперативник, знающий, какие криминальные сети какими маршрутами двигают деньги (Nansen – следит за паттернами известных игроков), data-аналитик, который пишет SQL по архиву дел за много лет (Dune – спрашивает «мы уже видели эту сигнатуру?»). Каждый инструмент собран под конкретный вопрос. С рутинным вызовом справится патрульный. Дело об убийстве требует полного набора, применённого в правильном порядке. :::

:::keypoints{label="Ключевые моменты"}

  • Симуляция точно отвечает на один вопрос – «что делает эта транзакция прямо сейчас» – и её легко переоценить, приняв за ответ на другой. Чистая симуляция доказывает, что этот вызов не опустошит вас при исполнении; она не доказывает, что контракту безопасно держать allowance завтра – обновляемый контракт может сменить поведение уже после вашей подписи. То есть зелёная симуляция снижает риск этого клика, а не риск самих отношений с контрактом. Читайте её как «отправить безопасно», но не как «доверять безопасно».
  • Не все метки Arkham весят одинаково, и платформа не показывает, какая чего стоит. Метка вроде «Binance 14» опирается на годы подтверждённых паттернов депозитов; метка с именем человека за свежим кошельком может опираться на одну заявку из bounty-рынка. Раз уверенность не показана, калибруйте её сами по типу утверждения: горячий кошелёк биржи – почти наверняка, конкретный человек, привязанный к недавней активности, – это зацепка для проверки. Ошибка, которой надо избегать, – принять громкое имя на метке так, будто платформа его доказала.
  • Есть структурная причина, почему сигнал «Smart Money покупает» разочаровывает, помимо того что эти кошельки ошибаются. К моменту, когда метка определилась и дашборд её показал, цена входа уже ушла – и сам сигнал рефлексивен: достаточно людей, смотрящих в ту же ленту и копирующих, сами двигают цену, так что преимущество стирается именно потому, что оно видимое. Полезно читать Smart Money назад – как карту того, кого изучать и почему случилось движение, – а не вперёд как триггер на покупку.
  • Почти никто не начинает с пустого запроса. Реалистичный путь входа – найти публичный дашборд, близкий к вашему вопросу, форкнуть его и поменять одну строку: адрес контракта, диапазон дат. А значит, важнее уметь читать SQL, чем писать его с нуля. Более глубокая разблокировка – просто знать, что декодированные таблицы существуют: как только вы понимаете, что «каждый swap на Uniswap – это уже готовая строка для запроса», целый класс вопросов, на которых вы бы махнули рукой, превращается в пятиминутную правку вместо скрейпинг-проекта. :::

:::details{badge=Практика title="Симуляция перед подписью: 30-секундный workflow в Tenderly"} :::p{html} Кошелёк показывает транзакцию, которую он хочет подписать. Сводка пишет «Approve to 0xAbc…123» или «[[gloss:permit|Permit]] on USDC to 0xDef…456», а получателя вы не узнаёте. Встроенные в Rabby и свежий MetaMask симуляторы (см. 3.3 §8) ловят большую часть случаев, но их глубина – на прямые state changes, не на последствия логики контракта. Tenderly [[gloss:transaction|Tx]] Builder даёт полную версию той же проверки. :::

:::p{html} Если симуляция показывает, что с вашего адреса уходят токены, которых вы не ждали – на адрес, который не тот контракт, с которым вы думали взаимодействовать – это и есть ответ. Кошелёк собирался подписать drainer; закрыть запрос кошелька без подтверждения. Стоимость симуляции: ноль газа, ~10 секунд. Стоимость пропущенной симуляции, которая бы поймала drainer: всё, что в кошельке. ::: :::

:::details{badge=Глубже title="Почему ни один инструмент не покрывает всё"} :::p{html} Соблазнительно спросить, почему нет одного эксплорера, который делает всё это – метки, симуляцию, SQL, агрегацию портфеля – в одном отполированном UI. Ответ: лежащие в основе инженерные задачи разной формы и торгуются друг против друга. Etherscan оптимизирует быстрые lookup'ы по канонической цепи; добавление глубокого entity research замедлит индексатор и размоет фокус команды. Tenderly оптимизирует точную симуляцию; это значит запускать форкнутый [[gloss:evm|EVM]] на каждый запрос, что стоит на порядки больше compute, чем чтение индекса. Arkham оптимизирует attribution research; это команда аналитиков и другая пайплайн поглощения данных, не только ноды. Nansen оптимизирует поведенческие метки и курируемые списки; это research-операция, не база данных. Dune оптимизирует гибкий SQL; цена в том, что данные могут отставать до 30 минут от реального времени под пиковой нагрузкой. :::

:::p{html} Рынок сошёлся на специалистах не просто так. У каждого инструмента своя структура издержек, своя специализация команды, своё определение «хорошо». Объединённый продукт был бы медленнее во всём и наследовал бы худшие ограничения каждого компонента. Цена использования четырёх инструментов вместо одного – освоить четыре UI; реальная, но конечная. Цена одного инструмента, пытающегося делать четыре работы, – посредственность по всем четырём. Для пользователя практический ход – знать, какой вопрос к какому инструменту, и интернализировать это как часть навыка, а не мечтать о существовании единого решения. Его, скорее всего, не будет – и это нормально. ::: :::

:::quiz{id=q-3-4-s6 correct=1 explanation="Верно. Tenderly – правильный инструмент, потому что вопрос «что произойдёт, если я подпишу», а это ровно то, что Tenderly симулирует. Вставка данных транзакции в [[gloss:transaction|Tx]] Builder исполняет вызов на форке текущего состояния цепи и показывает asset-change diff для вашего адреса: если подпись позволит получателю забрать ваш USDC, в diff это будет виден как будущий отток, когда spender исполнит [[gloss:permit|permit]]. Etherscan (вариант A) полезен для контекста, но рассказывает только метаданные контракта, не то, что разрешит ваша конкретная подпись. Arkham (C) – отсутствие метки ничего не значит; drainer'ы начинают без меток, потому что свежие. Nansen (D) – Smart Money лейблит кошельки, а не drainer-контракты, и «Smart Money пока не выходит» совместимо и с безопасным, и с опасным сценарием. Симуляция – единственный из четырёх инструментов, который отвечает на заданный конкретный вопрос."} Кошелёк, в котором вы собираетесь подписать, показывает: «[[gloss:permit|Permit]] on USDC to 0x9F7B…1234, amount: unlimited». Контракт незнакомый. Самый эффективный способ узнать, что реально произойдёт, если подписать?

  • Открыть Etherscan на адресе контракта и проверить verification + holders
  • Вставить неподписанную транзакцию в Tenderly [[gloss:transaction|Tx]] Builder и просимулировать – панель asset-changes покажет, не уходит ли USDC с кошелька
  • Посмотреть адрес получателя в Arkham – если метки нет, значит безопасно
  • Проверить Nansen – Smart Money уже отметили бы drainer :::

:::section{mins=5} Расследование подозрительной TX :::

:::lead С §1 по §6 мы разбирали инструменты по одному; в этом разделе собираем их вместе. Мы пройдём через реальный случай 2024 года – атака Angel Drainer через Safe vault, $403K уведены у 128 кошельков – используя только инструменты из предыдущих разделов, в том порядке, в котором действительно работает аккуратный исследователь. Дело не в конкретном кейсе. Дело в форме работы. :::

:::p{html} Расследование почти всегда начинается с симптома, не с причины. Кто-то просыпается, в MetaMask ноль. Или приходит сообщение в Telegram: «Я только что задрейнился». Или Discord-канал шумит про проект, у которого двигается treasury. Хеш плохой транзакции – это нить. Если потянуть аккуратно, размотается весь ковёр – но только если тянуть в правильном направлении. Неправильное направление – побежать ловить атакующего. Правильное – начать с жертвы, задокументировать всё, что уже произошло, и только потом тянуть наружу. Кейс ниже – операция Angel Drainer от 12 февраля 2024 года – был восстановлен ровно по этой схеме командами безопасности MetaSleuth, Scam Sniffer и Blockfence в течение следующих 48 часов. :::

:::p{html} Этап один: подтвердить, что потеря реальна, и зафиксировать канонические факты. Жертва говорит «весь USDC ушёл». Шаг один – проверить на цепи, не в UI кошелька. Берёте адрес, открываете Etherscan, идёте на вкладку ERC-20 Token Transfers (§2 объяснял, почему именно эта, а не главная [[gloss:transaction|Transactions]]). Оттоки видны как Transfer-события с адреса жертвы на адрес получателя, с таймстампами. В случае Angel Drainer паттерн был узнаваемый: один Transfer всего баланса USDC за один блок, на адрес с двухчасовой историей и кодом контракта, похожим на Permit2-style approvals. Паническая версия жертвы («всё пропало») теперь стала конкретной цепочкой трёх фактов: какой токен, какая сумма, кто получил, в каком блоке. Сохранить хеш. Всё дальнейшее цепляется за него. :::

:::p{html} Этап два: прочитать саму вредоносную транзакцию. Открываете хеш в Etherscan (§3). Overview показывает Status: Success – атака сработала. From – жертва. To – известный канонический адрес Permit2 (0x000000000022D473030F116dDEE9F6B43aC78BA3); Permit2 это [[gloss:permit|permit]]-агрегатор Uniswap, его используют много dApp'ов, и сам по себе он известен как безопасный; злоупотребление – в том, как Angel Drainer убедил жертву подписать. Input Data, декодированный, показывает вызов permitTransferFrom с подписью жертвы, в которой «spender» – адрес drainer-контракта. Вкладка Logs показывает собственно Transfer-событие USDC, источник – контракт USDC, получатель – адрес drainer'а. Трейс теперь полный на техническом уровне: мы знаем, что было подписано, кто исполнил, куда ушло. Почему жертва подписала – пока не знаем. :::

:::p{html} Этап три: исследовать контракт drainer'а. Берёте адрес drainer'а, вставляете в Etherscan. Первое, что показывает страница – зелёная галка, verified. Это и есть ловушка, на которой вся атака держалась. Политика автоверификации у Etherscan для Safe (Gnosis Safe) vault'ов расценила деплой drainer'а как обычный Safe и проставила verified в течение секунд после деплоя. Read Contract (§4) показывает: задеплоен за два часа до подписи первой жертвы, один owner, ноль публичной активности, ноль holders. Три сигнала на одной странице: verified-но-молодой + ноль истории + исходник, который автоверификатор принял, соответствует стандартному интерфейсу Safe, но deployment salt и initialization data у proxy указывают на вредоносный implementation. Ничего из этого не спрятано – всё на странице – но «verified – и стоп» это то, как 128 кошельков дошли до дня подписания. :::

:::p{html} Этап четыре: тянуть наружу, в обе стороны во времени. Назад: откуда у жертвы взялись средства за часы и дни до drain'а? В Etherscan это верхняя половина вкладки Token Transfers. В случае Angel Drainer жертвы пришли из разных источников – биржи, другие кошельки, [[gloss:defi|DeFi]]-позиции – но у них было общее поведение: незадолго до этого они посещали фишинговый dApp, который выглядел как страница клейма для разных airdrop-кампаний. На цепи этого не видно; это реконструируется по off-chain сравнению заметок жертв. Но видно на цепи то, что все адреса-жертвы подписали Permit2-сообщения на один и тот же drainer-адрес в течение 36-часового окна. Вперёд: куда ушли средства от drainer'а? USDC каждой жертвы переехал на сборный адрес drainer'а, который затем прогнал всё через Tornado Cash и серию мостов для запутывания. Arkham (§6) в итоге пометил сборный адрес как принадлежащий кластеру Angel Drainer, увидев тот же паттерн адресов в потерях примерно $25 миллионов от ~35 000 кошельков за предыдущие двенадцать месяцев. :::

:::p{html} Этап пять: подтвердить вектор и записать. Подписанное сообщение во вкладке Logs декодируется в Permit2 SignatureTransfer структуру: жертва авторизовала drainer вытащить конкретную сумму USDC, подпись off-chain, исполнение on-chain в момент, когда подпись доехала до drainer'а. Permit2 хорошо спроектирован; криптографический примитив безупречен; провалилось то, что жертва читала «Sign to claim your airdrop» в попапе кошелька и не разобрала, что подписанная структура авторизует. Фишинговый сайт выглядел как легитимная страница клейма; кошелёк показывал «[[gloss:eip-712|EIP-712]] signature request» с расплывчатым заголовком; жертва одобрила. Вектор был социальным, исполнение – техническим, ловушка – политика автоверификации Etherscan. Записать это – вектор, исполнение, ловушка, blast radius (128 кошельков, $403 000) – это deliverable. Цель расследования не поймать атакующего; цель – чтобы та же ловушка не поймала следующего человека, который прочитает writeup. Writeup – единственная долговечная защита. :::

:::callout{icon=💡} Forensic accounting после мошенничества в небольшой фирме. Бухгалтер замечает число, которое не сходится; это симптом. Forensic-аудитор не начинает с вопроса «кто это сделал» – это работа полиции, и она будет позже. Он начинает с восстановления книг: каждая транзакция, которая трогала подозрительный счёт, по порядку, с соответствующими первичными документами. Устанавливает каноническую хронологию. Идентифицирует конкретные записи, не проходящие аудит – переводы незнакомому подрядчику, счета без актов выполненных работ. Тянет назад во времени: как фирма вообще оказалась в отношениях с этим подрядчиком, и куда ушли деньги после того, как подрядчик их получил. И только в конце, когда хронология, записи и трейс собраны, передаёт досье следователям. Досье – это и есть результат, а не арест. On-chain расследование имеет ту же форму: инструменты, последовательность, результат. Поймать атакующего – редкое и побочное. Задокументировать ловушку – это собственно работа, и она защищает всех остальных. :::

:::keypoints{label="Ключевые моменты"}

  • Инстинкт сначала гнаться за атакующим – самая дорогая ошибка. Пока вы охотитесь за личностью, тикают часы, которые реально важны: украденные средства часто ещё в движении, и единственное окно, чтобы пометить их для биржи или успеть до моста, закрывается быстро. Хуже того, если стартовать с панической версии жертвы, её догадки вшиваются в ваши факты. Потратьте первые минуты на то, что показывает цепь – токен, сумма, адрес назначения, блок, хеши – и вы сохраните и хронологию, и факты чистыми.
  • Трассировка назад и вперёд отвечают на две разные задачи – понимайте, какая ваша. Назад (откуда пришли средства и approvals жертвы?) реконструирует, как она попалась – а это то, что спасёт следующую жертву. Вперёд (куда ушла добыча?) – про возврат: это единственный путь к централизованной бирже или мосту, которые ещё могут заморозить средства, и он критичен по времени. Если деньги ещё можно спасти – сначала вперёд; если их уже отмыли – долговечная ценность в направлении назад.
  • Большинство расследований заканчиваются на одном Etherscan, и умение понять, что ты уже закончил, – отдельный навык. Как только можешь назвать токен, сумму, адрес назначения и что именно подписала жертва – у тебя есть ответ почти для любого случая со слитым кошельком; более тяжёлые инструменты нужны для редкого оставшегося вопроса. Тянуться к Tenderly или Arkham, не исчерпав бесплатный быстрый обзор, обычно значит добавлять глубину, которая не нужна, вместо того чтобы закрыть уже раскрытое дело.
  • Writeup защитит следующего, только если фиксирует момент обмана, а не один лишь ущерб. Хеши, суммы и адрес атакующего легко записать, но для профилактики они бесполезны: устаревают, как только атакующий сменит кошельки. Многоразовая часть – это разрыв: что говорил попап кошелька («Подпишите, чтобы получить»), и что подпись на самом деле авторизовала (вывести этот токен). Запишешь этот разрыв точно – следующий читатель узнает ловушку; перечислишь одни криминалистические факты – задокументируешь кражу, на которой никто не научится. :::

:::details{badge=Практика title="Шаблоны для четырёх самых частых расследований"} :::p{html}

  • "My [[gloss:wallet|wallet]] got drained." Etherscan → victim address → Token Transfers tab → find the outflow → open the [[gloss:transaction|transaction]] → read From/To/Logs → identify which approve or [[gloss:permit|permit]] was the entry point → trace allowance history backward to find the malicious approval [[gloss:transaction|transaction]]. The malicious signature is usually 1–48 hours before the drain; the social-engineering happened before that. Revoke remaining allowances via revoke.cash (covered in 3.3 §7) before anything else.
  • "This contract feels off." Etherscan → contract address → Code tab (verified? when deployed?) → Read Contract (who is owner? is it paused? is it a proxy?) → if proxy, Read as Proxy → Read the deployer's other deployments (link in the "Contract Creator" field on the overview). A deployer with five contracts deployed in the last week, all small, none with significant usage, is a different signal than a deployer with two years of legitimate history.
  • "This [[gloss:transaction|transaction]] didn't do what I expected." Etherscan → [[gloss:transaction|transaction]] [[gloss:hash|hash]] → Logs tab (the event you expected – is it there? is the amount what you expected?) → if not, check Internal [[gloss:transaction|Transactions]] for [[gloss:ethereum|ETH]] [[gloss:movement|movement]] → if still unclear, paste the [[gloss:hash|hash]] into Tenderly and read the full call trace to see exactly which sub-call failed silently or returned without effect.
  • "Did this project just rug?" Etherscan on the token contract → Holders tab (did the top holders all dump at once?) → Token Tracker → trace where the LP tokens went. DefiLlama → search for the project → check if [[gloss:tvl|TVL]] collapsed. Twitter is downstream; on-chain shows it first.
:::

:::p{html} Большинство расследований ложится в одну из четырёх форм. Знание формы заранее экономит время и не даёт блуждать. :::

:::p{html}

  • «У меня дрейнули кошелёк». Etherscan → адрес жертвы → вкладка Token Transfers → найти отток → открыть транзакцию → прочитать From/To/Logs → понять, какой approve или [[gloss:permit|permit]] стал точкой входа → проследить историю allowance назад, чтобы найти вредоносный approval. Вредоносная подпись обычно за 1–48 часов до drain'а; социальная инженерия – раньше. Отозвать оставшиеся allowance через revoke.cash (разобрано в 3.3 §7) прежде всего остального.
  • «Этот контракт выглядит подозрительно». Etherscan → адрес контракта → вкладка Code (verified? когда задеплоен?) → Read Contract (кто owner? на паузе? proxy?) → если proxy, Read as Proxy → посмотреть другие деплои создателя (ссылка в поле «Contract Creator» в overview). Создатель с пятью контрактами за последнюю неделю, все маленькие, без значимой активности – это другой сигнал, чем создатель с двухлетней легитимной историей.
  • «Транзакция сделала не то, что я ждал». Etherscan → хеш → вкладка Logs (то событие, которого вы ждали – оно там? сумма та?) → если нет, проверить Internal [[gloss:transaction|Transactions]] на движение [[gloss:ethereum|ETH]] → если всё ещё непонятно, вставить хеш в Tenderly и прочитать полный call trace, чтобы увидеть, какой именно подвызов тихо упал или вернулся без эффекта.
  • «Этот проект только что сделал rug?» Etherscan на контракте токена → вкладка Holders (топ-холдеры все одновременно вышли?) → Token Tracker → проследить, куда ушли LP-токены. DefiLlama → найти проект → проверить, не схлопнулся ли [[gloss:tvl|TVL]]. Twitter – вниз по течению; на цепи это видно первым.
::: :::