Come ho usato conoscenze di base sulla probabilità per creare un software di generazione NFT

Il karma è un boomerang. Ciò è dimostrato dal fatto che oggi un artista possa non solo guadagnarsi da vivere, ma anche guadagnare milioni online.

Sono all'inizio dei miei trenta e per anni ho visto solo una manciata di artisti (ovvero persone che disegnano, dipingono e creano contenuti visivi) raggiungere il successo nella loro carriera. Queste persone sono state abbastanza fortunate e talentuose da mostrare il loro lavoro alle persone giuste, che in cambio hanno pagato molto bene. Ma non tutti gli artisti hanno questo lusso.

La maggior parte lavorano duramente ma alcuni di loro non riescono nemmeno a dedicarsi alle proprie passioni a causa di vincoli economici. Non sono un artista, ma sono felice di vedere come la storia che circonda questo lavoro sta per cambiare, e questo è solo l'inizio.

Ma non sono qui solo per parlare di artisti: quello che voglio davvero fare è condividere con voi le opportunità che ci sono per noi appassionati di dati. In fatti, spiegherò come ho utilizzato le mie competenze nel data science per creare un utile software di generazione NFT per la comunità crypto.

Perché sfruttare lo spazio degli NFT?

Definire bene lo spazio NFT è complicato. È una nicchia delle cryptovalute estremamente rischiosa ma anche redditizia che attrae ogni giorno sempre più persone. Ciò che lo rende interessante è che questo campo (al momento) sfrutta principalmente le opere d'arte per creare valore. Oggi gli artisti hanno quindi opportunità per realizzare grandi profitti vendendo collezioni NFT.

Non introdurrò cosa sono gli NFT. Ci sono molte risorse qui online che approfondiscono questo argomento. Tuttavia, farò una breve introduzione su come sono stato coinvolto nel campo.

Di recente ho lanciato un mio progetto NFT come co-fondatore con un amico artista (maggiori informazioni qui). L'idea è che l'artista creerebbe l'opera d'arte e io lo aiuterei a costruire e impostare la struttura tecnologica. Per questo progetto abbiamo scelto la blockchain di Solana.

La creazione dell'artwork è andata molto bene e in pochissimo tempo abbiamo avuto gli asset pronti per la generazione NFT. Una breve ricerca online ha fornito una soluzione popolare: Hashlips Art Engine. Ho esplorato rapidamente la base di codice e mi sono reso conto che il software era ben scritto e offriva funzionalità interessanti.

Ma quello che avevamo in mente non era ottenibile attraverso Hashlips: volevamo codificare classi di rarità esplicite (come leggendaria, epica, rara, comune, …) e controllarne il loro comportamento durante la generazione. Volevamo impostare le probabilità che i livelli si verificassero durante la generazione ed escludere anche che combinazioni specifiche avvenissero insieme. Inoltre, essendo l'artista l'utilizzatore ipotetico del software, la sua interfaccia utente doveva essere abbastanza semplice per gli utenti non tecnici in modo che potessero generare la loro collezione NFT solo focalizzandosi sull'artwork.

Mi sono preso la briga di scrivere questo software io stesso in Python e l'ho reso open source cosicché la community possa usarlo e migliorarlo come meglio crede.

Come funziona il software?

Ho iniziato a scrivere il software partendo dal file di configurazione. Gli utenti possono impostare i parametri della loro collezione semplicemente manipolando una serie di dizionari Python. Anche se può sembrare scoraggiante per le persone che sono completamente nuove alla lingua, quelli con una conoscenza introduttiva di base nelle strutture dati si sentiranno a casa.

L'idea era quella di consentire agli utenti di controllare le classi di rarità e la loro probabilità di occorrenza in un'immagine. Vediamo un esempio.

Supponiamo che tu sia un artista e desideri creare una raccolta NFT a tema gotico basata su mostri. Prendi un orco come esempio. Vuoi dare a questo orco la possibilità di brandire armi, armature e altro. A sua volta, ciascuno di questi elementi dovrebbe essere più forte o più debole in base ad una probabilità.

Questo è proprio quello che questo software permette di fare.

Crei le tue classi di oggetti per ogni livello, come leggendario, epico, raro, ecc. e poi assegni le probabilità a queste classi. Ad esempio, un'armatura leggendaria può verificarsi una volta ogni dieci oggetti, ovvero il 10%.

È inoltre possibile configurare il comportamento degli oggetti speciali. Gli oggetti speciali sono oggetti così rari da essere persino più preziosi degli oggetti leggendari. Puoi specificare un elenco di oggetti unici e la probabilità relativa e ottenere un insieme di oggetti che si comportano in modo diverso all'interno della stessa classe di rarità.

Abbiamo pubblicato un video su YouTube che copre in dettaglio il funzionamento del software (in lingua inglese).

I requisiti

Questo è tutto ciò che serve per eseguire correttamente il software:

  • Python 3.7+
  • Livelli (layer) di immagini

Non c'è altro. Abbiamo letteralmente bisogno di Python, inizializzare un ambiente virtuale (che è facoltativo, ma altamente consigliato) e installare Pillow. Informazioni dettagliate su come installare il software si trovano nel repository Github.

Il file config.py

Esaminiamo brevemente il file di configurazione per vedere cosa dobbiamo modificare per personalizzare la nostra raccolta NFT. Al momento della stesura di questo articolo, il software è adatto solo per la blockchain di Solana. In futuro consentirà anche le raccolte su Ethereum.

