Estándar de token no fungible ERC-721
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);10Mostrar todoCopiar
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);4Copiar
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 web32
1from Web3 import Web32from web3.utils.events import get_event_data345w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth. om"))67ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Contrato de ventas de CryptoKitties89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Subasta de ventas de CryptoKitties1011# 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': True19 },20 {21 'inputs': [],22 'nombre': 'nombre',23 'salidas': [{'internalType': 'string', 'name': '', 'type': 'string'}],24 'stateMutability': 'view', 'type': 'function', 'constant': Verdadero25 },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': True31 },32 {33 'inputs': [],34 'nombre': 'símbolo',35 'salidas': [{'internalType': 'string', 'name': '', 'type': 'string'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 },38 {39 'inputs': [],40 'name': 'totalSupply',41 'salidas': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],42 'stateMutability': 'view', 'type': 'function', 'constant': Verdadero43 },44]4546ck_extra_abi = [47 {48 'inputs': [],49 'nombre': 'pregnantKitties',50 'salidas': [{'name': '', 'type': 'uint256'}],51 'pagable': False, 'stateMutability': 'view', 'type': 'function', 'constant': Verdadero52 },53 {54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],55 'nombre': 'isPregnant',56 'outputs': [{'name': '', 'type': 'bool'}],57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True58 }59]6061ck_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}")6667pregnant_kitties = ck_contract.functions.pregnantKitties(). all()68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")6970# 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}8081# Necesitamos la firma del evento para filtrar los registros82event_signature = w3. ha3(text="Transfer(address,address,uint256)").hex()8384logs = w3.eth.getLogs({85 "fromBlock": w3.eth.blocknumber - 120,86 "address": w3. oChecksumadress(ck_token_addr),87 "topics": [event_signature]88})8990# Notas:91# - 120 bloques es el rango máximo para CloudFlare Provider92# - Si no has encontrado ningún evento de Transferencia, también puedes intentar obtener un tokenId en:93# https://etherscan. o/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# Haz clic para expandir los registros del evento y copiar su argumento "tokenId"9596recent_tx = [get_event_data(tx_event_abi, log)["args"] para logs de logs]9798kitty_id = recent_tx[0]['tokenId'] # Pegue el "tokenId" aquí desde el enlace de arriba99is_pregnant = ck_contract. unctions.isPregnant(kitty_id).call()100print(f"{name} [{symbol}] NFTs {kitty_id} está embarazado: {is_pregnant}")101Mostrar todoCopiar
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 }]2425# We need the event's signature to filter the logs26ck_event_signatures = [27 w3.sha3(text="Pregnant(address,uint256,uint256,uint256)").hex(),28 w3.sha3(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),29]3031# Here is a Pregnant Event:32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog33pregnant_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})3839recent_pregnants = [get_event_data(ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]4041# Here is a Birth Event:42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a43birth_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})4849recent_births = [get_event_data(ck_extra_events_abi[1], log)["args"] for log in birth_logs]50Mostrar todoCopiar
NFT populares
- 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
- EIP-721: ERC-721 Estándar de token no fungible
- OpenZeppelin: Documentos de ERC-721
- OpenZeppelin: Implementación de ERC-721