Ändern Sie die ERC20-Umbuchungsfunktion, um den Vertrag als Absender zu berücksichtigen

Ich habe einen Vertrag, den wir A anrufen werden, der die Übertragungsfunktion eines ERC20-Vertrags verwendet, den wir B über eine Schnittstelle anrufen. Allerdings funktioniert die Transferfunktion nicht wie erwartet, da beim Aufruf von Benutzer -> A -> B der msg.sender nun die Vertragsadresse von A und nicht mehr die Adresse des Benutzers ist.

Ich kann mir zwei unmittelbare Möglichkeiten vorstellen, dies zu lösen.

  1. Übergeben Sie die ursprüngliche msg.sender (Adresse des Benutzers) als Parameter an die Übertragungsfunktion
  2. Ändern Sie msg.sender in der Übertragungsfunktion von Vertrag B in tx.origin

Beide Lösungen ändern jedoch den ERC20-Token-Standardvertrag, von dem ich nicht sicher bin, ob dies eine gute Praxis ist.

Ich kann sehen, dass dies ein häufiges Problem sein könnte, auf das Entwickler stoßen. Soll ich eine der oben genannten Lösungen implementieren, obwohl sie den Standardvertrag ändert? Wenn nicht, wie soll ich es dann lösen?

Antworten (2)

Der richtige Weg, dies zu tun, ist mit dem approveand transferFrom-Workflow. Der EOA würde approveden Vertrag zum Übertragen der Tokens und dann die Funktion für den Vertrag aufrufen, die tranferFromstattdessen verwenden würdetransfer

Dies scheint, als ob die Verwendung von delegatecall()über ein Proxy-Muster das ist, wonach Sie suchen.

Mit Delegiertenruf geben Sie den ursprünglichen Absender an den nächsten Vertrag weiter . Dies kann Sie jedoch Sicherheitsrisiken für den Anrufvertrag aussetzen. dh in Ihrem Szenario Vertrag B, da Sie den Speicher von Vertrag A für Vertrag B freigeben.

Es gibt andere Beiträge, die erklären, wie man solche verwendet, zB den Unterschied zwischen CALL, CALLCODE und DELEGATECALL

Wie funktioniert die Methode "delegatecall", um die Methode eines anderen Vertrags aufzurufen?

Toller Blog: https://blog.gnosis.pm/solidity-delegateproxy-contracts-e09957d0f201

Dadurch wird der Speicher des Anrufers und nicht der des Angerufenen verwendet. msg.senderkorrekt ist, aber die Saldenaktualisierungen werden nicht im Speicher gespeichert, der dem Token-Vertrag zugeordnet ist.
@MrYellow, hast du noch andere Vorschläge?
@JonathanScialpi Es gibt approve/ transferFromMuster. Es werden auch mehrere Standardentwürfe für das Hinzufügen eines Rückrufs zur Information eines Vertrags über das Senden von Token in Vorbereitung sein. ERC223, ERC677, ERC827