Ich habe Benutzer A, der Vertrag B aufruft, der Vertrag
C aufruft, der Vertrag D aufruft msg.sender==B
. Natürlich kann ich nicht verwenden, tx.origin
da tx.origin
A ist.
Benutzer A hat die Adresse von C und die Adresse von D erstellt, aber nicht B.
DELEGATECALL
ist nicht die Lösung, oder?
Von Vertrag C können Sie a delegatecall
bis D machen, dies bewahrt den Absender (B)
Aber es wird den Speicher nicht ändern, es wird weiterhin auf den Speicher von Vertrag C zugegriffen.
Dies funktioniert nur, wenn Vertrag D keinen Speicher benötigt oder er geschrieben wurde, um auf Speicher von C zuzugreifen (z. B. wenn D ein Bibliotheksvertrag ist).
Es hängt alles davon ab, ob Sie der Autor all dieser Verträge sind oder nicht. Sie können dies mit Kombinationen von erreichen DELEGATECALL
, siehe diese Antwort. Aber seien Sie immer vorsichtig, wenn Sie nicht der einzige Verantwortliche für kritische Aspekte der Verträge sind (z. B. wenn sie Proxy-Funktionen haben, damit jemand Anrufe auf unerwarteten Code umleiten könnte), würde ich nicht empfehlen, sich auf Delegatecall zu verlassen. Eine andere Lösung wäre es, msg.sender
einen Funktionsparameter für einen anderen Vertrag zu verwenden und diese Adresse an den nächsten weiterzugeben, und so weiter.
this
von B wäre gleich this
C) mit anderen Daten verwendet werden kann. Aber in meinem Fall möchte ich, dass der Soliditätscode von Vertrag C auf etherscan.io und Library D Closed Source verifiziert wird (weshalb ich vermeiden möchte, dass D msg.sender über C-Code verwendet), was bedeutet, dass alle Verträge darin gespeichert werden Konto mit unterschiedlichen Adressen. Meinen Sie damit depends if you're the author of all these contracts or not
alle unter derselben Ethereum-Adresse gespeichert?
Benutzer2284570
this
anders. Bitte beachten Sie, dass die Antworttx.origin
sowieso nicht in ist. Immer !Jaime
Benutzer2284570