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?

o inicia sesi贸n.

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 鈥淕as 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.