Porozumění chytrému kontraktu tokenu ERC-20
Jeden z nejvýznamnějších standardů chytrých kontraktů na Ethereu je známý jako ERC-20, který se stal technickým standardem používaným pro všechny chytré kontrakty na ethereovém blockchainu pro implementaci zaměnitelných tokenů.
ERC-20 definuje společný seznam pravidel, která by měly dodržovat všechny zaměnitelné ethereové tokeny. V důsledku toho tento tokenový standard umožňuje vývojářům všech typů přesně předvídat, jak budou nové tokeny fungovat v širším systému Etherea. To zjednodušuje a usnadňuje práci vývojářů, protože mohou pokračovat ve své práci s vědomím, že každý nový projekt nebude třeba předělávat pokaždé, když je vydán nový token, pokud se token řídí pravidly.
Zde jsou, prezentovány jako rozhraní, funkce, které musí ERC-20 implementovat. Pokud si nejste jisti, co je to rozhraní, přečtěte si náš článek o OOP programování v Solidity (opens in a new tab).
1pragma solidity ^0.6.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}Zobrazit všeZde je vysvětlení řádek po řádku, k čemu jednotlivé funkce slouží. Poté si představíme jednoduchou implementaci tokenu ERC-20.
Gettery
1function totalSupply() external view returns (uint256);Vrátí množství tokenů v oběhu. Tato funkce je getter a nemění stav kontraktu. Mějte na paměti, že v Solidity neexistují čísla s plovoucí desetinnou čárkou (floats). Proto většina tokenů používá 18 desetinných míst a celkovou zásobu a další výsledky vrátí jako 1000000000000000000 pro 1 token. Ne každý token má 18 desetinných míst a na to si opravdu musíte dávat pozor při práci s tokeny.
1function balanceOf(address account) external view returns (uint256);Vrátí množství tokenů vlastněných adresou (account). Tato funkce je getter a nemění stav kontraktu.
1function allowance(address owner, address spender) external view returns (uint256);Standard ERC-20 umožňuje, aby adresa udělila povolení jiné adrese, aby z ní mohla čerpat tokeny. Tento getter vrací zbývající počet tokenů, které bude moci spender utratit jménem ownera. Tato funkce je getter, nemění stav kontraktu a ve výchozím nastavení by měla vracet 0.
Funkce
1function transfer(address recipient, uint256 amount) external returns (bool);Přesune amount tokenů z adresy volajícího funkce (msg.sender) na adresu příjemce. Tato funkce spouští událost Transfer definovanou později. Vrací hodnotu true, pokud byl převod možný.
1function approve(address spender, uint256 amount) external returns (bool);Nastaví výši allowance, kterou smí spender převést ze zůstatku volajícího funkce (msg.sender). Tato funkce spouští událost Approval. Funkce vrací, zda bylo povolení úspěšně nastaveno.
1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);Přesune amount tokenů z adresy sender na adresu recipient pomocí mechanismu povolení. Částka (amount) je poté odečtena z povolení volajícího. Tato funkce spouští událost Transfer.
Události
1event Transfer(address indexed from, address indexed to, uint256 value);Tato událost se spustí, když je množství tokenů (value) odesláno z adresy from na adresu to.
V případě ražby nových tokenů je převod obvykle z (from) adresy 0x00..0000, zatímco v případě pálení tokenů je převod na (to) 0x00..0000.
1event Approval(address indexed owner, address indexed spender, uint256 value);Tato událost se spustí, když owner schválí množství tokenů (value) k použití pro spendera.
Základní implementace tokenů ERC-20
Zde je nejjednodušší kód, ze kterého můžete vycházet při tvorbě svého tokenu ERC-20:
1pragma solidity ^0.8.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}171819contract ERC20Basic is IERC20 {2021 string public constant name = "ERC20Basic";22 string public constant symbol = "ERC";23 uint8 public constant decimals = 18;242526 mapping(address => uint256) balances;2728 mapping(address => mapping (address => uint256)) allowed;2930 uint256 totalSupply_ = 10 ether;313233 constructor() {34 balances[msg.sender] = totalSupply_;35 }3637 function totalSupply() public override view returns (uint256) {38 return totalSupply_;39 }4041 function balanceOf(address tokenOwner) public override view returns (uint256) {42 return balances[tokenOwner];43 }4445 function transfer(address receiver, uint256 numTokens) public override returns (bool) {46 require(numTokens <= balances[msg.sender]);47 balances[msg.sender] = balances[msg.sender]-numTokens;48 balances[receiver] = balances[receiver]+numTokens;49 emit Transfer(msg.sender, receiver, numTokens);50 return true;51 }5253 function approve(address delegate, uint256 numTokens) public override returns (bool) {54 allowed[msg.sender][delegate] = numTokens;55 emit Approval(msg.sender, delegate, numTokens);56 return true;57 }5859 function allowance(address owner, address delegate) public override view returns (uint) {60 return allowed[owner][delegate];61 }6263 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {64 require(numTokens <= balances[owner]);65 require(numTokens <= allowed[owner][msg.sender]);6667 balances[owner] = balances[owner]-numTokens;68 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;69 balances[buyer] = balances[buyer]+numTokens;70 emit Transfer(owner, buyer, numTokens);71 return true;72 }73}Zobrazit všeDalší vynikající implementací tokenového standardu ERC-20 je implementace ERC-20 od OpenZeppelin (opens in a new tab).
Stránka naposledy aktualizována: 21. srpna 2025