Pionieri della blockchain
Accedi

Uniswap: exchange “veramente” decentralizzato per lo scambio di token su EthereumTempo di lettura: 15 min.

menu categorie articoli

Amici di EtherEvolution, oggi vi parliamo di una delle applicazioni al momento più in voga sulla blockchain di Ethereum. Uniswap è un protocollo per lo scambio veloce di token, con delle caratteristiche uniche che lo rendono veramente decentralizzato.

Un vero DEX

Uniswap è uno degli exchange decentralizzati (DEX) basati su Ethereum di cui si sente più parlare. Lo stesso Vitalik Buterin l’ha elogiato a più riprese.

Guardando alle sue caratteristiche, si può affermare che si tratta di un “exchange completamente decentralizzato” per lo scambio di token sulla blockchain di Ethereum.

È stato lanciato nel novembre del 2018, ma è già uno dei DEX più utilizzati, nonché una delle dApp di maggiore successo del panorama della finanza decentralizzata (DeFi).

Il motivo per cui apprezzo particolarmente questo progetto risiede nel fatto che non è previsto alcun suo token nativo e neppure commissioni per la piattaforma.

Il team che l’ha ideato non ha tenuto alcuna ICO finalizzata esclusivamente a fare incetta di denaro.

Uniswap non garantisce alcun trattamento privilegiato ai primi investitori, agli early adopters o agli sviluppatori.

Il progetto ha ricevuto solo un finanziamento di 100.000,00 $ da parte della Fondazione Ethereum, ciò che è indice di approvazione da parte del principale ente alla spalle di Ethereum.

Un altro elemento a favore di Uniswap risiede nell’assenza di elementi di centralizzazione, la cui violazione sarebbe in grado compromettere la tenuta di un sistema che si regge sul paradigma della decentralizzazione.

In particolare, Uniswap non ha un oracolo per la comunicazione del prezzo dei pair di scambio.

È un aspetto positivo in funzione dell’obiettivo di decentralizzazione della piattaforma, considerato che un sistema di oracoli mal congegnato diventa solo un rischioso single point of failure.

Come vedremo, anziché basarsi su un order book, come la maggior parte degli exchange, Uniswap è costituito da una serie di smart contract che mantengono delle riserve di liquidità per ogni token.

Il sistema non accoppia l’ordine di un utente con quello di un altro utente, ma lo esegue direttamente nei confronti della pool di liquidità.

Attraverso Uniswap è possibile:

  • scambiare rapidamente ETH e qualsiasi token ERC20;
  • guadagnare fee fornendo dei fondi a una pool di liquidità;
  • creare un nuovo mercato di scambio, se non è già esistente per uno specifico token.

Scambio ETH ⇄ ERC20

Per ogni coppia di scambio ETH/ERC20 esiste un apposito smart contract (“exchange contract”) che mantiene una riserva di liquidità di entrambi gli asset (cioè ETH e il rispettivo token ERC20 del pair).

Per eseguire uno scambio è sufficiente accedere all’intuituva app front end di Uniswap:

Nel campo “Input” bisogna selezionare la criptovaluta che si intende vendere e la quantità. In questo esempio ho selezionato ETH, specificando che voglio venderne 1.

Nel campo “Output” bisogna selezionare la criptovaluta che si vuole comprare. Sarà direttamente l’applicazione ad indicare l’importo che si riceverà in base al tasso di cambio corrente.

In questo esempio ho selezionato DAI come criptovaluta che intendo comprare. Mi viene indicata in automatico la quantità di DAI che dovrei ricevere vendendo 1 ETH.

Infine bisogna cliccare su “Swap” per eseguire lo scambio.

Nulla di più semplice! L’utente finale può fermarsi già qui.

Come hai potuto notare, Uniswap è un DEX dall’interfaccia semplice e pulita. È utilizzabile da chiunque con un paio di click.

Nell’introduzione di questo articolo, però, ho specificato che Uniswap non dispone di un oracolo per la comunicazione dei prezzi.

Ma allora, trattandosi di un exchange decentralizzato, in assenza di un sistema di oracoli, chi determina il tasso di cambio per ogni pair?

Andiamo un po’ più nel dettaglio esplorando il modello alla sua base.

Come si determina il tasso di cambio su Uniswap?

