Aller au contenu

Jetons non fongibles

Les jetons non fongibles (NFTs) sur Alephium possèdent plusieurs caractéristiques uniques par rapport aux NFTs sur d'autres blockchains:

  • Propriété véritable basée sur le modèle UTXO: Comme les autres types de jetons sur Alephium, les NFTs sont gérés de manière sécurisée par des UTXOs, qui sont directement possédés par des adresses. Puisque les UTXOs sont protégés par les clés privées des utilisateurs, même en cas de bugs dans le contrat NFT, les actifs des utilisateurs restent sécurisés.

  • Support de première classe pour les NFTs: Les jetons sont des actifs natifs sur Alephium. En conséquence, les NFTs des utilisateurs peuvent être facilement découverts et affichés par les portefeuilles, les explorateurs et les dApps sans dépendre de services tiers.

  • Sécurité accrue grâce au VM et au langage de contrat d'Alephium: La machine virtuelle (VM) et le langage de contrat d'Alephium éliminent le besoin d'une transaction d'approbation séparée lors du commerce de NFT, réduisant ainsi les risques associés. Cela simplifie le processus d'écriture de contrats NFT sécurisés pour les développeurs avec l'aide d'outils tels que le Système de Permission des Actifs.

  • Système de sous-contrats: Dans Alephium, il n'existe pas de structure de données mapping. Les collections sont créées avec un contrat parent (la collection) et des Sous-contrat (les articles). Chaque sous-contrat représente un NFT dans cette collection, et toutes les métadonnées lui sont liées. C'est une fonctionnalité native de la blockchain Alephium qui permet aux NFTs d'Alephium d'être uniques (un jeton par sous-contrat) ou semi-fongibles, car le même contrat de frappe peut créer plus d'un jeton.

  • Regroupement efficace des transactions: Plusieurs NFTs et utilisateurs peuvent être impliqués dans une seule transaction.

  • Frais de transaction moins élevés et débit supérieur: Les transactions NFT bénéficieront de l'algorithme de sharding d'Alephium.

  • NRareté des NFT : L'offre de NFTs sur Alephium est finie, car chaque NFT nécessite le déploiement de son propre sous-contrat individuel, qui à son tour nécessite un dépôt de ALPH - actuellement fixé à 1 ALPH. Cette structure unique impose intrinsèquement une limite à la production de NFTs sur la plateforme, renforçant la rareté des NFTs sur Alephium..

Norme de Jeton Non-Fongible

Les collections de NFT et les NFT individuels possèdent des métadonnées associées telles que collectionUri, totalSupply et tokenUri, etc. Les interfaces INFTCollection et INFT normalisent les méthodes pour récupérer ces métadonnées.

