Estoy trabajando en la interfaz donde uso try / catch para encontrar errores y dar mensajes apropiados a los usuarios. Mi contrato inteligente tiene una función de pago y estaba a punto de detectar errores con respecto al uso de gas.
uint[] public theArray;
function myFunction(uint bigNumber) payable public {
if(msg.value == 0.01 ether){
theArray.push(bigNumber);}
else {if (msg.value == .05 ether){
for (int i; i<50;i++)
theArray.push(bigNumber);
}
else {
revert();
}
}}
Ahora, cuando trato de detectar los errores, el mismo error puede tener dos 'salidas' diferentes (err.message). Los ejemplos:
Uso de MetaMask en la red de pruebas de Rinkeby
Si envío 0,05 ETH con 21.000 de gasolina o incluso 21.001 (cantidad mínima) el error que me sale es:
Error devuelto: Error: Error: [ethjs-rpc] error de rpc con carga útil
Sin embargo, si envío 0,05 ETH con 25 000 de gasolina (no hay suficiente gasolina, por lo que sigue fallando), el error que obtengo es:
La transacción ha sido revertida por el EVM
¿Alguien podría explicarme por qué si aumento la cantidad de gas, el error cambia?
Otra cosa que noté es que si envío una cantidad inválida como 0.04 también obtengo
La transacción ha sido revertida por el EVM
Basado en mi observación y comprensión. Puede que no sea la mejor explicación que existe.
Error devuelto: Error: Error: [ethjs-rpc] error de rpc con carga útil
-Este error puede haber sido por la propia metamask, tal vez jugar con gasPrice y/o gasLimit. Puede consultar aquí o aquí para una mejor comprensión.
La transacción ha sido revertida por el EVM
¿Alguien podría explicarme por qué si aumento la cantidad de gas, el error cambia?
-Para este error, ejecuté el código y descubrí que la posible razón es que la transacción ocurre y continúa. Los parámetros satisfacen esta parte del código. Sin embargo, en medio del proceso, el gas se agotó mientras se ejecuta el bucle for, que consume la mayor parte del gas que ha proporcionado. Tal vez intente aumentar el límite de gas y esto se extraerá sin error.
if (msg.value == .05 ether){
for (int i; i<50;i++)
theArray.push(bigNumber);
}
La transacción ha sido revertida por el EVM
Con el último escenario, el parámetro simplemente no satisfizo ninguna de las condiciones, por eso va directamente al último else que lo revierte ().
julian
cuando
julian