ERC20 principle of work

Discussion

How the ERC20 protocol works?

Answers 1

What is the basis of ERC-20 tokens?

To comply with this standard, the contract must contain 6 main functions - totalSupply, balanceOf, transfer, transferFrom, approve, and allowance. There may also be others - name, symbol, and decimal, but they are not so important anymore. All of these features work within the framework of the programming language underlying Ethereum. To read more check this stuff.

What are the principle moments?

Token balance of an address is recorded on the token contract. A token contract is considered a contract that meets all criteria required by the ERC-20 standard, such as implementing the specified interface and emitting events when required by the standard.

Balances are mostly stored in the form of a mapping where the key is the holder address, and the value is the amount of tokens they own, because it's convenient for most cases. However the standard does not specify and particular way so if it suits your needs, you can store the balances in an array, or any other way.

Token transfer is an interaction with the token contract transfer() function (standardized in ERC-20), which should perform validations (my example skips that for simplicity), update the local variables storing balances, and emit the (again standardized) Transfer event.

Offchain apps, such as Etherscan, can listen to these events and update their own database of token holders. This allows them to filter all tokens by an address in their own database and show them on the website. But again, this is not part of the blockchain data, it's an aggregated database built on top of blockchain.

Example: Address 0x123 owns 1 USDT and 2 DAI. The USDT balance is stored in the USDT contract, and the DAI balance is stored in the DAI contract. There's no global property of the 0x123 address keeping track of its tokens.

contract USDT {
    // for the key `0x123`, the value is 1 (and decimals)
    mapping (address => uint256) balances;

    event Transfer(address indexed from, address indexed to, uint256 amount);

    function transfer(address to, uint256 amount) public {
        balances[msg.sender] -= amount;
        balances[to] += amount;
        emit Transfer(msg.sender, to, amount);
    }
}
contract DAI {
    // for the key `0x123`, the value is 2 (and decimals)
    mapping (address => uint256) balances;
}

For a full code example, see the OpenZeppelin implementation, and their docs related to this specific implementation. Just to clarify, OpenZeppelin is an organization that publishes open source code, but you can also build your own implementation of the standard or use another one, if that fits your use case.

Source - https://stackoverflow.com/questions/72769617/questions-about-erc-20-tokens