RPC·6 мин чтения

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-нода трейсит только недавнюю историю.

1st Node Engineering

Частые вопросы

Оба namespace доступны в каждой сети?

Нет. Доступность зависит от клиента. Ноды на Erigon предоставляют и trace_, и debug_; некоторые op-stack и другие клиенты дают debug_, но не полный набор trace_. Сверяйтесь со справочником методов для конкретной сети.

Почему трейсинг настолько дороже обычного вызова?

Трейсинг переигрывает транзакцию через EVM с инструментацией, а исторический трейсинг требует archive-состояния на том блоке. И вычисления, и хранилище тяжелее, чем простое чтение текущего состояния.

Похожее

Пополнили, получили ключ, запустили.

Полное самообслуживание. Оплата криптой или картой. Тарификация в кредитах — тяжёлые примитивы дороже, простые дёшевы.

Получить API-ключ