Ayúdenos a actualizar esta página.

🌏

Disponemos de una nueva versión de esta página, pero solo está en inglés por ahora. Ayúdenos a traducir la última versión.

¡Aquí no hay ningún error!🐛

Esta página no se está traduciendo. Por ahora hemos dejado esta página en inglés.

Estándar de token ERC-20

Última edición: , Invalid DateTime
Editar página

Introducción

¿Qué es un token?

Los tokens pueden representar cualquier elemento virtualmente en Ethereum:

  • puntos de reputación en la plataforma online
  • las habilidades de un personaje en un juego
  • boletos de lotería
  • activos financieros como una acción en una empresa
  • una moneda fiat como el USD
  • un lingote de oro
  • y más...

Una característica tan poderosa de Ethereum debe ser manejada con un estándar sólido, ¿verdad? ¡Ahí es exactamente donde el ERC desempeña su papel! Este estándar permite a los desarrolladores construir aplicaciones de token que son interoperables con otros productos y servicios.

¿Qué es el ERC-20?

El ERC-20 introduce un estándar para los tokens funcionales, es decir, tienen una propiedad que hace que cada token sea exactamente igual (en tipo y valor) que otro token. Por ejemplo, un token ERC-20 actúa igual que ETH, es decir, 1 token es y siempre será igual a todos los demás tokens.

Requisitos previos

Cuerpo

El ERC-20 (Ethereum Request for Comments 20), propuesto por Fabian Vogelsteller en Noviembre 2015, es un estándar de token que implementa una API para tokens dentro de contratos inteligentes.

Proporciona funcionalidades como transferir tokens de una cuenta a otra, para obtener el saldo actual del token de una cuenta y también el suministro total del token disponible en la red. Además de estos también tiene otras funcionalidades como aprobar que una cantidad de token de una cuenta puede ser gastada por una cuenta de terceros.

Si un contrato inteligente implementa los siguientes métodos y eventos, se puede llamar un contrato de token ERC-20, y una vez implementado, será el responsable de llevar un seguimiento de los tokens creados en Ethereum.

Desde EIP-20:

Métodos

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
Mostrar todo
📋 Copiar

Eventos

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

Ejemplos

Vamos a ver cómo un estándar es tan importante para que las cosas sean sencillas para que inspeccionemos cualquier contrato de token de ERC-20 en Ethereum. Sólo necesitamos la Interfaz binaria de aplicaciones de contrato (ABI) para crear una interfaz a cualquier token ER-20. Como puedes ver a continuación, usaremos una ABI simplificada, para que sea un ejemplo de fricción bajo.

Ejemplo de Web3.py

Primero asegúrate de haber instalado Web3.py Python library:

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" # Ether envuelto (WETH)
8
9acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
10
11# Esta es una interfaz binaria simplificada de la aplicación de contratos (ABI) de un contrato de token ERC.
12# Solo expondrá los métodos: 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.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**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.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**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)
61
Mostrar todo
📋 Copiar

Leer más

¿Ha respondido esta página a su pregunta?