Как учетной записи пользователя принадлежит токен ERC20

Этот вопрос носит немного концептуальный характер, поэтому, надеюсь, эта картинка поможет прояснить мое недоразумение. введите описание изображения здесь

Изображение смарт-контракт краудсейла, развернутый по адресу 0x2. Пользователь по адресу 0x01 покупает токен. Вот мое понимание того, что происходит:

  1. Контракт краудсейла (@ адрес: 0x2) принимает эфир от учетной записи пользователя (@ адрес: 0x1)
  2. Контракт краудсейла хранит 0x1 как приобретенный токен (важно: эта информация хранится в смарт-контракте @address 0x2)

Теперь мой вопрос: если 0x1 - это учетная запись пользователя (а не смарт-контракт), то по адресу 0x1 нет кода. Я думал, что учетная запись пользователя просто состоит из адреса + эфира, связанного с адресом, как он может также хранить тот факт, что 0x1 владеет токеном ERC20? Например, я могу войти в MetaMask и (перед тем, как щелкнуть опцию «добавить токен») MetaMask может увидеть, что у меня есть токен ... как это возможно?


person Test1 Test2    schedule 26.03.2018    source источник
comment
Если ваш кошелек поддерживает токены ERC20, он может просмотреть данные и узнать, какой у вас баланс.   -  person tadman    schedule 26.03.2018
comment
Да, я это сделал. Я вижу, что шаг 2 имеет место. Чего я не вижу, так это того, что позволило бы metaMask увидеть, что пользователь 0x01 владеет токеном (без просмотра данных, хранящихся в 0x02).   -  person Test1 Test2    schedule 26.03.2018
comment
Данные хранятся в блокчейне Ethereum, поэтому любой клиент кошелька может просто посмотреть на них и узнать. Вот как это делают такие инструменты, как Ethplorer.   -  person tadman    schedule 26.03.2018
comment
Да, я понимаю ваш первый пункт. Я не понимаю: как metaMask знает о кошельке по адресу 0x02, когда единственная информация, которая есть, - это 0x01. Я не думаю, что metaMask будет сканировать каждый кошелек в блокчейне, чтобы узнать, владеет ли пользователь токеном.   -  person Test1 Test2    schedule 26.03.2018
comment
Ему не нужно сканировать каждый кошелек, он просто сканирует хранилище данных контракта, в котором указывается, кто чем владеет.   -  person tadman    schedule 26.03.2018
comment
но мой вопрос: как metaMask знает о кошельке по адресу 0x02. Если я вхожу в metaMask только с адресом 0x01, как metaMask узнает, какое хранилище данных контракта нужно сканировать. Как я уже сказал, MetaMask знал, что у меня есть токен, до того, как щелкнул опцию добавления токена.   -  person Test1 Test2    schedule 26.03.2018
comment
Какой токен вы купили? Я предполагаю, что MetaMask автоматически запрашивает популярные токены. Конечно, возможно, что он отслеживает каждое событие ERC 20 Transfer или обращается к службе, которая это делает. (Это то, что делают Ethplorer и Etherscan.)   -  person user94559    schedule 26.03.2018
comment
Как только они обнаружат контракт, довольно легко связать всех держателей с адресами их кошельков в их базе данных. Обход всей цепочки блоков занимает много времени, но не невозможно, и это то, что подобные сайты обычно делают в режиме реального времени.   -  person tadman    schedule 26.03.2018
comment
Это определенно не популярный токен, это токен на основе ERC20, который я только что создал :) Хорошо, спасибо за информацию   -  person Test1 Test2    schedule 26.03.2018


Ответы (3)


Каждый контракт ERC20 выполняет следующую функцию:
function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; }

Ваш кошелек просто вызывает эту функцию из известных контрактов токена с вашим адресом. Поскольку это функция просмотра, она не требует затрат газа.

Я считаю, что большинство токенов ERC20 довольно быстро добавляются в кошелек, такой как Metamask или MEW. Но если ваш баланс не отображается автоматически, вы можете добавить адрес контракта вручную (по крайней мере, в MEW, не уверен в Metamask), и он появится позже.

person Fischa7    schedule 03.04.2018

В солидности есть два способа получить адрес человека, отправившего транзакцию.

  • 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?

person gaiazov    schedule 28.03.2018

как он может также сохранить тот факт, что 0x1 владеет токеном ERC20?

Переводы токенов или переводы в бухгалтерском учете в целом хранятся в бухгалтерской книге. В этом случае реестр представляет собой смарт-контракт ERC-20, который внутренне хранит балансы, кому принадлежит и что в его balances сопоставлении. Или смарт-контракт управляет хранилищем (инструкции EVM SSTORE), где хранятся записи о праве собственности.

Обратите внимание, что некоторые другие блокчейны, такие как Telos и EOS (и mayne Solana), могут быть противоположными, и там хранилище поддерживается в учетной записи пользователя (учетная запись пользователя имеет связанную оперативную память и таблицы для любого токена, которым владеет пользователь).

person Mikko Ohtamaa    schedule 07.06.2021