Ayúdanos a actualizar esta página.

🌏

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

Esta página está incompleta. Si eres un experto en el tema, por favor edita esta página y esparce tu sabiduría.

Estándar de token no fungible ERC-721

Última edición: , Invalid DateTime
Edit page

Introducción

¿Qué es un token no fungible o funcional?

Una ficha no funcional (NFT) se utiliza para identificar algo o a alguien de una manera única. Este tipo de token es perfecto para ser usado en plataformas que ofrecen artículos recolectables, acceder a llaves, boletos de lotería, asientos numerados para conciertos y partidos deportivos, etc. Este tipo especial de token tiene unas posibilidades asombrosas, por lo que merece un estándar adecuado, el ERC-721 vino a solucionarlo.

¿Qué es ERC-721?

El ERC-721 introduce una norma para NFT, en otras palabras, este tipo de ficha es único y puede tener un valor diferente que otra ficha del mismo contrato inteligente, tal vez debido a su antigüedad, rareza o incluso a algo como su visualidad. Espera, ¿visual?

¡Sí! Todos los NFT tienen una variable uint256 llamada tokenId, así para cualquier Contrato ERC-721, el par dirección del contrato, uint256 tokenId debe ser único globalmente. Digo que una dapp puede tener un "convertidor" que usa el tokenId como entrada y produce una imagen de algo fresco, como zombies, armas, habilidades o increíbles gatitos.

Requisitos previos

Cuerpo

El ERC-721 (Ethereum Request for Comments 721), propuesto por William Entriken, Dieter Shirley, Jacob Evans, Nastassia Sachs en enero de 2018, es un Estándar de Token No Fungible que implementa una API para tokens dentro de Smart Contracts.

Proporciona funcionalidades como transferir tokens de una cuenta a otra, para obtener el saldo actual del token de una cuenta y además del 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-721, y una vez desplegado será el responsable de llevar un seguimiento de los tokens creados en Ethereum.

De EIP-721:

Métodos

1 function balanceOf(address _owner) external view returns (uint256);
2 function ownerOf(uint256 _tokenId) external view returns (address);
3 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
4 function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
5 function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
6 function approve(address _approved, uint256 _tokenId) external payable;
7 function setApprovalForAll(address _operator, bool _approved) external;
8 function getApproved(uint256 _tokenId) external view returns (address);
9 function isApprovedForAll(address _owner, address _operator) external view returns (bool);
10
Mostrar todo
📋 Copiar

Eventos

1 event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
2 event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
3 event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
4
📋 Copiar

Ejemplos

Vamos a ver la importancia de un estándar para que inspeccionemos fácilmente cualquier contrato de token de ERC-721 en Ethereum. Sólo necesitamos la Interfaz binaria de aplicaciones de contrato (ABI) para crear una interfaz a cualquier Token ERC-721. Como puedes ver a continuación, usaremos un ABI simplificado, para que sea un ejemplo de fricción baja.

Ejemplo de Web3.py

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

