Fallback-Funktion akzeptiert mehr als 2300 Gas

Zitat aus solidity doc :

In einem solchen Kontext steht dem Funktionsaufruf normalerweise sehr wenig Gas zur Verfügung (um genau zu sein, 2300 Gas), daher ist es wichtig, Fallback-Funktionen so günstig wie möglich zu gestalten. Insbesondere die folgenden Operationen verbrauchen mehr Gas als das Stipendium, das einer Fallback-Funktion bereitgestellt wird (Aktualisierung der Zustandsvariablen a auf 100):

  1. Schreiben in den Speicher
  2. Vertrag erstellen
  3. Aufruf einer externen Funktion, die viel Gas verbraucht
  4. Äther senden

Idealerweise sollte ich also keine komplexe Logik in der Fallback-Funktion verwenden. Und die Fallback-Funktion kann nicht mehr als 2300 Gas verwenden.

Ich habe es versucht.

pragma solidity ^0.4.18;

contract TestFallback{
    uint public a = 0;
    uint public loopsize = 100;

    function updateLoopSize(uint _size) public {
        loopsize = _size;
    }

    function() public payable{
        uint i = 0;
        for (i=0; i<loopsize; i=i+1){
            a +=1;
        }
    }
}

Ich habe die fallbackFunktion mit aufgerufen loopsize = 100. Die Funktion wurde erfolgreich mit folgendem Gasverbrauch ausgeführt:

Benzin: 3000000; Transaktionskosten: 585049; Ausführungskosten: 563777

Nun, das verwirrte mich mit dem Absatz, den ich gerade gelesen hatte. Ich habe sogar versucht, Berechnungen sowie Token-Transfers in der Fallback-Funktion durchzuführen. Sie verbrauchten mehr als 100.000 Gas, wurden aber erfolgreich ausgeführt. Was fehlt mir also?

  1. Kann ich komplexe Logik innerhalb der Fallback-Funktion verwenden?
  2. Wenn ich eine Funktion ausführen muss (z. B. Token senden), sobald der Benutzer Ether an Smart Contract bezahlt, was sind mögliche Ansätze, abgesehen vom Schreiben der Logik in der Fallback-Funktion.

PS: Für die zweite Abfrage glaube ich nicht, dass es hilfreich ist, eine kostenpflichtige Funktion zu erstellen. Wie in diesem Fall müssen Benutzer eine bestimmte Methode des Smart Contract aufrufen. Aber ich möchte, dass dieser Benutzer einfach Ether von einer beliebigen Brieftasche sendet und Vermögenswerte erhält. (Benutzer brauchen kein abi, um eth an den Vertrag zu senden)

Sie sagen, es sollten nicht mehr als 23000 Gas sein, aber im Dokument steht, dass es 2300 Gas sind.

Antworten (2)

Die Fallback-Funktion ist wie jede andere Funktion: Sie bekommt so viel Gas, wie Sie ihr übergeben.

Das Besondere an der Fallback-Funktion ist, dass sie aufgerufen wird, wenn jemand eine einfache Ether-Überweisung durchführt, z. B. msg.sender.transfer(amount)in einem Smart Contract, oder eine Überweisung von einer Börse usw. In diesen Fällen wird sehr wenig Gas mitgeschickt, also wenn Sie wollen Um in diesen Fällen erfolgreich zu sein, sollten Sie vorsichtig sein, was Sie in die Fallback-Funktion eingeben.

Ich denke, es gibt andere Gründe, die Fallback-Funktion zu vermeiden, insbesondere um Fehler zu vermeiden. Siehe https://programtheblockchain.com/posts/2017/12/16/be-careful-when-using-the-solidity-fallback-function/ .

Ich verstehe, dass beim Senden normaler Brieftaschen/Börsen 21000 Gas passieren, was nicht ausreicht, um die komplexe Logik auszuführen, die in der Fallback-Funktion geschrieben ist. Aber ich sende Gas manuell bis zum vom Fallback geforderten Limit, es wird erfolgreich ausgeführt. Was bringt es dann, im Dokument etwa 2300 Gas zu erwähnen?
Der Grund dafür ist, dass es sich um ein häufiges Problem handelt und die Autoren der Dokumentation Sie darauf aufmerksam machen möchten, damit Sie es vermeiden können.
Auch wenn Sie etwas zum zweiten Teil der Frage vorschlagen könnten.
Wenn Sie den von mir verlinkten Blogbeitrag lesen, empfehle ich Ihnen, das zu tun, was Sie in Ihrem PS abgelehnt haben
Vielen Dank für Ihre Eingaben. Aber ich bin nicht viel klar mit dem, was in der Dokumentation geschrieben steht. Es wird ausdrücklich erwähnt, dass nur 2300 Gas für die Fallback-Funktion verfügbar sind, was jeden verwirren würde, dass wir nur 2300 Gas im Fallback-Fn verwenden können.
Aus Ihrem Zitat (meine Hervorhebung): "In einem solchen Kontext steht dem Funktionsaufruf normalerweise sehr wenig Gas zur Verfügung (um genau zu sein, 2300 Gas) ..."
Hmm... vielleicht lesen wir dieselbe Zeile mit unterschiedlichen Schwerpunkten. Die endgültige Schlussfolgerung kann lauten: „Die Fallback-Funktion kann auf jede Menge an zugeführtem Gas zugreifen, aber im Allgemeinen werden Fallback-Funktionen mit Senden/Übertragen aufgerufen, und die Leute geben sehr begrenztes Gas an die Übertragungsfunktion weiter. Wir sollten also versuchen, Logiken zu vermeiden, die mehr als 2300 verwenden Ich werde die Antwort bald als akzeptiert markieren.
Das klingt für mich richtig.
Ich stoße auf das gleiche Problem. send()und transfer()Methoden passieren nur 2300 Gas. Ich habe jedoch eine komplexe Fallback-Funktion, die Zahlungen von einer Börse erhält, Daten speichert und ~70.000 Gas verbraucht. Ich bezweifle, dass sie das verwenden, call().gas()was eine schlechte Praxis ist. Wie wird dann meine ~70K-Gas-Fallback-Funktion erfolgreich ausgeführt?
Ja, sie verwenden wahrscheinlich eine Low-Level- call.

Das Problem mit dem 2300-Gas ist, wenn der Anruf von einem Smart Contract stammt.

Wenn Sie die Transaktion manuell auslösen, können Sie das für die Fallback-Funktion erforderliche Gas steuern, sodass es keine Probleme gibt.

Aber wenn Sie ein .send() oder .transfer() von einem Smart Contract auslösen, wird die Ziel-Fallback-Funktion mit nur 2300 Gaslimit aufgerufen.

Wenn Sie Ihre Funktion von einem Smart Contract aufrufen, schlägt sie fehl.