53 – NFTs, technical & personal review
Ils sont partout . De véritables œuvres d’art, mais aussi des vaches, des masques, des grenouilles, des patates, des jeux de cartes, des riddles…. On les achète, on les admire, on les trouve moches, on a pour certains du mal à les vendre, et clairement tous ne se valent pas. On entend parler de ERC-1155, ERC-721, de metadatas, certains se sont vendus des millions, d’autres tombent dans l’oubli, d’autres ont une utilité. Comment comprendre ce que l’on a sous les yeux et faire des choix éclairés ?
Je ne referai pas l’histoire des NFTs, je ne m’y connais clairement pas suffisamment. Il y a moins d’un an je n’avais aucune idée de ce que c’était réellement alors qu’ils existent depuis bien plus longtemps, mais je pense en savoir assez aujourd’hui pour vous partager mon expérience, ce que j’en ai compris et l’avenir que je leur prédis.
Cet article s’apparente plus à des travaux pratiques que certains d’entre vous avez peut-être connus au Lycée alors si vous souhaitez tirer le meilleur parti de cette lecture je vous invite à lancer quelques onglets supplémentaires et à aller vérifier les informations que je donne ci-dessous au fur et à mesure, comme des grands. C’est en forgeant que l’on devient forgeron, et un Powerpoint ou ou jpeg ne tombe jamais en panne. Alors manipulez ! Enfin, il fallait bien un exemple pour faire du concret alors j’ai choisi de me baser sur le projet CFN, tant qu’à faire. Qu’il vous intéresse ou non ne change rien, il sera question ici d’aller lire un contrat et comprendre ce que l’on a sous les yeux. Je rappelle les adresses Songbird CFN et la collection actuelle pour que vous puissiez aller par vous-même regarder.
Songbird Explorer : https://songbird-explorer.flare.network/
CFN-Mint : 0x7fc6d36E0ab7C4860Ada1499970f2c8C0e552A0f
CFN Community Wallet : 0x532B287aA00165dA67c41f03a9cBCb83a48bB25E
Collection CFN-King : 0xCD6eD3410187d6774AA0a3aE32d232A263D5B100
WhitePaper (pour les curieux) : HS14 – CFN NFTs « White Paper »
En dehors d’un NFT anthologique de DocMarmott sur Polygon tous ceux que j’ai circulent sur Songbird mais la blockchain n’a finalement que peu d’importance en dehors des frais. Pourquoi ? Car ils répondent tous aux mêmes standards, les deux principaux étant ERC-721 et ERC-1155. ERC veut dire « Ethereum Request for Comments ». Encore et toujours Ethereum, et pour cause ! Ethereum a été la première blockchain à proposer des contrats intelligents et beaucoup de standards y ont été créés, il est donc naturel de retrouver ces mêmes standards sur les autres blockchains compatibles avec EVM, Ethereum Virtual Machine. Les autres blockchains auraient pu inventer leur propre langage de programmation mais en se rendant nativement compatibles avec celui d’Ethereum elles simplifient énormément la portabilité des programmes déjà existants sur Ethereum vers les leurs.
Quand une personne crée un NFT ou une collection de NFTs, il y a toute une série de paramètres qu’elle va devoir définir afin de créer le « contrat ». Quelle sera la norme de contrat utilisée ? Combien y aura-t-il de NFTs au total dans la collection ? Quel sera le coût d’un mint ? … Et c’est l’adresse depuis laquelle le contrat sera crée qui sera à tout jamais liée aux NFTs créés, en tant que « Creator » des NFTs. A ne pas confondre avec le « Owner » du contrat. En effet une personne peut avoir construit une maison mais ne plus en être propriétaire. Et bien c’est exactement la même chose ici. La propriété d’un contrat est transférable d’une adresse à une autre. Il ne faut pas non plus confondre le owner d’un NFT avec le owner du contrat dont dépend un NFT.
Pour trouver ces informations, la seule source fiable est l’explorer de Songbird. Oubliez Sparkles, NFTSO, FLRDrops ou autre. Suivez le contrat. On retrouve bien le « creator » dans l’en-tête du contrat, où se trouvent des informations que l’on ne peut pas modifier, ici l’adresse de CFN-Mint.
Le « Owner » du contrat lui se trouve dans l’onglet « Read Contract », ici l’adresse du Community Wallet.
Pourquoi avoir transféré la propriété du contrat à l’autre adresse ? Car nous sommes deux (avec Mouradski) à détenir la clé privée de CFN-Mint, alors que je suis le seul à détenir celle du Community Wallet.
Maintenant vous allez vite vous rendre compte à quelle vitesse ça peut vite se compliquer inutilement. Rendez-vous sur Sparkles, sur la page de la collection :
« Created by CFN – Community Wallet ». Mmmmmm vraiment ? Il faut déjà savoir qu’une fois connecté à Sparkles avec votre wallet, vous pouvez personnaliser votre profil. Associer à votre adresse une image, un nom, un profil Twitter etc. pour faire plus joli. Evidemment pour des raisons d’anonymat beaucoup ne le font pas. J’ai donc personnalisé les deux adresses car je n’avais aucune raison de ne pas le faire. Si vous cliquez sur le nom « CFN – Community Wallet », vous verrez que c’est bien l’adresse indiquée comme « owner » dans l’explorer qui apparaît. C’est donc bien Sparkles qui interprète le « Owner » d’un contrat comme étant le « Creator ». Il devrait objectivement être écrit « Owned by », et pourquoi pas ajouter dessous « Created by ».
En cas de doute, c’est toujours, toujours, toujours l’explorer qui fait foi car il lit les données brutes directement depuis la blockchain et vous les affiche directement, sans fioritures, alors apprenez à vous en servir
J’expliquais plus haut que lorsque l’on crée une collection, il faut choisir la norme de contrat que l’on va utiliser. Comment ? Tout dépend du cas d’usage. Attention j’essaie de simplifier au maximum mais même comme ça reste un peu compliqué je trouve, accrochez-vous
ERC-721 est une norme dans laquelle chaque collection de NFTs dispose de son propre contrat, et où chaque NFT au sein de la collection dispose de son propre ID et est donc identifiable de façon unique. Chaque ID est également associé à l’adresse sur laquelle il se trouve. Contrat -> NFT#1:adresse1, NFT#2:Adresse2 etc. Comme une bibliothèque qui associerait chaque livre à la personne qui la lui a emprunté.
Avec la norme ERC-1155, là encore chaque collection dispose de son propre contrat, mais un même contrat peut régir plusieurs collections, et il n’est pas possible d’identifier un NFT de façon unique au sein d’une collection. Pourquoi ? Parce qu’ils n’ont pas d’ID, de numéros individuels. Contrairement au ERC-721, on associe pas l’ID d’un NFT à une adresse, mais une adresse à un certain nombre de NFT de cette collection. Ainsi on a d’une part Contrat -> Collection 1, Collection 2 etc. puis au sein de chaque collection Collection 1 -> Adresse1:quantité1, Adresse2:quantité2 etc.
Il est donc impossible de différencier deux NFTs de la même collection avec la norme ERC-1155. On parle de semi-fongibilité. Alors si par exemple votre but est de créer une collection de personnages avec des attributs comme la couleur des yeux, l’image de fond etc. vous n’aurez pas d’autre choix que de vous orienter vers le ERC-721.
La première chose à faire va maintenant être de regarder et comprendre ce qu’il y a dans le contrat intelligent d’un NFT. N’importe quel contrat de n’importe quel NFT peut être consulté sur l’explorer de la blockchain sur laquelle il a été créé. Suivant le standard ERC qui aura été choisi, certains champs seront présents par défaut car faisant partie de la définition du standard. Cependant la personne qui crée le contrat peut très bien ajouter des propriétés ou des fonctions pour enrichir le contrat du NFT et lui offrir ainsi de nouvelles fonctionnalités. Rendez-vous donc dans l’onglet « Read Contract » du CFN-King. A noter que l’onglet « Write Contract » n’est utilisable qu’à condition d’être connecté avec l’adresse « Owner » du contrat à l’explorer. Et oui, vous l’ignoriez peut-être mais on peut connecter son wallet à l’explorer.
https://songbird-explorer.flare.network/token/0xCD6eD3410187d6774AA0a3aE32d232A263D5B100/read-contract
Alors, qu’est-ce qu’on a là-dedans ? 27 champs. Comme expliqué plus haut, certains sont natifs du standard ERC-721 et d’autres ont été ajoutés par notre cuisinier en chef, Mouradski.
Je ne comprends rien, certains ont des champs où l’on peut écrire, d’autres non, tout est en anglais, help !
Et bien faisons-les dans l’ordre, soyons fous ! Tout d’abord sachez que vous ne pourrez rien casser ici car on y fait que de la consultation, alors n’hésitez pas à saisir une adresse de wallet dans les champs, peut-être la vôtre pour voir ce qu’il se passera quand vous cliquerez sur « Query ».
Un peu à la manière d’un dictionnaire où toute définition commence en précisant s’il s’agit d’un nom ou un verbe, masculin ou féminin etc., chacun de ces champs peut être classé. Natif au standard choisi ou non, fonction ou propriété/métadata avec le type de données pour les métadatas. Je n’apprendrai rien au développeurs ici mais pour les néophytes de la programmation :
– uint256 : Correspond à un chiffre entier (int=integer), donc pas de virgule, codé sur 256 bits.
– string : Chaîne de caractères. Cela peut être une URL, une adresse mail ou l’adresse de votre grand-mère. Attention, une chaîne de caractères peut contenir des chiffres ! Mais en informatique on ne peut additionner que deux chiffres entre eux, donc ici deux uint256 par exemple.
– bool : Un booléen soit Vrai / Faux.
Quand il s’agit d’une fonction, il y a généralement un champ de saisie qui permet d’exploiter la fonction comme par exemple de donner l’ID d’un NFT au sein de la collection pour récupérer l’adresse qui hold ce NFT en particulier.
1. airdropBalance (fonction, non natif) : Cette fonction a été utilisée dans le cadre du mint. Un utilisateur saisis une quantité, valide, l’adresse Owner mint le ou les NFTs et les envoie, les « airdrop », vers l’adresse de l’utilisateur. C’est un abus de langage dans le nom de la fonction en quelque sorte puisqu’il s’agit d’un simple transfert atomique. Elle n’a plus d’utilité maintenant que la collection a été mint et aurait pu être cachée de l’explorer car elle n’est exploitée que par une autre fonction, qui elle est cachée. Note pour plus tard (#parkerlewis) : A modifier si l’on souhaite être propres.
2. balanceOf (fonction, natif) : On saisit une adresse de Wallet, on valide avec Query et cela nous retourne le nombre de tokens détenus par l’adresse saisie.
3. baseURI (propriété, string, natif) : Peut contenir l’emplacement du visuel (image ou vidéo) du NFT, de préférence au format IPFS (InterPlanetary File System) plutôt qu’au format HTTP. Je dis « peut » car il existe plusieurs façon de faire, certains préférant utiliser la fonction getTokenURI(ID) . L’IPFS, indique un emplacement de stockage décentralisé dont le but est d’empêcher le créateur du NFT de modifier le visuel du NFT dans le temps. Si le créateur indique HTTP et que ça pointe vers son serveur Web, il lui suffirait de remplacer le visuel par un autre du même nom pour le modifier. Mais le propriétaire du contrat, le « owner », lui le peut toujours. En effet dans l’onglet « Write Contract » on peut voir que la fonction 14 indique SetBaseURI et permet donc de modifier l’image d’un NFT. Et oui ! Le propriétaire du contrat de votre NFT préféré peut modifier le visuel de ce dernier si l’envie lui prend.
4. cost (metadata, entier, non natif) : C’est le prix qu’il coûtera pour minter un NFT sur ce contrat. Oui, il y a beaucoup de « 0 » mais c’est une question d’unité. Cochez la case « WEI », qui est un héritage d’Ethereum, et vous aurez la valeur en SGB, 1 million. C’est une valeur intentionnellement élevée pour décourager quelqu’un de minter un NFT.
5. getApproved (fonction, natif) : Renvoie l’adresse autorisée à signer des transactions pour un ID en particulier. Non utilisé.
6. isApprovedForAll (fonction, natif) : Permet de déterminer si une adresse a le droit d’agir en tant qu’une autre adresse sur ce contrat en particulier, un peu comme une procuration au moment des élections. Renvoie vrai ou faux.
7. isWhitelisted (fonction, non natif) : Permet de savoir si l’adresse saisie fait partie de la liste blanche autorisée à mint un ou des NFTs de la collection.
8. maxMintAmount (propriété, entier, non natif) : Détermine le nombre maximum de mints qu’il est possible de faire à la fois.
9. maxSupply (propriété, entier, non natif) : Utilisée par la fonction de mint afin de déterminer s’il reste ou non des NFTs à minter.
10. name (propriété, string, natif) : Désigne le nom de la collection.
11. nftPerAddressLimit (propriété, entier, non natif) : Détermine le nombre maximum de mint qu’une seule adresse peut faire.
12. notRevealedUri (propriété, string, non natif) : Ce champ est intéressant quand on ne veut pas révéler tout de suite ce à quoi ressemblera le NFT que l’utilisateur va minter. Particulièrement pratique pour les collections ayant des « traits » car on peut ainsi afficher un visuel standard pour toute la collection.
13. onlyWhitelisted (booléen, non natif) : Détermine si seules les adresses de la liste blanche peuvent mint ou non.
14. owner (fonction, natif) : Indique l’adresse propriétaire contrat.
15. ownerOf (fonction, natif) : Renvoie l’adresse qui détient le NFT portant l’ID spécifié.
16. paused (booléen, non natif) : Détermine si le mint est en pause.
17. remainingAddressesToAirdrop (propriété, entier, non natif) : Indique le nombre d’adresses qu’il reste à airdrop.
18. revealed (booléen, non natif) : Va de paire avec l’item 12 pour modifier le visuel de tous les NFTs de la collection en même temps.
19. royaltyInfo (propriété, natif) : Détermine un pourcentage de chaque vente qui est envoyé à l’adresse indiquée. Bien que non exploitée pour le moment par nos marketplaces préférées, sur lesquelles le owner de la collection peut aller spécifier des royalties, le standard ERC-721 inclus depuis bientôt 2 ans les royalties nativement dans le contrat.
20. supportsInterface (fonction, natif) : Indique si oui ou non le token est compatible avec certaines interfaces de wallets afin de permettre les « safe » transfer. La différence avec un transfert classique est que la compatibilité du wallet destinataire est vérifiée avant que le transfert ne soit initié.
21. symbol (proriété, string, natif) : Un nom abrégé pour la collection.
22. tokenByIndex (fonction, natif) : Renvoie l’ID du token situé à un index précis de la collection. Il faut vraiment en avoir besoin…
23. tokenOfOwnerByIndex (fonction, natif) : Enumère les NFTs détenus par une adresse
24. tokenURI (fonction, non natif) : Renvoie le visuel associé à un NFT particulier en spécifiant son ID. Pratique dans le cas de collections comme les Grungies ou chaque NFT a son propre visuel, mais inutile dans le cas du CFN-King.
25. totalSupply (propriété, entier, natif) : Renvoie le nombre total de NFTs existants dans la collection. A ne pas confondre avec la maxSupply qui elle indique le nombre maximum de NFTs que peut contenir la collection.
26. walletOfOwner (fonction, non natif) : Renvoie tous les IDs de la collection détenus par une adresse.
27. whitelistedAddresses (propriété, string, non natif) : Liste les adresses autorisées à mint un ou plusieurs NFTs de la collection, si « onlyWhitelisted » est à « True ».
Vous êtes encore là ? Félicitations ! Vous gagnez une boîte de cachets pour les maux de tête !
Vous n’avez pas tout compris ? C’est normal. Vous n’avez RIEN compris ? C’est dommage ! Ca n’est évidemment pas un travail qu’il faudra faire dès que l’on mint un NFT, mais savoir se servir de l’explorer, aller jeter un oeil et voir s’il n’y a pas des fonctions qui sortent de l’ordinaire peut parfois aider à mieux cerner un projet, vérifier la maxSupply par exemple, identifier des baleines, deviner ce qu’ils souhaitent faire dans le futur avec des fonctions encore inexploitées, ou au contraire mettre le doigt sur quelque chose de louche et nous éviter de minter possiblement un scam. Dans tous les cas cela fera de la culture générale pour beaucoup, j’en suis certain ! Retenez bien qu‘acheter un NFT, c’est aussi accepter son contrat sous-jacent.
Un mot sur la sécurité justement. Ne faîtes jamais de mint depuis vos wallet principal ! C’est aussi important que d’utiliser un cold wallet pour stocker ses cryptos. Petit rappel sur l’hygiène numérique ici. Lorsque l’on mint un NFT, on se retrouve généralement sur une page web dont on n’avait jamais entendu parlé avant avec des images des NFTs que l’on peut minter. On connecte le wallet, saisissons la quantité de NFTs que l’on souhaite, validons, confirmons la transaction (les yeux fermés, soyons honnètes), et nous empressons d’aller voir le contenu de notre wallet sur Sparkles ou ailleurs pour admirer nos nouveaux NFTs. Oui mais… si la transaction signée précédemment ne faisait pas ce qu’elle annonçait et plutôt que de minter des NFTs envoyait tous vos SGB ou autre vers une adresse lambda ? Qui a codé cette page ? Après avoir vu ce que l’on pouvait mettre dans les fonctions du contrat d’un NFT, vous ne pensez pas qu’il est facile de mettre n’importe quel code derrière le bouton « MINT » d’une page web ? La plupart sont légitimes, je ne veux pas instaurer de psychose, mais la prudence doit toujours être le maître mot pour éviter de se faire siphonner son wallet.
C’est pourquoi lorsque vous mintez un nouveau NFT il est fortement recommandé d’utiliser une adresse dite poubelle. On y dépose la quantité de SGB nécessaire au mint, et c’est tout. Libre à nous de transférer les NFT mintés vers notre adresse principale dans un second temps.
Alors à ce stade nous avons possiblement une collection de NFTs, des tokens uniques en nombre limité, identifiables, traçables et avec disons un magnifique visuel. And so what ?! C’est bien beau tout ça mais on en fait quoi ? Pourquoi les gens les achèteraient ? Parce qu’ils les trouvent jolis ?
Il y a effectivement de nombreux artistes qui méritent que l’on s’attarde sur leur travail, je ne pourrais pas tous les citer et je ne veux vexer personne alors je me contenterai de partager celui-ci que je trouve personnellement magnifique, mais c’est très subjectif. (Cliquez sur l’image pour le voir dans FLRDrops)
Malgré tout je pense que les NFTs de cette qualité visuelle sont largement minoritaires, pour de bonnes ou de mauvaises raisons, même si ce n’est que c’est mon avis. Alors comment donner de la valeur à tous ces NFTs ? Une solution est de leur donner de la rareté mais on peut aussi leur donner de l’utilité et l’on sent que les choses sont en train de changer à ce niveau. Certains pensent que les NFTs vont passer de mode voire disparaître, je pense personnellement qu’ils font leur mutation. Nous passons progressivement d’un marché de NFTs animé par les spéculateurs et des collectionneurs de NFTs parfois beaux, ou funs, mais souvent « inutiles » à un marché qui tend à devenir majoritairement utilitaire. Dès l’instant que l’on comprend qu’ils sont traçables publiquement, que l’on peut savoir qui détient quoi en temps réel, il devient possible de s’en servir comme clé ouvrant l’accès à des services.
Cela peut être pour donner accès à des salons de discussions dans un serveur Discord, donner accès à certaines parties de sites web, permettre de les stacker pour générer un revenu passif, s’en servir comme de billets de concerts ou de soirées privées, faire des collections que l’on pourra fusionner, y cacher des énigmes avec des prix à gagner, s’en servir comme collatéral en DeFi ou encore en faire des « phygitals » comme FlareCommunity l’a fait récemment avec son deck de poker (dont je suis un fier détenteur). Nous savons également qu’il va être possible de louer des NFTs, de les fragmenter pour qu’un seul NFT puisse avoir plusieurs détenteurs, ou comme PangolinSwap de s’en servir un peu comme d’une carte de fidélité avec le protocole Sunshine and Rainbows dont les bénéfices pourront êtres loués à quelqu’un d’autre… je pense sincèrement que les cas d’usage possibles sont sans fin et que l’on ne fait que gratter la surface.
Mais si on peut en faire tout ça, pourquoi tout le monde ne le fait pas déjà ?
Parce que cela prend du temps de développer les interfaces qui permettent de le faire. Le stacking de NFT arrive chez OracleSwap, Flare Oracle, FLRDrops et j’en passe, l’ouverture des accès à des salons de discussions sur Discord sont déjà live et Mouradski développe d’ailleurs un bot qui fait entre autres cela mais c’est un marché à peine naissant et les codes informatiques permettant d’ouvrir la porte à de tels services sont soit inexistants, soit en cours de développement, soit payants, ou en tout cas difficiles d’accès, pour l’instant.
Pour résumer un peu tout ça, ce que je veux avant tout expliquer c’est qu’il faut prendre la peine de comprendre ce que l’on a devant soit avant de cliquer mécaniquement sur « Acheter ». Ce que je décris dans mes deux articles consacrés aux recherches avant d’investir est tout aussi vrai pour les NFTs. Qui ? Quoi ? Combien ? Pourquoi ? Il n’y a aucun problème à acheter un NFT que l’on trouve beau ou pour soutenir le travail d’un artiste bien au contraire, tant que l’on comprend ce que l’on achète, mais aussi accepter qu’un autre NFT au visuel peut-être effrayant, puisse voir sa valeur exploser car le détenir vous permettrait d’avoir Netflix gratuit, allez savoir. Blague à part les NFTs pourraient très bien devenir les clés de licences de nos logiciels préférés de demain. Et n’oubliez pas : Ne faîtes jamais de mint depuis votre wallet principal !
Web3. Gentlemen, connect your wallets.
Si cet article vous a plu, pensez à mettre un like et/ou un RT le ce tweet, ça fait toujours plaisir https://twitter.com/cryptapero/status/1564479362019237888?s=20&t=0IEwR0n-UQOHVfleZ_pqiA
Je vous laisse là-dessus, pas de contenu pour les Kings aujourd’hui car le plugin WordPress n’est pas encore en place. Ne mettons pas la charrue avant les bœufs comme on dit chez nous. Mais on y travaille, c’est promis !
Prenez soin de vous
Cryptapero
XRP (Xumm Wallet) : rLpfeWYAq1Vk5RM2LAkQifUZKArt17oD1r
Twitter TipBot Enabled
SGB : 0x2B2506bc4ea8BC053666c4db1C0c98803cF725E3