Gasverbrauch einer öffentlichen Funktion anzeigen

In meinem Vertrag habe ich eine öffentliche Ansichtsfunktion, die ein Array von bytes32-Elementen zurückgibt. Im Remix wird eine Warnung ausgegeben, die besagt, dass das Blockgaslimit möglicherweise erschöpft ist, wenn ich diese Funktion verwende.

Wie ich gelesen hatte, wenn eine Funktion keine Zustandsänderungen vornimmt, definieren Sie sie als öffentliche Ansicht. Wenn Sie es also aufrufen, müssen Sie keinen Ether bezahlen, da Ihr lokaler Knoten die Variablen aus dem Vertrag aufruft und lokal ausführt. Ist das richtig? Warum muss ich mir dann Gedanken über das Gaslimit machen?

Überarbeitet nach Lauris Peltonen-Kommentar. Der Code, den ich verwendet habe, ist:

pragma solidity ^0.4.18;
contract Project{
    bytes32[] array;

    function addValue(bytes32 element)public{
        //only the administrator can add new values
        array.push(element);
    }

    function getAll()view public returns(bytes32[]){
        return array;
    }
}
Bitte geben Sie Ihren Code an
Lauri Peltonen Ich habe den Kommentar überarbeitet und den Code eingefügt

Antworten (1)

Sie zahlen kein Gas, wenn Sie eine Ansichtsfunktion aufrufen. Dies ändert nichts an der Tatsache, dass noch Operationen zu erledigen sind, die mit Kosten verbunden sind und daher der Gasobergrenze des Blocks sowie einer zeitlichen Begrenzung unterliegen.

Es ist keine gute Idee, zu versuchen, ein ganzes unbegrenztes Array zurückzugeben, da der Aufruf eine Zeitüberschreitung hat und Sie nichts erhalten.

Was Sie tun könnten, ist einen Cursor wie hier zu verwenden , Artikel, der das Problem angeht, mit dem Sie konfrontiert sind.

HAFTUNGSAUSSCHLUSS: NICHT MEIN BLOG ODER ARTIKEL!

Sie zahlen Gas, wenn Sie eine Ansichtsfunktion innerhalb einer Transaktion aufrufen
Ja, wenn Sie es innerhalb einer anderen Funktion aufrufen, aber nicht, wenn Sie es "normal" aufrufen.
Eli Drion danke für den Artikel, er war sehr hilfreich. Ich habe eine Frage, in der es heißt: „Für Ansichtsfunktionen, die von außerhalb der EVM aufgerufen werden (z. B. von JavaScript in einer Web-App), ist Gas kein einschränkender Faktor, da keine Transaktion ausgeführt wird. Der Knoten, der den Aufruf verarbeitet, führt die Berechnung lokal und durch gibt das Ergebnis zurück. Jeder Knoten kann seine eigenen Verarbeitungsgrenzen festlegen – normalerweise wird die Ausführungszeit begrenzt. Wenn der Aufruf zu lange dauert, schlägt er fehl.“ Si, wenn ich Trüffel verwende, kann ich diese Grenzen sehr hoch setzen, damit ich keine Probleme bekomme?