Muss ein Anrufervertrag die vollständige Schnittstelle eines Angerufenen kennen?

Soweit ich weiß, muss ein Aufrufer, wenn er nur eine Funktion aus einem Angerufenen-Vertrag verwendet, nur die Signatur dieser Funktion kennen, nicht die gesamte Schnittstelle.

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;
    }
}

Anrufer.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);
    }
}

Es funktioniert auf Testnet (Kovan), aber ich kann es nirgendwo in den Dokumenten finden. Meine Frage ist also, kann ich dieses Muster verwenden, um aktualisierbare Verträge zu schreiben (damit ich den Callee-Vertrag bis auf eine Funktion leicht ändern könnte)? Gibt es etwas zu beachten?

Antworten (2)

Nein, der Aufrufer muss nicht die vollständige Schnittstelle des Aufgerufenen kennen . Wie Sie gesagt haben:

Soweit ich weiß, muss ein Aufrufer, wenn er nur eine Funktion aus einem Angerufenen-Vertrag verwendet, nur die Signatur dieser Funktion kennen, nicht die gesamte Schnittstelle.

Der Anrufvertrag ist nicht allwissend, er kann nicht wissen, ob die von Ihnen angegebene Schnittstelle vollständig ist oder nicht. Indem Sie also die gewünschten Funktionen in der Schnittstelle angeben, sagen Sie ihr nur, dass sie diese Funktionen verwenden kann, um mit dem Aufgerufenen zu interagieren, und "wie sie sich dabei verhalten soll".

Was ist der Grund dafür, diesen Code in Caller.sol zu schreiben?

interface Callee{
function theOnlyFunctionCallerNeeds (uint);}
  1. Sie können jede öffentliche Funktion von Callee ohne diesen Code verwenden;
  2. Sie verwenden das Schlüsselwort interface, wenn Sie einen Vertrag mit Funktionen ohne Körper erstellen möchten, davon erben und Körper implementieren. Aber Sie erben nicht.