Pionieri della Blockchain
Menu
Home » Exchange » Uniswap: exchange “veramente” decentralizzato per lo scambio di token su Ethereum

Uniswap: exchange “veramente” decentralizzato per lo scambio di token su Ethereum

13 Ottobre 2019 20:00
Tempo di lettura: 11 min.
13 Ottobre 2019 20:00
Giuseppe Brogna

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 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.



3 VIDEO GRATUITI DALLA DM CRIPTO












Ti invieremo i
VIDEO GRATUITI
e in più, n
elle email successive, il frutto delle nostre ricerche più avanzate sulle criptovalute e i nostri servizi legati ad esse.

Tratteremo i tuoi
dati personali
con la massima cura e in conformità della normativa privacy GDPR UE2016/679. E potrai disiscriverti in qualsiasi momento con un semplice click.


Condividi

CATEGORIE:

ExchangeProgetti su Ethereum


Giuseppe Brogna

Giuseppe è laureato in giurisprudenza, da sempre appassionato di tecnologia e studioso di tematiche economiche. Stimolato dal potenziale impatto economico e sociale, si approccia al mondo delle DLT; matura particolari interessi nella nuova finanza decentralizzata legata alle tecnologie del ledger distribuito.


  1. ha commentato:

    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..

    • ha commentato

      Clemente questo è possibile attravero la funzione pubblica createExchange() dello smart contract che funge sia da factory che da registro per gli altri exchange contract.

      • ha commentato:

        Ciao Giuseppe, ho fatto varie prove, ho creato un Exchange contract come primo finanziatore di una coppia (1 eth a fronte di 10mila XXX erc20), tutto bene, ho ottenuto un exchange rate di 1 eth = 10.000 token XXX. Poi non so come, sono finiti un milione di altri token dentro il POOL., senza che nessuno chiedesse autorizzazione (ne metamask ne Uniswap). allora ho provato a tirar fuori 1milione di XXX con la voce SEND , ma niente, mi dice “⚠️High Slippage Warning” così da li non riesco più a tirarli fuori.. in sostanza c’è una confusione alta tra SWAP, SEND e POOL.. l’unica cosa chiara è che, per fare queste transazioni, devi avere un wallet erc20 aperto sullo stesso browser (esempio Chrome), ma come si possa gestire il pool e riportarlo al rate iniziale proprio non si sa.. Quindi al momento mi sembra ancora una Dapp ancora troppo beta.. ovvero poco chiara nei suoi passaggi e assai rischiosa..

        • ha commentato

          ho fatto varie prove, ho creato un Exchange contract come primo finanziatore di una coppia (1 eth a fronte di 10mila XXX erc20), tutto bene, ho ottenuto un exchange rate di 1 eth = 10.000 token XXX

          Se sei primo finanziatore, il tasso di cambio lo definisci tu.

          Poi non so come, sono finiti un milione di altri token dentro il POOL., senza che nessuno chiedesse autorizzazione (ne metamask ne Uniswap)

          Ma derivanti dal tuo account o da quello di qualcun’altro?

          allora ho provato a tirar fuori 1milione di XXX con la voce SEND , ma niente, mi dice “⚠️High Slippage Warning” così da li non riesco più a tirarli fuori

          Attenzione, la voce “SEND” chiama, a seconda dei casi, le funzioni ethToTokenTransfer(), tokenToEthTransfer(), e tokenToTokenTransfer(), in base alle quali acquisti una criptovaluta e la trasferisci a un altro indirizzo (diverso da quello tuo con il quale sei collegato). Per rimuovere la liquidità che hai fornito, bisogna andare su “Remove Liquidity”.

          • ha commentato:

            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..

  2. ha commentato:

    Grazie Giuseppe. Articolo davvero apprezzato e ben spiegato. Molto utile e affascinante. Avrei solo evitato l’accostamento a Binance dex per più motivi, ma cmq grazie per la condivisione

    • ha commentato

      Ciao Giovanni, grazie innanzitutto. In realtà non è un accostamento a Binance DEX. Al contrario, volevo sottolineare che Binance DEX non rispecchia i canoni di decentralizzazione. Mi hai fatto notare che la frase è equivoca. Grazie per l’appunto, la correggerò.

  3. ha commentato:

    Ciao Giuseppe, ho usato la funzione remove Liquidy, ed è proprio quella che ha creato il casino.. in pratica ha tolto 0,9 ETH dal pool, e ci ha messo un milione di mieii altri token XXX, di fatto annacquandone il prezzo (rate tra eth e mio token) così ho cercato di recuperare quel milione di token che ora costavano 0,000n ETH, ma niente, sia usando SWAP sia SEND e sia le sottovoci di POOL mi dava sempre lo stesso errore evidenziato sopra .. e dire che loro scrivono che la versione è beta ed è a nostro rischio se la usiamo.. ma cavolo perdere anche i propri token non è bella cosa.. magari prima dovrebbero testarla questa Dapp e poi metterla in rete.. ora mi ripaga della spesa sostenuta mesi fa per creare un token erc20? E mi sembra di aver letto che la foundation ethereum ha pure investito nel progetto, così perde di credibilità ai i miei occhi, allora meglio una qualunque Baas (Blockchain as a service) tipo Ardor, dove i token o asset che crei restano nell’ecosistema e li puoi cambiare con criptò locali.. lodevole la vision dietro Uniswap, ma pessimo il tentativo di mettere online una Dapp rischiosa. Forse ad altri andrà meglio, a patto che si fermino al primo tentativo di creare la coppia eth/miotoken.

    • ha commentato

      Sicuro di aver utilizzato la giusta funzione?

      Quando hai fatto remove liquidty avrebbe dovuto restituirti sia ETH che il token ERC20, nello stesso rapporto in base al quale li avevi forniti (perché presumo che nel frattempo non ci siano stati scambi su quel pair).

      Non capisco perché mai ti abbia dato indietro solo gli ETH e tra l’altro ha inviato i tuoi token ERC20 allo smart contract. L’unica spiegazione è che, per errore, hai fatto uno swap in luogo del ritiro della liquidità, chiamando quindi la funzione tokenToEthSwap().

      In ogni caso, contatta il team di sviluppo sul canale Discord (https://discord.gg/Y7TF6QA) e spiega nei dettagli quello che hai fatto. Riusciranno a farti capire cosa è successo.

      • ha commentato:

        Grazie Giuseppe, contatterò il team da te consigliato, rimettere a posto i miei token e rifare il contratto di exchange sarebbe bello.. forse per noi italiani crea un po’ di confusione il significato delle tre parole inglesi a cui non siamo abituati.. ad esempio non si capisce bene semanticamente, la differenza tra swap e send, mentre pool (piscina, riserva) pur se si capisce, ha funzioni interne che si possono confondere con swap e send.. contatto il team e poi ti faccio sapere 🤔 grazie

Lascia un commento

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

Condividi questo articolo

Invia questo articolo ad un amico