TP Blockchain Ethereum - NFT

Utilisez de préférence la version Anglaise de ce sujet.

Les Token non fongibles (NFT) sont des jetons cryptographiquement uniques qui sont liés à un contenu numérique (et parfois physique), fournissant une preuve de propriété. Ils sont utilisés dans de nombreux cas, notamment pour les œuvres d'art, les objets de collection numériques, la musique et les articles (assets) de jeux vidéo.

Dans ce TP nous vous proposons de développer un smart contract simple respectant la norme ERC-721 que nous déploierons ensuite sur la blockchain de test Goerli.

Ce smart contract devra nous permettra entre autre de stocker une URI pointant vers un fichier de description au format JSON stocker idéalement dans un système de fichiers distribué (ex: IPFS). Notez que ce fichier de description contiendra également une URI pointant vers votre oeuvre d'art numérique que vous aurez préalablement créé.

Finalement, puisque nous allons respecter quelques standard de fait vous pourrez exposer et mettre en vente votre oeuvre sur le très connu marketplace de NFT OpenSea.

CryptoPunk

Étape préliminaire

Avant de faire ce TP nous allons vous demander de créer une petite oeuvre sous forme d'image png ou jpeg que vous déposerez sur IPFS (Interplanetary File System). IPFS est un système distribué pour le stockage et l'accès aux fichiers, sites web, applications et données. Il convient parfaitement au stockage et à l'adressage des données pour les NFT.

  1. Créez une oeuvre d'art ! :-)
  2. Installer IPFS sur votre poste (IPFS CLI)
  3. Déposez votre oeuvre sur IPFS (ex: ipfs add myPieceOfArt.jpg)
  4. Notez le CID (un hash). Votre oeuvre devrait être disponible via la passerelle ipfs (https://ipfs.io/ipfs/QmVzeepjhqRz3...)

Si vous rencontrez des problèmes pour installer ou utiliser IPFS voici quelques CIDs.

  • QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq
  • QmaRwFBUjYhVGjP3XKxeZyNuS6X9u2uhMk9oguP6Za1jx2
  • ...

Le smart contract ERC-721

Afin de nous simplifier la vie et maximiser nos chances de déployer un smart contract bien écrit nous allons nous appuyer sur les smart contract audités de chez Openzeppelin.

Voici quelques indications:

  1. Votre Smart contract devrait importez de chez Openzeppelin le contrat ERC721URIStorage.sol (Remarque: celui-ci hérite de ERC721.sol)
  2. votre contrat pourra alors hériter de ERC721URIStorage (ex: contract PieceOfArtCollectible is ERC721URIStorage).
  3. déclarez ensuite un attribut public de type uint256 nommé tokenCounter.
  4. votre constructeur fera appel au constructeur ERC721. Passez lui en paramètre un nom et un symbole sous forme de chaine de caractères (ex: constructor() ERC721("PieceOfArt","POA")).
  5. créez une fonction createCollectible qui prend en paramètre une string pour l'URI du token (ex: function createCollectible(string tokenURI)) et qui retourne un uint256 qui est l'indice du dernier token créé. Dans cette fonction,
    1. déclarez un uint256 newTokenId initialisé a tokenCounter.
    2. faites appel à la fonction _safeMint(...), puis à la fonction _setTokenURI(...)
    3. incrémenter tokenCounter
    4. retournez newTokenId (ex: return newTokenId;)

Voilà votre contrat est prêt. Une fois que vous l'aurez testé localement, déployez le sur Goerli.

Fichier de description (meta data)

Un NFT peut être seulement représenté par un identifiant unique (token_id) d'un contrat ERC-721. Dans la pratique nous pouvons aussi associer a cet identifiant des meta données qui fourniront des propriétés supplémentaires à notre NFT comme un nom par exemple. Ces meta données pourront alors être exploitées par des applications tierces.

Nous vous proposons de créer un fichier de description au format JSON. Nommez le avec l'extension .json (ex: NFT.json) Si vous respectez ce format le marketplace Opensea pourra en faire le rendu dans son interface utilisateur. Pour associer plus de Meta data a votre NFT vous pouvez consulter cette page.

Exemple de fichier JSON:

{
    "name": "POA",
    "description": "A short description of my piece of art...",
    "image": "https://ipfs.io/ipfs/Qm...?filename=image.png",
    "attributes": [
        {
            "trait_type": "Beauty",
            "value": 100
        }
    ]
}

Ce fichier json est a déployer sur IPFS par exemple, et son URL est a passer en paramètre à la fonction createCollectible() du Smart contract.

Étape finale

A présent le Smart contract est déployé sur Goerli. Le fichier .json de description et l'image du NFT sont accessibles à leurs URL respectives (de préférence sur un système de fichiers paire-à-paire distribué comme IPFS).

Vous pouvez vous rendre sur le testnet de OpenSea : https://testnets.opensea.io/ suivit de votre adresse de compte ethereum (cf. metamask). Ex: https://testnets.opensea.io/0x52Bf31... Vous devriez pouvoir visualiser tous les NFT associer à votre adresse.

Alternativement, vous pouvez consulter un NFT en particulier associé a votre contrat ERC-721 en passant à l'URL https://testnets.opensea.io/assets/ l'adresse du contrat suivit du token_id. Ex: https://testnets.opensea.io/assets/0x287cb.../0 ici le token_id est 0.