El método debug_traceCall
ejecuta una llamada a un contrato y devuelve un rastreo detallado de su ejecución a nivel de opcode, sin crear una transacción en la blockchain. Esto proporciona la visibilidad más profunda posible sobre cómo la Máquina Virtual de Ethereum (EVM) procesa las llamadas a contratos, convirtiéndolo en una herramienta esencial para la depuración y el análisis detallado.
Este método simula una llamada a un contrato y proporciona información detallada de ejecución a nivel de opcode.
Objeto de llamada de transacción
Dirección desde la que se envía la transacción
Dirección a la que se dirige la transacción
Gas proporcionado para la ejecución de la transacción (hex)
Precio del gas en wei (hex)
Valor transferido en wei (hex)
Datos de llamada al método del contrato (selector de función y parámetros codificados)
Número de bloque en formato hexadecimal o etiqueta ('latest', 'earliest', 'pending', 'safe', 'finalized') o hash del bloque
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, etc.)
Anula el tiempo de espera predeterminado para el rastreo basado en JavaScript
Objeto de rastreo con información detallada de ejecución
Gas utilizado durante la llamada
Si la llamada falló
Los datos devueltos por la llamada
Array de registros estructurados de operaciones EVM
Posición del contador de programa
El opcode ejecutado
Gas restante
Costo de gas para este opcode
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": 26848,
"failed": false,
"returnValue": "0x000000000000000000000000000000000000000000000000000000000001e240",
"structLogs": [
{
"pc": 0,
"op": "PUSH1",
"gas": 190129,
"gasCost": 3,
"depth": 1,
"stack": [],
"memory": [],
"storage": {}
},
{
"pc": 2,
"op": "MSTORE",
"gas": 190126,
"gasCost": 12,
"depth": 1,
"stack": ["0x60", "0x40"],
"memory": [
"0000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000"
],
"storage": {}
}
// ... more operations
]
}
}
El callTracer produce una representación jerárquica de todas las llamadas realizadas durante la ejecución:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"type": "CALL",
"from": "0xd7dad5d1413e8c08f2d92d5bd905bed62d9e2400",
"to": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
"value": "0x0",
"gas": "0x2cb9e",
"gasUsed": "0x68c5",
"input": "0x70a08231000000000000000000000000d7dad5d1413e8c08f2d92d5bd905bed62d9e2400",
"output": "0x000000000000000000000000000000000000000000000000000000000001e240",
"calls": [
{
"type": "STATICCALL",
"from": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
"to": "0x000000000000000000000000000000000000000a",
"gas": "0x26b2f",
"gasUsed": "0xd5",
"input": "0x1c0e9c09",
"output": "0x0000000000000000000000000000000000000000000000000000000000000001"
}
]
}
}
Geth proporciona varios trazadores incorporados:
Adicionalmente, puede usar trazadores personalizados basados en JavaScript para análisis especializado.
El parámetro options
le permite configurar el rastreo:
El trazador predeterminado devuelve cada ejecución de opcode en la VM. Opcodes comunes que verá:
El array structLogs
contiene una entrada para cada opcode ejecutado:
disableMemory
, disableStack
o disableStorage
para contratos grandescallTracer
proporciona una salida mucho más compacta centrándose solo en la estructura de llamadasto
nula y proporcione bytecode de inicialización en data