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.
Este método simula una transacción y devuelve trazas detalladas de su ejecución.
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)
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)
{
"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
}
}
El campo callType
en la acción de traza indica el tipo de llamada:
El campo type
en la traza indica el tipo de operación:
El campo traceAddress
indica la posición en el árbol de llamadas:
[]
) para llamadas de nivel superiorAquí 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 */ }
}
}
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álisiseth_call
es más ligero y estándar en todos los clientes Ethereumtrace_call
soporta simulación de estado de bloque histórico--gcmode=archive
y OpenEthereum/Nethermind)stateDiff
puede ser muy grande para transacciones que modifican muchos slots de almacenamiento