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).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 bytesuint
: intero senza segno (unsigned)uint8
,uint16
,uint32
..uint256
: intero senza segno di determinata lunghezzaint8
,int16
,int32
..int256
: intero con segno di determinata lunghezza
<=
<
==
!=
>=
>
, 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
ufixed128x19
e fixed128x19!
Con questo particolare tipo di dato abbiamo i classici operatori tra tipi numerici:
<=
<
==
!=
>=
>
+
-
-
+
*
/
%
Indirizzo
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
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!
(2800 + 1) - 2800
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
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
\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 dia
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
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>)]
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!
Posted from my blog with SteemPress : https://www.coiners.it/tutorial-solidity-tipi-di-dati/
This user is on the @buildawhale blacklist for one or more of the following reasons:
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Congratulations @coiners-it! You have completed some achievement on Steemit and have been rewarded with new badge(s) :
You published 4 posts in one day
Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word
STOP
To support your work, I also upvoted your post!
Do not miss the last post from @steemitboard!
Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit