El requisito de gas de la función de solidez es infinito

struct userData{
     uint val;
     bool isvalue;
     string name;
}



mapping(uint => address) internal users;
mapping(address => userData) internal bidirectionalUsers;

function addMember(address newMember, string memberName) public{

        if (msg.sender != owner) return;

        if (bidirectionalUsers[newMember].isvalue) return;

        users[memberCount] = newMember;
        bidirectionalUsers[newMember] = userData(memberCount,true,memberName);

    }

El código anterior arroja una advertencia en addMember(), gas limit is high:infinite and it can not be executed.

Comenté todas las líneas dentro de la función, pero aún arroja esta advertencia. ¿Qué estoy haciendo mal aquí? ¿Puede alguien ayudarme en esto? Gracias.

Respuestas (2)

Puede ignorar esta advertencia con seguridad. El problema es su variable de cadena en los parámetros string memberName. Debido a que una cadena no tiene un tamaño fijo, en teoría es posible requerir una cantidad infinita de gas para llenarla con una cantidad infinita de caracteres.

Su código aún se compilará y funcionará si no se muestran otros errores.

Entonces puedo decirle a mi cliente que limite el nombre de miembro, digamos a 10, es seguro, de lo contrario, podría causar algunos problemas.
Podrías hacer eso, pero el beneficio es cuestionable. Tendrías que entregar una cadena muy, muy, muy larga para descifrar el código al alcanzar el límite de gas. Incluso si alguien logra lograr eso, nada malo sucedería. El código simplemente nunca se ejecutará y la transacción se declarará como "fallida". Si desea verificar la longitud de las cadenas, puede hacerlo directamente dentro de la función:require(memberName.length <= 10);

Recibo la misma advertencia incluso con una función pura que usa argumentos de longitud fija. Aquí está el código:

function sumar(int a, int b) public pure returns (int) {
    return a+b;
}

¿Algunas ideas?
(Usando la versión actual de Remix, versión del compilador 0.8.13)