Tempo di lettura: 4 minuti

Eccoci in un nuovo tutorial Solidity! Dopo aver configurato Remix IDE e Remixd siamo finalmente pronti a imparare un po’ di Solidity, il linguaggio più usato per scrivere Smart Contracts Ethereum.

Tipi di dato e operatori

Cominciamo dai tipi di dato. Si, perchè Solidity è un linguaggio tipizzato. Andiamo ora ad elencare tutti i tipi presenti, con i rispettivi operatori.

Bool

Una variabile booleana può assumere lo stato di true oppure false e permette i classici operatori: ! (negazione logica) && (congiunzione logica, “and”) || (disgiunzione logica, “or”) == (confronto) e != (diverso).

solidity tutorial boolean
Analisi del tipo Booleano

Interi

Quando scrivi uno Smart Contracts devi essere un amante dell’ottimizzazione: è possibile infatti specificare la dimensione della variabile espressa in bytes:

  • int: intero con segno. Occupa 256 bytes
  • uint: intero senza segno (unsigned)
  • uint8, uint16, uint32..uint256: intero senza segno di determinata lunghezza
  • int8, int16, int32..int256: intero con segno di determinata lunghezza

Gli operatori per gli interi sono i classici confronti <=  < == != >= >, i quali restituiscono un valore booleano. L’operatore di divisione tronca sempre, tranne nel caso in cui entrambi gli operatori siano literals, di cui parleremo successivamente. Una divisione per zero con modulo zero lancia una eccezione in fase di runtime.

Numeri a virgola fissa

Molto probabilmente conosci i numeri a virgola mobile, ma non i numeri a virgola fissa! I numeri a virgola fissa sono numeri di cui specifichiamo il numero di posizioni prima e dopo la virgola: Solidity, pur non supportando ancora al 100% questo tipo di dato, usa diverse rappresentazioni:

  • fixed
  • ufixed
  • ufixedMxN
  • fixedMxN

I primi due sono molto intuitivi: numeri a virgola fissa con segno e senza segno. I successivi invece indicano con M il numero di bit usati dal tipo, e N il numero di decimali vogliamo usare. M deve essere divisibile per 8, in un range da 8 fino a 256 bit. N deve essere compreso tra 0 e 80 (80 compreso). Scrivere ufixed e fixed è la stessa cosa di scrivere ufixed128x19 e fixed128x19!

Con questo particolare tipo di dato abbiamo i classici operatori tra tipi numerici:

<= < == != >= > + - - + * / %

Indirizzo

guida solidity address
Address Ethereum: usiamo il tipo address

address è un tipo di dato dalla dimensione di 20 byte (la stessa di un indirizzo Ethereum). Questo tipo di dato offre non solo la memorizzazione di un indirizzo, assegnabile con questa sintassi:

address indirizzo = 0x123

ma anche attributi, metodi e operatori. Possiamo infatti effettuare confronti tra indirizzi:

<= < == != >= e >

Da un indirizzo Ethereum possiamo ottenerne il balance, cioè il “saldo” semplicemente usando l’attributo balance. Vuoi inviare 10 Eth ad un indirizzo Ethereum? Solidity mette a disposizione il metodo transfer, che accetta come parametro il numero di Wei da inviare.

address x = 0x123;
address myAddress = this;
if (x.balance < 10 && myAddress.balance >= 10)
    x.transfer(10);

Se x riferisce all’indirizzo di uno smart contract, e non ad un indirizzo di una wallet, insieme alla funzione transfer verrà eseguita la fallback di x, se presente.

Insieme alla funzione send è presente la funzione send, che in caso di fallimento non lancerà una eccezione, ma ritornerà false!

Array di dimensione fissa

guida solidity array
Array di dimensione fissa

Devi creare un vettore con una dimensione fissa? Solidity offre diversi tipi per specificarne la dimensione: bytes1, bytes2, bytes3 fino a bytes32.

Gli array con dimensione fissa mettono a disposizione l’attributo length, per ottenerne la lunghezza. Nella documentazione Solidity viene sottolineato la proprietà read-only di questo attributo, non provare a modificare la lunghezza di questi vettori per non incorrere in un Expression has to be an lvalue.

uint128[2] array;
array.length = 5;

Array di dimensione variabile

