¿Cómo funciona una función alternativa que rechaza el éter?

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 reserva y la throwdeclaración son características independientes.

Respuestas (1)

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.datacampo 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.datacorresponden a una de sus funciones. Si es así, llama a esa función con el resto msg.datainterpretado 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.