Bad Jump Destination, ¿cómo puedo saber mediante programación?

Digamos que estoy haciendo mediante programación una transacción a un contrato. ¿Cómo puedo saber (mediante programación) que la transacción confirmada tiene un destino de salto incorrecto? En este momento, la única forma que conozco es ir a etherscan.io y buscar el texto rojo. Pero, ¿cómo puedo determinar esto programáticamente?

Estoy viendo los datos de respuesta de una llamada eth_getTransactionByHash y no puedo distinguir la diferencia entre un destino de salto incorrecto y uno que funcionó.

Parece que etherscan tiene una API que puede hacer esto. ¿Pero no debería haber una forma integrada que no involucre etherscan? https://etherscan.io/apis#transactions

------Editar------

Mi solución actual es verificar si mi transacción tiene al menos 1 confirmación. Si tiene al menos 1 confirmación, hago una llamada API a etherscan y verifico si hay errores. La respuesta de Etherscan me dice que es un destino de salto bueno o malo o que se quedó sin gasolina. Es bastante sorprendente, pero parece muy redondo y hacky. Revisaré las otras publicaciones que han mencionado para ver si esa solución es mejor.

Y también este ethereum.stackexchange.com/questions/6007/… . TL; DR La única forma confiable de determinar si una transacción ha fallado es usar debug.traceTransaction.
Problema similar seguro, leeré más sobre estos y veré si me brindan una solución. Por ahora, la API de etherscan es increíble y funciona. Me siento como si estuviera alrededor y en un gueto.
@Ismael Gracias. He implementado esa lógica y está funcionando bien. Estoy haciendo una llamada a la red para ver cuánto gas se usó para esa transacción y compararlo con la cantidad de gas que suministré.

Respuestas (1)

Actualmente, usaría la misma técnica que ¿Cómo sé cuándo me quedé sin combustible mediante programación?

Después de Metropolis, si está escribiendo un contrato que desea depurar, puede registrar un evento y usar revert. Por ejemplo:

event BadInputData();
...
// inside a function
if (inputData == 0) {  // inputData should not be zero
  BadInputData();  // log event
  revert;
}

Luego, mediante programación, puede buscar los eventos.