Přeskočit na hlavní obsah
Change page

Standard tokenu ERC-20

Stránka naposledy aktualizována: 25. února 2026

Úvod

Co je to token?

Tokeny mohou v ekosystému Etherea reprezentovat prakticky cokoliv:

  • reputační body na online platformě
  • dovednosti postavy ve hře
  • finanční aktiva, jako je podíl ve společnosti
  • fiat měnu, jako je USD
  • unci zlata
  • a více...

Takováto mocná funkce Etherea musí být samozřejmě ošetřena robustním standardem, že? A právě zde hraje svou roli ERC-20! Tento standard umožňuje vývojářům vytvářet tokenové aplikace, které jsou interoperabilní s jinými produkty a službami. Standard ERC-20 se také používá k poskytnutí dodatečné funkcionality pro .

Co je ERC-20?

ERC-20 zavádí standard pro zaměnitelné tokeny, které, jinými slovy, mají vlastnost, díky níž je každý token naprosto stejný (typem i hodnotou) jako jiný token. ERC-20 token funguje stejně jako ETH, což znamená, že 1 token je a vždy bude roven všem ostatním tokenům.

Předpoklady

Tělo

ERC-20 (Ethereum Request for Comments 20), navržený Fabianem Vogelstellerem v listopadu 2015, je tokenový standard, který implementuje API pro tokeny v rámci smart kontraktů.

Příklady funkcionalit, které ERC-20 poskytuje:

  • převod tokenů z jednoho účtu na druhý
  • získání informace o aktuálním zůstatku tokenů na účtu
  • získání celkové nabídky tokenů dostupných v síti
  • schválení, zda může být určitá částka tokenů z účtu použita třetí stranou

Pokud smart kontrakt implementuje následující metody a události, může být nazván ERC-20 kontraktem a po spuštění bude zodpovědný za sledování tokenů vytvořených na Ethereu.

Z EIP-20opens in a new tab:

Metody

1function name() public view returns (string)
2function symbol() public view returns (string)
3function decimals() public view returns (uint8)
4function totalSupply() public view returns (uint256)
5function balanceOf(address _owner) public view returns (uint256 balance)
6function transfer(address _to, uint256 _value) public returns (bool success)
7function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
8function approve(address _spender, uint256 _value) public returns (bool success)
9function allowance(address _owner, address _spender) public view returns (uint256 remaining)
Zobrazit vše

Události

1event Transfer(address indexed _from, address indexed _to, uint256 _value)
2event Approval(address indexed _owner, address indexed _spender, uint256 _value)

Příklady

Podívejme se, proč je tento standard tak důležitý pro zjednodušení prohlížení jakéhokoliv kontraktu ERC-20 tokenu na Ethereu. Abychom mohli vytvořit rozhraní pro jakýkoliv ERC-20 token, stačí nám Contract Application Binary Interface (ABI). Jak můžete vidět níže, použijeme zjednodušené ABI, abychom vám to ukázali na jednoduchém příkladu.

Příklad Web3.py

Nejprve se ujistěte, že máte nainstalovanou knihovnu Python Web3.pyopens in a new tab:

1pip install web3
1from web3 import Web3
2
3
4w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
5
6dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)
8
9acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
10
11# This is a simplified Contract Application Binary Interface (ABI) of an ERC-20 Token Contract.
12# It will expose only the methods: balanceOf(address), decimals(), symbol() and totalSupply()
13simplified_abi = [
14 {
15 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
16 'name': 'balanceOf',
17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
18 'stateMutability': 'view', 'type': 'function', 'constant': True
19 },
20 {
21 'inputs': [],
22 'name': 'decimals',
23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
26 {
27 'inputs': [],
28 'name': 'symbol',
29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
30 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'name': 'totalSupply',
35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 }
38]
39
40dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)
41symbol = dai_contract.functions.symbol().call()
42decimals = dai_contract.functions.decimals().call()
43totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
45
46# DAI
47print("===== %s =====" % symbol)
48print("Total Supply:", totalSupply)
49print("Addr Balance:", addr_balance)
50
51weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)
52symbol = weth_contract.functions.symbol().call()
53decimals = weth_contract.functions.decimals().call()
54totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
56
57# WETH
58print("===== %s =====" % symbol)
59print("Total Supply:", totalSupply)
60print("Addr Balance:", addr_balance)
Zobrazit vše

