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

debug_traceBlockByHash

El método debug_traceBlockByHash devuelve un rastreo completo de todos los opcodes invocados de todas las transacciones incluidas en el bloque especificado, identificado por su hash. Este método proporciona información completa de ejecución a nivel de opcode para analizar y depurar cada transacción dentro de un bloque especificado, lo que lo hace ideal para la investigación profunda de las transiciones de estado de la blockchain.

Casos de Uso

  • Depurar fallos de transacciones complejas e interacciones dentro de un bloque conocido específico
  • Analizar patrones de ejecución a través de múltiples transacciones en un bloque identificado con precisión
  • Investigar la optimización del uso de gas a través de transacciones en bloques históricos
  • Realizar auditorías de seguridad de contratos desplegados en entornos de producción
  • Verificar que el comportamiento de las transacciones y el flujo de ejecución sean correctos en bloques importantes específicos
  • Entender interacciones complejas entre múltiples contratos a través de una serie de transacciones
  • Analizar bloques históricos por su hash para investigar el comportamiento de la red
  • Rastrear la ejecución exacta de transacciones para validación de bloques o búsqueda de errores
  • Identificar patrones en la ejecución de transacciones dentro del mismo contexto de bloque
  • Investigar los efectos de ordenamiento de transacciones MEV (Valor Extraíble del Minero)
  • Depurar transacciones fallidas en el contexto de su entorno de bloque

Detalles del Método

Este método rastrea la ejecución de todas las transacciones en un bloque, identificado por su hash, a nivel de opcode.

Parámetros:

El hash del bloque a rastrear

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, 4byteTracer, etc.)

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

Devuelve:

Array de rastreos de transacciones dentro del bloque

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 (Simplificado)

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": [
		{
			"gas": 21000,
			"failed": false,
			"returnValue": "",
			"structLogs": [
				{
					"pc": 0,
					"op": "PUSH1",
					"gas": 68232,
					"gasCost": 3,
					"depth": 1,
					"stack": [],
					"memory": [],
					"storage": {}
				},
				{
					"pc": 2,
					"op": "MSTORE",
					"gas": 68229,
					"gasCost": 12,
					"depth": 1,
					"stack": ["0x60", "0x40"],
					"memory": [
						"0000000000000000000000000000000000000000000000000000000000000000",
						"0000000000000000000000000000000000000000000000000000000000000000"
					],
					"storage": {}
				}
				// ... more operations
			]
		}
		// Additional transaction traces...
	]
}

Respuesta con callTracer

Cuando se utiliza la opción callTracer, la respuesta se formatea como un gráfico de llamadas para cada transacción:

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": [
		{
			"type": "CALL",
			"from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
			"to": "0xdac17f958d2ee523a2206206994597c13d831ec7",
			"value": "0x0",
			"gas": "0x13458",
			"gasUsed": "0x8fc",
			"input": "0xa9059cbb0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000002b5e3af16b1880000",
			"output": "0x0000000000000000000000000000000000000000000000000000000000000001",
			"calls": [
				{
					"type": "STATICCALL",
					"from": "0xdac17f958d2ee523a2206206994597c13d831ec7",
					"to": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
					"gas": "0x8fc",
					"gasUsed": "0x54b",
					"input": "0x70a08231000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7",
					"output": "0x0000000000000000000000000000000000000000000000000000000000000000"
				}
			]
		}
		// Additional call traces...
	]
}

Trazadores Disponibles

Geth proporciona varios trazadores incorporados:

  1. Trazador predeterminado: Registros detallados de ejecución a nivel de opcode
  2. callTracer: Se centra en la jerarquía de llamadas entre contratos
  3. prestateTracer: Muestra el estado del contrato antes de la ejecución
  4. 4byteTracer: Rastrea estadísticas de uso del selector de funciones
  5. noopTracer: Trazador mínimo para pruebas de rendimiento
  6. opCountTracer: Cuenta las ocurrencias de cada opcode

También puede utilizar trazadores personalizados basados en JavaScript para análisis especializados.

Diferencias con Otros Métodos de Rastreo de Bloques

Mientras que los tres métodos de rastreo de bloques proporcionan información similar:

  • debug_traceBlockByHash acepta un hash de bloque para una identificación precisa del bloque
  • debug_traceBlockByNumber utiliza un número de bloque o etiqueta (por ejemplo, "latest")
  • debug_traceBlock requiere un bloque codificado en RLP como entrada
  • Todos los métodos devuelven formatos de rastreo idénticos
  • Este método es ideal cuando conoce el hash exacto del bloque que desea investigar

Consideraciones de Rendimiento

  • Rastrear bloques completos es extremadamente intensivo en recursos, especialmente para bloques con muchas transacciones
  • El tamaño de la respuesta puede ser muy grande para bloques con transacciones complejas
  • Considere usar las opciones disableMemory, disableStack o disableStorage
  • Para análisis de gráficos de llamadas solamente, el callTracer es mucho más eficiente
  • Los trazadores JavaScript pueden requerir tiempos de espera más largos para bloques complejos
  • Las consultas contra bloques históricos requieren un nodo de archivo
  • El rastreo de bloques con muchas transacciones puede agotar el tiempo de espera en nodos públicos
  • Para bloques de alto volumen, considere rastrear transacciones individuales en su lugar
  • El tiempo de respuesta aumenta con el tamaño del bloque y la complejidad de la transacción
  • Para bloques con transacciones complejas, se recomiendan trazadores especializados

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 de Ethereum admiten este método (principalmente Geth con APIs de depuración habilitadas)
  • Para bloques más antiguos, se requiere un nodo de archivo para acceder al estado histórico
  • El método proporciona rastreos detallados para todas las transacciones en el bloque, lo que puede resultar en respuestas muy grandes
  • Diferentes clientes de Ethereum pueden producir formatos de rastreo ligeramente diferentes
  • El formato de salida depende del trazador utilizado y puede cambiar entre versiones de cliente
  • Para información regular del bloque sin rastreo, use eth_getBlockByHash

Ver también

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