Diego Fernando Gómez Peña
Kevin Fiorentino
Mauro Volpe
Sebastian Perez
ProfesorAsegurar que las llamadas externas, si fallan, no continuen consumiendo gas. Ejemplo:
uint llamadasExitosas; function incrementarLlamadas(address direccion) public { direccion.call(abi.encodedPacked("algunaFuncion()")); llamadasExitosas++; }
No estamos validando si el llamado se ejecutó correctamente, debemos poner la validacion de la siguiente manera:
uint llamadasExitosas; function incrementarLlamadas(address direccion) public { (bool resultado, ) = direccion.call(abi.encodedPacked("algunaFuncion()")); if (!resultado) revert(); if (resultado) llamadasExitosas++; }
No me terminó de quedar claro por qué la clase se llama "Gas insuficiente" pero la vulnerabilidad está relacionada con que no se está validando si una llamada externa fue exitosa o no. Una llamada externa a otro contrato puede fallar por varis motivos, no solo por la falta de gas.
Lo veo como dos cosas distintas. Por un lado, administrar el gas correctamente. Por otro lado, validar si la llamada externa fue exitosa. Es bastante obvio, es como pegarle a una API. Hay que verificar si fue exitosa o no la llamada y la falta de gas es solo un causante de que las cosas no salgan como esperamos.
Consulta, en el ejemplo dice que si la llamada externa falla por falta de gas, el contrato principal no se da cuenta y de todas formas incrementa la variable de llamadas exitosas, pero... si no hay suficiente gas como se ejecuta la siguiente linea? No me queda claro
Hola Mauro, primero que todo es aclararte que es algo que "puede pasar" y no sucede siempre, todo depende de cómo modelemos nuestros contratos. Dicho esto, en este caso lo que sucede es que en la llamada externa se limita el gas a un monto menor al de la llamada total. Imaginemos que la transacción tiene un límite de gas de 1000, y la llamada externa tiene un límite de 100. Entonces puede que la llamada externa consuma esos 100 y se quede sin saldo, pero aún te quedan 900 para usar en el resto de la función original y por eso puede seguir funcionando