Ir al contenido principal

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.

Traducir la página
Ver en inglés

¡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.

Prerrequisitos

  • Cuentas
  • Contratos inteligentes
  • Estándares de tókenes

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.

Ejemplos de funcionalidades que proporciona ERC-20:

  • transferir tokens de una cuenta a otra
  • obtener el saldo actual de tokens de una cuenta
  • obtener el siministro total del token disponible en la red
  • aprobar si una cantidad de tokens de una cuenta puede gastarse con 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" # 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# 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.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

Más información

¿Le ha resultado útil este artículo?