Comenzando con TheRPC
Referencia de API
API de Ethereum
Core API
Guías
Ethereum/Debug API/debug_traceCall

debug_traceCall

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.

Casos de Uso

  • Depurar funciones complejas de contratos inteligentes con ejecución paso a paso de opcodes
  • Analizar operaciones de memoria y almacenamiento durante la ejecución del contrato
  • Identificar oportunidades de optimización de gas examinando costos de gas a nivel de opcode
  • Realizar análisis de seguridad detallados de las rutas de ejecución del contrato
  • Probar el comportamiento del contrato bajo diferentes condiciones de entrada
  • Investigar reversiones de funciones y fallos de ejecución con contexto completo
  • Entender interacciones complejas entre múltiples contratos a nivel de bytecode
  • Verificar el flujo exacto de ejecución de la lógica del contrato
  • Detectar desbordamientos de pila y otros problemas de ejecución de bajo nivel
  • Analizar cómo los contratos manipulan la memoria y el almacenamiento

Detalles del Método

Este método simula una llamada a un contrato y proporciona información detallada de ejecución a nivel de opcode.

Parámetros:

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

Devuelve:

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)

Ejemplo de Respuesta (Trazador Predeterminado)

{
	"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
		]
	}
}

Respuesta con callTracer

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"
      }
    ]
  }
}

Trazadores Disponibles

Geth proporciona varios trazadores incorporados:

  1. Trazador predeterminado: Proporciona registros detallados de ejecución a nivel de opcode
  2. callTracer: Se centra en la jerarquía de llamadas y menos en operaciones individuales
  3. prestateTracer: Muestra el estado antes de la ejecución
  4. 4byteTracer: Recopila estadísticas sobre llamadas a métodos
  5. noopTracer: Trazador minimalista que no hace nada
  6. opCountTracer: Cuenta ocurrencias de opcodes

Adicionalmente, puede usar trazadores personalizados basados en JavaScript para análisis especializado.

Opciones de Rastreo

El parámetro options le permite configurar el rastreo:

  • disableStorage: Reduce el tamaño de salida eliminando detalles de almacenamiento
  • disableMemory: Reduce el tamaño de salida eliminando detalles de memoria
  • disableStack: Reduce el tamaño de salida eliminando detalles de pila
  • tracer: Especifica un trazador especializado a utilizar
  • tracerConfig: Configuración adicional para trazadores personalizados (no mostrado)
  • timeout: Establece el tiempo de espera para trazadores JavaScript (ej., "10s")

Opcodes EVM

El trazador predeterminado devuelve cada ejecución de opcode en la VM. Opcodes comunes que verá:

  • PUSH1, PUSH2, etc.: Empujan valores a la pila
  • POP: Elimina un elemento de la pila
  • ADD, MUL, SUB, DIV: Operaciones aritméticas
  • SLOAD, SSTORE: Carga y almacenamiento de almacenamiento
  • MLOAD, MSTORE, MSTORE8: Operaciones de memoria
  • CALL, STATICCALL, DELEGATECALL: Llamadas externas
  • JUMP, JUMPI: Flujo de control
  • RETURN, REVERT: Terminar ejecución

Entendiendo structLogs

El array structLogs contiene una entrada para cada opcode ejecutado:

  • pc: Contador de programa - posición en el bytecode
  • op: La operación que se está ejecutando
  • gas: Gas restante en este punto
  • gasCost: Costo de esta operación específica
  • depth: Profundidad de llamada (1 para nivel superior, aumenta para cada llamada)
  • stack: Valores actuales en la pila EVM
  • memory: Estado actual de la memoria
  • storage: Ubicaciones de almacenamiento accedidas durante esta operación

Consideraciones de Rendimiento

  • El rastreo a nivel de opcode produce salidas extremadamente grandes para contratos complejos
  • Considere usar las opciones disableMemory, disableStack o disableStorage para contratos grandes
  • El callTracer proporciona una salida mucho más compacta centrándose solo en la estructura de llamadas
  • Para contratos complejos, los tiempos de respuesta pueden ser significativos
  • Establezca tiempos de espera apropiados para trazadores JavaScript
  • Los trazadores especializados (como callTracer) tienen mucho mejor rendimiento para casos de uso específicos
  • Considere limitar el alcance de lo que rastrea (ejecución de función vs. contrato completo)
  • El rastreo contra nodos de archivo para estados históricos puede llevar más tiempo

Notas Importantes

  • Este método requiere que las APIs de depuración estén habilitadas en el nodo (--http.api=eth,debug,net,web3)
  • No todos los clientes Ethereum admiten el método debug_traceCall o tienen el mismo comportamiento
  • El tamaño de la respuesta puede ser extremadamente grande para contratos complejos
  • Para creaciones de contratos, use una dirección to nula y proporcione bytecode de inicialización en data
  • El formato de salida difiere entre trazadores y puede cambiar entre versiones de clientes
  • Algunos opcodes pueden no estar representados con precisión en versiones anteriores del cliente
  • Las ejecuciones de delegatecall mantienen el contexto del llamador, lo que puede ser confuso en los rastreos
  • Los valores de memoria y pila se representan en hexadecimal y pueden necesitar decodificación para ser legibles
  • Las ejecuciones revertidas se rastrearán hasta el punto de reversión
  • Para sistemas de producción, el uso de este método puede aumentar significativamente la carga en el nodo

Ver también

¡Ayúdanos a Mejorar!
Comparte esta página y ayúdanos a crear un producto aún mejor para ti.