Da eine Fallback-Funktion eine Solidity-Funktion ist , wie funktioniert sie, wenn der EVM-Opcode CALL
verwendet wird?
Wenn msg.data
leer 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 CALL
Opcode auf oder macht Solidity noch etwas Zusätzliches?
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 .call
als .send
auch zum CALL
Opcode, nur ihre erwarteten Argumente sind unterschiedlich.
eth
Alex Byrd