I protocolli di finanza decentralizzata (DeFi) hanno avuto nel corso degli ultimi 12 mesi una grossa crescita nell’adozione e conseguentemente nei volumi scambiati. Il caso più emblematico è quello di Uniswap, il primo protocollo decentralizzato di scambio fra asset che è riuscito a competere con i grandi exchange centralizzati. La maggior parte dei protocolli DeFi funziona sulla rete Ethereum; con il “second layer” (o layer 2), si possono delegare transazioni di poca importanza a sistemi che possono gestirle con costi più bassi e in grande quantità, per poi fare una transazione nella catena principale solo se necessario.
Come funzionano i protocolli DeFi
Abbiamo detto che la maggior parte dei protocolli DeFi utilizza la rete Ethereum. Ora, un po’ per un ciclo positivo di tutto il settore, un po’ proprio per l’attenzione che la stessa DeFi ha richiamato su di sé, il prezzo dell’ether, la moneta per far funzionare le transazioni in Ethereum, è cresciuto tantissimo, volando a circa 4.000 dollari, per poi cadere e stabilizzarsi a un più modesto intorno di quota 2.000 dollari (circa un anno fa stava a quota 200 dollari).
Questo esser vittima del suo successo ha portato a una conseguenza: la DeFi è costosa.
La sillaba “De” in DeFi sta per “decentralizzata” e non per “democratica”, tuttavia ci si era un po’ convinti o magari illusi che tali protocolli fossero nati per disintermediare la finanza, per accorciare la filiera, eliminare un po’ di rent seeker e poter accedere a costi più bassi.
E invece si sono raggiunte delle fee a dir poco astronomiche. Un semplice deposito di ether su un exchange fino a 60-80 dollari, l’interazione con una liquidity pool per un semplice swap nei momenti di grande congestione della rete, è arrivata a delle mediane di prezzo di oltre 50 dollari a operazione, per la sola parte di gas fee e senza contare la fee percentuale, per la verità modesta, che viene distribuita ai liquidity provider.
E queste sono le operazioni più semplici e meno costose. La DeFi è diventato un playground per le ricche balene che avevano fatto scorta di ether quando questo era prezzato a pochi dollari.
Non si tratta solo dell’avidità dei miner, questa situazione deriva da una semplice considerazione: la blockchain di Ethereum può trattare un numero limitato di blocchi al minuto e ogni blocco ha un numero limitato di transazioni (più sono complesse, meno ne possono essere inserite in un blocco). Quindi è come cercare di salire a bordo di un treno che parte ogni circa venti secondi e in cui i posti limitati vengono messi continuamente all’asta, se i passeggeri all’imbarco sono molto più numerosi dei sedili a disposizione i prezzi salgono.
Appare quindi evidente che la DeFi per diventare anche democratica dovrebbe trovare dei meccanismi per “scalare” in modo esponenziale il numero di transazioni tenendo bassi i costi di gas.
Ethereum2 o second layer?
Mentre in Bitcoin questa soluzione globale in qualche modo si è individuata nelle Lightning Networks e la community è in buona parte orientata a una loro adozione, anche se da varie parti si levano voci critiche sull’infinita “costruzione” di questo layer, in Ethereum la strada non sembra essere così ben tracciata.
Da un lato si parla di Ethereum 2 come panacea di tutti i mali, ma gli stessi sviluppatori di questa nuova blockchain riconoscono che va pensata come un progetto a lungo termine che non potrà rispondere alle necessità di oggi.
Una grande forza dell’ecosistema Ethereum è proprio quella di dar luogo in poco tempo alla nascita, alla crescita, al successo o al fallimento di una moltitudine di progetti. Per cui nell’attesa che Ethereum2 risolva tutti i problemi di scalabilità, abbiamo a disposizione diversi meccanismi che vengono definiti layer 2, per distinguerli dal layer 1 che è appunto il protocollo che regola le transazioni sulla catena principale.
Passando da una metafora all’altra, se esistesse una sola catena dei blocchi e usassimo quella per tutte le transazioni sarebbe come se nell’economia tradizionale ogni transazione fosse gestita tramite un atto notarile: non solo l’acquisto di una casa ma anche quello di un gelato! Ovviamente non avrebbe senso, e in fondo è proprio questa l’idea alla base del layer 2, delegare transazioni non molto importanti a sistemi che possono gestirle con costi più bassi e in grande quantità, per poi in caso di necessità fare una transazione nella catena principale.
Tra i meccanismi di layer 2 che più stanno prendendo piede in Ethereum ci sono: le sidechain e i rollup.
Layer 2: cos’è una sidechain
Tecnicamente, una sidechain non è solo un meccanismo di layer 2, ma può vivere di vita propria in quanto ha una sua catena di blocchi e un suo protocollo di consenso che tiene le transazioni sicure. Tuttavia, se prendiamo una blockchain e la dotiamo di un bridge che permette di trasferire in modo sicuro e decentralizzato gli asset da e verso la catena principale, allora avremo una sidechain.
Questo significa che l’utente può spostare una parte dei suoi fondi dentro la sidechain con una transazione in mainnet (quindi costosa da un punto di vista del gas) ma una volta dentro si presuppone che tutte le transazioni fatte con altri utenti che hanno fondi nella stessa sidechain saranno rapide e poco costose.
La sicurezza della sidechain è assicurata da un protocollo di consenso completamente diverso da quello della mainnet. Questo aspetto è un po’ il punto debole di questa soluzione, infatti in principio la sidechain stessa per essere efficiente e veloce nel transare grandi quantità di pagamenti deve necessariamente fare qualche compromesso. Se infatti fosse una soluzione sicura, scalabile e decentralizzata, allora non si capisce perché la sidechain non potrebbe essere usata direttamente come blockchain unica e principale.
Infatti, in genere le sidechain hanno un protocollo di consenso che risulta sempre un po’ più centralizzato di quello della mainnet, sia perché lo è proprio il protocollo, sia perché magari i nodi validatori e block producer sono nelle mani di pochi attori.
Se la mainnet è come il “suolo pubblico”, entrare nella sidechain è un po’ come entrare in un luogo privato: potreste essere cacciati via senza troppi convenevoli e senza preavviso.
Tra le soluzioni più interessanti e che stanno acquisendo una grande popolarità ci sono quelle sidechain che non soltanto hanno un bridge bidirezionale con la mainnet, ma hanno una vera e propria totale compatibilità del loro formato di transazioni con Ethereum, ovvero sono compatibili con Web3 e EVM (Ethereum Virtual Machine) che rispettivamente sono gli standard con cui un’applicazione interagisce con la blockchain e il set di operation code con cui si costruiscono e vengono eseguiti gli smart contract.
Questo si traduce, in parole povere, nel fatto che uno smart contract scritto per Ethereum potrebbe essere ricompilato e lanciato in esecuzione anche sulla sidechain EVM compatibile, e grazie a web3 anche i wallet normalmente pensati per Ethereum possono funzionare con la sidechain.
Tra queste soluzioni voglio citare la Binance Smart Chain, che ha dato vita a un ecosistema al centro del quale c’è sicuramente PancakeSwap, il protocollo di finanza decentralizzata che è in pratica un clone di Uniswap.
Altre due sidechain che stanno vedendo un notevole incremento in volume e numero di applicazioni sono xDai e Matic (ora ribattezzata Polygon).
Layer 2: cosa sono i rollup?
I rollup sono una soluzione di layer 2 che, a differenza della sidechain, affida la sicurezza delle sue transazioni alla catena di blocchi principale.
In un certo senso possiamo immaginarli come un meccanismo per comprimere tante transazioni fra gli utenti dentro una sola transazione in mainnet con un rapporto di 1 a 100 circa, e tutto questo senza scendere mai a compromessi con il livello di sicurezza e di decentralizzazione del sistema.
La magia alla base dei rollup viene direttamente da un algoritmo crittografico detto Merkle tree. Senza entrare troppo nei dettagli, questo algoritmo permette di costruire delle prove matematiche che una determinata identità abbia un determinato balance (ad esempio Alice: 1000) a un determinato momento, senza bisogno di pubblicare nella catena principale l’insieme completo di tutti i balance di tutti gli utenti (che è esattamente quello che accade oggi con i token erc20).
Grazie a una struttura ad albero binario, un Merkle tree può comprimere ad esempio 1024 balance con un albero binario di 11 livelli dove ogni nodo è l’hash a 32 byte dei suoi nodi figli. Questo produce una radice, detta Merkle root di 32 byte che può essere scritta dentro uno smart contract nella catena principale.
Il funzionamento può essere pensato così:
- lo smart contract ha memorizzato il Merkle root che rappresenta tutti i balance al tempo t=T0;
- dopo T0 avvengono numerosi scambi Alice->Bob:1, Charlie->Alice:30, e così via;
- le transazioni vengono raggruppate in un batch con un formato molto compatto, molto più compatto di quello abituale della mainnet;
- tutti i nuovi balance vengono aggiornati e un nuovo Merkle tree viene creato. Il batch con il nuovo Merkle tree viene inserito nel batch;
- lo smart contract aggiorna il suo stato memorizzando il nuovo Merkle root.
La domanda cruciale è: dato che un batch può essere preparato da chiunque, che le transazioni al suo interno non sono firmate dai rispettivi pagatori e non esiste un’autorità preposta a farlo (altrimenti non staremmo a parlare di soluzione decentralizzata), come fa lo smart contract a sapere che il nuovo Merkle tree e quindi il suo Merkle root non contenga transazioni malevole?
Il Merkle tree è molto efficace per dimostrare che un “dato” esiste in un insieme (ad esempio balance di Alice:1000) ma non altrettanto valido per dimostrare che un dato non esiste (ad esempio dimostrare che non esiste transazione malevola in cui Charlie che crea il batch si accredita tutti i coin di alcuni utenti).
Per questo problema esistono due categorie di soluzione: gli optimistic rollup e i zero-knowledge rollups (in breve zk-rollups).
Nei primi è previsto un periodo di tempo in cui la parte defraudata può fare ricorso, costruire una proof-of-fraud, inviarla allo smart contract che, verificata l’accusa, provvede a rimuovere dal rollup il batch della frode e tutti i successivi. Questo significa che nessuno è autorizzato a prelevare i fondi dal rollup verso la catena principale finché il periodo per il “ricorso” non sarà esaurito.
Nello zk-rollup, invece, il batch, oltre al nuovo Merkle root, contiene anche una prova crittografica chiamata Zk-Snark che dimostra che il batch e il nuovo Merkle root sono effettivamente corretti. Tale prova è molto onerosa da costruire, ma indipendentemente dal numero di transazioni e di account si può verificare in modo quasi istantaneo.
Questa proprietà rende gli zk-rollup molto interessanti e tra tutte le soluzioni di scalabilità la più promettente. Ma c’è un inconveniente: allo stato attuale i rollup sono un’ottima soluzione per il trasferimento di somme da un account all’altro ma non sono pronti per l’esecuzione di smart contract. Questo a causa della complessità nella generazione delle prove crittografiche e in particolar modo nel caso dei zk-rollup. Tale inconveniente li rende ancora poco adatti per la realizzazione di protocolli di finanza decentralizzata che stanno invece trovando grande spazio nelle sidechain EVM compatibili.