Un contrato en Solidity puede tener una función alternativa como:
// 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; }
}
¿Qué mecanismo subyacente en el EVM permite esto?
La función de respaldo es una función del lenguaje Solidity y no es una función de nivel EVM. Solidity simplemente analiza el msg.data
campo en las transacciones según el ABI:bytes4(sha3("functionName(argTypes)"))
Cuando se compila el código, las firmas ABI se almacenan en el código compilado y, cuando se llama al código, se busca si los primeros cuatro bytes de msg.data
corresponden a una de sus funciones. Si es así, llama a esa función con el resto msg.data
interpretado como argumentos. Si no, se llama a la función de reserva.
Serpent podría implementar un sistema similar, pero no sé lo suficiente sobre Serpent para decir cómo podría implementarse.
Paweł Bylica
throw
declaración son características independientes.