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

trace_block

El método trace_block devuelve trazas de ejecución para todas las transacciones incluidas en un bloque específico. Esto proporciona una visión completa de todas las interacciones de contratos que ocurrieron dentro de un solo bloque.

Casos de Uso

  • Analizar todas las interacciones de contratos dentro de un bloque específico
  • Depurar transacciones complejas examinando el flujo de ejecución
  • Extraer transacciones internas no visibles en los registros de transacciones estándar
  • Auditar patrones de ejecución a nivel de bloque para análisis de seguridad
  • Monitorear y visualizar flujos de ejecución de transacciones a través de múltiples contratos
  • Rastrear y analizar actividades MEV (Valor Extraíble por Mineros)
  • Investigar interacciones de protocolos en puntos específicos de la historia de la blockchain
  • Rastrear flujos de valor a través de múltiples contratos dentro de un bloque
  • Analizar la ejecución paralela de transacciones en un bloque
  • Construir funcionalidad integral de explorador de bloques

Detalles del Método

Este método devuelve un array de trazas para todas las transacciones en el bloque especificado.

Parámetros:

Número de bloque (número de bloque en hex o "latest", "earliest", "pending")

Devuelve:

Array de objetos de traza para todas las transacciones en el bloque

Información sobre la acción realizada

Tipo de llamada (p.ej., "call", "delegatecall", "staticcall")

Dirección del remitente

Gas proporcionado para esta acción

Datos de entrada

Dirección del destinatario

Valor enviado (en wei)

Código de inicialización del contrato (para trazas de creación)

Hash del bloque

Número de bloque

Resultado de la llamada

Cantidad de gas utilizado

Datos de salida

Dirección del contrato creado (para trazas de creación)

Código del contrato (para trazas de creación)

Número de subtrazas

Ruta de dirección dentro de la traza de ejecución

Hash de la transacción

Posición de índice de la transacción en el bloque

Tipo de traza (p.ej., "call", "create", "suicide")

Mensaje de error (si la transacción falló)

Entendiendo la Respuesta de Traza

La respuesta contiene trazas para todas las transacciones en el bloque, donde cada transacción puede contener múltiples trazas. Las trazas forman una estructura jerárquica:

  • Las trazas de nivel superior (traceAddress: []) representan la transacción inicial
  • Cada subtraza tiene un array traceAddress que indica su posición en el árbol de llamadas
  • El campo subtraces muestra el número de hijos directos que tiene una traza

Aquí hay una representación visual simplificada de cómo se estructuran las trazas:

Transacción 1
├── Llamada al Contrato A [traceAddress: []]
│   ├── Llamada de A a B [traceAddress: [0]]
│   └── Llamada de A a C [traceAddress: [1]]
│       └── Llamada de C a D [traceAddress: [1, 0]]
└── Llamada al Contrato E [traceAddress: []]

Transacción 2
└── ... (estructura similar)

Tipos de Traza

El método devuelve diferentes tipos de trazas indicados por el campo type:

  • call: Una llamada de mensaje a una dirección
  • create: Una creación de contrato
  • suicide: Una operación de autodestrucción de contrato (también llamada SELFDESTRUCT)

Tipos de Llamada

Para trazas con type: "call", el campo callType indica el tipo de llamada:

  • call: Llamada estándar entre direcciones (más común)
  • delegatecall: Llamada especial que preserva el contexto del remitente
  • staticcall: Llamada de solo lectura que no puede modificar el estado (introducida en Byzantium)
  • callcode: Tipo de llamada heredada (obsoleta)

Manejo de Errores

Si una transacción o subtraza falló:

  • El campo error contendrá la razón (p.ej., "out of gas", "reverted")
  • El campo result puede ser nulo o incompleto
  • Las trazas previas al punto de error siguen estando incluidas

Ejemplo de Respuesta

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    {
      "action": {
        "callType": "call",
        "from": "0x8bb73bcb5d553b5a556358d27625323fd781d37",
        "gas": "0x576e",
        "input": "0x370158ea000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
        "to": "0x6090a6e47849629b7245dfa1ca21d94cd15878ef",
        "value": "0x0"
      },
      "blockHash": "0x8512d367492371edf44ebcbbbd935bc434946dddc2b126cb558df5906012186c",
      "blockNumber": 1059416,
      "result": {
        "gasUsed": "0x14a0",
        "output": "0x0000000000000000000000000000000000000000000000000000000000000001"
      },
      "subtraces": 0,
      "traceAddress": [],
      "transactionHash": "0x4c253746e8d0ab1d135df9711532c41a85ab33f069f1c733ceb0a6bf3e304503",
      "transactionPosition": 0,
      "type": "call"
    },
    {
      "action": {
        "callType": "call",
        "from": "0x431957dbd818eaab7c5ed352430d1bf44dccd837",
        "gas": "0x3d090",
        "input": "0x4c37a69b00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
        "to": "0x6090a6e47849629b7245dfa1ca21d94cd15878ef",
        "value": "0x0"
      },
      "blockHash": "0x8512d367492371edf44ebcbbbd935bc434946dddc2b126cb558df5906012186c",
      "blockNumber": 1059416,
      "result": {
        "gasUsed": "0x2b43",
        "output": "0x0000000000000000000000000000000000000000000000000000000000000001"
      },
      "subtraces": 0,
      "traceAddress": [],
      "transactionHash": "0x1eb099b3e9396b9d188b1c313261f6a13c7e13cb5c1afd3884847cc2c61289c0",
      "transactionPosition": 1,
      "type": "call"
    }
  ]
}

Consideraciones de Rendimiento

  • El trazado de bloques completos consume muchos recursos, especialmente para bloques con muchas transacciones
  • El tamaño de la respuesta puede ser muy grande para bloques con transacciones complejas
  • Para cadenas de alto rendimiento o durante congestión de la cadena, los bloques pueden contener docenas o cientos de transacciones
  • Considera usar trace_transaction para transacciones específicas si no necesitas el bloque completo
  • Se recomienda configurar límites y paginación en tu aplicación al procesar trazas de bloques

Notas Importantes

  • Este método requiere que las APIs de traza estén habilitadas en el nodo Ethereum
  • No todos los clientes Ethereum soportan el trazado (principalmente Geth con --gcmode=archive y OpenEthereum/Nethermind)
  • Los proveedores públicos de RPC pueden limitar o deshabilitar los métodos de traza debido a su intensidad de recursos
  • Los resultados solo pueden ser confiables para bloques finalizados (es mejor evitar "latest", "pending")
  • La estructura de respuesta puede variar ligeramente entre diferentes implementaciones de clientes Ethereum
  • Para bloques recientes en un nodo no archivo, los resultados podrían estar disponibles pero no para bloques más antiguos
  • La respuesta incluye transacciones fallidas con sus trazas hasta el punto de fallo
  • Los datos de traza incluyen acciones que no son visibles en la cadena principal (p.ej., transacciones internas)
  • Para bloques con muchas transacciones complejas, las respuestas pueden contener miles de trazas
  • Este endpoint de API coloca una carga significativamente mayor en un nodo Ethereum que las llamadas JSON-RPC estándar
  • Cuando se usa en producción, la mejor práctica es ejecutar tu propio nodo de archivo con el trazado habilitado

Ver también

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