No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Gas insuficiente en Solidity

8/15
Recursos

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;
function incrementarLlamadas(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.

uint llamadasExitosas;
function incrementarLlamadas(address direccion) public {
    (bool resultado) = direccion.call(abi.encodedPacked("algunaFuncion()"));
    if (!resultado) revert();
    if (resultado) llamadasExitosas++;
}

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.


Contribución creada por: Kevin Fiorentino (Platzi Contributor).

Aportes 2

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Asegurar 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.