Ethereum et smart contracts · 5 min · démo interactive

NFT : ce qu'un ERC-721 contient vraiment

Un NFT est souvent un numéro, un propriétaire et un lien. Inspecte trois tokens simulés, puis casse le lien pour voir ce qu'il reste.

L’idée en une phrase

Un NFT est une entrée dans un contrat qui associe un numéro unique à une adresse propriétaire, et qui pointe le plus souvent vers une image stockée ailleurs.

La norme ERC-721 définit cette interface. Là où un token ERC-20 compte des quantités interchangeables, un ERC-721 suit des objets numérotés : le token 7 n'est pas le token 8. La propriété de ce numéro est garantie par la chaîne. Le reste dépend de l'endroit où le créateur a placé les fichiers.

La démo

Bobpropriétaire, sur la chaîne
Serveur weboù vivent les métadonnées
–état de la lecture

Sur la chaîne

ownerOf(3) : Bob tokenURI(3) : https://api.exemple.test/nft/3.json

Ce que le wallet résout

Image chargée par la démo
Les métadonnées JSON s'affichent ici.
Choisis un token et casse quelque chose.

Sans JavaScript, compare ces trois valeurs de tokenURI : data:application/json;base64,eyJuYW1lIjo… contient les métadonnées elles-mêmes ; ipfs://bafy…/2.json désigne un contenu par son empreinte ; https://api.exemple.test/nft/3.json désigne un serveur, dont le contenu peut changer sans laisser de trace sur la chaîne.

Cette démo est un modèle en JavaScript, pas un contrat exécuté : les propriétaires, le réseau et les trois stockages sont simulés. Les décodages Base64 et les empreintes SHA-256 sont réels, mais l'adresse ipfs:// affichée est simplifiée. Un vrai CID encode aussi le format, et le fichier y est découpé avant hachage.

Intégrer cette démo

Copie ce code sur ton site, ton cours ou ton blog. La démo reste gratuite ; garde simplement le lien vers protocole.org.

Pourquoi ça compte

Claire achète une illustration vendue comme NFT. Trois ans plus tard, le studio ferme et son serveur s'éteint. Son wallet affiche un carré vide. La blockchain indique toujours qu'elle possède le token 4217 : ce fait n'a pas bougé. Mais l'image n'a jamais été sur la blockchain, et le lien mène désormais à une erreur.

Avant d'attribuer une quelconque permanence à un NFT, il faut donc lire son tokenURI. Le mot « NFT » ne dit rien du stockage, et l'interface d'une place de marché affiche la même chose dans tous les cas, tant que le lien répond.

Le code

Le token 1 de la démo construit ses métadonnées comme ceci. Change le nom ou les attributs : tu verras grandir l'URI, et avec elle le coût indicatif d'une écriture de ces octets dans le stockage du contrat.

Clique sur Lancer pour exécuter ce code dans ton navigateur.

Ce qui se passe vraiment

Commence par le token 3, sur serveur. Clique sur « Transférer le token » : seul ownerOf change. Le contrat écrit une nouvelle adresse et rien d'autre. Une vente de NFT ne déplace aucun fichier.

Clique ensuite sur « Modifier les métadonnées ». Le nom et l'image changent, alors que tokenURI reste identique au caractère près. La chaîne n'a enregistré aucun événement. Ton NFT montre autre chose, et rien sur la blockchain ne permet de le prouver. L'état passe à « Non vérifiable » parce qu'un wallet n'a aucune empreinte à comparer.

Passe au token 2. La même modification provoque un rejet. L'adresse ipfs:// dérive du contenu : un fichier différent aurait une autre adresse. Le contenu ne peut donc pas être falsifié en silence. Coupe le stockage : le token 2 disparaît aussi. Un lien IPFS garantit l'intégrité, pas la disponibilité. Il faut qu'au moins un nœud continue d'héberger le fichier, ce que le jargon appelle épingler.

Le token 1 résiste aux deux pannes. Son tokenURI contient tout, encodé en Base64, y compris l'image SVG. Tant que la chaîne existe, un nœud peut le reconstituer. Et il refuse la modification, parce que ce contrat simulé n'offre aucune fonction pour le faire. Ce point n'est pas automatique : beaucoup de vrais contrats gardent une fonction pour changer l'URI de base.

Voici ce qu'impose la norme, en version résumée :

  • Dans le cœur d'ERC-721 : ownerOf, balanceOf, les transferts, les approbations. Le lien avec les fichiers n'y figure pas.
  • Dans l'extension de métadonnées, optionnelle : name, symbol, tokenURI(id).
  • Hors de la chaîne par convention : le JSON avec name, description, image, souvent attributes. Le contrat ne lit pas ce fichier et n'en vérifie rien.

Dans la vraie vie

La raison du compromis est le prix. Le panneau de code montre l'écart : stocker un mot neuf de 32 octets coûte 20 000 gas. Dix kilo-octets dépassent déjà six millions de gas, alors qu'un lien tient sur quelques mots. La plupart des collections écrivent donc un lien, et les projets entièrement on-chain se limitent à de petites images vectorielles ou génératives. Le calculateur de gas convertit ces unités en coût réel selon le prix du moment.

Posséder un NFT, c'est contrôler un numéro dans un contrat, grâce à ta clé privée. Cela ne donne pas de droit d'auteur sur l'image, sauf si une licence le prévoit. N'importe qui peut copier le fichier : ce qui ne se copie pas, c'est l'écriture dans le contrat. Les redevances aux créateurs ne sont pas non plus garanties par ERC-721, leur versement dépend des places de marché.

L'authenticité repose sur l'adresse du contrat. Rien n'empêche quelqu'un de redéployer une collection avec les mêmes images : techniquement ce sont d'autres tokens, et seul le contrat d'origine fait référence.

Ce qui peut mal tourner

  • Lien mort. Serveur fermé, nom de domaine expiré, passerelle IPFS en panne : le NFT reste, l'image non.
  • Métadonnées modifiables. Une baseURI reste souvent modifiable par le propriétaire du contrat. Une image achetée peut être remplacée après coup.
  • Contrefaçons. Un clone porte le même nom et la même image. Vérifie l'adresse du contrat, pas la vignette.
  • setApprovalForAll. Cette signature accorde à un opérateur tous tes tokens de la collection. C'est une technique classique de vol : lis les approbations et le phishing.
  • NFT reçus sans demande. Un token envoyé sur ton adresse peut renvoyer vers un site piégé. Ne connecte pas ton wallet pour le « réclamer ».
  • Confondre token et droits. Sans licence explicite, acheter le token ne donne pas le droit d'exploiter l'œuvre.

Teste-toi

1. Que stocke le plus souvent un contrat ERC-721 pour un token ?
2. Qu'apporte une adresse ipfs:// par rapport à une adresse https:// ?
3. Après la vente d'un NFT, qu'est-ce qui change sur la chaîne ?