Cos’è lo standard token ERC-721 e come funziona nella blockchain?

Cos’è lo standard token ERC-721?
ERC-721 è uno standard di Ethereum per NFT: token unici che non puoi scambiare uno a uno come se fossero tutti uguali. Ogni NFT ha un proprio numero, il tokenId. Così un contratto può tenere traccia con precisione di quale indirizzo possiede quale NFT.
Puoi immaginarlo come delle tessere d’ingresso numerate. Due tessere possono entrambe dare accesso allo stesso evento, ma la tessera numero 14 non è tecnicamente la stessa tessera della numero 15. Con ERC-721 funziona allo stesso modo: ogni token è registrato separatamente.
Un token ERC-721 viene identificato da due elementi insieme: l’indirizzo dello smart contract e il tokenId. Questa combinazione punta a un token specifico su una chain di Ethereum.
Lo standard dà agli smart contract un insieme comune di regole. Così un crypto wallet, un marketplace o un’altra app possono riconoscere come mostrare, richiedere e inviare un NFT compatibile. Anche ERC-165 fa parte di questo. È un modo per permettere al software di controllare quale standard supporta un contratto.
Importante da sapere: un tokenId unico significa solo che il token è unico all’interno di quel contratto. Non prova automaticamente che l’immagine collegata, l’opera d’arte o un oggetto fisico siano davvero unici o autentici.
In breve
- ERC-721 è uno standard di Ethereum per token unici e non fungibili.
- Ogni NFT ha un proprio tokenId all’interno di un contratto.
- L’indirizzo del contratto e il tokenId insieme identificano un token specifico.
- Lo standard aiuta wallet e app a riconoscere e gestire gli NFT nello stesso modo.
- Un tokenId unico non prova automaticamente che l’opera o l’oggetto collegato sia autentico.
Come funziona lo standard token ERC-721?
Uno smart contract ERC-721 tiene traccia di quale indirizzo blockchain sia il proprietario attuale di ogni tokenId. Con ownerOf(tokenId) puoi richiedere quel proprietario. Con balanceOf(indirizzo) vedi quanti NFT possiede in totale un indirizzo.
Quando qualcuno invia un NFT, il contratto cambia il proprietario registrato. Per questo tipo di trasferimento esistono tra gli altri transferFrom e safeTransferFrom.
La seconda opzione è di solito particolarmente importante quando invii un NFT a un altro smart contract. safeTransferFrom controlla allora se il contratto ricevente può accettare token ERC-721. Se non può, la transazione viene annullata. Così eviti che un NFT resti bloccato per errore in un contratto che non sa cosa farne.
Un proprietario può anche dare autorizzazione a un altro indirizzo:
- Con
approvequell’indirizzo può spostare un singolo tokenId specifico. - Con
setApprovalForAllun operatore ottiene il permesso di spostare tutti i token ERC-721 di quel proprietario.
Quest’ultima autorizzazione è quindi piuttosto ampia. Concedi un permesso del genere solo a un contratto di cui ti fidi. Un’autorizzazione per un singolo NFT scade quando quell’NFT viene trasferito.
Il contratto salva anche trasferimenti e autorizzazioni negli eventi: notifiche nel registro pubblico della blockchain. Le app possono usarli per seguire quando un NFT cambia proprietario o quando un operatore riceve il permesso.
ERC-721 non stabilisce come debbano funzionare minting o burning. Minting è la creazione e l’emissione di un nuovo token, mentre burning rimuove un token in modo permanente dalla circolazione. Chi crea il contratto decide da solo chi può fare minting, quanti token possono esistere e se i trasferimenti, per esempio, possono essere messi temporaneamente in pausa o avere dei costi.
A cosa servono i token ERC-721?
I token ERC-721 si usano per elementi che vuoi tracciare singolarmente, perché ogni token può avere caratteristiche proprie o una funzione propria. Pensa ad arte digitale, oggetti da collezione, elementi di gioco, biglietti per eventi, certificati, token di accesso e identità online.
Possono anche essere usati per collegare alcuni asset fisici a un token (pensa a una casa). Ma qui c’è una differenza importante: ERC-721 registra soprattutto chi gestisce il token sulla blockchain. Se quel token fuori dalla blockchain dia davvero diritto a un biglietto, a un oggetto o ad altri diritti dipende dal creatore, dai metadata, dalle condizioni del contratto e da eventuali accordi separati.
Dato che molte app capiscono la stessa interfaccia ERC-721, la maggior parte delle applicazioni può in linea di principio riconoscere e trasferire un token. Questo rende lo standard utile nel mondo crypto, senza che ogni app debba capire da zero come funziona il contratto di ogni collezione NFT. Per questo è anche molto facile per le persone avviare da sole un progetto NFT.
Quale ruolo hanno i token ERC-721 negli NFT?
ERC-721 è una base tecnica molto usata per gli NFT su Ethereum. Lo standard gestisce il nucleo: identificare un NFT separato, registrare il proprietario, inviare l’NFT e gestire le autorizzazioni.
NFT significa semplicemente non-fungible token: un token che non è scambiabile come unità uguale ad altre. ERC-721 non è la stessa cosa di NFT. È uno standard specifico con cui puoi costruire NFT. Un NFT può quindi usare anche un altro standard tecnico.
Un contratto ERC-721 può inoltre contenere regole extra. Per esempio regole per il minting, l’accesso a certe funzioni, i metadata o limitazioni sui trasferimenti.
Le royalties non sono incluse di default in ERC-721. ERC-2981 è uno standard separato con cui si possono richiedere informazioni sulle royalties. Questo però non significa ancora che un marketplace le paghi automaticamente: il pagamento dipende dal marketplace o da un’altra parte coinvolta.
Come vengono registrati i diritti di proprietà digitali?
Un contratto ERC-721 registra quale indirizzo è proprietario di un certo tokenId. Chiunque può controllare questa registrazione tecnica di proprietà tramite ownerOf e tramite gli eventi Transfer del contratto. Dopotutto tutto è visibile sulla blockchain, quindi il proprietario di un NFT è quasi sempre verificabile o consultabile. Anche gli smart contract usati per la collezione NFT sono in molti casi consultabili.
Immagina che il tokenId 42 passi dall’indirizzo A all’indirizzo B. Allora l’indirizzo B diventa il proprietario registrato del tokenId 42. Nel frattempo l’indirizzo del contratto e il tokenId 42 restano la stessa identificazione tecnica di quel token.
L’NFT può anche avere metadata: informazioni extra sul token. Tramite tokenURI il contratto può rimandare, per esempio, a un file JSON con un nome, una descrizione e un link a un’immagine.
Questa proprietà on-chain non è automaticamente la stessa cosa di copyright, proprietà intellettuale o proprietà legale dell’immagine, dell’opera o di un oggetto fisico. Possedere l’NFT quindi non significa automaticamente ottenere tutti i diritti sul contenuto collegato. Per questo di solito serve un accordo separato e valido.
Qual è la differenza tra ERC-721 ed ERC-20?
ERC-20 è stato creato per token fungibili, mentre ERC-721 è stato creato per token non fungibili. Fungibile significa che ogni unità è uguale alle altre. Un token ERC-20 dello stesso tipo è quindi uguale a un altro token ERC-20 di quel tipo.
Con ERC-20 invii una quantità, per esempio 10 token. Con ERC-721 invii un tokenId specifico, per esempio il token numero 42.
Le differenze principali in breve:
- Trasferimento: ERC-20 riguarda un numero di token. ERC-721 riguarda un tokenId unico.
- Proprietà: Con ERC-20 un indirizzo ha un saldo. Con ERC-721 il contratto tiene traccia di chi è il proprietario per ogni tokenId.
- Autorizzazione: ERC-20 usa un allowance per un importo spendibile. ERC-721 può dare il permesso per un singolo NFT o per tutti gli NFT di un proprietario.
- Divisibilità: I token ERC-20 possono essere inviati in quantità. Un token ERC-721 è tecnicamente un singolo tokenId separato e non ha una funzione standard
decimals. - Quantità totale: ERC-20 ha
totalSupplycome funzione standard. In ERC-721totalSupplyè disponibile solo se il contratto usa l’estensione opzionale ERC721Enumerable.
Anche i metadata in ERC-721 sono opzionali. Un contratto quindi non deve per forza offrire un nome, un simbolo o tokenURI, anche se la maggior parte dei contratti NFT lo fa.
Come si crea un token ERC-721?
Crei un token ERC-721 costruendo uno smart contract e aggiungendo la logica di minting al suo interno. ERC-721 da solo non offre una funzione pubblica di minting già pronta, quindi è lo sviluppatore a decidere come nascono i nuovi token.
In pratica di solito si fa così:
-
Costruisci o usa un contratto ERC-721 Uno sviluppatore scrive uno smart contract in Solidity che supporta ERC-721 ed ERC-165. Spesso si estende un’implementazione base già testata come OpenZeppelin ERC721, invece di scrivere tutto da zero.
-
Definisci le regole per il minting Il contratto deve stabilire chi può fare minting, come vengono assegnati i tokenId, se esiste un numero massimo di token e se il minting costa denaro. Anche il controllo degli accessi rientra qui: non tutti devono poter creare automaticamente nuovi NFT.
-
Assegna un nuovo tokenId Per ogni nuovo NFT il contratto deve usare un tokenId che non esiste ancora. Quel tokenId viene assegnato a un indirizzo valido, quindi non a un indirizzo vuoto.
-
Usa il minting safe quando possibile
_safeMintcontrolla, nel caso di un destinatario che è a sua volta uno smart contract, se quel contratto può ricevere token ERC-721. Questo riduce il rischio che un NFT appena creato resti bloccato presso il destinatario. -
Distribuisci ed esegui le transazioni Dopo il deployment su una chain EVM, minting, trasferimenti e autorizzazioni vengono eseguiti come transazioni blockchain. Costi e rischi dipendono dalla chain scelta e soprattutto dal codice del contratto.
Copiare un contratto non basta per usarlo in modo sicuro. Logiche extra per pagamenti, whitelist, upgrade o royalties possono introdurre nuove vulnerabilità. Per questo i test e, quando opportuno, un audit di sicurezza indipendente sono importanti.
Quali elementi contiene uno smart contract ERC-721?
Uno smart contract ERC-721 deve offrire un nucleo fisso di funzioni ed eventi. Questa interfaccia standard fa sì che altre app sappiano come interagire con gli NFT.
Gli elementi obbligatori includono tra gli altri:
balanceOf: richiede quanti NFT possiede un indirizzo.ownerOf: richiede quale indirizzo è proprietario di uno specifico tokenId.transferFromesafeTransferFrom: inviano un NFT a un altro indirizzo.approveegetApproved: gestiscono e controllano l’autorizzazione per un singolo NFT.setApprovalForAlleisApprovedForAll: gestiscono e controllano l’autorizzazione per tutti gli NFT di un proprietario.Transfer,ApprovaleApprovalForAll: eventi con cui le app possono seguire trasferimenti e autorizzazioni.supportsInterface: la funzione ERC-165 con cui le app possono controllare che il contratto supporti ERC-721.
Esistono anche estensioni opzionali. ERC721Metadata aggiunge name, symbol e tokenURI. ERC721Enumerable aggiunge tra le altre cose totalSupply e funzioni per elencare i tokenId.
Inoltre un contratto pratico spesso ha funzioni proprie, come una funzione di minting, ruoli per gli amministratori, regole di vendita, una base URI o una funzione di burn. Il modo in cui il contratto salva internamente i dati, per esempio proprietari e autorizzazioni, non è definito da ERC-721. Lo standard riguarda ciò che il contratto deve poter fare verso l’esterno.
Come vengono collegati i metadata a un token ERC-721?
I metadata vengono di solito collegati tramite tokenURI(tokenId), una funzione opzionale che restituisce un riferimento alle informazioni su uno specifico NFT. Questa URI può per esempio puntare a un file JSON.
In un file JSON di questo tipo possono esserci campi come name, description e image. Un marketplace NFT o un crypto wallet può usare questi dati per mostrare il nome, la descrizione e l’immagine del token. Dato che ogni NFT ha statistiche proprie, puoi vederlo come una specie di figurina da collezione. Alcune figurine sono uniche e rare, mentre altre sono comuni. È anche così che in generale viene determinato il valore degli NFT.
Uno sviluppatore può salvare una URI separata per ogni NFT. Un’altra opzione è usare una base URI e aggiungere per ogni token un numero o una parte specifica. OpenZeppelin offre per questo tra le altre cose ERC721URIStorage con _setTokenURI.
Importante da tenere a mente: ERC-721 non obbliga i metadata a essere permanenti o immutabili. Una URI è un riferimento testuale a dati fuori dalla blockchain. Chi può modificare la URI e dove si trova il contenuto dipende dal contratto e dalla struttura di archiviazione. Un’immagine o un file JSON quindi possono eventualmente cambiare o non essere più disponibili.
Quali sono i vantaggi e gli svantaggi di ERC-721?
ERC-721 è utile perché offre un modo chiaro e condiviso per creare token unici su Ethereum. Ma lo standard non risolve ogni problema legato agli NFT.
Vantaggi:
- Interoperabilità: wallet, broker, aste e altre app possono riconoscere e gestire gli NFT ERC-721 in modo prevedibile.
- Tracciabilità: per ogni tokenId è visibile quale indirizzo è proprietario e quali trasferimenti ci sono stati.
- Autorizzazioni flessibili: puoi dare a un indirizzo il permesso per un singolo NFT, oppure a un operatore per tutti i tuoi NFT.
- Estendibile: metadata ed enumerazione sono opzionali. Un contratto può quindi restare piccolo oppure aggiungere funzioni extra.
Svantaggi e rischi:
- Molto potere con
setApprovalForAll: un operatore approvato può spostare tutti i token ERC-721 del tuo indirizzo. Controlla regolarmente queste autorizzazioni e concedile solo a contratti di cui ti fidi. - Rischio con
transferFrom: un NFT può restare bloccato se il contratto ricevente non è in grado di gestirlo.safeTransferFromcontrolla meglio questo aspetto, ma la chiamata esterna aggiuntiva può introdurre un rischio di reentrancy. In quel caso un altro contratto prova a richiamare di nuovo una funzione durante l’esecuzione. - Costi più alti con l’enumerazione: ERC721Enumerable spesso non viene usato, perché elencare i token on-chain può costare molto gas in più.
- Nessuna garanzia fuori dalla blockchain: ERC-721 non prova automaticamente copyright, autenticità delle dichiarazioni, metadata permanenti o un pagamento obbligatorio delle royalties.
In breve: ERC-721 fornisce una base tecnica per la proprietà e il trasferimento di un NFT. Se una collezione sia anche sicura e quali diritti vi siano esattamente collegati dipende dal codice del contratto, dai diritti di gestione, dai metadata e dagli accordi fuori dalla blockchain.
Conclusione
ERC-721 è lo standard di Ethereum che dà agli NFT una propria identità. Uno smart contract registra per ogni tokenId chi è il proprietario, come viene trasferito un NFT e chi ha il permesso di farlo.
Questo rende ERC-721 utile per arte digitale, elementi di gioco, biglietti e token di accesso, tra le altre cose. Allo stesso tempo un NFT non è automaticamente prova di copyright, autenticità o proprietà legale di ciò a cui è collegato. Quindi non guardare solo l’NFT in sé, ma anche le regole del contratto, i metadata e le autorizzazioni che concedi a un contratto.