El método debug_traceBlockByHash
devuelve un rastreo completo de todos los opcodes invocados de todas las transacciones incluidas en el bloque especificado, identificado por su hash. Este método proporciona información completa de ejecución a nivel de opcode para analizar y depurar cada transacción dentro de un bloque especificado, lo que lo hace ideal para la investigación profunda de las transiciones de estado de la blockchain.
Este método rastrea la ejecución de todas las transacciones en un bloque, identificado por su hash, a nivel de opcode.
El hash del bloque a rastrear
Opciones de rastreo para configurar la salida de depuración
Establecer esto a true desactiva la captura de almacenamiento
Establecer esto a true desactiva la captura de memoria
Establecer esto 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:
También puede utilizar trazadores personalizados basados en JavaScript para análisis especializados.
Mientras que los tres métodos de rastreo de bloques proporcionan información similar:
debug_traceBlockByHash
acepta un hash de bloque para una identificación precisa del bloquedebug_traceBlockByNumber
utiliza un número de bloque o etiqueta (por ejemplo, "latest")debug_traceBlock
requiere un bloque codificado en RLP como entradadisableMemory
, disableStack
o disableStorage
callTracer
es mucho más eficiente