El método debug_traceBlock
devuelve un rastreo completo de todos los opcodes invocados de todas las transacciones incluidas en el bloque especificado. Este método proporciona información completa de ejecución de bajo nivel, esencial para la depuración, análisis de seguridad y optimización del comportamiento de transacciones a través de múltiples contratos dentro del contexto de un solo bloque.
Este método rastrea la ejecución de todas las transacciones en un bloque a nivel de opcode.
El bloque codificado en RLP para rastrear
Opciones de rastreo para configurar la salida de depuración
Establecerlo a true desactiva la captura de almacenamiento
Establecerlo a true desactiva la captura de memoria
Establecerlo a true desactiva la captura de pila
Usar un trazador personalizado (disponibles: callTracer, prestateTracer, 4byteTracer, etc.)
Anula el tiempo de espera predeterminado de 5 segundos para el rastreo basado en JavaScript
Array de rastreos de transacciones dentro del bloque
Gas utilizado por la transacción
Si la transacción falló
El valor de retorno de la transacción
Array de registros estructurados de operaciones EVM
Posición del contador de programa
El opcode ejecutado
Gas restante
Costo de gas para esta operación
Profundidad de llamada
Contenido de memoria EVM (si no está desactivado)
Contenido de pila EVM (si no está desactivado)
Cambios de almacenamiento (si no está desactivado)
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"gas": 21000,
"failed": false,
"returnValue": "",
"structLogs": [
{
"pc": 0,
"op": "PUSH1",
"gas": 68232,
"gasCost": 3,
"depth": 1,
"stack": [],
"memory": [],
"storage": {}
},
{
"pc": 2,
"op": "MSTORE",
"gas": 68229,
"gasCost": 12,
"depth": 1,
"stack": ["0x60", "0x40"],
"memory": [
"0000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000"
],
"storage": {}
}
// ... more operations
]
}
// Additional transaction traces...
]
}
Cuando se utiliza la opción callTracer
, la respuesta se formatea como un gráfico de llamadas para cada transacción:
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"type": "CALL",
"from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0x0",
"gas": "0x13458",
"gasUsed": "0x8fc",
"input": "0xa9059cbb0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000002b5e3af16b1880000",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
"calls": [
{
"type": "STATICCALL",
"from": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"to": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
"gas": "0x8fc",
"gasUsed": "0x54b",
"input": "0x70a08231000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7",
"output": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
]
}
// Additional call traces...
]
}
Geth proporciona varios trazadores incorporados que formatean la salida de diferentes maneras:
También puede utilizar trazadores personalizados basados en JavaScript para análisis especializados.
Este método requiere un bloque codificado en RLP como entrada:
Mientras que los tres métodos proporcionan rastreos de transacciones a nivel de bloque:
debug_traceBlock
acepta un bloque codificado en RLP como entradadebug_traceBlockByNumber
acepta un número de bloque o etiqueta (por ejemplo, "latest")debug_traceBlockByHash
acepta un hash de bloquedisableMemory
, disableStack
o disableStorage
para un mejor rendimientocallTracer
es mucho más eficiente