Ich versuche herauszufinden, wie die delegatecall
Methode 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 delegatecall
die Funktionen eines anderen Vertrags verwendet, wäre das sehr zu schätzen.
Hier ist ein Ausschnitt der D
Verwendung delegatecall
von E
Unterschied 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 sender
auf C gesetzt (E wird nicht modifiziert). Was msg.value
auch immer Teil des Aufrufs ist, ist auch der Wert von msg.value
inside setN
.
Sie können oben im Solidity Browser schnell testen .
Bibliotheken finden Sie in der Solidity-Dokumentation .
ein Typ
eth
bytes32
. Fürstring
undbytes
bin ich mir nicht sicher und wahrscheinlich ist eine separate Frage erforderlich.Alper
D.delcallCfunc(addressOfE, 10);
ist es die richtige Art, es zu nennen? KönnteaddressOfE
eine Schnur sein? @etheth
addressOfE
kann aber keine Zeichenfolge sein, da die Zeichenfolge keindelegatecall
Mitglied hat. Es ist wahrscheinlich einfacher, sich an Bibliotheken zu halten als an "einfache" Delegiertenrufe.Kaki Meister der Zeit
Benutzer2284570
eth