Как учетной записи пользователя принадлежит токен ERC20
Этот вопрос немного концептуален, так что, надеюсь, эта картина поможет прояснить мое недоразумение.
Изображение есть краудсейл умный контракт, развернутый по адресу 0x2. Пользователь по адресу 0x01 покупает токен. Вот мое понимание того, что происходит:
- Краудсейл-контракт (@ address: 0x2) принимает эфир от учетной записи пользователя (@ address: 0x1)
- В договоре краудсейла 0x1 хранится как приобретенный токен (важно: эта информация хранится в смарт-контракте @ адрес 0x2)
Теперь мой вопрос: если 0x1 - учетная запись пользователя (а не смарт-контракт), то по адресу 0x1 код отсутствует. Я думал, что учетная запись пользователя просто состоит из адреса + эфира, связанного с адресом, как он может хранить факт, что 0x1 владеет токеном ERC20? Например, я могу войти в MetaMask и (перед нажатием опции "добавить токен") MetaMask может увидеть, что у меня есть токен... как это возможно?
3 ответа
Каждый контракт ERC20 имеет следующую функцию:function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
Ваш кошелек просто вызывает эту функцию из известных токенов-контрактов с вашим адресом. Так как это функция просмотра, она не стоит никакого газа.
Я считаю, что большинство токенов ERC20 добавляются довольно быстро в кошелек, такой как Metamask или MEW. Но если ваш баланс не отображается автоматически, вы можете добавить адрес договора вручную (по крайней мере, в MEW, не уверенный в метамаске), и он появится позже.
В солидности есть два способа получить адрес человека, который отправил транзакцию
tx.origin
msg.sender
В вашем примере в методе внутри ERC20 Token.sol
, Значение tx.origin
будет 0x1
а также msg.sender
будет 0x2
Итак, чтобы ответить на ваш вопрос, как токен ERC20 узнает о 0x2
является: это зависит от того, как написан токен-контракт и использует ли он tx.origin
или же msg.sender
, Я бы предположил, что он использует msg.sender
потому что это более распространенный.
Если он использует msg.sender
вы все равно можете заставить работать контракт краудсейла, сначала купив токены, а затем немедленно перенеся токены из контракта краудсейла вызывающей стороне.
Для получения дополнительной информации обратитесь к разделу "В чем разница между" msg.sender "и" tx.origin "?
как он может также сохранить тот факт, что 0x1 владеет токеном ERC20?
Переводы токенов или переводы в бухгалтерском учете в целом хранятся в бухгалтерской книге. В этом случае реестр представляет собой смарт-контракт ERC-20, который внутренне хранит балансы, кому принадлежит и что находится в его собственности.
balances
отображение. Или смарт-контракт для управления хранилищем (EVM
SSTORE
инструкции), где хранятся записи о праве собственности.
Обратите внимание, что некоторые другие блокчейны, такие как Telos и EOS (и mayne Solana), могут быть противоположными, и там хранилище поддерживается в учетной записи пользователя (учетная запись пользователя имеет связанную оперативную память и таблицы для любого токена, которым владеет пользователь).