Rust
// Interface standard pour une collection de NFT
@std(id = #0002)
Interface INFTCollection {
   pub fn getCollectionUri() -> ByteVec
   pub fn totalSupply() -> U256
   pub fn nftByIndex(index: U256) -> INFT
   pub fn validateNFT(nftId: ByteVec, nftIndex: U256) -> () // Vérifie que le NFT fait partie de la collection, sinon lance une exception.
}

// Interface standard pour NFT
@std(id = #0003)
Interface INFT {
   pub fn getTokenUri() -> ByteVec
   pub fn getCollectionIndex() -> (ByteVec, U256) // Renvoie l'identifiant de la collection et l'index du NFT dans la collection.
}

Elles sont également annotées avec les annotations @std pour faciliter la déduction des types de contrat/jeton par les dApps et les portefeuilles.

TypeScript
// Deviner le type de jeton NFT
const nftTokenType = await web3.getCurrentNodeProvider().guessStdTokenType(nft.contractId)
expect(nftTokenType).toEqual('non-fungible')

// Vérifie si un contrat est une collection de NFT
const isNFTCollection = await web3.getCurrentNodeProvider().guessFollowsNFTCollectionStd(nftCollection.contractId)
console.log("Is NFT collection", isNFTCollection)

Pour les contrats qui implémentent INFTCollection et INFT, le SDK offre une manière canonique de récupérer leurs métadonnées respectives:

TypeScript
// Métadonnées de la collection de NFT
const collectionMetadata = await web3.getCurrentNodeProvider().fetchNFTCollectionMetaData(nftCollection.contractId)
console.log("NFT Collection URI, totalSupply", collectionMetadata.collectionUri, collectionMetadata.totalSupply)

// Métadonnées du NFT
const nftMetadata = await web3.getCurrentNodeProvider().fetchNFTMetadata(nft.contractId)
console.log("NFT Token URI, collection address", nftMetadata.tokenUri, nftMetadata.collectionAddress)

Pour une collection de NFT, une des métadonnées est collectionUri, qui est une URI pointant vers un document JSON avec le schéma suivant:

TypeScript
interface NFTCollectionUriMetaData {
  name: string            // Nom de la collection de NFT
  description: string     // Description générale de la collection de NFT
  image: string           // Une URI vers l'image qui représente la collection de NFT
}

Pour un NFT individuel, une des métadonnées est tokenUri, qui est une URI pointant vers un document JSON avec le schéma suivant:

TypeScript
interface NFTTokenUriMetaData {
  name: string                           // Nom du NFT
  description?: string                   // Description générale du NFT
  image: string                          // Une URI vers l'image qui représente le NFT
  attributes?: [                         // Attributs du NFT
    {
      trait_type: string
      value: string | number | boolean
    }
  ]
}

Marché AlephiumNFT

AlephiumNFT est un marché de NFT de preuve de concept pour montrer les capacités des NFT sur Alephium. Ici, vous pouvez créer des collections de NFT, découvrir, frapper et échanger des NFT. Vous pouvez également lancer des campagnes de vente publique de s tyle Opensea Drop pour vos collections de NFT. Ces campagnes sont appelées Flows sur le marché AlephiumNFT.

Créer vos propres collections de NFT devrait être assez simple. Suivez ce Twitter thread pour plus de détails. Si vous souhaitez créer unFlow sur le marché AlephiumNFT, @alephium/cli possède une sous-commande nft qui peut aider à cela.

Créer des Flows

Supposons que vous souhaitiez lancer une vente publique pour votre collection de NFT qui possède 5 individuels. Avant de créer un Flowpour cela, vous devriez avoir 5 images prêtes au préalable. Sinon, @alephium/cli offre une commande pour vous permettre de générer des images en utilisant les modèles DALL.E de OpenAI:

Bash
export OPENAI_API_KEY=xxxx-xxxx-xxxx-xxxx
npx @alephium/cli@latest nft generate-images-with-openai --number 5 -d /tmp/imagine "imagine all the people, living life in peace"

Cela créera 5 images avec la prompte "imagine all the people, living life in peace" et les stockera dans le répertoire /tmp/imagine. Veuillez passer cette étape si vous avez déjà conçu les images pour votre collection.

En supposant que les images soient prêtes dans le répertoire /tmp/imagine L'étape suivante consiste à créer un fichier de métadonnées au format YAML pour votre collection. Voici un exemple de fichier YAML appelé imagine.yaml:

Bash
> ls /tmp/imagine
0.jpg  1.jpg  2.jpg  3.jpg  4.jpg

> cat imagine.yaml
0.jpg:                              # Nom du fichier de l'image
  attributes:                       # Attributs du NFT, optionnel
    - couleur: bleu                   # La valeur des attributs peut être `number`, `boolean` ou `string`
    - en extérieur: true
1.jpg:
  description: Imagine is too naive # Description du NFT, optionnelle
2.jpg:
  name: Imagine in Asia             # Nom du NFT, optionnel
  attributes:
    - couleur: bleu 
    - en extérieur: false
3.jpg:                              # Le nom est généré automatiquement comme #${index} s'il n'est pas spécifié, par exemple #04
4.jpg:

Lorsque vous êtes satisfait des images et des métadonnées de votre collection, exécutez la commande suivante pour télécharger les images et les métadonnées sur IPFS:

Bash
> export IPFS_INFURA_PROJECT_ID=xxxx-xxxx-xxxx-xxxx
> export IPFS_INFURA_PROJECT_SECRET=xxxx-xxxx-xxxx-xxxx
> npx @alephium/cli@latest nft upload-images-and-metadata-to-ipfs -m imagine.yaml -d /tmp/imagine -i imagine
NFTBaseUri:
https://ipfs.io/ipfs/QmaTXEGJQe5ZLg9TVEBJEpz3dwbzG9m7b6NWVogxnYgnbJ/

Le NFTBaseUri pointe vers un répertoire IPFS où 5 documents sont nommés et stockés selon leur séquence dans le fichier imagine.yaml:

IPFS Imagine directory

Chacun des documents pointe vers les métadonnées d'un NFT et peut être référencé par leurs indices. Par exemple, https://ipfs.io/ipfs/QmaTXEGJQe5ZLg9TVEBJEpz3dwbzG9m7b6NWVogxnYgnbJ/2 pointe vers les métadonnées du 3ème NFT:

Bash
> curl https://ipfs.io/ipfs/QmaTXEGJQe5ZLg9TVEBJEpz3dwbzG9m7b6NWVogxnYgnbJ/2 | jq
{
  "name": "Imagine in Asia",
  "image": "https://ipfs.io/ipfs/QmbLevU4kVnQCCoYt23mKhdowJ7TnNNT9dRyVw9AyQDJty/2.jpg",
  "attributes": [
    {
      "trait_type": "color",
      "value": "blue"
    },
    {
      "trait_type": "is_outdoor",
      "value": false
    }
  ]
}

Vous pouvez valider si un NFTBaseUri est valide en utilisant la commande suivante:

Bash
> npx @alephium/cli@latest nft validate-enumerable-nft-base-uri --nftBaseUri https://ipfs.io/ipfs/QmbLevU4kVnQCCoYt23mKhdowJ7TnNNT9dRyVw9AyQDJty/ --maxSupply 5
Token Metadataz:
[
  {
    name: '#0',
    ....
  },
  ....
]

Après avoir créé le NFTBaseUri, nous sommes prêts à lancer le Flow sur le marché AlephiumNFT:

create flow directory

Comme illustré ci-dessus, vous pouvez ajouter l'image de la collection, la taille maximale de frappe en lot, le prix de frappe, le nom et la description de la collection, et surtout l'URI de base NFT que nous avons créé à l'étape précédente. Après avoir cliqué sur le bouton Créer la collection NFT et signé la transaction, vous réussirez à créer votre premier Flow, partager le lien et commencer à lancer la vente publique de votre collection de NFT !

flow-page

Support des portefeuilles

Le Portefeuille de Bureau et le Portefeuille d'Extension prennent en charge nativement les jetons non fongibles.

Voici un exemple d'affichage et de transfert d'un NFT de la Imagine Collection dans le portefeuille d'extension:

show-nft-collection-extension-wallet transfer nft collection extension wallet

Liste des jetons

Il n'est pas trop difficile de falsifier d'autres collections de NFT et d'escroquer les utilisateurs. La liste des jetons permet de mettre en liste blanche les collections de NFT bien connues dans l'écosystème Alephium, afin que les dApps et les portefeuilles puissent avertir les utilisateurs des collections de NFT non vérifiées. Voici comment le portefeuille d'extension affiche une collection de NFT avant et après son ajout à la liste des jetons.

unverified nft collection verified nft collection

Actuellement, une demande de tirage est nécessaire pour ajouter la collection de NFT à la liste des jetons.