Ugrás a fő tartalomra
Change page

ERC-20 Tokenszabvány

Utolsó módosítás: @Satglow(opens in a new tab), 2024. június 11.

Bevezetés

Mi is az a token?

A tokenek gyakorlatilag bármit képviselhetnek az Ethereumon:

  • reputációs pontokat egy online platformon
  • egy karakter képességeit egy játékban
  • pénzügyi eszközöket, mint például részesedést egy cégben
  • fiat valutát, mint az USD
  • egy uncia aranyat
  • és még sok mást...

Egy ilyen erős Ethereum funkciót egy szintén erős szabványnak kell kezelnie, igaz? És pontosan itt jön képbe az ERC-20 szerepe! Ez a szabvány lehetővé teszi a fejlesztők számára, hogy olyan tokenalkalmazásokat fejlesszenek, amelyek együttműködnek más termékekkel és szolgáltatásokkal. Az ERC-20 szabványt arra is használják, hogy további funkciókat biztosítsanak az számára.

Mi az az ERC-20?

Az ERC-20 bevezeti a helyettesíthető tokenekre vonatkozó szabványt, vagyis minden egyes token pontosan ugyanaz (típusban és értékben), mint egy másik. Például egy ERC-20 token úgy viselkedik, mint az ETH, vagyis 1 token egyenlő és egyenlő is marad az összes többi tokennel.

Előfeltételek

  • Számlák
  • Okosszerződések
  • Token szabványok

Törzs

Az ERC-20 (Ethereum Request for Comments 20), melyet Fabian Vogelsteller javasolt 2015. novemberében, egy tokenszabvány, mely egy API-t implementál a tokenek számára az okosszerződéseken belül.

Az ERC-20 által biztosított funkciók például:

  • tokenek átutalása egyik számláról a másikra
  • egy számla aktuális tokenegyenlegének lekérdezése
  • a hálózaton rendelkezésre álló tokenek teljes készlete
  • jóváhagyja, hogy egy számláról származó token összegét elköltheti-e egy másik számla

Ha egy okosszerződés implementálja a következő metódusokat és eseményeket, akkor egy ERC-20 tokenszerződésnek lehet nevezni, és a telepítés után a létrejött tokenek számontartásáért lesz felelős az Ethereumon.

Az EIP-20-ból(opens in a new tab):

Metódusok

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)
Összes megjelenítése
Másolás

Események

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

Példák

Nézzük meg, miért olyan fontos egy szabvány, hogy egyszerűbbé tegye számunkra azt, hogy bármely ERC-20 tokenszerződést megtekinthessük az Ethereumon. Csak a szerződés Alkalmazás bináris interfészére (ABI) lesz szükség, hogy egy felületet készítsünk bármely ERC-20 tokennek. Ahogy lentebb láthatja, egy egyszerűsített ABI-t használunk, hogy egyszerűbb példával éljünk.

Web3.py példa

Először győződjön meg arról, hogy a Web3.py(opens in a new tab) Python könyvtár telepítve van:

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# Ez egy ERC-20 token szerződés egyszerűsített Application Binary Interface-e (ABI).
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)
Összes megjelenítése
Másolás

Ismert problémák

ERC-20-token-elfogadási problémák

Amikor ERC-20 tokeneket küldenek olyan okosszerződésbe, amely nem tudja azokat kezelni, akkor ezek végleg elvesznek. Ennek az az oka, hogy a befogadó szerződésnek nincs olyan funkcionalitása, hogy felismerje vagy válaszoljon a bejövő tokenekre, és nincs olyan mechanizmus az ERC-20-szabványban, ami figyelmeztetné a szerződést az érkező tokenekről. Ez a probléma a következő módokon nyilvánul meg:

  1. Tokenátviteli mechanizmus
  • Az ERC-20 tokeneket a transfer vagy a transferFrom függvényekkel lehet küldeni
    • Amikor a felhasználó tokeneket küld egy szerződéscímre ezekkel a függvényekkel, a tokenek elmennek attól függetlenül, hogy a szerződés képes-e azokat fogadni
  1. A figyelmeztetés hiánya
    • A befogadó szerződés nem kap figyelmeztetést vagy visszahívást, hogy tokenek érkeztek hozzá
    • Ha a befogadó szerződés nem tud tokeneket kezelni (például nincs egy fallback függvény vagy egy dedikált függvény, ami a tokent fogadná), akkor a tokenek beragadnak a szerződés címén
  2. Nincs beépített kezelés
    • Az ERC-20 szabvány nem köti ki a kötelező funkciót a befogadó szerződésnek, ezért számos szerződés képtelen a beérkező tokenek megfelelő kezelésére

Néhány alternatív szabvány létezik ennek a problémának a kezelésére, mint az ERC-223

További olvasnivaló

További helyettesíthető tokenekről szóló szabványok

  • ERC-223
  • ERC-777
  • ERC-4626 - Tokenizált értékmegőrzőre vonatkozó szabvány

Hasznosnak találta a cikket?