Перенесите токены ERC20, используя другой контракт. tx.origin против msg.sender

У меня есть базовый контракт токена ERC20 (монета TMP), как указано в примере токена ERC20 .

В примере кода токена ERC20 функция передачи токенов переносится из msg.senderдругой учетной записи, но почему мы не используем tx.origin?

Как я могу перевести токены монет TMP с одной учетной записи на другую, используя другой смарт-контракт (контракт XYZ)?

Ответы (2)

tx.originпротив msg.sender:

msg.sender- адрес прямого вызывающего абонента (может быть договором или внешней учетной записью)

tx.origin- адрес вызывающего абонента, из которого исходит транзакция (всегда внешняя учетная запись).

Лучше всего не использовать, tx.originесли вам действительно не нужно знать происхождение.

Вы не должны использовать tx.originдля проверки, так как это может подвергнуть вас потенциальным атакам ( атака tx.origin ). Пример в документации Solidity устарел и .transfer()больше не может быть воспроизведен, но есть способы обойти это.

Передача ERC20 из A в B:

Чтобы перевести токены со счета A на счет B с помощью контракта C, вам необходимо сделать следующее:

  1. От A вызовите функцию ERC20 approve(address _spender, uint256 _value)и передайте адрес C как отправителя плюс сумму, которую ему разрешено отправить. Это сообщит Token Contract, что вашему контракту C разрешено переводить указанную сумму с вашего адреса A.

  2. Из C вызовите функцию ERC20 transferFrom(address _from, address _to, uint256 _value). Проходит from: A.addressиto: B.address

msg.senderтакже может быть адресом контракта, но tx.originвсегда является EOA. http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html#eoa-vs-contract-accounts

Использование msg.senderпозволяет контрактам получать средства с других контрактных счетов, а не только с EOA.