kostet es Gas, Sicht oder reine Funktion in Solidität auszuführen?

Nehmen wir an, ich habe den folgenden Code in der Solidity-Funktion von Ethereum:

function getArray() external pure returns(uint[]) {
  // Instantiate a new array in memory with a length of 3
  uint[] memory values = new uint[](3);
  // Add some values to it
  values.push(1);
  values.push(2);
  values.push(3);
  // Return the array
  return values;
}

Da es rein ist, liest es nicht einmal Daten aus dem Speicher, ändert nichts am Speicher. Stellen Sie sich also vor, ich hätte diesen Vertrag eingesetzt. Dann gibt es Leute, die diese Funktion zum Beispiel aus web3.js oder remix aufrufen möchten. Wird diese Funktion sie Benzin kosten? Ich habe gelesen, dass Ansichtsfunktionen und reine Funktionen den Speicher nicht ändern. Sie sind also frei (kein Benzin). Wenn Benutzer die obige Funktion verwenden, warum ist sie kostenlos? Ich mache immer noch die Berechnung und speichere temporäre Daten im Speicher.

Antworten (2)

Es hängt davon ab, ob,

Wenn sie eine pureFunktion selbst aufrufen, wie in Ihrem Beispiel getArray(), dann nein, es kostet nichts.

Wenn sie jedoch eine Funktion aufrufen, die nicht pure oder viewist, und diese Funktion die Funktion intern aufruft getArray(), müssen sie für die gesamte Transaktion bezahlen.

Wer rechnet dann? Stellen Sie sich die Funktion vor, die ich hier gepostet habe. Darin habe ich eine For-Each-Schleife, die von 0 bis 1000000 geht und jede i-Variable in einem Array speichert, das ich in einer Funktion wie einer Speichervariablen erstellt habe. Wenn es für jeden, der es anruft, 0 Gas kostet, wer führt dann die Berechnung durch, wenn er von Web3 oder Remix aus anruft?
Wer die Funktion aufruft, führt in diesem Fall die Berechnung durch. Aber wenn Sie eine Funktion ausführen, die Änderungen vornimmt, bedeutet dies, dass sie in einen Block aufgenommen wird, was im Grunde bedeutet, dass jeder Miner diese Berechnung durchführt, wenn er versucht, sie in den Block aufzunehmen, weshalb Sie bezahlen müssen (aber nur ein glücklicher Miner bekommt dafür belohnt). Wenn es speziell um Web3 geht, beim Aufrufen pureoder viewFunktionieren, denke ich, dass technisch gesehen der Anbieter die Berechnungen durchführt, was wahrscheinlich entweder Infura oder Ihr lokal ausgeführter Knoten sein würde.
Danke wirklich sehr hilfreich.

Nichts ist umsonst. Verarbeitungsanweisungen kosten Benzin, viel weniger als eine Transaktion, die den Status ändert. Es darf kein Benzin kosten, wenn die EVM in gängigen IDEs läuft, was zu dem Irrglauben führen kann, dass reine Funktionen nichts kosten.

Diese Grundfunktion:

    function bigLoop(uint max) public pure returns (uint) {
      uint n;
      for(n = 0; n < max; n++) {
      }
      return n;
    }

Wird von einem Web3-Client mit max= 310000 aufgerufen und trifft einen lokalen Dev geth-Knoten ( geth --dev), wird eine Gas-Aus-Ausnahme ausgelöst. Wenn Sie dies in die Schleife werfen:

    function bigLoop(uint max) public pure returns (uint) {
      uint n;
      for(n = 0; n < max; n++) {
         bytes memory dummy = new bytes(256);
      }
      return n;
    }

dann max= 11000 wird aus Gas werfen.