Dado que una función de respaldo es una característica de Solidity , ¿cómo funciona si CALL
se usa el código de operación EVM?
Si msg.data
está 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 CALL
o Solidity todavía hace algo adicional?
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 .call
y .send
se compilan en el CALL
código de operación, solo que sus argumentos esperados son diferentes.
ética
Alex Byrde