Ist es möglich, von einem Vertrag, der den msg.sender des ursprünglichen Anrufers beibehält, einen anderen Vertrag anzurufen?

Stellen Sie sich vor, Alice ruft eine Vertragsmethode C1 auf und diese Methode ruft eine andere Methode in Vertrag C2 auf.

Regelmäßig msg.sendergleicht das Alice-Konto im C1-Verfahren. Und msg.senderentspricht der C1-Vertragsadresse in der C2-Methode.

Ich würde gerne wissen, ob es möglich ist, C2 so anzurufen, dass msg.senderimmer 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, callcodeaber 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.

Stellen Sie sich vor, Sie bitten eine Börse, Ether an einen von Ihnen erstellten Smart Contract zu senden. Sie könnten Token übertragen, die im Namen der Adresse gespeichert sind, die Ether sendet. Die meisten Börsen speichern Ether- und ERC20-Token an derselben Adresse.
@ user2284570 Sie haben die neue Frage als Duplikat der alten markiert. Auch die Antworten hier sind besser.
@jbaylina was passiert, wenn Sie versuchen, C1 von C2 zu delegieren? Warum funktioniert es nicht?

Antworten (2)

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.origindie 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 _callerstatt msg.sender.

Verwenden tx.originbedeutet, 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.originanstelle von verweisen msg.caller.

Es ist eine gute Antwort! aber ich lasse es offen, weil ich etwas finde, das in C1 getan werden kann, da C2 bereits bereitgestellt ist.