Según mi conocimiento, no hay excepciones personalizadas en la solidez. La única excepción es Out of Gas
. Dondequiera que escribamos throw
en código de contrato, arroja out-of-gas
una excepción.
Pero, ¿hay alguna manera de que pueda detectar esa excepción? Quiero decir, si puedo ejecutar un fragmento de código cada vez que se produce una excepción. Incluso al trabajar con la consola geth, no recibí ninguna notificación sobre si se produjo alguna excepción.
Creo que es bastante posible detectar tal excepción, porque Mist puede mostrar Intrinsic gas too low
un mensaje de error cada vez que ocurre una excepción, por lo que debe haber manejado esa excepción en alguna parte.
Editar:
Básicamente la pregunta es:
¿Cómo podemos saber, antes de enviar la transacción, que esta transacción consumirá todo el gas proporcionado?
No estoy preguntando cómo puedo proporcionar suficiente gasolina para mi transacción, sino cómo puedo saber que mi transacción se quedará sin gasolina.
Una forma de hacerlo es enviar la transacción, dejar que se extraiga y luego verificar gasUsed=gasSend
si hay thow
uso debug.traceTransaction
.
Pero quiero saber si mi transacción se realizará o no sin enviar la transacción. En Mist, cada vez que intento enviar una transacción que encontrará una throw
declaración, se muestra Intrinsic gas too low
antes de enviar la transacción. Quiero hacer lo mismo desde geth
.
Solidity no ofrecía un mecanismo de gestión de excepciones como try/catch (para Java/c#).
debido a un código EVM no válido, throw consume todas las terminaciones de gas proporcionadas y revierte todos los cambios al estado realizados por la ejecución del contrato actual y a los saldos de Ether. este concepto pretende evitar el spam en la red.
en el Libro Amarillo se menciona que:
Al igual que con la creación del contrato, si la ejecución se detiene de manera excepcional (es decir, debido a un suministro de gas agotado, flujo insuficiente de la pila, destino de salto no válido o instrucción no válida), entonces no se reembolsa el gas a la persona que llama y el estado se revierte al punto inmediatamente antes de la transferencia de saldo (es decir, σ)
como información para el mensaje de “gas intrínseco demasiado bajo”
Mist verifica la cantidad de gas sin ejecutar ningún código y le dice que la transacción fallará porque no proporcionó suficiente gas para ejecutar la transacción.
Si desea estimar el gas como lo hace Mist, puede llamar a estoeth_estimateGas
:
Realiza una llamada o transacción, que no se agregará a la cadena de bloques y devuelve el gas usado, que se puede usar para estimar el gas usado.
web3.eth.call
. Quiero decir, cómo obtener el data
parámetro, si quiero llamar a una función como transfer("to_addr", amount, { from: "accnt_addr});
usar web3.eth.call()
..call(param, { gas:3000000 })
, ¿estimará el gas en 3000000
? 3000000 es mucho.throw
en alguna línea? Consumirá todo el gas, sin importar cuán grande sea el valor. Entonces, si quiero saber si mi código throws
en alguna línea o no, la mejor manera de hacerlo, supongo, es verificar si la transacción se quedó sin gasolina. No estoy preguntando enhow can I provide sufficient gas for my transaction but How can I know beforehand that my transaction will run out of gas?
geth console
. En ese caso, ¿cómo sabré que mi transacción puede fallar antes de enviar la transacción?eth.estimateGas({ from: account, to: myContract.address, data: myContract.myFunction.getData(param1, param2) })
está disponible en geth console
.Estimated gas=50000000
. Entonces, puedo poner un cheque como if(EstimatedGas=50000000){console.log("transaction may fail")};
. Pero esto planteó una nueva pregunta de ¿por qué 50000000
? ¿Es el límite máximo de gas de la transacción Ethereum?eth_estimateGas
de funciones que no toman ningún parámetro de entrada. Para evitar discusiones aquí, abrí una nueva pregunta ¿Cómo estimar el gas para una función sin ningún parámetro de entrada? . Por favor échale un vistazo.
Prashant Prabhakar Singh
out-of-gas
excepción, para poder mostrar un mensaje como lo hace Mist.Badr Bellaj
Badr Bellaj
Prashant Prabhakar Singh
Badr Bellaj
Badr Bellaj
Prashant Prabhakar Singh
throw
una excepción, todo el gas se consume y, por lo tanto, aparece MistIntrinsic gas too low
. Pero, si realiza la misma transacción desdegeth console
, las transacciones se envían, pero después de la minería cuando lo depura, daráinvalid jump destination (PUSH1) 2
. Lo que quiero es que pueda evitar que la transacción se envíe tal como lo hace Mist, si hay excepciones en algún lugar o si la transacción consume todo el combustible.