Pomóż nam zaktualizować tę stronę

🌏

Dostępna jest nowsza wersja tej strony, ale tylko w języku angielskim. Pomóż nam przetłumaczyć najnowszą wersję.

Ta strona jest niekompletna. Jeśli jesteś ekspertem w temacie, edytuj tę stronę i wzbogać ją swą mądrością.

Standard tokena ERC-20

Ostatnia edycja: , Invalid DateTime
Edit page

Wprowadzenie

Czym jest token?

Tokeny mogą reprezentować praktycznie wszystko w Ethereum:

  • punkty reputacji na platformie internetowej
  • umiejętności postaci w grze
  • bilety na loterię
  • aktywa finansowe, takie jak udział w spółce
  • walutę fiducjarną, taką jak USD
  • uncję złota
  • i więcej...

Tak potężna funkcja Ethereum musi być obsługiwana przez solidny standard, prawda? To jest dokładnie to, gdzie ERC-20 odgrywa rolę! Te standardy umożliwiają programistom tworzenie aplikacji tokenów, które mogą współpracować z innymi produktami i usługami.

Co to jest ERC-20?

ERC-20 wprowadza standard dla tokenów wymiennych, innymi słowy mają one właściwość, która sprawia, że każdy token jest dokładnie taki sam (pod względem typu i wartości) jak inny token. Na przykład token ERC-20 działa podobnie jak ETH, oznacza, że 1 token jest i będzie zawsze równy wszystkim pozostałym tokenom.

Warunki wstępne

Treść

ERC-20 (Ethereum Request for Comments 20) zaproponowany przez Fabiana Vogelstellera w listopadzie 2015 r. jest standardem tokenów, który implementuje API dla tokenów w inteligentnych kontraktach.

Zapewnia funkcje takie jak przesyłanie tokenów z jednego konta na drugie, uzyskanie aktualnego salda tokenów na koncie oraz całkowitą podaż tokenów dostępnych w sieci. Poza tym ma również kilka innych funkcji , takich jak zatwierdzanie, że ilość tokenów z konta może być wydana przez konto osoby trzeciej.

Jeśli inteligentny kontrakt implementuje następujące metody i zdarzenia, można go nazwać kontraktem tokena ERC-20, a po wdrożeniu będzie odpowiedzialny za śledzenie utworzonych tokenów w Ethereum.

Od EIP-20:

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)
10
Pokaż wszystko
📋 Kopiuj

Wydarzenia

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

Przykłady

Zobaczmy, dlaczego standard jest tak ważny, aby ułatwić nam sprawdza kontraktów z tokenami ERC-20 na Ethereum. Potrzebujemy tylko interfejsu binarnego Umowy (ABI), aby utworzyć interfejs dla każdego tokenu ERC-20. Jak możesz zobaczyć poniżej, użyjemy uproszczonego ABI, aby zmniejszyć złożoność przykładu.

Przykład Web3.py

Najpierw upewnij się, że zainstalowałeś Web3.py bibliotekę Pythona:

1$ pip install web3
2
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
13# It will expose only the methods: balanceOf(address), decimals(), symbol() and totalSupply()
14simplified_abi = [
15 {
16 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
17 'name': 'balanceOf',
18 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
19 'stateMutability': 'view', 'type': 'function', 'constant': True
20 },
21 {
22 'inputs': [],
23 'name': 'decimals',
24 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
25 'stateMutability': 'view', 'type': 'function', 'constant': True
26 },
27 {
28 'inputs': [],
29 'name': 'symbol',
30 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
31 'stateMutability': 'view', 'type': 'function', 'constant': True
32 },
33 {
34 'inputs': [],
35 'name': 'totalSupply',
36 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
37 'stateMutability': 'view', 'type': 'function', 'constant': True
38 }
39]
40
41dai_contract = w3.eth.contract(address=w3.toChecksumAddress(dai_token_addr), abi=simplified_abi)
42symbol = dai_contract.functions.symbol().call()
43decimals = dai_contract.functions.decimals().call()
44totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
45addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
46
47# DAI
48print("===== %s =====" % symbol)
49print("Total Supply:", totalSupply)
50print("Addr Balance:", addr_balance)
51
52weth_contract = w3.eth.contract(address=w3.toChecksumAddress(weth_token_addr), abi=simplified_abi)
53symbol = weth_contract.functions.symbol().call()
54decimals = weth_contract.functions.decimals().call()
55totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
56addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
57
58# WETH
59print("===== %s =====" % symbol)
60print("Total Supply:", totalSupply)
61print("Addr Balance:", addr_balance)
62
Pokaż wszystko
📋 Kopiuj

Dalsza lektura