1$ pip install web3
2
1from Web3 import Web3
2from web3.utils.events import get_event_data
3
4
5w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth. om"))
6
7ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Contrato de ventas de CryptoKitties
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Subasta de ventas de CryptoKitties
10
11# Este es un Contrato simplificado de aplicación binaria (ABI) de un Contrato ERC-721 NFT.
12# Sólo expondrá los métodos: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply()
13simplified_abi = [
14 {
15 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],
16 'nombre': 'balanceOf',
17 'salidas': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
18 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
19 },
20 {
21 'inputs': [],
22 'nombre': 'nombre',
23 'salidas': [{'internalType': 'string', 'name': '', 'type': 'string'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': Verdadero
25 },
26 {
27 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],
28 'name': 'ownerOf',
29 'salidas': [{'internalType': 'address', 'name': '', 'type': 'address'}],
30 'pagable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'nombre': 'símbolo',
35 'salidas': [{'internalType': 'string', 'name': '', 'type': 'string'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 },
38 {
39 'inputs': [],
40 'name': 'totalSupply',
41 'salidas': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
42 'stateMutability': 'view', 'type': 'function', 'constant': Verdadero
43 },
44]
45
46ck_extra_abi = [
47 {
48 'inputs': [],
49 'nombre': 'pregnantKitties',
50 'salidas': [{'name': '', 'type': 'uint256'}],
51 'pagable': False, 'stateMutability': 'view', 'type': 'function', 'constant': Verdadero
52 },
53 {
54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
55 'nombre': 'isPregnant',
56 'outputs': [{'name': '', 'type': 'bool'}],
57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
58 }
59]
60
61ck_contract = w3. th.contract(address=w3.toChecksumAddress(ck_token_addr), abi=simplified_abi+ck_extra_abi)
62name = ck_contract.functions.name().call()
63symbol = ck_contract.functions.symbol().call()
64kitties_auctions = ck_contract.functions.balanceOf(acc_address). all()
65print(f"{name} [{symbol}] NFT en subastas: {kitties_auctions}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties(). all()
68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
69
70# Utilizar el evento de transferencia ABI para obtener información sobre Kitties transferidos.
71tx_event_abi = {
72 'anónimo': False,
73 'entradas': [
74 {'indexed': False, 'name': 'from', 'type': 'address'},
75 {'indexed': False, 'name': 'to', 'type': 'address'},
76 {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],
77 'nombre': 'Transferir',
78 'type': 'event'
79}
80
81# Necesitamos la firma del evento para filtrar los registros
82event_signature = w3. ha3(text="Transfer(address,address,uint256)").hex()
83
84logs = w3.eth.getLogs({
85 "fromBlock": w3.eth.blocknumber - 120,
86 "address": w3. oChecksumadress(ck_token_addr),
87 "topics": [event_signature]
88})
89
90# Notas:
91# - 120 bloques es el rango máximo para CloudFlare Provider
92# - Si no has encontrado ningún evento de Transferencia, también puedes intentar obtener un tokenId en:
93# https://etherscan. o/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
94# Haz clic para expandir los registros del evento y copiar su argumento "tokenId"
95
96recent_tx = [get_event_data(tx_event_abi, log)["args"] para logs de logs]
97
98kitty_id = recent_tx[0]['tokenId'] # Pegue el "tokenId" aquí desde el enlace de arriba
99is_pregnant = ck_contract. unctions.isPregnant(kitty_id).call()
100print(f"{name} [{symbol}] NFTs {kitty_id} está embarazado: {is_pregnant}")
101
Mostrar todo
📋 Copiar

El contrato de CryptoKitties tiene algunos eventos interesantes aparte de los estándar.

Revisemos dos de ellos, Embarazada y Nacimiento.

1# Usar la ABI de eventos de Embarazada y Nacimiento para obtener información sobre nuevos gatitos.
2ck_extra_events_abi = [
3 {
4 'anonymous': False,
5 'inputs': [
6 {'indexed': False, 'name': 'owner', 'type': 'address'},
7 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
8 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
9 {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],
10 'name': 'Pregnant',
11 'type': 'event'
12 },
13 {
14 'anonymous': False,
15 'inputs': [
16 {'indexed': False, 'name': 'owner', 'type': 'address'},
17 {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},
18 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
19 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
20 {'indexed': False, 'name': 'genes', 'type': 'uint256'}],
21 'name': 'Birth',
22 'type': 'event'
23 }]
24
25# We need the event's signature to filter the logs
26ck_event_signatures = [
27 w3.sha3(text="Pregnant(address,uint256,uint256,uint256)").hex(),
28 w3.sha3(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
29]
30
31# Here is a Pregnant Event:
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_logs = w3.eth.getLogs({
34 "fromBlock": w3.eth.blockNumber - 120,
35 "address": w3.toChecksumAddress(ck_token_addr),
36 "topics": [ck_extra_events_abi[0]]
37})
38
39recent_pregnants = [get_event_data(ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# Here is a Birth Event:
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_logs = w3.eth.getLogs({
44 "fromBlock": w3.eth.blockNumber - 120,
45 "address": w3.toChecksumAddress(ck_token_addr),
46 "topics": [ck_extra_events_abi[1]]
47})
48
49recent_births = [get_event_data(ck_extra_events_abi[1], log)["args"] for log in birth_logs]
50
Mostrar todo
📋 Copiar
  • Etherscan NFT Tracker enumera los principales NFT en Ethereum por volumen de transferencias.
  • CryptoKitties es un juego centrado en criables, coleccionables y tan adorables criaturas que llamamos CryptoKitties.
  • Sorare es un juego de fútbol de fantasía global en el que puedes coleccionar coleccionables de ediciones limitadas, gestiona tus equipos y compite para ganar premios.
  • Ethereum Name Service (ENS) ofrece un Nombre en forma descentralizada de abordar los recursos tanto dentro y fuera de la cadena de bloques utilizando nombres sencillos y legibles por humanos.
  • Unstoppable Domains es una empresa con sede en San Francisco que crea dominios en blockchains. Los dominios de blockchain reemplazan las direcciones de criptomonedas por nombres legibles por humanos y se pueden usar para habilitar sitios web resistentes a la censura.
  • Las tarjetas no encadenadas son un TCG en la blockchain de Ethereum, que utiliza los NFT para representar la propiedad real en los activos del juego.

Leer más