¿El contrato de la persona que llama necesita conocer la interfaz completa de la persona que llama?

Según tengo entendido, si una persona que llama usa solo una función de un contrato de destinatario de la llamada, solo necesita saber la firma de esta función, no toda la interfaz.

Callee.sol ( Kovan ):

contract Callee{

    uint public anyNumber;

    function theOnlyFunctionCallerNeeds (uint someData) external {
        anyNumber = someData;
    }

    function justSomeRandomFunction(uint someOtherData) public view returns (uint){
        return anyNumber + someOtherData + 42;
    }
}

Llamador.sol ( Kovan ):

interface Callee{
    function theOnlyFunctionCallerNeeds (uint);
}

contract Caller{

    Callee callee;
    uint public anyNumber;

    function Caller(address calleeAddr) public {
        callee = Callee(calleeAddr);
    }

    function usingCallee(uint callerData) external {
        callee.theOnlyFunctionCallerNeeds(callerData);
    }
}

Funciona en testnet (Kovan) pero no puedo encontrarlo en ninguna parte de los documentos. Entonces, mi pregunta es: ¿puedo usar este patrón para escribir contratos actualizables (para poder cambiar fácilmente el contrato de Callee excepto por una función)? ¿Hay algo que considerar?

Respuestas (2)

No, la persona que llama no necesita conocer la interfaz completa de la persona que llama . Como has dicho:

Según tengo entendido, si una persona que llama usa solo una función de un contrato de destinatario de la llamada, solo necesita saber la firma de esta función, no toda la interfaz.

El contrato de llamada no es omnisciente, no puede saber si la interfaz que le diste está completa o no. Entonces, al proporcionar las funciones que desea en la interfaz, solo le está diciendo que puede usar estas funciones para interactuar con el destinatario y "cómo comportarse" al hacerlo.

¿Cuál es el motivo de escribir este código en Caller.sol?

interface Callee{
function theOnlyFunctionCallerNeeds (uint);}
  1. puede usar cualquier función pública de Callee sin ese código;
  2. usa la palabra clave de interfaz si desea crear un contrato con funciones sin cuerpo Heredar de él e implementar cuerpos. Pero no heredas.