Раздел 2 · Урок 2.7
Внутренние транзакции и смарт-контракты
Начинающий аналитик открывает адрес в эксплорере, видит короткий список из трёх переводов — и делает вывод «кошелёк почти пустой, ничего интересного». А на самом деле через этот адрес прошли миллионы долларов, просто они двигались как внутренние транзакции, которых нет в обычной вкладке. Это одна из самых частых слепых зон новичка. В этом уроке разберём, что такое internal txns, почему их не видно, как смарт-контракты (DEX, мосты) перемещают средства и где всё это правильно смотреть.
Два типа транзакций в Ethereum
Чтобы понять внутренние транзакции, нужно различать, кто инициирует перевод:
- Внешняя транзакция (external / normal). Её создаёт и подписывает человек своим приватным ключом из обычного кошелька (EOA — externally owned account). Только такие транзакции записываются в блокчейн как отдельные записи с собственным хешем. Именно их показывает вкладка «Transactions».
- Внутренняя транзакция (internal). Её инициирует смарт-контракт в процессе исполнения кода, запущенного внешней транзакцией. У неё нет собственного хеша и собственной подписи — это побочный эффект работы контракта.
Ключевая мысль: «внутренняя транзакция» — это не отдельная запись в блокчейне, а событие внутри исполнения. Поэтому её нельзя увидеть, просто листая обычный список переводов.
Почему их не видно в обычном списке
Блокчейн хранит только внешние транзакции — те, что подписаны пользователями. Перемещения ETH, которые контракт совершает во время своей работы, нигде не записаны как самостоятельные строки. Откуда же тогда эксплореры вроде Etherscan показывают вкладку «Internal Transactions»? Ответ важен для понимания всей механики.
Внутренние транзакции — это реконструкция. Эксплореры не «читают» их из блокчейна напрямую. Они повторно исполняют (trace) каждую транзакцию на своей копии виртуальной машины EVM и записывают все внутренние вызовы, при которых передаётся ETH. Поэтому: (1) внутренние переводы существуют только для нативной валюты (ETH), но не путайте их с ERC-20 токенами — те двигаются через события Transfer; (2) если сервис не делает трейсинг, он этих движений не видит вовсе.
Аналогия. Внешняя транзакция — это как приказ «запусти вендинговый автомат». Автомат внутри себя выдаёт банку, отсчитывает сдачу, включает подсветку — это внутренние действия. В журнале записан только ваш приказ, а всё, что автомат сделал внутри, приходится восстанавливать, «прокрутив» его работу заново.
Как контракты двигают средства: DEX
Рассмотрим самый частый случай — обмен на децентрализованной бирже (DEX), например Uniswap. Пользователь меняет ETH на токен USDC. Что происходит на самом деле?
- Внешняя транзакция. Пользователь отправляет ETH на адрес контракта роутера Uniswap и вызывает функцию swap. Это единственная запись, которую видно в его обычном списке. «Отправил ETH на 0xUniswap...» — и всё.
- Внутренние переводы. Внутри исполнения контракт роутера обращается к контракту пула ликвидности, пул отправляет USDC пользователю, а часть ETH распределяется по пути. Все эти перемещения — внутренние. Их не видно во вкладке normal.
- Возврат сдачи. Если пользователь прислал чуть больше ETH, контракт вернёт остаток внутренней транзакцией обратно на его адрес. Тоже невидимо в обычном списке.
Для AML это критично. Представьте: аналитик видит, что подозрительный адрес отправил 10 ETH на Uniswap и «на этом след обрывается». На самом деле контракт вернул этому же адресу USDC внутренней транзакцией, и деньги живут дальше в другом токене. Без просмотра internal txns и токен-трансферов «нить» теряется, и отмывание через DEX выглядит как тупик.
Как контракты двигают средства: мосты (bridges)
Ещё сложнее с кросс-чейн мостами. Мост принимает актив в одной сети и выдаёт эквивалент в другой. Это классический инструмент разрыва следа: аналитик, работающий только с одним блокчейном, «теряет» деньги на входе в мост.
Механика моста глазами аналитика
- Депозит. Пользователь отправляет ETH на контракт моста в сети Ethereum. Внешняя транзакция видна. Дальше в Ethereum деньги «замораживаются» на контракте.
- Событие. Контракт моста эмитирует лог-событие с адресом получателя в целевой сети (например, Arbitrum). Это не перевод, а запись в логах — её нужно уметь читать.
- Выдача в другой сети. Валидатор/релеер моста в сети Arbitrum отправляет эквивалент средств на адрес получателя. Это уже совсем другая транзакция в другом блокчейне. Связь между «до» и «после» существует только через логику моста.
Чтобы не потерять след через мост, аналитик должен: (1) распознать адрес контракта как известный мост; (2) прочитать событие с адресом-получателем; (3) переключиться на целевую сеть и продолжить трассировку там. Именно поэтому серьёзный AML-движок мультичейновый и знает адреса популярных мостов.
Где и как это смотреть
Теперь практика — как аналитик реально находит скрытые движения.
- Вкладка «Internal Transactions» на Etherscan. Отдельная вкладка рядом с обычными транзакциями. Здесь видны все ETH-переводы, инициированные контрактами: возвраты с DEX, выплаты, распределения.
- Вкладка «Token Transfers» (ERC-20 / ERC-721). Движения токенов вообще не отражаются ни в normal, ни в internal — у них своя вкладка, построенная по событиям Transfer. Пропустить её — значит не увидеть, что адрес держит USDT на миллионы.
- Trace / «State» и debug-инструменты. Для глубокого разбора сложной транзакции (много вложенных вызовов) используют трейсеры: вкладку «State», Tenderly, Phalcon. Они показывают полное дерево вызовов contract → contract.
- Логи и события (Logs / Events). Именно здесь читаются данные мостов, свопов, депозитов — то, что не является прямым переводом, но несёт ключевую информацию об адресах.
Практический чек-лист аналитика. Открыв любой EVM-адрес, всегда проверяйте минимум четыре вкладки: Normal, Internal, Token Transfers (ERC-20), NFT Transfers. Оценка «пустой кошелёк» по одной лишь вкладке Normal — грубая ошибка, из-за которой пропускают целые пласты отмывания.
Сквозной пример: отмывание через DEX и мост
Схема, которую легко пропустить.
Взлом → вор получает 100 ETH → внешняя tx на Uniswap (виден только этот перевод) → internal: контракт выдаёт 250 000 USDC на адрес вора (невидимо в Normal) → token transfer: USDC уходит на контракт моста → событие моста: получатель в сети Polygon → продолжение отмывания в другой сети.
Аналитик, смотрящий только вкладку Normal в Ethereum, увидит лишь «отправил 100 ETH на Uniswap» и решит, что след оборвался. На деле деньги живут, просто в другом токене и другой сети.
Разберём, что спасает аналитика на каждом шаге: вкладка Internal показывает возврат USDC; вкладка Token Transfers — движение стейблкоина к мосту; чтение события моста — адрес получателя; мультичейн-подход — продолжение в Polygon. Уберите любой из этих инструментов — и схема выглядит как тупик, а грязные деньги «исчезают».
Итог урока. Внешние транзакции создаёт человек, и только они записаны в блокчейне; внутренние — это переводы ETH, которые контракты совершают в ходе исполнения, реконструируемые трейсингом. DEX возвращают средства в других токенах внутренними транзакциями, мосты переносят ценность между сетями через события. Чтобы AML-анализ был честным, движок обязан читать internal txns, токен-трансферы, логи событий и работать в нескольких сетях. Когда AMLConsensus не «теряет» деньги на входе в Uniswap или мост — это работает именно та механика, что вы разобрали в этом уроке.
Материалы носят образовательный характер.