Přejít na hlavní obsah
Change page

Standard tokenu ERC-20

Úvod

Co je to token?

Tokeny mohou v Ethereu představovat prakticky cokoliv:

  • body reputace 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 další...

Takto mocná funkce Etherea musí být řízena robustním standardem, že? Přesně v tom 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 poskytování dalších funkcí pro .

Co je ERC-20?

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

Předpoklady

Hlavní část

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

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

  • převod tokenů z jednoho účtu na druhý
  • získání aktuálního zůstatku tokenů na účtu
  • získání celkové nabídky tokenu dostupné v síti
  • schválit, zda může být určité množství tokenů z účtu utraceno účtem třetí strany

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

Z EIP-20 (opens in a new tab):

Metody

Události

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

Příklady

Pojďme se podívat, proč je standard tak důležitý pro zjednodušení kontroly jakéhokoli kontraktu tokenu ERC-20 na Ethereu. K vytvoření rozhraní pro jakýkoli token ERC-20 potřebujeme pouze aplikační binární rozhraní kontraktu (ABI). Jak můžete vidět níže, použijeme zjednodušené ABI, aby byl příklad co nejsrozumitelnější.

Příklad s Web3.py

Nejprve se ujistěte, že máte nainstalovanou knihovnu Web3.py (opens in a new tab) pro Python:

pip install web3

Známé problémy

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

K 20. 6. 2024 byly kvůli tomuto problému ztraceny tokeny ERC-20 v hodnotě nejméně 83 656 418 USD. Upozorňujeme, že čistá implementace ERC-20 je k tomuto problému náchylná, pokud nad rámec standardu neimplementujete sadu dalších omezení, jak je uvedeno níže.

Když jsou tokeny ERC-20 odeslány do chytrého kontraktu, který není navržen pro práci s tokeny ERC-20, mohou být tyto tokeny trvale ztraceny. K tomu dochází proto, že přijímající kontrakt nemá funkci pro rozpoznání nebo reakci na příchozí tokeny a ve standardu ERC-20 neexistuje žádný mechanismus, který by přijímající kontrakt o příchozích tokenech informoval. Hlavní způsoby, jakými se tento problém projevuje, jsou:

  1. Mechanismus převodu tokenů
  • Tokeny ERC-20 se převádějí pomocí funkcí transfer nebo transferFrom
    • Když uživatel odešle tokeny na adresu kontraktu pomocí těchto funkcí, tokeny jsou převedeny bez ohledu na to, zda je přijímající kontrakt navržen tak, aby s nimi dokázal pracovat
  1. Chybějící upozornění
    • Přijímající kontrakt neobdrží upozornění ani zpětné volání (callback), že mu byly odeslány tokeny
    • Pokud přijímající kontrakt postrádá mechanismus pro zpracování tokenů (např. záložní funkci nebo vyhrazenou funkci pro správu příjmu tokenů), tokeny v podstatě uvíznou na adrese kontraktu
  2. Žádné vestavěné zpracování
    • Standard ERC-20 neobsahuje povinnou funkci, kterou by přijímající kontrakty musely implementovat, což vede k situaci, kdy mnoho kontraktů není schopno správně spravovat příchozí tokeny

Možná řešení

Ačkoli není možné tomuto problému u ERC-20 zcela zabránit, existují metody, které by umožnily výrazně snížit pravděpodobnost ztráty tokenů pro koncového uživatele:

  • Nejčastějším problémem je, když uživatel odešle tokeny na samotnou adresu kontraktu tokenu (např. USDT vložené na adresu kontraktu tokenu USDT). Doporučuje se omezit funkci transfer(..), aby takové pokusy o převod zvrátila. Zvažte přidání kontroly require(_to != address(this)); v rámci implementace funkce transfer(..).
  • Funkce transfer(..) obecně není navržena pro vkládání tokenů do kontraktů. Místo toho se pro vkládání tokenů ERC-20 do kontraktů používá vzor approve(..) & transferFrom(..). Je možné omezit funkci převodu tak, aby neumožňovala vkládání tokenů do jakýchkoli kontraktů, nicméně to může narušit kompatibilitu s kontrakty, které předpokládají, že tokeny lze do kontraktů vkládat pomocí funkce transfer(..) (např. fondy 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řijmout. Neexistuje způsob, jak zabránit nebo odmítnout náhodné vklady na straně příjemce. 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 je ERC-223 nebo ERC-1363.

Další čtení

Další standardy zaměnitelných tokenů

Návody: Vývoj s ERC-20 na Ethereu