Warum verwenden wir revert() in der Bezahlfunktion?

Ich habe dieses Snippet in vielen Online-Beispielen gesehen. Könnten Sie bitte erklären, was das tut und warum wir es in einer kostenpflichtigen Funktion verwenden?

function () public payable {
   revert () ; 
}   

Antworten (3)

Die Funktion ohne Namen: function ()heißt Fallback-Funktion . Es wird ausgeführt, wenn der Vertrag etwas ETH erhält, ohne dass eine Funktion explizit aufgerufen wird.

Das Einfügen revert();bedeutet, dass Sie ETH nicht zum Vertrag senden können, ohne explizit eine kostenpflichtige Funktion aufzurufen.

Siehe auch meine Antwort. Ich glaube nicht, dass das wirklich (mehr) benötigt wird.

Ich glaube, dass dieses Muster in Versionen von Solidity so alt wie 0.4.0 (veröffentlicht im September 2016) nicht benötigt wird. Von https://github.com/ethereum/solidity/blob/develop/Changelog.md#040-2016-09-08 (meine Hervorhebung):

Kontrakte, die Ether mit einem einfachen „Send“ empfangen wollen, müssen eine Fallback-Funktion mit dem Bezahl-Modifikator implementieren. Verträge lösen jetzt aus, wenn keine kostenpflichtige Fallback-Funktion definiert ist und keine Funktion mit der Signatur übereinstimmt.

Ich glaube, das function () payable { revert(); }war ein Muster, das verwendet wurde, um die implizite Akzeptanz von Äther in Solidity-Versionen älter als 0.4.0 zu verhindern, aber heute ist dies nicht mehr erforderlich. Ich stelle mir vor, dass die Praxis weitgehend durch Kopieren/Einfügen weitergeführt wurde.

Habe es gerade im Mainnet getestet, das ist richtig.

Die obige Funktion verhindert grundsätzlich, dass Konten Ether direkt auf den Vertrag übertragen.

Die obige Funktion wird in Solidität als Fallback-Funktion bezeichnet. Wenn jemand eine Transaktion an den Smart Contract sendet, ohne einen Funktionsnamen anzugeben (oder der aufgerufene Funktionsname mit keiner vorhandenen Funktion übereinstimmt), wird diese Fallback-Funktion aufgerufen.

Wenn also jemand contract.transfer(someValue);die Fallback-Funktion ausführen würde, aber da alles, was es tut, revert() ist, schlägt der Funktionsaufruf fehl und das nicht verbrauchte Gas und der gesendete Ether werden an den Aufrufer zurückgegeben.

Sie sollten dies tun, um zu verhindern, dass Leute fälschlicherweise Ether an Ihren Vertrag senden.

Als Randnotiz: Genau diese Funktion kann auch von einem böswilligen Vertrag verwendet werden, um einige Verträge anzugreifen, wie im Fall King Of Ether: https://www.kingoftheether.com/postmortem.html#Causes

Zu dieser Zeit wurde das Problem dadurch verursacht, dass die Gasstipendien nicht begrenzt wurden, aber mit der ursprünglichen Logik (die kein Auszahlungsmuster verwendet) kann jemand einen Vertrag codieren, der Ether sendet, um der König zu werden, und dann, wenn dieser Vertrag entthront wird und das Der KoE-Vertrag möchte Ether an den Vertrag zurücksenden, er wird immer fehlschlagen und zurückrollen, da die Fallback-Funktion jede eingehende Transaktion mit dem Aufruf revert() ablehnt.