ГЛАВНАЯ / ИНСТРУКЦИИ / INTERNAL TRANSACTION В ОБОЗРЕВАТЕЛЕ: ПОЧЕМУ ЭТО НЕ ОТДЕЛЬНАЯ ТРАНЗАКЦИЯ
Internal transaction в обозревателе: почему это не отдельная транзакция
В Ethereum блок содержит транзакции, а исполнение одной транзакции может вызвать множество контрактов. Обозреватель иногда показывает эти вложенные действия в разделе Internal Transactions. Это удобное представление execution trace, а не ещё один подписанный пользовательский объект, добавленный в блок.
Подписанный запрос имеет hash и параметры верхнего уровня
Обычная внешняя транзакция подписывается отправителем, имеет nonce и попадает в блок как самостоятельный объект. Она указывает верхний адрес назначения, value, calldata и параметры газа. После исполнения для неё создаётся receipt с итоговым статусом.
Вызванный контракт может обращаться к другим контрактам, отправлять ETH и вызывать новые адреса. Такие message calls происходят внутри исполнения исходной транзакции. Вложенный вызов сам не получает отдельную подпись отправителя и обычно не имеет отдельного transaction hash.
| Объект | Самостоятелен в блоке | Идентификатор |
|---|---|---|
| Внешняя transaction | Да, подписана и включена | Transaction hash |
| Вложенный CALL | Нет, часть исполнения | Позиция в trace |
| Event log | Запись события в receipt | Log index и родительский hash |
| Receipt | Результат внешней transaction | Hash родительской транзакции |
Trace восстанавливает цепочку исполнения по кадрам вызова
Execution client может повторно исполнить транзакцию на состоянии блока и записать вызовы, создание контрактов, передачу value, возвраты и ошибки. Это даёт структуру parent/child и помогает понять, какой контракт инициировал следующий шаг. Конкретная глубина, поля и формат зависят от реализации клиента или обозревателя.
Trace обычно не является отдельным consensus-объектом с тем же статусом, что transaction и receipt. Это рассчитанное клиентом или индексатором представление исполнения. Для проверки деталей сравните используемый метод, клиент, номер блока и доступность исторического состояния; разные обозреватели могут по-разному группировать frames.
- запишите RPC-метод или формат trace;
- зафиксируйте клиент, блок и родительский hash.
Найдите родительский вызов и проверяйте каждый шаг
Начните с внешнего hash и проследите trace сверху вниз. Для каждого шага установите тип вызова, адрес инициатора и получателя, переданное значение, входные данные и результат. Не принимайте имя контракта из подписи обозревателя за доказательство его назначения. Для токенов отдельно проверяйте логи и изменение token storage: ERC-20 перевод обычно не является передачей нативного ETH во вложенном CALL.
Ребёнок может завершиться ошибкой, которую родительский код обработал. Поэтому не выводите status верхней транзакции из одной строки trace. Напротив, верхний вызов может завершиться revert, хотя trace показывает несколько успешно исполненных до этого операций: итоговое состояние и логи родительского отката нужно читать вместе.
Internal transaction не создаёт вторую комиссию отправителя
Комиссия относится к внешней транзакции и её итоговому расходу газа. Вложенный вызов может добавлять работу к этому расходу, но не образует самостоятельный gas market bid со своим nonce отправителя. Если обозреватель показывает вкладки или строки, похожие на отдельные переводы, найдите родительский hash и receipt прежде, чем считать их новыми транзакциями.
Название internal transaction – исторически распространённый термин интерфейсов, но оно способно запутать. Точнее говорить о вложенном вызове или trace frame, если речь не о самостоятельной транзакции в блоке. Для проверки доказательства используйте receipt, логи, код и состояние; trace объясняет путь исполнения и зависит от реализации инструмента.
- не назначайте вложенному вызову отдельный hash транзакции;
- запишите клиент или сервис, построивший trace.
Частые вопросы
У internal transaction есть отдельный transaction hash?
Обычно нет. Это часть исполнения внешней транзакции; для поиска используют родительский hash и позицию trace.
Нужно ли оплачивать отдельную комиссию за каждый internal transfer?
Нет отдельной самостоятельной комиссии и ставки отправителя; вложенные действия увеличивают расход родительской транзакции.
ERC-20 Transfer считается internal transaction?
Событие Transfer – log. Изменение токенового состояния проверяется отдельно; оно не обязательно выглядит как передача нативной валюты через CALL.
Почему у двух обозревателей trace отличается?
Методы, доступная история и представление execution frames зависят от клиента и индексатора.
Может ли дочерний вызов упасть при status 1?
Да, если родительский контракт обработал его ошибку и верхний вызов завершился успешно.
Чек-лист: internal transaction в обозревателе: почему это не отдельная транзакция
- родительский hash найден в нужной сети;
- trace отличён от объекта транзакции в блоке;
- инициатор и адрес каждого frame проверены;
- value transfer отличён от event log и token state;
- ошибка дочернего вызова сопоставлена с родителем;
- receipt status прочитан отдельно;
- клиент или индексатор trace указан.
Материал подготовлен редакцией сайта и проверен 28 октября 2026 года. Условия бирж, кошельков и блокчейн-сетей могут меняться. Перед операцией сверяйте данные в интерфейсе выбранного сервиса.