简体   繁体   中英

How does a User account own an ERC20 Token

This question is a little conceptual, so hopefully this picture will help clear up my misunderstanding. 在此处输入图像描述

Image there is a crowdsale smart contract deployed on address 0x2. A User at address 0x01 buys a token. Here is my understanding of what happens:

  1. The crowdsale contract (@ address: 0x2) accepts ether from the user account (@ address: 0x1)
  2. The crowdsale contract stores 0x1 as having purchased a token (important: this information is stored in the smart contract @address 0x2)

Now my Question: If 0x1 is a user account (and not a smart contract) there is no code at address 0x1. I thought a user account just consisted of an address + ether associated with the address, how can it also store the fact that 0x1 owns an ERC20 token? For example, I can login to MetaMask and (before clicking the "add token" option) MetaMask can see that I have a token... how is this possible?

Every ERC20 contract has the following function:
function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; }

Your wallet just calls this function from the known token contracts with your address. Since it's a view function it doesn't cost any gas.

I recon most ERC20 token get added rather quickly to a wallet like Metamask or MEW. But if your balance doesn't automatically show, you can add the contract address manually (in MEW at least, not sure about Metamask) and it will show up afterwards.

In solidity there are two ways to get the address of the person who sent the transaction

  • tx.origin
  • msg.sender

In your example, in the method inside ERC20 Token.sol , the value tx.origin will be 0x1 and msg.sender will be 0x2

So to answer your question, how does the ERC20 token know about 0x2 is: it depends on how the token contract is written and whether it uses tx.origin or msg.sender . I would imagine it uses msg.sender , because that is the more prevalent one.

If it does use msg.sender you can still make the crowdsale contract work by first buying the tokens and then immediatelly transfering the tokens from the crowdsale contract to the caller.

For more information, refer to What's the difference between 'msg.sender' and 'tx.origin'?

how can it also store the fact that 0x1 owns an ERC20 token?

Token transfers, or transfers in accounting in general, are kept in a ledger . In this case, the ledger is ERC-20 smart contract that internally keeps balances who owns and what in its balances mapping. Or, the smart contract manage the storage (EVM SSTORE instructions) where the records of ownership are kept.

Note that some other blockchains, like Telos and EOS (and mayne Solana) might be opposite and there the storage is maintained on the user account (user account has associated RAM and tables for any token user owns).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM