Wie funktioniert eine Solidity-Fallback-Funktion mit dem rohen CALL-Opcode der EVM?

Da eine Fallback-Funktion eine Solidity-Funktion ist , wie funktioniert sie, wenn der EVM-Opcode CALLverwendet wird?

Wenn msg.dataleer ist, wie kann Solidity die Fallback-Funktion ausführen? Sollte die EVM nicht einfach den Ether übertragen, da es keinen Funktionsaufruf gibt?

Ruft in Solidity eine Syntax wie contractAddress.call.value(amountWei)()ein roher CALLOpcode auf oder macht Solidity noch etwas Zusätzliches?

Antworten (1)

Jede Nachricht, die an einen Vertrag gesendet wird, auch wenn sie leer ist oder nur eine Ether-Übertragung, ruft den Code des Vertrags auf. Die Fallback-Funktion wird ausgeführt, wenn die gesendeten Daten nicht mit einer bekannten Funktionskennung beginnen (z. B. wenn eine nicht vorhandene Funktion aufgerufen wird oder wenn die Nachrichtendaten leer sind, wie dies bei einer einfachen Ether-Übertragung der Fall ist).

Wenn also ein Kontrakt eine Fallback-Funktion hat, gibt es keine Möglichkeit, den Aufruf zu verhindern (außer durch den Aufruf einer tatsächlich vorhandenen Funktion oder das Senden von nicht genug Gas, aber keinem Ether).

In Solidity kompilieren sowohl .callals .sendauch zum CALLOpcode, nur ihre erwarteten Argumente sind unterschiedlich.

Ich habe die Antwort akzeptiert, aber ich denke, die Schlüsselfrage ist, warum dies so ist: "Jede Nachricht, die an einen Vertrag gesendet wird, selbst wenn sie leer ist, oder nur eine Ether-Übertragung, ruft den Code des Vertrags auf." ethereum.stackexchange.com/questions/1585/…
Um die Antwort zu vervollständigen: Soliditys ".transfer" kompiliert auch zu CALL. Sowohl transfer() als auch send() unterscheiden sich von call() dadurch, dass sie standardmäßig ein Gasstipendium von 2300 einrichten. Bei call() wird standardmäßig das gesamte verbleibende Gas verwendet.