RPC·6 分で読める

trace_対debug_:どのtracing namespaceを使うべきか

トランザクションが実際に何を行ったか——すべての内部コール、すべてのstate変更——を正確に知る必要に迫られたことがあるなら、2つのEVM tracing namespaceに出会っているはずだ。両者は混乱するほど重複し、無視できないほど異なる。これはその実践的な地図である。

debug_ namespace

debug_traceTransactionとdebug_traceCallはgethネイティブだ。これらは設定可能なtracer(デフォルトのstruct logger、あるいはcallTracerやprestateTracerといったbuilt-in)を実行し、opcodeレベルまたはコールレベルの詳細を返す。callTracerが主力である:値、gas、revert理由を伴う完全な内部コールツリーを返し、それこそがほとんどのアプリケーション開発者が実際に求めているものだ。

trace_ namespace

trace_transaction、trace_block、trace_filterはOpenEthereum/Erigon由来だ。trace_filterが際立っている:自分でトランザクションを再実行することなく、from/toアドレスによってブロック範囲にわたる内部コールをクエリできる——価値の流れを追跡したり、あるアドレスの活動を再構築したりするのに非常に有用だ。この範囲フィルタのパターンに相当するきれいなdebug_の手段は存在しない。

両者の選択

特定のトランザクションハッシュがあってそのコールツリーが欲しいなら、debug_ callTracerを使え。アドレスまたはブロック範囲があって、それに触れるすべての内部コールが欲しいなら、trace_filterを使え。opcodeレベルのgasプロファイリングには、struct loggerを伴うdebug_を使う。これらすべては、履歴ブロックに対して実行するにはarchive stateを必要とする——full nodeは最近の履歴しかtraceできない。

1st Node Engineering

よくある質問

両方のnamespaceはすべてのチェーンで利用できるのか?

いいえ。利用可否はクライアントに依存する。Erigonベースのnodeはtrace_とdebug_の両方を公開する。一部のop-stackやその他のクライアントはdebug_を公開するが、完全なtrace_セットは公開しない。対象チェーンのメソッドリファレンスを確認せよ。

なぜtracingは通常のコールよりはるかに高価なのか?

tracingはインストルメンテーションを伴ってEVM上でトランザクションを再実行し、履歴tracingはそのブロックのarchive stateを必要とする。演算とストレージの両方が単純な現在state読み取りより重いのだ。

関連記事

チャージして、キーを取得し、リリース。

セルフサーブ。暗号資産またはカードで支払い。クレジットで従量課金——重いプリミティブは高く、単純なものは安価。

APIキーを取得