Uniswap imposta automaticamente i prezzi utilizzando il meccanismo di market maker del prodotto costante (x * y = k), che mantiene le riserve in equilibrio relativo.

Questo modello è stato proposto dallo stesso Vitalik Buterin nel marzo del 2018 su Ether Research, proprio al fine di applicarlo a un exchange decentralizzato basato sulla blockchain.

Vitalik ha chiamato quest’idea come “x*y=k market maker”.

Gli ideatori di questo exchange decentralizzato l’hanno poi implementata nello sviluppo di Uniswap come market maker.

In parole più semplici, il tasso di cambio tra ETH e un ERC20 si basa sulle dimensioni relative delle loro riserve di liquidità all’interno dello smart contract.

Si ottiene mantenendo la relazione eth_pool * token_pool = invariante.

Questo invariante resta costante durante gli scambi e cambia solo quando la liquidità viene aggiunta o rimossa dal mercato.

Nell’esempio di sopra ho venduto ETH per acquistare DAI. Vuol dire che ho inviato degli ETH (in questo caso 1) alla pool, contribuendo ad aumentare la riserva di liquidità di ETH.

Per mantenere la relazione eth_pool * token_pool = invariante, la riserva di liquidità del token ERC20 (in questo caso DAI) si riduce di un importo proporzionale.

L’importo di cui la riserva del token ERC20 si riduce, equivale all’ammontare dei token comprati.

Questa variazione nel rapporto di riserva modifica il tasso di cambio per gli scambi da ETH al token ERC20, incentivando gli scambi nella direzione opposta.

Il motivo è dovuto al fatto che, a seguito di uno scambio ETH -> ERC20, la riserva di ETH si è incrementata, mentre quella del token ERC20 si è ridotta.

Come logica conseguenza, chi successivamente richiederà uno scambio nella stessa direzione (cioè da ETH a ERC20) riceverà una quantità proporzionalmente inferiore del token ERC20.

Un esempio pratico può aiutare a chiarire le idee.

Esempio di scambio ETH -> BAT

Ipotizziamo che nello smart contract del pair di scambio ETH/BAT siano depositati 20 ETH e 19.000 BAT.

Avremo quindi:

ETH_pool = 20

BAT_pool = 19.000

invariante = 20 * 19.000 = 380.000

Ora un utente vuole vendere 3 ETH e comprare una quantità corrispondente di BAT.

Invia 3 ether allo smart contract, di cui lo 0.3% vengono trattenuti come fee, che serve per remunerare i fornitori di liquidità (vedi sotto per quanto riguarda i fornitori di liquidità).

I restanti 2.991 ETH vanno ad incrementare la riserva di liquidità di ETH.

Successivamente, l’invariante viene diviso per la nuova quantità di ETH presente nella pool di liquidità, per determinare la nuova dimensione della pool di BAT.

I BAT rimanenti vengono inviati all’acquirente.

Per chiarire:

L’utente invia 3 ETH

Fee: 0,3% di 3 ETH = 0.009 ETH

ETH_pool = 20 + 3 – 0,009 = 22,991

BAT_pool = 380.000/22,991 = 16.528,2066895

L’utente riceve: 19.000 – 16.528,2066895 = 2.471,79331042 BAT

La fee pagata dall’utente viene aggiunta alla riserva di liquidità solo dopo l’esecuzione dello scambio, andando ad incrementare l’invariante dopo ogni trade (serve a rendere profittevole il sistema per i fornitori di liquidità).

Ciò che rappresenta realmente l’invariante è ETH_pool * BAT_pool alla fine dello scambio precedente:

ETH_pool = 22,991 + 0.009 = 23

BAT_pool = 16.528,2066895

nuovo invariante = 23 * 16.528,2066895 = 380.148,7538585

Poiché la fee viene aggiunta dopo il calcolo del prezzo, l’invariante aumenta gradualmente con ogni operazione di scambio eseguita, rendendo redditizio per i fornitori di liquidità l’attività di deposito di liquidità in un exchange contract.

Nell’esempio appena fatto, l’utente ha acquistato BAT al tasso di cambio di 823,931103473 per ogni ETH venduto. Ora però il tasso di cambio si è modificato, poiché si è incrementata la riserva di liquidità di ETH ed è diminuita quella di BAT.

