trace_ против debug_: за каким namespace тянуться для трейсинга
Если вам когда-нибудь нужно было точно узнать, что сделала транзакция — каждый внутренний вызов, каждое изменение состояния, — вы натыкались на два EVM-namespace для трейсинга. Они перекрываются достаточно, чтобы путать, и различаются достаточно, чтобы это имело значение. Вот практическая карта.
Namespace debug_
debug_traceTransaction и debug_traceCall — нативны для geth. Они запускают настраиваемый трейсер (дефолтный struct logger или встроенные вроде callTracer и prestateTracer) и возвращают детализацию на уровне опкодов или вызовов. callTracer — рабочая лошадка: он возвращает полное дерево внутренних вызовов со значениями, gas и причинами revert, а это ровно то, чего на деле хотят большинство прикладных разработчиков.
Namespace trace_
trace_transaction, trace_block и trace_filter родом из OpenEthereum/Erigon. trace_filter — жемчужина: он позволяет запрашивать внутренние вызовы по диапазону блоков через адреса from/to, не переигрывая транзакции самому, — бесценно для отслеживания потока средств или реконструкции активности адреса. Чистого эквивалента этому паттерну фильтра по диапазону в debug_ нет.
Как выбирать между ними
Тянитесь к debug_ callTracer, когда у вас есть конкретный хеш транзакции и нужно её дерево вызовов. Тянитесь к trace_filter, когда у вас есть адрес или диапазон блоков и нужны все внутренние вызовы, его затрагивающие. Для профилирования gas на уровне опкодов используйте debug_ со struct logger. Всё это требует archive-состояния, чтобы работать по историческим блокам, — full-нода трейсит только недавнюю историю.
Частые вопросы
Оба namespace доступны в каждой сети?
Нет. Доступность зависит от клиента. Ноды на Erigon предоставляют и trace_, и debug_; некоторые op-stack и другие клиенты дают debug_, но не полный набор trace_. Сверяйтесь со справочником методов для конкретной сети.
Почему трейсинг настолько дороже обычного вызова?
Трейсинг переигрывает транзакцию через EVM с инструментацией, а исторический трейсинг требует archive-состояния на том блоке. И вычисления, и хранилище тяжелее, чем простое чтение текущего состояния.
Похожее
Пополнили, получили ключ, запустили.
Полное самообслуживание. Оплата криптой или картой. Тарификация в кредитах — тяжёлые примитивы дороже, простые дёшевы.
Получить API-ключ