Přeskočit na hlavní obsah

Porozumění chytrému kontraktu tokenu ERC-20

smart kontrakt účty
tokeny
solidity
erc-20
Začátečník
jdourlens
5. dubna 2020
4 minuta čtení

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;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
Zobrazit vše

Zde 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;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
17
18
19contract ERC20Basic is IERC20 {
20
21 string public constant name = "ERC20Basic";
22 string public constant symbol = "ERC";
23 uint8 public constant decimals = 18;
24
25
26 mapping(address => uint256) balances;
27
28 mapping(address => mapping (address => uint256)) allowed;
29
30 uint256 totalSupply_ = 10 ether;
31
32
33 constructor() {
34 balances[msg.sender] = totalSupply_;
35 }
36
37 function totalSupply() public override view returns (uint256) {
38 return totalSupply_;
39 }
40
41 function balanceOf(address tokenOwner) public override view returns (uint256) {
42 return balances[tokenOwner];
43 }
44
45 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 }
52
53 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 }
58
59 function allowance(address owner, address delegate) public override view returns (uint) {
60 return allowed[owner][delegate];
61 }
62
63 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
64 require(numTokens <= balances[owner]);
65 require(numTokens <= allowed[owner][msg.sender]);
66
67 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še

Další 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

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