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

debug_traceTransaction

El método debug_traceTransaction recrea el estado exacto de ejecución de una transacción histórica, proporcionando información detallada de trazado a nivel de opcode. Reproduce el estado original en el bloque específico donde se ejecutó la transacción, permitiendo un análisis completo del flujo de ejecución de la transacción, operaciones de pila, cambios de memoria, modificaciones de almacenamiento y consumo de gas.

A diferencia de otros métodos de recuperación de transacciones que solo proporcionan datos básicos, debug_traceTransaction ofrece introspección en la ejecución interna de la EVM durante el procesamiento de la transacción.

Casos de Uso

  • Análisis de Transacciones Fallidas: Determinar exactamente por qué falló una transacción examinando la instrucción precisa que causó la reversión y el estado de la EVM en ese punto
  • Depuración de Contratos Inteligentes: Investigar comportamientos inesperados en la ejecución del contrato examinando la ruta de ejecución completa y los cambios de estado
  • Optimización del Uso de Gas: Identificar operaciones costosas y patrones de código ineficientes analizando el consumo de gas por opcode
  • Auditoría de Seguridad: Detectar vulnerabilidades potenciales analizando el flujo exacto de ejecución y las transiciones de estado durante el procesamiento de la transacción
  • Verificación de Transacciones: Confirmar que un contrato se comportó según lo esperado para una transacción específica revisando todas las operaciones realizadas
  • Inspección del Estado del Contrato: Ver los cambios exactos realizados en el almacenamiento del contrato durante la ejecución de la transacción
  • Investigación Forense: Reconstruir la ejecución de transacciones para investigar incidentes de seguridad o analizar eventos históricos
  • Análisis de Gráfico de Llamadas: Visualizar el flujo de ejecución entre contratos, incluyendo llamadas a funciones internas y valores de mensaje
  • Encontrar Inconsistencias de Estado: Identificar cambios de estado inesperados durante interacciones complejas de contratos
  • Recreación del Contexto de Ejecución: Reproducir el entorno exacto de blockchain que existía cuando se ejecutó la transacción

Detalles del Método

Este método traza la transacción identificada por su hash, proporcionando detalles de ejecución a nivel de opcode.

Parámetros:

Hash de la transacción a trazar

Opciones de trazado

Configurar como true desactiva la captura de almacenamiento

Configurar como true desactiva la captura de memoria

Configurar como true desactiva la captura de pila

Usar un trazador personalizado (disponibles: callTracer, prestateTracer, etc.)

Anula el tiempo de espera predeterminado de 5 segundos para el trazado basado en JavaScript

Devuelve:

El resultado del trazado con detalles de ejecución

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)

Ejemplo de Respuesta (Trazador Predeterminado)

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": {
		"gas": 21000,
		"failed": false,
		"returnValue": "",
		"structLogs": [
			{
				"pc": 0,
				"op": "PUSH1",
				"gas": 4677951,
				"gasCost": 3,
				"depth": 1,
				"stack": [],
				"memory": [],
				"storage": {}
			},
			{
				"pc": 2,
				"op": "MSTORE",
				"gas": 4677948,
				"gasCost": 12,
				"depth": 1,
				"stack": ["0x60", "0x40"],
				"memory": [
					"0000000000000000000000000000000000000000000000000000000000000000",
					"0000000000000000000000000000000000000000000000000000000000000000"
				],
				"storage": {}
			}
			// Muchos más registros de opcode...
		]
	}
}

Ejemplo de Respuesta (callTracer)

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "from": "0x8894e0a0c962cb723c1976a4421c95949be2d4e3",
    "gas": "0x2d48c",
    "gasUsed": "0x594c",
    "to": "0x55d398326f99059ff775485246999027b3197955",
    "input": "0xa9059cbb000000000000000000000000b5cfcb4b073ebcda22f57097dbd0e0be5731ca5c00000000000000000000000000000000000000000000000011c37937e08000",
    "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
    "calls": [
      {
        "type": "CALL",
        "from": "0x55d398326f99059ff775485246999027b3197955",
        "to": "0xb5cfcb4b073ebcda22f57097dbd0e0be5731ca5c",
        "gas": "0x1e25b",
        "gasUsed": "0x30b",
        "input": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
        "output": "0x"
      }
    ],
    "value": "0x0"
  }
}

Problemas Comunes Identificados Mediante Trazado

  • Errores por falta de gas
  • Subdesbordamientos o desbordamientos de pila
  • Ejecución de opcode inválido
  • Afirmaciones fallidas o condiciones require
  • Reversiones inesperadas
  • Problemas de asignación de memoria
  • Estado de contrato inesperado
  • Fallos de transferencia
  • Problemas de control de acceso
  • Errores lógicos

Trazadores Disponibles

  1. Trazador Predeterminado: Devuelve registros estructurados para cada opcode
  2. callTracer: Muestra el gráfico de llamadas entre contratos
  3. prestateTracer: Muestra el estado antes de la ejecución de la transacción
  4. 4byteTracer: Recopila selectores de funciones
  5. noopTracer: Descarta toda la información
  6. Trazadores JavaScript Personalizados: Crea tu propia lógica de trazado

Opciones de Trazado

Puedes ajustar el rendimiento y la salida configurando estas opciones:

  • Desactivar la captura de pila, memoria o almacenamiento para una ejecución más rápida
  • Usar tiempo de espera personalizado para transacciones complejas
  • Aplicar configuraciones de trazador personalizadas para necesidades específicas de análisis

Consideraciones de Rendimiento

  • El trazado de transacciones complejas puede consumir muchos recursos y ser lento
  • Los contratos grandes con muchas operaciones pueden producir cargas de respuesta muy grandes
  • Usar opciones para desactivar ciertas capturas (memoria, almacenamiento, pila) puede mejorar el rendimiento
  • Considera usar un trazador personalizado específico para análisis dirigido en lugar de capturar todo
  • El trazado de transacciones que crean contratos con código de inicialización grande puede ser particularmente intensivo
  • Las transacciones con muchas llamadas internas o alta profundidad de llamada requieren más recursos para trazar

Notas Importantes

  • Este método requiere que las APIs de depuración estén habilitadas en el nodo (generalmente con la bandera --http.api=debug)
  • debug_traceTransaction proporciona información más detallada que trace_transaction
  • Para resultados precisos, necesitas acceso al estado histórico en el bloque donde ocurrió la transacción
  • Se requieren nodos de archivo para trazar transacciones más antiguas
  • Algunos clientes pueden no soportar todos los tipos de trazadores
  • Los trazadores JavaScript personalizados solo están disponibles en Geth y algunos clientes compatibles con Geth
  • Este método reproducirá la transacción exactamente como ocurrió, incluyendo cualquier efecto secundario
  • El trazado no incluye eventos/logs (estos deben consultarse por separado)
  • Algunas operaciones como BLOCKHASH tienen sus resultados de la ejecución original en caché y se reutilizan
  • Usar este método en transacciones en bloques muy antiguos puede resultar en inconsistencias de estado en algunos nodos

Ver también

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