A veces el comportamiento de nuestro contrato depende del resultado de una llamada externa a otro contrato. Esto lo debemos verificar correctamente y no confiarnos de que las cosas en el otro contrato fueron exitosas.
Validación de llamadas a contratos externos
Si realizas una llamada a otro contrato, con excepción de que realmente no nos interese el resultado, haz la validación necesaria para saber qué sucedió en la llamada.
uint llamadasExitosas;functionincrementarLlamadas(address direccion)public{ direccion.call(abi.encodedPacked("algunaFuncion()"));// Si la llamada tuvo un problema, no se está realizando la verificación y estamos incrementando la variable de todos modos llamadasExitosas++;}
Es una buena práctica utilizar la función revert() para revertir las operaciones realizadas en caso de un error.
El otro contrato puede haberse quedado sin gas o haber algún tipo de problema en la llamada como para que la misma no se haya concretado correctamente. Asegura el código de tu contrato antes de continuar luego de llamados externos y evitar gastos innecesarios.
Hacer una llamada a otro contrato inteligente no deja de ser similar al consumo de una API de un tercero. Debemos actuar de una manera u otra dependiendo el resultado satisfactorio o no de la misma.
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