Se un altro utente eseguirà uno scambio nella stessa direzione, otterrà un tasso di cambio peggiore rispetto al precedente. Al contrario, se un acquirente eseguirà uno scambio nella direzione opposta (cioè vende BAT per comprare ETH), otterrà un tasso leggermente migliore.

Ma come fa il prezzo a mantenersi in linea con quello degli altri exchange?

Attraverso gli arbitraggi.

Gli arbitraggisti possono sfruttare opportunità di guadagno quando il tasso di cambio di un pair è disallineato rispetto a quello del mercato in generale.

L’effetto mediato dell’attività di arbitraggio è quello di favorire il riallineamento dei prezzi di Uniswap con quelli di mercato.

Se ad esempio su Uniswap con 1 ETH, in base al corrente rapporto di scambio, si ottiene una quantità di BAT superiore rispetto alla media di mercato, l’arbitraggista sarà incentivato a vendere ETH e a comprare BAT, i quali verranno rivenduti a loro volta su un altro exchange.

Questa azione farà aumentare il prezzo di BAT/ETH su Uniswap, riconducendolo verso la media di prezzo degli altri exchange.

Scambio ERC20 ⇄ ERC20

Su Uniswap ogni exchange contract mantiene una riserva di liquidità di ETH e di un token ERC20. In altri termini, ogni exchange contract costituisce un pair di scambio ETH/ERC20.

Poiché ETH viene utilizzato come pair comune per tutti i token ERC20, può essere impiegato come intermediario per gli scambi da ERC20 a ERC20. Ad esempio, è possibile convertire da BAT a ETH su un exchange e poi da ETH a DAI su un altro, nell’ambito di una singola transazione.

È questo il modo in cui avvengono gli scambi diretti ERC20 ⇄ ERC20, senza che l’utente se ne accorga!

Per scambiare BAT con DAI, ad esempio, l’utente chiama la funzione tokenToTokenSwap() sull’exchange contract di BAT.

Lo smart contract converte i BAT in ETH. Però, anziché inviare gli ETH all’utente (come avverrebbe in uno scambio ERC20 -> ETH), viene chiamata la funzione ethToTokenTransfer() sull’exchange contract di DAI.

Lo smart contract del pair ETH/DAI, quindi, converte gli ETH in DAI, inviandoli all’indirizzo dell’utente.

La seguente immagine rende più intuitivo il meccanismo alla base degli scambi ERC20 ⇄ ERC20:

L’utente finale non è tenuto conoscere tutti questi dettagli, che ho comunque riportato per chi vuole capire come funziona Uniswap a più basso livello.

Come già visto per gli scambi ETH ⇄ ERC20, per scambiare un token ERC20 contro un altro token ERC20, è sufficiente accedere all’app front di Uniswap:

Ho indicato come token di input (quello che voglio vendere) BAT e come token di output (quello che voglio comprare) DAI.

Inserendo la quantità di BAT che voglio vendere, il sistema mi calcola in automatico la quantità di DAI che riceverò.

Ma chi mette la liquidità negli smart contract di Uniswap?

Fornitori di liquidità

Ho specificato a più riprese che gli scambi su Uniswap non dipendono da un order book che accoppia gli ordini degli utenti.

Uniswap si basa su riserve di liquidità, nei confronti delle quali gli utenti eseguono gli ordini.

Qualsiasi persona può fornire fondi per sostenere le riserve di liquidità, diventando un “fornitore di liquidità”.

La ragione per cui una persona dovrebbe essere incentivata a vincolare liquidità in un exchange contract, è dovuta al fatto che le fee pagate dagli utenti vengono corrisposte proprio ai fornitori di liquidità.

Per diventare fornitore di liquidità bisogna inviare all’exchange contract di un determinato pair una quantità di ETH e di token ERC20, in base al rapporto di scambio esistente al momento del deposito.

È sufficiente recarsi nella sezione “Pool” dell’app di Uniswap:

In questo esempio ho deciso di diventare fornitore di liquidità per il pair ETH/MKR.

Dopo aver indicato la quantità di ETH che voglio depositare (in questo esempio 10), l’app mi calcola in automatico, in base al tasso di cambio corrente, la corrispondente quantità di MKR (3,5606) che si deve vincolare insieme a ETH.

Infine bisogna cliccare su “Add Liquidity” in basso.

