Comenzando con TheRPC
Referencia de API
API de Ethereum
Core API
Guías
Ethereum/Trace API/trace_call

trace_call

El método trace_call te permite ejecutar una nueva llamada de mensaje y obtener una traza detallada de su ejecución sin añadir la transacción a la blockchain. Esto es como eth_call pero con trazas de ejecución detalladas paso a paso.

Casos de Uso

  • Depurar interacciones complejas de contratos antes de enviar transacciones
  • Analizar patrones de consumo de gas sin gastar gas real
  • Probar funciones de contratos inteligentes con diferentes parámetros
  • Simular transacciones en diferentes estados de la blockchain
  • Detectar vulnerabilidades potenciales de seguridad en el código del contrato
  • Comprender flujos de ejecución de contratos y cambios de estado
  • Verificar el comportamiento del contrato en condiciones específicas de casos extremos
  • Crear herramientas de visualización de ejecución de contratos
  • Realizar análisis estático del código del contrato
  • Probar reversiones de transacciones y condiciones de error de forma segura

Detalles del Método

Este método simula una transacción y devuelve trazas detalladas de su ejecución.

Parámetros:

El objeto de llamada de transacción

La dirección desde la cual se envía la transacción

La dirección a la cual se dirige la transacción

El gas proporcionado para la transacción (hex)

El precio del gas en wei (hex)

El valor transferido en wei (hex)

Los datos de la llamada al método del contrato

Array de tipos de traza a incluir en la respuesta

Número de bloque entero, o 'latest', 'earliest', 'pending' (opcional)

Devuelve:

El objeto resultado de la traza con detalles de ejecución

Los datos de retorno de la llamada

Cambios de estado causados por la llamada (si se solicita)

Array de objetos de traza

Detalles sobre la acción de llamada

Tipo de llamada (call, delegatecall, etc.)

Dirección del remitente

Gas proporcionado para la llamada

Datos de entrada para la llamada

Dirección del destinatario

Valor transferido en wei

Resultado de la llamada

Cantidad de gas utilizado

Datos de salida de la llamada

Número de subtrazas

Ruta de dirección de la ubicación de la traza en el árbol de llamadas

Tipo de traza

Mensaje de error si la llamada falló

Traza de ejecución de la máquina virtual (si se solicita)

Ejemplo de Respuesta

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": {
		"output": "0x",
		"stateDiff": null,
		"trace": [
			{
				"action": {
					"callType": "call",
					"from": "0x6f1fb6efdf50f34bfa3f2bc0e5576edd71631638",
					"gas": "0x1dcd11f8",
					"input": "0xa67a6a45000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000",
					"to": "0x1e0447b19bb6ecfdae1e4ae1694b0c3659614e4e",
					"value": "0x0"
				},
				"error": "Reverted",
				"subtraces": 0,
				"traceAddress": [],
				"type": "call"
			}
		],
		"vmTrace": null
	}
}

Tipos de Llamada

El campo callType en la acción de traza indica el tipo de llamada:

  • call: Llamada estándar entre direcciones
  • staticcall: Llamada de solo lectura (no puede modificar el estado)
  • delegatecall: Llamada que mantiene el contexto del llamador
  • callcode: Tipo de llamada heredada (obsoleta)

Tipos de Traza

El campo type en la traza indica el tipo de operación:

  • call: Una llamada de mensaje
  • create: Una creación de contrato
  • suicide: Una autodestrucción de contrato (opcode SELFDESTRUCT)

Entendiendo traceAddress

El campo traceAddress indica la posición en el árbol de llamadas:

  • Array vacío ([]) para llamadas de nivel superior
  • Un array de índices que muestra la ruta a través de llamadas anidadas
  • Ayuda a rastrear la ruta exacta de ejecución a través de interacciones complejas

Ejemplo de Respuesta con Llamada Exitosa

Aquí hay un ejemplo de respuesta de trace_call:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
    "stateDiff": { /* cambios de estado */ },
    "trace": [
      {
        "action": {
          "callType": "call",
          "from": "0x407d73d8a49eeb85d32cf465507dd71d507100c1",
          "gas": "0x1dcd12f8",
          "input": "0xa9059cbb0000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a",
          "to": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
          "value": "0x0"
        },
        "result": {
          "gasUsed": "0x765",
          "output": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        "subtraces": 1,
        "traceAddress": [],
        "type": "call"
      },
      {
        "action": {
          "callType": "call",
          "from": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
          "gas": "0x1dcd0393",
          "input": "0x",
          "to": "0x2710000000000000000000000000000000000000",
          "value": "0xa"
        },
        "result": {
          "gasUsed": "0x0",
          "output": "0x"
        },
        "subtraces": 0,
        "traceAddress": [0],
        "type": "call"
      }
    ],
    "vmTrace": { /* información detallada de ejecución de VM */ }
  }
}

Diferencias con eth_call

Aunque tanto trace_call como eth_call realizan llamadas simuladas:

  • trace_call proporciona trazas de ejecución detalladas no disponibles en eth_call
  • trace_call puede devolver varios tipos de trazas (operaciones, pasos de VM, cambios de estado)
  • trace_call proporciona más información para depuración y análisis
  • eth_call es más ligero y estándar en todos los clientes Ethereum
  • trace_call soporta simulación de estado de bloque histórico

Consideraciones de Rendimiento

  • El trazado es computacionalmente intensivo, especialmente con todos los tipos de traza habilitados
  • vmTrace y stateDiff aumentan particularmente el tamaño de la respuesta y el tiempo de cálculo
  • Considera solicitar solo los tipos de traza que necesitas
  • Para contratos complejos, las respuestas pueden ser muy grandes
  • Puede agotar el tiempo de espera en nodos públicos o endpoints con límite de velocidad
  • El tiempo de respuesta aumenta con la complejidad de la transacción
  • Considera usar solicitudes por lotes si trazas múltiples llamadas
  • Para aplicaciones de producción, se recomienda infraestructura dedicada

Notas Importantes

  • Este método requiere que las APIs de traza estén habilitadas en el nodo
  • No todos los clientes soportan este método (principalmente Geth con --gcmode=archive y OpenEthereum/Nethermind)
  • El método no modifica la blockchain ni usa gas real
  • Las estimaciones de gas pueden diferir ligeramente de las transacciones reales debido a detalles de simulación
  • Diferentes clientes pueden devolver formatos de traza ligeramente diferentes
  • Las transacciones revertidas incluirán información de traza hasta el punto de reversión
  • Para bloques históricos, el nodo debe tener datos de archivo para ese estado
  • La respuesta stateDiff puede ser muy grande para transacciones que modifican muchos slots de almacenamiento
  • El trazado contra la red principal podría no estar disponible en la mayoría de los proveedores públicos de RPC
  • Las trazas muestran la ruta de ejecución real, no todas las rutas posibles

Ver también

  • trace_transaction - Recuperar traza para una transacción existente
  • trace_filter - Filtrar y buscar trazas a través de múltiples bloques
  • trace_block - Obtener trazas para todas las transacciones en un bloque
  • eth_call - Método similar pero sin información detallada de traza
  • debug_traceCall - Método de traza alternativo con diferentes opciones de trazado
¡Ayúdanos a Mejorar!
Comparte esta página y ayúdanos a crear un producto aún mejor para ti.