Taiko
debug_traceBlock
The debug_traceBlock method returns a full trace of all invoked opcodes of all transactions included in the specified block. This method provides comprehensive low-level execution information essential for debugging, security analysis, and optimizing transaction behavior across multiple contracts within a single block context.
Use Cases
- Debug complex transactions and interactions within a specific block context
- Analyze smart contract execution flow across multiple transactions
- Optimize gas usage by identifying inefficient patterns across transactions
- Perform security auditing of deployed contracts in real-world conditions
- Verify transaction behavior matches expected outcomes and specifications
- Understand complex multi-contract interactions in production environments
- Analyze virtual machine execution patterns for research and optimization
- Investigate transaction failures at the opcode level
- Verify correctness of complex execution paths in smart contracts
- Identify gas usage patterns in production environments
- Debug and analyze the exact execution of transactions within historical blocks
- Trace all internal calls across a complete block of operations
Method Details
This method traces the execution of all transactions in a block at the opcode level.
Response Example (Simplified)
Response with callTracer
When using the callTracer option, the response is formatted as a call graph for each transaction:
Available Tracers
Geth provides several built-in tracers that format the output in different ways:
- Default tracer: Detailed opcode-level execution logs
- callTracer: Focuses on call hierarchy between contracts
- prestateTracer: Shows contract state before execution
- 4byteTracer: Tracks function selector usage statistics
- noopTracer: Minimal tracer for performance testing
- opCountTracer: Counts occurrences of each opcode
You can also use JavaScript-based custom tracers for specialized analysis.
Working with RLP-encoded Blocks
This method requires an RLP-encoded block as input:
- You can obtain an RLP-encoded block from eth_getBlockByHash with the second parameter set to false
- The encoding includes all block header fields and transaction data in binary format
- For testing purposes, you can use a known block RLP from the network
- Tools like web3.js or ethers.js can help extract and encode blocks properly
- Manually extracted blocks ensure you're analyzing the exact state you need
Differences from debug_traceBlockByNumber and debug_traceBlockByHash
While all three methods provide block-level transaction traces:
debug_traceBlockaccepts an RLP-encoded block as inputdebug_traceBlockByNumberaccepts a block number or tag (e.g., "latest")debug_traceBlockByHashaccepts a block hash- All methods return identical trace formats
- This method is useful when you already have the RLP-encoded block data
Performance Considerations
- Tracing entire blocks is extremely resource-intensive, especially for blocks with many transactions
- Response size can be very large for blocks with complex transactions
- Consider using the
disableMemory,disableStack, ordisableStorageoptions for better performance - For call graph analysis only, the
callTraceris much more efficient - JavaScript tracers may require longer timeouts for complex blocks
- Queries against historical blocks require an archive node
- Tracing blocks with many transactions may time out on public nodes
- For high-volume blocks, consider tracing individual transactions instead
- Response time increases with block size and transaction complexity
- For blocks with complex transactions, specialized tracers are recommended
Important Notes
- This method requires debug APIs to be enabled on the node (--http.api=eth,debug,net,web3)
- Not all Ethereum clients support this method (primarily Geth with debug APIs enabled)
- The RLP-encoded block parameter must be properly formatted for the method to work
- For older blocks, an archive node is required to access historical state
- The method provides detailed traces for all transactions in the block, which can result in very large responses
- Different Ethereum clients may produce slightly different trace formats
- The output format depends on the tracer used and may change between client versions
- Memory and stack values are represented in hex and may need decoding
See also
- debug_traceBlockByNumber - Trace block transactions by number
- debug_traceBlockByHash - Trace block transactions by hash
- debug_traceTransaction - Trace a single transaction
- debug_traceCall - Trace a call without creating a transaction
- eth_getBlockByHash - Get block by hash
Parameters
The RLP-encoded block to trace
Trace options to configure the debugging output (JSON)