Ansicht/Reingasverbrauch - Kostengas, wenn intern von einer anderen Funktion aufgerufen?

Ich weiß, dass ähnliche Fragen schon einmal gestellt wurden, aber ich konnte keine gute Erklärung für Folgendes finden:

In einem der Tutorials heißt es:

Pure- und View-Funktionen kosten kein Benzin, wenn sie extern von außerhalb des Vertrags aufgerufen werden. Aber sie kosten Gas, wenn sie intern von einer anderen Funktion aufgerufen werden.

  • Warum brauchen sie Benzin, wenn sie nichts aktualisieren?
  • Wie kostet Lesen Benzin?
  • Wird es nicht aus meiner lokalen Blockchain gelesen?
Wie ich weiß, kostet jede opEration Gas, wenn sie auf einem Miners-Knoten ausgeführt wird, nicht auf Ihrem lokalen (Benutzer-)Knoten. Leseoperationen (aus Blockchain) haben geringere Kosten, Schreiboperationen kosten mehr.

Antworten (2)

Wie ich es verstehe,

Pure- und View-Funktionen kosten kein Benzin, wenn sie extern von außen aufgerufen werden

In dieser Art von Fall wird keine Transaktion initiiert, da dies so wäre, als würde man einfach die Blockchain nach ihrem aktuellen Zustand abfragen, und es würde sich nichts ändern.

Aber sie kosten Gas, wenn sie intern von einer anderen Funktion aufgerufen werden.

Dies bedeutet, dass es bereits eine Transaktion gibt, um den Zustand der Blockchain zu ändern, und dieser Prozess der Zustandsänderung muss diese reine Funktion verwenden, beispielsweise für Berechnungen. Die Gaskosten für eine Transaktion hängen von der Anzahl der EVM-Opcodes ab, die während des Abschlusses ausgeführt werden, sodass die Ausführung dieser reinen Funktion auch innerhalb dieses Satzes von Opcodes liegt. Deshalb heißt es, dass es Benzin kostet.

Betrachten Sie den folgenden Vertrag:

pragma solidity ^0.4.24;


contract PureFunctionTest {

   uint state;

    function addNumbers(uint a, uint b) public pure returns (uint) {
       return a +b ;
   }

   function updateState(uint a, uint b) public {
       
     uint c = addNumbers(a,b);
     state = c;
   }

   function addThreeNumbers(uint a, uint b, uint c) public pure returns (uint) {
       
       uint temp = addNumbers(a,b);
       uint num  = addNumbers(temp,c);
       return num;
   }
}

Ein Anruf addNumberskostet nichts. Aber auch das Anrufen updateStatekostet ua Kosten addNumbers(a,b). Der Aufruf addThreeNumberskostet kein Gas, selbst wenn er addNumbersintern aufgerufen wurde, da während des gesamten Funktionsaufrufs keine Transaktion erforderlich ist.

Danke vielmals. Ich habe nicht verstanden, warum interne Anrufe immer Benzin kosten?
aber laut dem Zitat in der Frage sollte es Benzin kosten, wenn es 'addNumbers' verwendet? Wieso ist es so?
nicht wenn nur die addNUmbersangerufene alsone. aber wenn es innerhalb anderer Funktionen aufgerufen wird, die die Zustände ändern. denn für Transaktionskosten zählt die Anzahl der ausgeführten Opcodes. verstehst du es?
Was ist, wenn ich den Status nicht aktualisiere? Nehmen wir an, ich rufe nur die Funktion addNumbers auf und verwende diese Zeile nicht: state = c; aber nach dem Zitat in der Frage würde dies immer noch etwas kosten, da es intern ist?
Wenn Sie anrufen updatestate, können Sie nicht aufhören sate =c, auszuführen. Ich habe das Beispiel bearbeitet, prüfen, ob es Sinn macht?

Wie das Zitat sagt, kosten sie nichts , wenn sie nur zum Lesen von Ihrem lokalen Knoten verwendet werden.

Sie kosten Gas, wenn sie Teil einer Transaktion sind, die abgebaut werden muss. Gas entschädigt das Netzwerk für die Ausführung Ihres Codes. Es spielt keine Rolle, dass diese spezielle Funktion den Status nicht aktualisiert; Die Ausführung erfordert immer noch Ressourcen, also kostet es Benzin.

Danke vielmals. Sind interne Anrufe immer Teil der Transaktion? Was ist der Unterschied zwischen dem Lesen derselben Variablen aus einer internen Funktion und einer externen Funktion?
Ob Sie Gas bezahlen, hängt davon ab, ob Sie eine Transaktion übertragen oder nicht. Wenn Sie keine Transaktion übertragen, sondern nur lokal lesen, kostet nichts. Wenn Sie eine Transaktion übertragen, kostet alles.
Das bedeutet, dass interne Anrufe immer eine Transaktion übertragen, wie kosten sie?
Nein. Interne Anrufe können Teil einer Transaktion oder nicht Teil einer Transaktion sein. Die Unterscheidung zwischen „externer Anruf“ und „interner Anruf“ ist orthogonal dazu, ob etwas Benzin kostet oder nicht.