Standardul de token ERC-20
Ultima modificare: @nicklcanada(opens in a new tab), 11 iunie 2024
Introducere
Ce este un token?
Tokenurile pot reprezenta practic orice în Ethereum:
- puncte de reputație într-o platformă online
- abilități ale unui personaj într-un joc
- bilete de loterie
- active financiare cum ar fi o acțiune într-o întreprindere
- o monedă fiat precum USD
- o uncie de aur
- și altele...
O funcţionalitate atât de puternică a lui Ethereum trebuie gestionată printr-un standard robust, nu? Exact aici își joacă rolul ERC-20! Aceste standarde permit dezvoltatorilor să construiască aplicații pentru tokenuri care sunt interoperabile cu alte produse și servicii.
Ce este ERC-20?
ERC-20 introduce un standard pentru Tokenurile Fungibile, cu alte cuvinte, acestea au o proprietate care face ca fiecare Token să fie exact la fel (ca tip și valoare) cu alt Token. De exemplu, un token ERC-20 acționează exact ca ETH-ul, însemnând că 1 token este și va fi întotdeauna egal cu toate celelalte tokenuri.
Condiții prealabile
Conținut
ERC-20 (Cerere de comentarii Ethereum 20), propus de Fabian Vogelsteller în noiembrie 2015, este un standard de tokenuri care implementează un API pentru tokenuri în cadrul contractelor inteligente.
Exemple de funcționalități pe care le oferă ERC-20:
- transferă tokenuri de la un cont la altul
- obține soldul curent de tokenuri al unui cont
- obține numărul total de tokenuri disponibile în rețea
- aprobă dacă o sumă de tokenuri dintr-un cont poate fi cheltuită de un cont terț
Dacă un contract inteligent implementează următoarele metode și evenimente, poate fi numit contract de tokenuri ERC-20 și, odată implementat, va avea responsabilitatea de a ţine evidența tokenurilor create pe Ethereum.
De la EIP-20(opens in a new tab):
Metode
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)Afișează totCopiați
Evenimente
1event Transfer(address indexed _from, address indexed _to, uint256 _value)2event Approval(address indexed _owner, address indexed _spender, uint256 _value)Copiați
Exemple
Să vedem cât de important este un standard pentru a ne simplifica lucrurile când inspectăm orice contract de tokenuri ERC-20 pe Ethereum. Avem nevoie doar de Interfața binară cu aplicaţia (ABI) a contractului pentru a crea o interfață pentru orice token ERC-20. După cum puteţi vedea mai jos, vom folosi un ABI simplificat, pentru a facilita înţelegerea exemplului.
Exemplu Web3.py
În primul rând aveţi grijă să instalaţi librăria Python Web3.py(opens in a new tab):
1pip install web3
1from web3 import Web3234w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))56dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped eter (WETH)89acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 21011# Aceasta este o interfață binară simplificată pentru aplicația contractuală (ABI) a unui token Contract ERC-20.12# Va expune doar metodele: 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': True19 },20 {21 'inputs': [],22 'name': 'decimals',23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },26 {27 'inputs': [],28 'name': 'symbol',29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],30 'stateMutability': 'view', 'type': 'function', 'constant': True31 },32 {33 'inputs': [],34 'name': 'totalSupply',35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 }38]3940dai_contract = w3.eth.contract(address=w3.toChecksumAddress(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**decimals44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals4546# DAI47print("===== %s =====" % symbol)48print("Total Supply:", totalSupply)49print("Addr Balance:", addr_balance)5051weth_contract = w3.eth.contract(address=w3.toChecksumAddress(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**decimals55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals5657# WETH58print("===== %s =====" % symbol)59print("Total Supply:", totalSupply)60print("Addr Balance:", addr_balance)Afișează totCopiați