Známé problémy

Problém s příjmem tokenů ERC-20

K 20. červnu 2024 byly kvůli tomuto problému ztraceny tokeny ERC-20 v hodnotě nejméně 83 656 418 $. Všimněte si, že čistá implementace ERC-20 je náchylná k tomuto problému, pokud nad rámec níže uvedeného standardu neimplementujete sadu dodatečných omezení.

Když jsou ERC-20 tokeny poslány do smart kontraktu, který není k práci s nimi konstruován, mohou být tyto tokeny ztraceny navždy. K tomu dochází, když přijímající kontrakt nemá funkci, která by rozpoznala příchozí tokeny, nebo na ně dokázala reagovat, a ve standardu ERC-20 neexistuje mechanismus, který by přijímající kontrakt upozornil na příchozí tokeny. Hlavní způsoby, jak může tento problém vzniknout, jsou:

  1. Mechanismus přenosu tokenů
  • ERC-20 tokeny jsou přenášeny pomocí funkcí transfer nebo transferFrom
    • Když uživatel odešle tokeny na adresu kontraktu pomocí těchto funkcí, tokeny jsou přeneseny bez ohledu na to, zda je přijímající kontrakt navržen k jejich zpracování
  1. Nedostatek upozornění
    • Přijímající kontrakt nedostává žádné upozornění nebo zpětné volání, že mu byly odeslány nějaké tokeny
    • Pokud přijímající kontrakt postrádá mechanismus pro zpracování příchozích tokenů (například fallback funkci nebo speciální funkci pro správu přijetí tokenů), tokeny jsou fakticky na adrese tohoto kontraktu zaseknuté
  2. Bez vestavěné manipulace
    • Standard ERC-20 nemá povinnou funkci, kterou by přijímající kontrakty musely implementovat, což vede k situacím, kdy kontrakty nejsou schopny příchozí tokeny správně spravovat

Možná řešení

I když není možné tomuto problému s ERC-20 zcela zabránit, existují metody, které umožňují výrazně snížit možnost ztráty tokenů pro koncového uživatele:

  • Nejčastějším problémem je, když uživatel pošle tokeny na adresu samotného kontraktu tokenu (např. USDT vložené na adresu kontraktu tokenu USDT). Doporučuje se omezit funkci transfer(..) tak, aby takové pokusy o převod vrátila zpět. Zvažte přidání kontroly require(_to != address(this)); v rámci implementace funkce transfer(..).
  • Funkce transfer(..) obecně není určena k vkládání tokenů do kontraktů. Vzor approve(..) & transferFrom(..) se namísto toho používá k vkládání tokenů ERC-20 do kontraktů. Je možné omezit funkci převodu tak, aby se s ní zakázalo vkládání tokenů do jakýchkoli kontraktů, může to však narušit kompatibilitu s kontrakty, které předpokládají, že tokeny lze vkládat do kontraktů pomocí funkce trasnfer(..) (např. u poolů likvidity Uniswap).
  • Vždy předpokládejte, že tokeny ERC-20 mohou skončit ve vašem kontraktu, i když váš kontrakt nemá nikdy žádné přijímat. Na straně příjemce neexistuje žádný způsob, jak zabránit náhodným vkladům nebo je odmítnout. Doporučuje se implementovat funkci, která by umožnila extrahovat náhodně vložené tokeny ERC-20.
  • Zvažte použití alternativních standardů tokenů.

Z tohoto problému vzešly některé alternativní standardy, jako například ERC-223 nebo ERC-1363.

Další čtení

Další standardy zaměnitelných tokenů

Byl tento článek užitečný?