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?
Die Fallback-Funktion ist eine Funktion der Solidity-Sprache und keine Funktion auf EVM-Ebene. Solidity parst einfach das msg.data
Feld 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.data
einer seiner Funktionen entsprechen. Wenn dies der Fall ist, wird diese Funktion aufgerufen, wobei der Rest msg.data
als 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.
Pawel Bylica
throw
-Anweisung sind unabhängige Merkmale.