Führt ein Funktionsaufruf durch, der die Statuskosten eines Vertrags nicht ändert

Ich habe mehrfach gelesen, dass bei Ethereum alles Gas kostet. Aber wenn ich eine Funktion schreibe und verwende, die den Zustand eines Vertrags nicht ändert (dh zwei Parameter summiere und die Summe zurückgibt), kostet das kein Gas.

Also, was bedeutet die Aussage „Alles kostet Benzin auf Ethereum“ jetzt eigentlich?

Antworten (1)

Funktionen, die den Zustand nicht ändern, können explizit als schreibgeschützte Funktionen geschrieben werden, indem die Modifikatoren viewund pure(früher constant) verwendet werden.

  • view: Liest den Status, ändert ihn aber nicht.
  • pure: Benötigt keinen Zugriff auf den Zustand und ändert ihn nicht.

Ein Client kann auch jede Funktion mithilfe der Web3- .call()Methode aufrufen.

In allen drei Fällen gilt:

  1. Der Vertrag wird auf der lokalen CPU ausgeführt, wobei eine lokale Kopie der Blockchain verwendet wird (falls überhaupt erforderlich), und es findet keine Netzwerküberprüfung von irgendetwas statt.
  2. Es gilt die EVM-Gasabrechnung und wird nachgeführt. Das heißt, wenn die Vertragsfunktion eine Gasabrechnung enthält (wie viel bleibt übrig?), dann funktioniert sie wie gewohnt in einem "Probelauf"-Modus, call()z. B. mit . Dasselbe gilt für "Kein Gas"-Situationen. Bei der Anforderung muss ausreichend Gas zugeführt werden.
  3. Da keine Netzwerküberprüfung erfolgt, besteht keine Möglichkeit einer Zustandsänderung. Dies schließt das Ergebnis ein, dass der zur Gasversorgung verbrauchte Ether effektiv zurückgegeben wird. Genauer gesagt, es wurde nie wirklich gesendet, weil das Netzwerk nicht informiert wurde.

Jeder OPCODE auf Assemblerebene hat bestimmte Kosten. Es könnte eine etwas präzisere Verallgemeinerung sein zu sagen, dass alle zustandsändernden Operationen Benzin kosten. Ich möchte sagen, dass das Lesen kostenlos ist. Am Ende sind sie es, wenn sie richtig umgesetzt werden. Hoffentlich bieten die obigen Details etwas Klarheit darüber, was los ist.

Ich hoffe es hilft.