Prima parte di una guida esauriente su Vyper, il nuovo linguaggio di Ethereum
Vyper è un linguaggio di programmazione sperimentale compilabile fino al bytecode della EVM (Ethereum Virtual Machine), così come Solidity.
Tuttavia, Vyper è progettato per semplificare enormemente il processo per creare Smart Contract più comprensibili in modo da essere più trasparente per tutte le parti coinvolte ed avere meno punti di accesso per un attacco.
Qualsiasi codice che mira all’EVM deve essere iperefficiente per minimizzare il gas che serve ad eseguire lo Smart Contract, poiché un contratto con un codice inefficiente costa letteralmente più ether per essere eseguito e può diventare rapidamente troppo costoso, specialmente in casi d’uso come micro-transazioni.
Il risultato finale è che Vyper sembra logicamente simile a Solidity e sintatticamente simile a Python, ma senza molti dei paradigmi dell’Object Oriented Programming – che forse necessita una nuova definizione di paradigma per la programmazione di transazioni.
Apprendere queste differenze logiche e sintattiche adesso vi aiuteranno a diventare uno sviluppatore di Vyper a livello mondiale, poiché Vyper è stato in v0.1-beta.1 fino a Giugno 2018!
0.Mettere a confronto Python, Vyper e Solidity
Qui, tratteremo il “perché” di Vyper ad alti livelli – presentando un le basi per analizzare e scrivere il codice di Vyper, includendo gli Smart Contract.
Miglioramento fondamentale 1 : Semplicità
Vyper non contiene molti dei costrutti familiari alla maggior parte dei programmatori: ereditarietà, overload delle funzioni o degli operatori e ricorsività.
Nessuno di questi è tecnicamente necessario per un linguaggio Turing-complete ed essi rappresentano dei rischi per la sicurezza con l’aumento della complessità.
Per via di questa complessità, questi costrutti renderebbero gli Smart Contract troppo difficili da capire e verificare per i non addetti ai lavori, come si è visto nei contratti di Solidity.
Costrutti meno comuni anch’essi non inclusi sono i modificatori (questi rendono troppo facile la scrittura di codice ingannevole), inline assembly (questo interrompe Ctrl + F) e punti fissi binari (sono spesso richieste approssimazioni con un punto fisso binario).
Miglioramento fondamentale 2 : Sicurezza
Gli stessi sviluppatori di Vyper dicono che Vyper “vieterà alcune cose deliberatamente o renderà le cose più difficili qualora lo ritenga opportuno per l’obiettivo di aumentare la sicurezza”.
Quindi, Vyper non è un sostituto definitivo per Solidity, ma piuttosto un ottimo linguaggio da utilizzare quando la sicurezza è prioritaria, come quando gli Smart Contract gestiscono metadati sulla salute di un paziente o gradienti per l’intelligenza artificiale decentralizzata.
Il codice di Vyper e le differenze sintattiche
Vyper è stato progettato per essere il più possibile vicino a Python mirando agli obiettivi di sicurezza e semplicità, così che la percezione complessiva dei linguaggi sia la stessa, sebbene ci siano molte differenze di cui tenere conto.
Eseguire un file
Mentre lo script di Python è eseguito come
python file_name.py
uno script di Vyper viene compilato utilizzando
vyper file_name.vy.
Variabili dello state
Le variabili dello stato sono dei valori conservati in maniera permanente nel contratto e possono essere di qualsiasi tipo, come:
exampleStateVariable: int256.
Mapping
La prima cosa che contiene un contratto di Vyper sono i campi dello storage del contratto, come un token balance mapping:
balance: public(wei_value[address])
Che è una variabile dello state che definisce chiavi e valori corrispondenti.
I mapping di Vyper sono sostanzialmente tabelle hash che vengono inizializzate, come abbiamo visto sopra, così che
“Esiste ogni chiave possibile ed è associata ad un valore la cui rappresentazione in byte è fatta tutta da zeri: un tipo di valore predefinito”.
I dati chiave non vengono conservati nel mapping, ma soltanto il loro hash di tipo kecca256 in modo da poterne visualizzare il valore.
Definendo il rapporto, il type public () viene dato, seguito dalla sintassi del mapping: dove il tipo di wei_value viene dato prima, seguito dalla chiave (address) in parentesi quadre– simile al trattamento dei vettori che ha Python.
Definizioni
Noterete che Vyper utilizza i due punti nel definire la nomenclatura (come balance) al contrario ai segni dell’uguale di Pyhton, sebbene Python 3.6 includa la stessa sintassi per l’annotazione di variabili:
context = {} # empty dictionary context["a"]: 2 # annotate dictionary variable
Dove la sintassi dei due punti è per l’annotazione della variabile e i due punti sono utilizzati come assignment operator che assegna soltanto una type annotation. Vyper utilizza questa sintassi per assegnazione di valore reale.
Numeri interi
Vyper ha soltanto due numeri interi: uint256 (per interi non negativi) ed int128 (per numeri interi con il segno) – al contrario di uint8 fino a uint256 di Solidity ad intervalli di 8 e lo stesso per int8 fino a int256 (questo vuol dire 64 parole chiave differenti per int type).
Valori booleani, Operatori, Confronti e Funzioni
Vyper ha quasi la stessa identica sintassi di Python per la maggior parte degli operatori, inclusi:
true and false booleani; not, and, or, ==, and != operatori; <, <=, ==, !=, >=, and > comparatori; and +, -, *, /, **, and % operatori aritmetici (only for int128)
Così come alcune funzioni interne:
len(x) che ritorna la lunghezza di un intero; floor(x) che ritorna l’intero inferiore più vicino; e ceil(x) che ritorna l’intero superiore più vicino
Ed alcune nuove:
sha3(x) che ritorna il calcolo sha3 in un formato bytes 32; concat(x, ...) per concatenare vari input; slice(x, start=_start, len=_len) per ritornare sottostringhe
Liste
Le liste su Vyper vengono dichiarate utilizzando il formato _name:_ValueType[_Integer], mentre fissare i valori ha la stessa sintassi di Py=thon.
Per esempio:
lst: int128[3] # define a list lst = [1, 2, 3] # set the values lst[2] = 5 # set a value by index return lst[0] # returns 1
Struct
Le Struct sono dei type che voi definite, che raggruppano le variabili e vi si accede utilizzando struct,argname, come (in qualche modo simile ai dizionari di Python):
struct: { # define the struct arg1: int128, arg2: decimal } struct.arg1 = 1 #access arg1 in struct
Definire i metodi
I metodi (i metodi dei contratti su Vyper) sono definiti nello stesso modo su Python e Vyper:
def method(): do_something()
In aggiunta a ciò che offre Python, Vyper include decorator specifici di Ethereum come @payable e @assert – il primo utilizzato per rendere possibile al contratto di accettare transazioni e l’ultimo che si aspetta un’espressione booleana:
Da notare la sintassi def function_name (arg1, arg2,…, argx)-> output: che serve a definire una funzione. A differenza di Python, Vyper definisce esplicitamente il type in uscita nella def line dopo il ->.
Di: blockgeeks
La seconda parte di questo articolo verrà pubblicata nei prossimi giorni
Commenti
6 Responses
Interessante, Emanuele ho una domanda tecnica: Vyper si può installare su una macchina linux ubuntu per fare esercitazioni? In quanto altrimenti bisogna prima installare la EVM ethereum? Inoltre, che differenza c’è tra Lity e Vyper? consigli di apprenderli entrambe o basta solo uno di essi per fare semplici ma sicuri Smart contract? Grazie mille ☺️
Ciao Clem, scusa per il ritardo nella risposta. Al seguente url trovi un video tutorial per l’installazione di Vyper su Ubuntu https://www.youtube.com/watch?v=_b3DccYQFAw
Riguardo a Lity, se non erro, è il linguaggio di programmazione di SC per un’altra blockchain differente da Ethereum. Personalmente punterei su Vyper data la maggior probabilità di adozione di Ethereum come “standard” per le blockchain con SC.
Ciao se siete interessati a Lity leggete qui https://etherevolution.eu/futuro-smart-contract/
Ciao Emanuele, dopo 2 giorni passati a cercar di installare Ubuntu 18.04 (che ho scoperto avere un bug kernel oops) perché all’interno possiede già Python 3.6 come richiesto da Vitalik x installare Vyper, alla fine ho deciso di rinviare a prossimo anno.. il tempo x gli Smart contract a mio avviso è prematuro.. un gran parlare ovunque ma, di praticabile e concreto poco poco.. ho reinstallato Ubuntu 16.04 che però ha Python 3.5 dunque inadatto al Vyper, ed upgradare a Python 3.6 è un labirinto! dunque mi chiedo: se a oggi solo gli amici di ethereum e altri pochi super Geeks nel mondo possono installare il necessario x fare Smart contract a che serve precorrere i tempi ? La tecnologia informatica base per utenti medi non è stata ancora messa a punto, mentre varie Dapp online non lavorano bene.. quindi resta solo la speculazione su criptovalute e l’ascolto su Tedex di mille propositi su quello che Blockchain potrà fare in futuro.. meglio allora che io attenda tempi migliori.. tempi maturi. Grazie di tutto è sempre amici ?
Ciao Clem, secondo me stai sbagliando approccio. Vyper è un linguaggio (e un ambiente) ancora fortemente in via di sviluppo. Puoi scrivere smart contract facilmente con Solidity (https://solidity.readthedocs.io/en/v0.4.24/solidity-by-example.html) che è quasi lo standard in questo momento. Ti segnalo inoltre https://cryptozombies.io/ un bel gioco attraverso il quale iniziare a prendere confidenza col linguaggio e le sue regole.
Ciao Emanuele, grazie per l’incoraggiamento, non mi va di apprendere solidity/lity, troppa roba finisce per stancare, sopratutto dopo che è stato messo sotto accusa per l’inflessibilità e la vulnerabilità ad attacchi (da un articolo letto qui sul vs blog ?) conosco Python e voglio rimanere su quel solco, quindi attenderò tempi maturi per vyper. Ma accetto tuo consiglio di vedere il gioco di criptozombie, grazie ? naturalmente il mio sfogo non è rivolto a voi del blog, ma solo alla frenesia idealistica che in rete si sente riguardo al fare “Smart contractor al più presto perché è il futuro futuro è già qui e noi resteremmo indietro” cerco solo un po’ di sano e paziente pragmatismo ? ciao