Standard tokena ERC-20
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)10Pokaż wszystkoKopiuj
Wydarzenia
1event Transfer(address indexed _from, address indexed _to, uint256 _value)2event Approval(address indexed _owner, address indexed _spender, uint256 _value)34Kopiuj
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 web32
1from web3 import Web3234w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))56dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)89acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 21011# This is a simplified Contract Application Binary Interface (ABI) of an ERC-20 Token Contract.1213# 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': True20 },21 {22 'inputs': [],23 'name': 'decimals',24 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],25 'stateMutability': 'view', 'type': 'function', 'constant': True26 },27 {28 'inputs': [],29 'name': 'symbol',30 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],31 'stateMutability': 'view', 'type': 'function', 'constant': True32 },33 {34 'inputs': [],35 'name': 'totalSupply',36 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],37 'stateMutability': 'view', 'type': 'function', 'constant': True38 }39]4041dai_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**decimals45addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals4647# DAI48print("===== %s =====" % symbol)49print("Total Supply:", totalSupply)50print("Addr Balance:", addr_balance)5152weth_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**decimals56addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals5758# WETH59print("===== %s =====" % symbol)60print("Total Supply:", totalSupply)61print("Addr Balance:", addr_balance)62Pokaż wszystkoKopiuj
Dalsza lektura
- EIP-20: standard tokena ERC-20
- OpenZeppelin – tokeny
- OpenZeppelin – implementacja ERC-20
- ConsenSys – wdrożenie ERC-20