Erhalten unendlicher Gasschätzungen für einfache Funktionen

Ich teste die Solidität in Remix-Ideen mit einfachen Verträgen. Dies ist der Vertrag, den ich geschrieben habe:

 contract mortal {

address owner;

function mortal() {
    owner = msg.sender;
}

function kill(){
    if(msg.sender == owner){
        selfdestruct(owner);
    }
   }
}

contract Hello is mortal
{

string public message;

function Hello(){
    message = 'This is the initial Message';
    }

function getMessage() public constant returns(string){
    return message;
    }

function setNewMessage(string newMessage) public payable {
    message = newMessage;   
    }
} 

Beim Betrachten von Details erhalte ich unendliche Gasschätzungen für jede dieser Funktionen.

{
"Creation": {
    "codeDepositCost": "243200",
    "executionCost": "infinite",
    "totalCost": "infinite"
},
"External": {
    "getMessage()": "infinite",
    "kill()": "30636",
    "message()": "infinite",
    "setNewMessage(string)": "infinite"
}
}

Erläutern Sie bitte, warum ich unendliche gasEstimates für diese Funktionen erhalte und wie ich diesen Fehler vermeiden kann.

wo ist mortalvertrag
Ich habe per Frage aktualisiert

Antworten (3)

Der Vertrag lässt sich gut kompilieren:

pragma solidity ^0.4.15;

contract mortal {
    address owner;

    function mortal() public {
        owner = msg.sender;
    }

    function kill() public {
        if (msg.sender == owner) {
            selfdestruct(owner);
        }
    }
}

contract Hello is mortal {
    string public message;

    function Hello() public {
        message = 'This is the initial Message';
    }

    function getMessage() public constant returns(string) {
        return message;
    }

    function setNewMessage(string newMessage) public payable {
        message = newMessage;   
    }
} 

aber dann kommen die warnungen...

Geben Sie hier die Bildbeschreibung ein

aber es reicht/bestätigt auf Ropsten ganz gut..

Geben Sie hier die Bildbeschreibung ein

und die Methodenaufrufe funktionieren auch gut.

Geben Sie hier die Bildbeschreibung ein

Dies kann nur ein Fehler in der statischen Analyse des Compilers sein.

Ich sehe, es wird ausgeführt, es ist vielleicht ein Fehler im Remix, wie Sie darauf hingewiesen haben. Danke dir :)
Die Warnung ist genau das. Das bedeutet nicht, dass der Vertrag nicht funktioniert; es bedeutet nur, dass der Gasverbrauch potenziell unbegrenzt ist. Ich denke, dass die Warnung richtig ist.
@smarx, ja, ich verstehe Ihren Punkt, da der Zeichenfolgentyp ungebunden zu sein scheint
@smarx Wenn die Zeichenfolge also unbegrenzt ist, was ist die beste Alternative zum Speichern von Zeichenfolgendaten?
Ich bin mir nicht sicher, ob ich die Frage verstehe. Was ist falsch daran, nur Strings zu verwenden? Wenn Sie die Länge der Zeichenfolge begrenzen möchten, die Benutzer bereitstellen können, können Sie die Länge überprüfen. (zB require(newMessage.length <= 20);)
@AhsanJamal Sie können bytes32oder eine beliebige Anzahl von Bytes anstelle von verwenden string. Stellen Sie einfach sicher, dass die Bytes die erforderlichen Informationen unterstützen können. Sie können die Bytes dann einfach in Zeichenfolgen konvertieren. ethereum.stackexchange.com/questions/2519/…

Ich vermute, das liegt daran, dass die Kosten für diese Funktionen tatsächlich unbegrenzt sind. Zeichenfolgen können beliebig lang sein, setNewMessage()müssen also eine unbegrenzte Datenmenge speichern und eine unbegrenzte Datenmenge getMessage()lesen.

Wenn Sie diese Warnung vermeiden möchten, müssen Sie einen Datentyp mit einer festen Obergrenze für seine Größe verwenden.

Ich weiß nicht, was eine "Grenze ohne Gas" ist (vielleicht wird die unendliche Gaswarnung diskutiert?), Aber bitte fügen Sie eine Antwort hinzu, wenn Sie glauben, dass Sie eine Lösung haben.
Nur zur Bestätigung, ich sehe die gleichen unendlichen Gaswarnungen wie OP, wenn ich Solidity 0.4.19 auf Remix verwende.
Auch wenn ich den Typ von String auf Bytes32 ändere, bekomme ich immer noch unendlich Gas für diese Funktionen.
Durch das Umschalten auf bytes32wird die Warnung für mich entfernt.
Warum wird das runtergevotet? Scheint vernünftig genug
Ich bin mir ziemlich sicher, dass dies die richtige Antwort ist. Ich nehme an, es wurde von @Victory oder jemand anderem, der ihren Kommentar gesehen hat, abgelehnt (was den Eindruck erweckte, dass diese Antwort falsch war).
Ich habe meinen alten Kommentar gelöscht, dieses A war richtig. Ich habe die Frage falsch gelesen.

Dies liegt daran, dass Sie eine Zeichenfolge verwenden, die keine bestimmte Größe hat, dh es handelt sich um einen ungebundenen Datentyp. Sie können bytes32 anstelle von string verwenden, um die Gaskosten für den Ausführungscode zu begrenzen, da solidity es als 32-Bit-Literal betrachtet.

Das heißt, ist es wahr, dass die Leute die Verwendung von Schnüren um jeden Preis vermeiden sollten, da sie immer einen unendlichen Gasverbrauch zurückgeben.