Stellen Sie sich vor, Alice ruft eine Vertragsmethode C1 auf und diese Methode ruft eine andere Methode in Vertrag C2 auf.
Regelmäßig msg.sender
gleicht das Alice-Konto im C1-Verfahren. Und msg.sender
entspricht der C1-Vertragsadresse in der C2-Methode.
Ich würde gerne wissen, ob es möglich ist, C2 so anzurufen, dass msg.sender
immer noch die Alice-Adresse anstelle der C1-Adresse ist. Und dass C2 auf die Zustandsvariablen von C2 zugreifen kann.
Ich habe versucht, und zu verwenden delegatecall
, callcode
aber diese Funktionen scheinen, dass C2 nur Zugriff auf den C1-Zustand hat, aber nicht auf den C2-Zustand. Ich denke, dass diese Aufrufe eher für Bibliotheken vorbereitet sind.
Es wäre gut, ein Beispiel für diesen Anruf zu haben.
Ich habe versucht, Delegatecall und Callcode zu verwenden, aber diese Funktionen scheinen, dass C2 nur Zugriff auf den C1-Status, aber nicht auf den C2-Status hat.
Richtig.
Wenn Sie den Zustand von C2 möchten, können Sie tx.origin
die Methode von C2 verwenden oder dazu bringen, ein zusätzliches address _caller
(Beispiel) zu nehmen , dass C1 die Adresse von Alice übergibt. C2 verwendet dann _caller
statt msg.sender
.
Verwenden tx.origin
bedeutet, dass Alice kein Vertrag sein kann und wie mache ich mein DAPP „Serenity-Proof“? schlägt vor, die Verwendung zu vermeiden tx.origin
.
Wenn Sie nur den Urheber der ursprünglichen Transaktion wissen möchten (im Gegensatz zum aktuellen Anruf), können Sie einfach auf tx.origin
anstelle von verweisen msg.caller
.
Benutzer2284570
Benutzer2284570
Ismael
Benutzer2284570