Wie kann msg.sender==B beibehalten werden, wenn Benutzer A Vertrag B aufruft, der Vertrag C aufruft, der Vertragsbibliothek D aufruft?

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.originda tx.originA ist.

Benutzer A hat die Adresse von C und die Adresse von D erstellt, aber nicht B.

DELEGATECALList nicht die Lösung, oder?

Die Adresse ( ) ist jedes Mal thisanders. Bitte beachten Sie, dass die Antwort tx.originsowieso nicht in ist. Immer  !
warum nicht B-Adresse als Parameter an C übergeben und C diese als Parameter an D übergeben.
@Jaime, weil die ERC20-Schnittstelle von C auf Etherescan überprüfbarer Quellcode ist, während ich D als geschlossene Quelle behalten würde. Je weniger Parameter ich an D übergebe, desto weniger Leute hätten eine Vorstellung von D.

Antworten (2)

Von Vertrag C können Sie a delegatecallbis 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.sendereinen Funktionsparameter für einen anderen Vertrag zu verwenden und diese Adresse an den nächsten weiterzugeben, und so weiter.

Aber wenn ich das richtig verstehe, scheint die Antwort, auf die Sie sich beziehen, zu sagen, dass Delagatecall nur zum Aufrufen derselben Adresse ( thisvon B wäre gleich thisC) 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 notalle unter derselben Ethereum-Adresse gespeichert?