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):
- Schreiben in den Speicher
- Vertrag erstellen
- Aufruf einer externen Funktion, die viel Gas verbraucht
- Ä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 fallback
Funktion 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?
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)
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/ .
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?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.
Daniel Luca CleanUnicorn