Metadati del progetto

./src/config.py è il file che bisogna modificare per personalizzare il progetto. Tutto inizia con il dizionario dei metadati del progetto Solana.

Definizione dei metadati su Solana

Questi parametri iniziali servono come base per la creazione di file di metadati per ogni NFT. In Solana, ogni NFT è associato a un file metadata.json e l'enumerazione inizia da 0.

Ordine dei layer

Successivamente bisogna specificare il nome e il numero di livelli da combinare per creare un'immagine.

Sistema di layering

Le immagini vengono assemblate attraverso la libreria Pillow. È infatti l'unica libreria esterna utilizzata in questo software, il resto è tutto parte della standard library di Python.

L'ordine dei livelli dovrebbe seguire un principio semplice: i livelli dovrebbero essere ordinati dallo sfondo al primo piano. Questo per garantire la corretta sovrapposizione degli elementi durante la creazione dell'immagine.

Classi di rarità, probabilità e oggetti speciali

Il dizionario successivo da modificare è contenuto nella variabile SETUP. È qui che avviene la magia (non è davvero magia, solo semplice matematica!).

Puoi aggiungere classi sotto la chiave scheme e elementi a quella classe in una semplice lista Python.

Come configurare il tuo progetto NFT

I nomi delle classi di rarità sono arbitrari. Abbiamo usato la convenzione ludicizzata di leggendario, epico e così via, ma è possibile usare quello che si preferisce.

La chiave p è dove si definisce la probabilità di quella classe. Se Legendary ha p = 0,1 significa che la classe leggendaria per quel livello si verificherà circa una volta ogni dieci NFT. Bello, vero? :) Questo è valido per tutte le classi che si decide di aggiungere.

Tutti gli elementi della classe hanno la stessa probabilità di verificarsi. Quindi, come controlliamo la rarità degli oggetti speciali? Specificando un dizionario, possiamo moltiplicare la probabilità degli elementi nella classe per quel moltiplicatore. Stiamo essenzialmente moltiplicando due probabilità.

Nell'esempio seguente, la classe leggendaria ha una probabilità del 10% di apparire. Dato che tutti gli oggetti all'interno di quella classe hanno la stessa probabilità di apparire (seguono una distribuzione uniforme), la probabilità che un oggetto appaia è di circa il 16% (1/6). Abbiamo impostato Tengu mask, Vader mask e Gas mask come oggetti speciali: vogliamo che appaiano meno del 16%. Usando 0,2, in pratica stiamo moltiplicando 16% * 20% = ~3%.

Naturalmente, poiché ora la probabilità di tre oggetti è più bassa, la probabilità che gli altri oggetti appaiano è più alta.

In questo modo è possibile manipolare non solo le probabilità per le classi, ma anche per i singoli oggetti.

Combinazioni da escludere

L'ultimo pezzo del puzzle è opzionale, ma comunque utile se un artista ha creato combinazioni complesse tra livelli. In EXCLUDE_COMBINATIONS è possibile specificare le combinazioni da escludere dalla collezione NFT.

Perché farlo? Un caso sarebbe quello di evitare conflitti e glitch tra livelli incompatibili. Abbiamo escluso la maschera Tengu e altri oggetti a causa del loro aspetto insieme. Non ci piacevano, quindi abbiamo deciso di consentire all'utente di controllare anche questo aspetto.

Come escludere le combinazioni che vogliamo

Rimando nuovamente al video di YouTube che illustra tutte queste funzionalità nel dettaglio.

Come creare una collezione di NFT

Ora che abbiamo impostato tutto nel file config.py, siamo pronti per creare la nostra raccolta NFT.

Mettiamo la cartella Layers nella root del progetto e assicuriamoci che le convenzioni di denominazione utilizzate siano coerenti ovunque.

Ora raggiungiamo ./src/run.py e impostiamo il numero di elementi che compongono la raccolta.

Lanciare questo script per creare la raccolta NFT da config.py

Il terminale dovrebbe popolarsi con la sequenza genetica dei nostri NFT.

Sequenza genetica dei nostro NFT

Se una sequenza genetica non è valida (ad esempio se la combinazione si trova in EXCLUDE_COMBINATIONS), il software distruggerà la sequenza e ne creerà una nuova.

Una volta completata, troveremo la cartella collection che conterrà le immagini e metadati, insieme ad alcuni report sulla rarità di oggetti e classi.

E questo è tutto! Ora siamo pronti per pubblicare la nostra collezione NFT su Solana!

Se avete trovato utile questo software, condividete i vostri pensieri nei commenti qui sotto o mandatemi un messaggio. Se siete degli sviluppatori, sentitevi liberi di contribuire su Github.

Andrea D'Agostino
Ciao, sono Andrea D'Agostino e sono un data scientist con 6 anni di esperienza nel campo della business intelligence. Applico tecniche statistiche e di machine learning per aiutare i clienti a trovare e risolvere problemi nei loro asset digitali e a sfruttare le debolezze dei competitor a loro vantaggio.

Sono il fondatore e l'autore di questo blog, il cui obiettivo è raccogliere le informazioni più importanti che ho imparato durante il mio percorso lavorativo e accademico al fine di poter aiutare il lettore a migliorare le sue analisi.