Qualora si trattasse di un primo fornitore di liquidità a finanziare una pool di liquidità (cioè a creare un nuovo pair di scambio ancora non esistente), sarebbe egli a determinate il tasso di cambio iniziale, depositando quello che ritiene essere un valore equivalente di ETH e del token ERC20.

È logico che se questo rapporto è disallineato rispetto al prezzo di mercato, gli arbitraggisti porterebbero i prezzi in equilibrio, a spese del fornitore di liquidità iniziale.

A livello tecnico, quando viene creato un nuovo pair di scambio, l’utente chiama la funzione createExchange() dello smart contract uniswap_factory.vy.

Questa funzione consente a qualunque utente di deployare un nuovo exchange contract per un ERC20 che ne è ancora privo.

Liquidity token

Quando un utente fornisce liquidità a un exchange contract, lo smart contract conia dei cosiddetti “liquidity token”.

La funzione dei liquidty token è quella di tracciare la quota delle riserve totali spettante al singolo fornitore di liquidità.

Il numero di liquidity token coniati è determinato dalla quantità di ETH inviati alla funzione addLiquidity() dell’exchange contract di riferimento.

Può essere calcolato usando l’equazione:

Quantità coniata = importo totale * ETH depositati / ETH nella pool

Un fornitore di liquidità può bruciare i liquidity token in qualsiasi momento, per ritirare dalla pool la corrispondente quota di ETH e del token ERC20.

L’utente preleva ETH e il token ERC20 al tasso di cambio corrente, non in base al rapporto di riserva dell’investimento originario. Significa che può essere perso del valore, per via delle fluttuazioni di mercato e degli arbitraggi.

I liquidity token rappresentano il contributo dei fornitori di liquidità a un pair ETH/ERC20.

Essendo i liquidity token a loro volta dei token ERC20, è possibile venderli o trasferirli tra gli account senza rimuovere la liquidità dalla pool.

Conclusioni

Nel titolo ho definito Uniswap come un exchange veramente decentralizzato.

Il suo punto di forza risiede nell’assenza di un order book centralizzato, di commissioni per la piattaforma e, in particolare, nell’assenza di un apparato di governance finalizzato puramente a realizzare un business model, come avviene invece nel caso di Binance DEX.

Ciononostante Uniswap non rimpiazza totalmente gli exchange centralizzati.

Si può anzi affermare che Uniswap faccia affidamento sugli exchange centralizzati per funzionare, in ragione del ruolo chiave ricoperto dagli arbitraggisti in questo sistema.

Nel caso in cui un tasso di cambio di Uniswap sia sbilanciato, qualunque ne sia la ragione, è necessario un meccanismo per ripristinare nuovamente l’equilibrio. In questo caso dunque gli arbitraggisti sfrutteranno i diversi tassi di cambio di altri servizi per eseguire l’arbitraggio.

Morale della favola è che Uniswap è un exchange veramente decentralizzato, che tuttavia non elimina la necessità degli exchange centralizzati. Li presuppone per poter funzionare senza un sistema di oracoli.

È ragionevole supporre che solo il tempo dirà come si evolverà il protocollo e come verrà utilizzato Uniswap in futuro.


DISCLAIMER: Il presente articolo ha finalità esclusivamente didattiche, in particolare di descrizione delle caratteristiche di un’appilcazione decentralizzata del panorama blockchain. Questa esposizione non costituisce alcun invito/sollecitazione all’utilizzo dell’applicazione, pertanto non ci assumiamo alcuna responsabilità in caso di danni derivanti da eventuali bug presenti nel codice dell’applicazione.

Non perdere le ultime notizie

Se questo articolo ti è piaciuto e vuoi rimanere sempre aggiornato sul mondo cripto e blockchain iscriviti alla nostra Newsletter

Guest

Guest

Guest

Guest

Commenti

3 risposte

  1. Ottimo articolo, resta da vedere se questo nuovo Dex Uniswap, permetterà realmente di scambiare token erc20 creati da chiunque seppur non prezzati o conosciuti dai vari Exchange .. vado a testare..

    1. Buongiorno a tutti, parliamo di poca trasparenza delle banche e poi uno si infila in questi “giochetti” che nessuno teoricamente gestisce, ma che tutti potrebbero gestire..

      io non andrei in giro di notte bendato in montagna…
      questo sistema mi da la stessa sensazione..

      meno male che si perdono “solo soldi” e non la vita..

      non ci siamo proprio ragazzi..

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *