Wie funktioniert die Methode "delegatecall", um die Methode eines anderen Vertrags aufzurufen?

Ich versuche herauszufinden, wie die delegatecallMethode für eine Vertragsadresse in einem Vertrag verwendet wird, um eine Funktion in einem separaten Vertrag aufzurufen.

Ich weiß, dass Bibliotheken die zu verwendende Schnittstelle auf höherer Ebene sind, aber ich möchte die Aktionen und Verhaltensweisen auf niedrigerer Ebene verstehen.

Wenn jemand einige gute Beispiele für einen Vertrag liefern könnte, der delegatecalldie Funktionen eines anderen Vertrags verwendet, wäre das sehr zu schätzen.

Antworten (1)

Hier ist ein Ausschnitt der DVerwendung delegatecallvon EUnterschied zwischen CALL, CALLCODE und DELEGATECALL

contract D {
  uint public n;
  address public sender;

  function delegatecallSetN(address _e, uint _n) {
    _e.delegatecall(bytes4(keccak256("setN(uint256)")), _n); // D's storage is set, E is not modified 
  }
}

contract E {
  uint public n;
  address public sender;
  function setN(uint _n) {
    n = _n;
    sender = msg.sender;
  }
}

Wenn eine Adresse C aufruft delegatecallSetN, werden Ds senderauf C gesetzt (E wird nicht modifiziert). Was msg.valueauch immer Teil des Aufrufs ist, ist auch der Wert von msg.valueinside setN.

Sie können oben im Solidity Browser schnell testen .

Bibliotheken finden Sie in der Solidity-Dokumentation .

Ich konnte es zum Laufen bringen, obwohl ich es nicht für Strings oder Bytes32 zum Laufen bringen konnte
Ich denke, es sollte das gleiche für funktionieren bytes32. Für stringund bytesbin ich mir nicht sicher und wahrscheinlich ist eine separate Frage erforderlich.
D.delcallCfunc(addressOfE, 10);ist es die richtige Art, es zu nennen? Könnte addressOfEeine Schnur sein? @eth
@Avatar Wenn Sie ein Beispiel wie die Antwort verwenden, scheint die Art und Weise Ihres Aufrufs konsistent zu sein, addressOfEkann aber keine Zeichenfolge sein, da die Zeichenfolge kein delegatecallMitglied hat. Es ist wahrscheinlich einfacher, sich an Bibliotheken zu halten als an "einfache" Delegiertenrufe.
Funktioniert das mit Enums?
@eth in diesem Fall, E und D und werden an derselben Adresse gespeichert, nicht wahr?
@ user2284570 Frage ist unklar. Jede Adresse hat nur 1 Vertrag.