Когда мы отправляем токены в контракт получателя, отправитель должен сначала использовать функцию передачи в контракте токена, прежде чем он сможет отправить токены в контракт получателя.
Отправитель --> Контракт токена --> Контракт получателя
Означает ли это, что msg.sender
контракт получателя получит адрес токена? Если да, то как контракт получателя может знать первоначальный адрес отправителя?
Вы правы, что msg.sender
в получателе будет адрес токена-контракта. Вот почему первым параметром tokenFallback
является адрес исходного отправителя: для токена, совместимого с ERC223, получатель узнает исходного отправителя по этому первому параметру.
https://github.com/ethereum/EIPs/issues/223 упоминает следующие моменты:
Контракт на работу с токенами
function tokenFallback(address _from, uint _value, bytes _data)
Функция для обработки передачи токенов, которая вызывается из контракта токена, когда держатель токена отправляет токены._from
— адрес отправителя токена, _value — количество входящих токенов, а _data — прикрепленные данные, аналогичные msg.data транзакций Ether. Работает по аналогии с резервной функцией транзакций эфира и ничего не возвращает.ПРИМЕЧАНИЕ. msg.sender будет токеном-контрактом внутри функции tokenFallback. Может быть важно отфильтровать, какие токены отправляются (по адресу токена-контракта). Отправитель токена (человек, инициировавший транзакцию токена) будет _from внутри функции tokenFallback.