¿Cómo funciona una función de respaldo de Solidity con el código de operación CALL sin procesar del EVM?

Dado que una función de respaldo es una característica de Solidity , ¿cómo funciona si CALLse usa el código de operación EVM?

Si msg.dataestá vacío, ¿cómo puede Solidity ejecutar la función de respaldo? ¿No debería el EVM simplemente transferir el Ether, ya que no hay invocación de función involucrada?

En Solidity, ¿la sintaxis contractAddress.call.value(amountWei)()invoca un código de operación sin procesar CALLo Solidity todavía hace algo adicional?

Respuestas (1)

Cualquier mensaje enviado a un contrato, incluso si está vacío o solo una transferencia de ether, invocará el código del contrato. La función de reserva se ejecuta si los datos enviados no comienzan con un identificador de función conocido (por ejemplo, si se llama a una función inexistente o si los datos del mensaje están vacíos, como en el caso de una simple transferencia de ether).

Entonces, si un contrato tiene una función de respaldo, no hay forma de evitar que se llame (excepto llamando a una función realmente existente o no enviando suficiente gas pero no éter).

En Solidity, ambos .cally .sendse compilan en el CALLcódigo de operación, solo que sus argumentos esperados son diferentes.

Acepté la respuesta, pero creo que la pregunta clave es por qué esto: "Cualquier mensaje enviado a un contrato, incluso si está vacío o solo una transferencia de ether, invocará el código del contrato". ethereum.stackexchange.com/questions/1585/…
Para completar la respuesta: ".transfer" de Solidity también se compila en CALL. Tanto transfer() como send() se diferencian de call() en que configuran un estipendio de gasolina de 2300 por defecto. Con call(), el valor predeterminado es usar todo el gas restante.