Übertragen Sie ERC20-Token mit einem anderen Vertrag. tx.origin vs. msg.sender

Ich habe einen einfachen ERC20-Token-Vertrag (TMP-Coin), wie im ERC20-Token-Beispiel erwähnt .

In der ERC20-Token-Beispielcode-Übertragungsfunktion werden Token von msg.sendereinem anderen Konto übertragen, aber warum verwenden wir nicht tx.origin?

Wie kann ich TMP-Coin-Token von einem Konto auf ein anderes übertragen, indem ich einen anderen Smart Contract (Vertrag XYZ) verwende?

Antworten (2)

tx.origingegen msg.sender:

msg.sender- die Adresse des direkten Anrufers (kann ein Vertrag oder ein externes Konto sein)

tx.origin- die Adresse des Anrufers, von dem die Transaktion stammt (immer ein externes Konto).

Es empfiehlt sich, es nicht zu verwenden, tx.origines sei denn, Sie müssen den Ursprung wirklich kennen.

Sie sollten nicht zur Verifizierung verwenden tx.origin, da Sie dadurch potenziellen Angriffen ausgesetzt würden ( tx.origin attack ). Das Beispiel in der Solidity-Dokumentation ist veraltet und kann nicht mehr reproduziert werden, .transfer()aber es gibt Möglichkeiten, es zu umgehen.

ERC20 von A nach B transportieren:

Um Token von Konto A auf Konto B mit Vertrag C zu übertragen , müssten Sie Folgendes tun:

  1. Rufen Sie von A aus die ERC20-Funktion auf approve(address _spender, uint256 _value)und übergeben Sie die Adresse von C als Spender, plus den Betrag, den er senden darf. Dies würde dem Token-Vertrag mitteilen, dass Ihr Vertrag C den angegebenen Betrag von Ihrer Adresse A überweisen darf .

  2. Rufen Sie von C aus die ERC20-Funktion auf transferFrom(address _from, address _to, uint256 _value). Vorbeigehen from: A.addressundto: B.address

msg.senderkann auch eine Vertragsadresse sein, tx.originist aber immer ein EOA. http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html#eoa-vs-contract-accounts

Die Verwendung msg.senderermöglicht es Verträgen, Gelder von anderen Vertragskonten zu erhalten, im Gegensatz zu nur EOAs.