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.
// 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.
// 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:
// 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:
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:
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 Flow
pour 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:
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
:
> 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:
> 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
:
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:
> 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:
> 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
:
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 !
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:
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.
Actuellement, une demande de tirage est nécessaire pour ajouter la collection de NFT à la liste des jetons.