Wie funktioniert eine Fallback-Funktion, die Ether ablehnt?

Ein Vertrag in Solidity kann eine Fallback-Funktion haben wie:

// This contract rejects any Ether sent to it. It is good
// practise to include such a function for every contract
// in order not to loose Ether.
contract Rejector {
    function() { throw; }
}

Welcher zugrunde liegende Mechanismus in der EVM ermöglicht dies?

Fallback-Funktion und throw-Anweisung sind unabhängige Merkmale.

Antworten (1)

Die Fallback-Funktion ist eine Funktion der Solidity-Sprache und keine Funktion auf EVM-Ebene. Solidity parst einfach das msg.dataFeld in Transaktionen nach dem ABI:bytes4(sha3("functionName(argTypes)"))

Wenn der Code kompiliert wird, werden die ABI-Signaturen im kompilierten Code gespeichert, und wenn der Code aufgerufen wird, prüft er, ob die ersten vier Bytes von msg.dataeiner seiner Funktionen entsprechen. Wenn dies der Fall ist, wird diese Funktion aufgerufen, wobei der Rest msg.dataals Argumente interpretiert wird. Wenn nicht, wird die Fallback-Funktion aufgerufen.

Serpent könnte ein ähnliches System implementieren, aber ich weiß nicht genug über Serpent, um sagen zu können, wie es implementiert werden könnte.