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.
É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.
- Créez une oeuvre d'art ! :-)
- Installer IPFS sur votre poste (IPFS CLI)
- Déposez votre oeuvre sur IPFS (ex:
ipfs add myPieceOfArt.jpg
) - 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:
- Votre Smart contract devrait importez de chez Openzeppelin le contrat
ERC721URIStorage.sol
(Remarque: celui-ci hérite deERC721.sol
) - votre contrat pourra alors hériter de
ERC721URIStorage
(ex:contract PieceOfArtCollectible is ERC721URIStorage
). - déclarez ensuite un attribut
public
de typeuint256
nommétokenCounter
. - 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")
). - 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 unuint256
qui est l'indice du dernier token créé. Dans cette fonction,- déclarez un
uint256 newTokenId
initialisé atokenCounter
. - faites appel à la fonction
_safeMint(...)
, puis à la fonction_setTokenURI(...)
- incrémenter
tokenCounter
- retournez
newTokenId
(ex:return newTokenId;
)
- déclarez un
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.