Se devi utilizzare degli array di cui non si conosce la dimensione in fase di compilazione, Solidity offre il tipo bytes e string, che conterrà del contenuto in UTF-8. La documentazione Solidity, in caso di array di lunghezza sconosciuta ma di cui si conosce la dimensione massima che esso può assumere consiglia l’utilizzo di bytes1, bytes2 fino a bytes32 di cui abbiamo parlato prima.

Numeri razionali e literals

Solidity non supporta ancora i literals in notazione ottale, solo decimale. Possiamo quindi scrivere 4,6,0 ma non 0o377. Per scrivere un decimale useremo il . che potremmo usare per esempio così: 1. (= 1,0), .1 (= 0.1) e 1.3(= 1,3).

Possiamo inoltre utilizzare la notazione esponenziale, in cui la base può essere una frazione mentre l’esponente no: 2e10, -2e10, 2e-10, 2.5e1. I vantaggi di utilizzare i literals? Che non avremmo overflow o troncamenti nelle divisioni! Un esempio? Eccolo!

(2**800 + 1) - 2**800

Nella prima parentesi eleviamo 2 alla 800, sommiamo 1 e sottraiamo 2^800. Come potete vedere il risultato è 1, di tipo int! Ora proviamo a eliminare la seconda parte:

(2**800 + 1)

Questo risultato non potrà essere assegnato a nessun tipo in quanto troppo grande! Qualsiasi operatore applicabile agli interi potrà applicarsi ai literals. Nel caso in cui uno dei due operandi sia una frazione sono vietati gli operatori sui bit e l’elevamento a potenza in caso di esponente frazionario, in quanto il risultato potrebbe essere un numero non razionale!

Stringhe

tutorial solidity stringhe
Stringhe in Solidity

Andiamo a parlare di stringhe: Solidity permette l’utilizzo di apici singoli sia di doppi apici, non ci sarà quindi differenza visibile tra ‘coiners’ e “coiners’. A differenza del C, Solidity non usa il carattere 0 per terminare le stringhe, perciò la stringa “coiners” occuperà 7 byte, un byte per carattere. Possiamo andare ad assegnare le nostre stringhe a diversi tipi: bytes1 fino a bytes32, altrimenti a bytes e string. Sono supportati diversi caratteri di escape:

  • \n
  • \xNN
  • \uNNNN

Oltre al classico newline abbiamo la possibilità di inserire un valore in formato esadecimale, mentre \uNNN inserirà una sequenza di byte in formato UTF-8.

Literals Esadecimali

Oltre ai literals decimali abbiamo i literals esadecimali, preceduti sempre dalla keyword hex e contenuti all’interno di doppi apici. All’interno di a verrà salvato la rappresentazione binaria della stringa.

bytes a = hex"001122FF";

Enum

enum EmozioniPersona { Felice, Triste, Normale }

Gli enum permettono al programmatore di definire dei tipi, che saranno esplicitamente convertibili in qualsiasi tipo di dato intero. Di seguito trovi un piccolo snippet che mostra l’utilizzo di Enum

Funzioni

solidity funzioni guida
Come si dichiara una funzione in Solidity?

Le funzioni sono dei veri e propri tipi; possiamo passare una funzione come parametro di una funzione, oppure scrivere una funzione che restituisca una variabile di tipo funzione! Una funzione può essere interna o esterna.

Le funzioni dichiarate come internal possono essere chiamate solamente all’interno dello smart contract corrente. Sono accettate inoltre chiamate alle funzioni internal da funzione di librerie e funzioni ereditate, in quanto queste non possono essere eseguite all’esterno del contesto dello smart contract attuale.

Questa la notazione per scrivere funzioni correttamente:

function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

Per funzioni senza variabile di ritorno (void nella maggior parte dei linguaggi) è necessario rimuovere la parte [returns (<return types>)]

Di default le funzioni sono internal, possiamo quindi omettere la keyword internal.

Conclusioni

Questo lungo tutorial Solidity sui tipi di dato  è terminato, tuttavia verrà costantemente aggiornato con gli aggiornamenti della documentazione.

Ricorda di entrare nel nostro gruppo Telegram per non perderti neanche un articolo!

Autore

Sono uno studente Web&Cloud. Amo programmare, negli anni ho sviluppato competenze full-stack, in particolare nel mondo Javascript. Linux e la crittografia mi hanno sempre appassionato, fino a portarmi nel mondo delle cryptovalute.

Scrivi un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.