Soliditätsfunktion Gasbedarf ist unendlich

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);

    }

Der obige Code gibt eine Warnung in addMember(), gas limit is high:infinite and it can not be executed.

Ich habe alle Zeilen innerhalb der Funktion kommentiert, aber trotzdem wird diese Warnung ausgegeben. Was mache ich hier falsch? Kann mir dabei jemand helfen. Danke dir.

Antworten (2)

Sie können diese Warnung ignorieren. Das Problem ist Ihre String-Variable in den Parametern string memberName. Da eine Zeichenfolge keine feste Größe hat, ist es theoretisch möglich, unendlich viel Gas zu benötigen, um sie mit unendlich vielen Zeichen zu füllen.

Ihr Code wird weiterhin kompiliert und funktioniert, wenn keine anderen Fehler angezeigt werden.

So kann ich meinem Client sagen, dass er memberName auf 10 beschränken soll, es ist sicher, sonst könnte es einige Probleme verursachen.
Das könnte man machen, aber der Nutzen ist fraglich. Sie müssten eine wirklich, wirklich, wirklich lange Zeichenfolge übergeben, um den Code zu brechen, indem Sie das Gaslimit erreichen. Selbst wenn jemand das schafft, würde nichts Schlimmes passieren. Der Code wird einfach nie ausgeführt und die Transaktion wird als "fehlgeschlagen" angegeben. Wenn Sie die Länge der Zeichenfolgen überprüfen möchten, können Sie dies direkt in der Funktion tun:require(memberName.length <= 10);

Ich erhalte die gleiche Warnung auch bei einer reinen Funktion mit Argumenten fester Länge. Hier ist der Code:

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

Irgendwelche Ideen?
(Mit aktueller Version von Remix, Compiler-Version 0.8.13)