Se escludiamo una ristretta cerchia di utenti più esperti, in pochi conoscono il concetto di “Allowance” per gli smart contract, i rischi associati e le più adeguate modalità di gestione.
Hai interagito almeno una volta con una dApp DeFi? Allora ti sarà sicuramente capitato di approvare le cosiddette Allowance.
Magari non ti sei reso neppure conto di cosa stessi facendo. Eppure questo passaggio è necessario per poter usufruire di alcune funzionalità delle dApp.
Le Allowance per spendere i token
Prendiamo ad esempio una della applicazioni DeFi più semplici e note: Uniswap.
Uniswap è un cosiddetto AMM (Automated Market Maker) che consente di scambiare ether e i token della blockchain di Ethereum.
Se ad esempio hai 50 token DAI e vuoi scambiarli – per il corrispondente valore – nel token BAT, con Uniswap puoi farlo in un paio di click.
Ti sarà magari capitato di notare che, prima di scambiare un token, devi fare un’altra transazione, propedeutica a quella di scambio, che in un certo senso “abilita” quel token a poter essere scambiato.
Un altro esempio possiamo farlo con il protocollo di lending Compound.
Prima di poter prestare il tuo token su Compound, devi abilitarlo. In genere, dall’interfaccia grafica, bisogna cliccare sulla voce “Enable” oppure “Allowance”, a seconda della dApp utilizzata.
Per intenderci, l’approvazione dell’Allowance serve per consentire allo smart contract (con cui vuoi interagire) di trasferire i token presenti sul tuo wallet.
Se ad esempio stai scambiando i tuoi DAI per BAT su Uniswap, devi prima dare il permesso a Uniswap di prendere i DAI dal tuo wallet per scambiarteli con BAT.
In termini più semplici, l’Allowance è una sorta di permesso (o mandato) che attribuisci allo smart contract per spendere – nel tuo interesse – il token che vuoi utilizzare nella sua dApp.
Perché le Allowance sono necessarie?
Esiste una differenza tra il token nativo di Ethereum, ether, e i cosiddetti token ERC20.
Ether è il token nativo, previsto direttamente nel protocollo Ethereum.
Con ether è possibile chiamare una funzione di uno smart contract e allo stesso tempo inviare ether allo smart contract, attraverso le cosiddette funzioni payable.
I token, invece, sono essi stessi smart contract.
Non è quindi possibile inviare direttamente dei token a uno smart contract mentre viene chiamata una delle sue funzioni.
Invece, lo standard ERC20 consente agli smart contract di trasferire i token per conto degli utenti attraverso la funzione transferFrom( )
.
È questa la ragione per cui l’utente deve approvare l’Allowance. Cioè per consentire allo smart contract di trasferire i token per conto dell’utente stesso.
In questo modo l’utente può “depositare” i token sullo smart contract (ad esempio quello di Compound per usare la funzione di lending) e, allo stesso tempo, lo smart contract può aggiornare il proprio stato per rispecchiare il deposito e “accreditare” i cToken all’utente (la “ricevuta” che attesta il deposito su Compound).
Quindi, ricapitolando, se vuoi prestare dei token su Compound:
- devi approvare una prima transazione per consentire allo smart contract di trasferire su Compound i tuoi token;
- successivamente dovrai effettuare un’altra transazione con la quale specifichi quanti token vuoi depositare;
- lo smart contract di Compound prenderà dal tuo wallet la quantità da te specificata usando la funzione
transferFrom( )
.
Le Allowance possono essere pericolose
Per fare un parallelo con il mondo dei servizi bancari e finanziari tradizionali, le Allowance possono essere paragonate alle domiciliazioni bancarie (o Rid bancario).
Attivando un Rid, consenti a un’azienda fornitrice di un servizio/prodotto di addebitare direttamente le fatture sul tuo conto corrente.
Sono rari i casi in cui un’azienda tenta di truffare il cliente addebitando un importo maggiore o non dovuto. Le aziende serie non hanno interesse a screditarsi assumendo atteggiamenti truffaldini.
Ma anche se ciò dovesse accadere, arrivano in soccorso i tipici sistemi di tutela sulle transazioni finanziarie. Si riuscirebbero a retrocedere i pagamenti non dovuti.
Nel mondo della blockchain questo non è possibile. Se uno smart contract spende i token di un utente in modo arbitrario, senza che l’utente lo voglia, non è più possibile rimediare.
Non tutti gli smart contract sono legittimi e creati con buone intenzioni.
Alcuni smart contract potrebbero essere creati da anonimi sviluppatori al solo fine di truffare gli utenti. Oppure altri smart contract potrebbero essere legittimi, ma nascondere delle vulnerabilità sfruttabili da malintenzionati per rubare i fondi agli utenti.
Non si tratta solo di un’ipotesi teorica. È già successo.
Ad esempio, un progetto scam chiamato UniCats è stato usato per rubare gli UNI (il token di Uniswap) che gli utenti avevano depositato per farmare il token MEOW.
Sono stati rubati non solo i token depositati sullo smart contract, come si potrebbe ingenuamente ritenere, ma anche quelli che gli utenti pensavano di custodire al sicuro nel proprio wallet.
Il problema è che molto spesso non si attribuisce allo smart contract il solo permesso di spendere la specifica somma che serve in quel momento.
Per evitare che ogni qualvolta si debba fare una doppia transazione per consentire allo smart contract di spendere i token, si approvano le cosiddette Allowance illimitate.
Molte dApp non consentono neppure all’utente di scegliere se approvare un Allowance limitata a una specifica quantità di fondi.
Per facilitare la user experience, fanno approvare direttamente Allowance illimitate, in modo che lo smart contract non abbia più bisogno di permessi successivi per compiere azioni con i token dell’utente.
Oppure può essere lo stesso utente a decidere di abilitare delle Allowance illimitate, per evitare di dover fare ogni volta una doppia transazione (cioè una per dare il permesso di spesa allo smart contract e l’altra per utilizzare una funzione della dApp in questione).
Il problema però è che approvare delle Allowance illimitate può essere molto pericoloso.
Consentire a uno smart contract di spendere i propri token senza limiti, vuol dire che lo smart contract potrebbe in qualunque momento – anche in un futuro molto lontano – utilizzare i token presenti sul wallet dell’utente (cioè lo specifico token per il quale era stata approvata l’Allowance).
Ma non devo comunque firmare con la mia chiave privata? E se uso un hardware wallet?
No, non c’entra niente. Approvare l’Allowance vuol dire autorizzare a priori lo smart contract a spendere i token, senza che abbia bisogno della chiave privata per farlo.
È chiaro che uno smart contract legit (come ad esempio Uniswap, Maker, Aave e tutte le dApp più popolari), non scritto con finalità truffaldine, non prevederebbe nel suo codice la possibilità di spendere in maniera arbitraria i token dell’utente.
Il problema però sorge se magari si approvano le Allowance per smart contract poco noti, magari non sottoposti ad audit e a peer review del codice.
L’utente potrebbe ingenuamente pensare di mettere a rischio solo la piccola quantità di token che trasferisce allo smart contract poco affidabile.
In realtà lo smart contract potrebbe spendere anche tutti gli altri token presenti sul wallet dell’utente, ove ci fosse modo di farlo in base a quanto è previsto nel suo codice.
Ma potrebbe anche aversi il caso di uno smart contract notoriamente legittimo che però nasconde delle vulnerabilità (non volute). Queste potrebbero essere sfruttate da qualche malintenzionato per spendere i token dei wallet che hanno approvato Allowance illimitate.
Come gestire le Allowance
Il modo più saggio di gestire i propri token con gli smart contract, è quello di non approvare Allowance illimitate.
Se interagisci con uno smart contract di cui ti fidi poco, oppure con una dApp molto popolare e affidabile ma che non ritieni di utilizzare frequentemente in un breve lasso di tempo, la migliore cosa da fare è approvare Allowance limitate alla quantità di token che si devono utilizzare in quello specifico momento.
Questo pattern di approvazione-spesa risulterà ovviamente più scomodo.
Ogni volta dovrai fare una doppia transazione. Ma in compenso renderà i tuoi token più sicuri, poiché lo smart contract non potrà spendere oltre la soglia limite che avrai impostato.
Gli utenti ora sono più consapevoli della questione delle Allowance rispetto a uno o due anni fa. Per questo alcune dApp offrono la possibilità di approvare solo l’importo che stai spendendo al momento.
Ma la maggior parte delle dApp ancora non consente di approvare della Allowance limitate a uno specifico importo.
Tuttavia, anche in questi casi, gli utenti più avanzati possono limitare le Allowance – in fase di approvazione – tramite l’interfaccia di MetaMask.
È inoltre sempre buona norma rivedere periodicamente tutte le Allowance approvate per gli smart contract e modificarle in base alle specifiche esigenze del caso. Si possono anche revocare totalmente le Allowance per gli smart contract che ritieni di non dover più utilizzare.
Puoi revocare totalmente un Allowance interagendo direttamente con lo smart contract.
Dovresti chiamare approve(address spender, uint256 amount)
sullo smart contract del token: “spender” è l’indirizzo dello smart contract per cui desideri revocare l’accesso e “amount” deve essere 0.
Potrebbe però accadere che non ricordi quali siano gli smart contract per cui hai approvato delle Allowance. Inoltre, per gestire il tutto, preferiresti una soluzione più comoda da interfaccia grafica.
Esistono dei tool che ti aiutano a individuare gli smart contract per i quali hai approvato delle Allowance e a gestirle in pochi click.
Uno di questi è Revoke.
Connettendoti con il tuo wallet o copiando ed incollando l’indirizzo del tuo wallet, questa applicazione scansiona automaticamente la blockchain alla ricerca degli smart contract per i quali sono stati approvati permessi di spesa in relazione al tuo indirizzo.
Attraverso la sua comoda interfaccia grafica, potrai modificare le Allowance a tuo piacimento.
Ogni modifica equivale a un’interazione – quindi a una transazione – con lo smart contract del token per il quale vuoi modificare/revocare l’Allowance.
È buona norma compiere periodicamente questo lavoro di analisi dei permessi attribuiti agli smart contract.
Ovviamente, modificare le Allowance costa del gas. Ma non può che beneficiare al tuo portafoglio, se ti accorgessi di aver dato permessi di spesa a smart contract poco affidabili.
Conclusioni
Dopo tutto quello che ho scritto, non pensare che tutte le Allowance costituiscano necessariamente una vulnerabilità.
Esistono un sacco di dApp che hanno superato la prova del tempo o, come si suol dire nel settore, sono “battle tested”, come ad esempio Uniswap.
Ma nel mondo della decentralizzazione con cui ci troviamo a che fare, non possiamo riporre ciecamente la nostra fiducia in progetti ancora poco collaudati o che non sono stati sottoposti ad adeguati audit.
Ecco perché dobbiamo assumere come buona norma l’attenta verifica dei permessi attribuiti agli smart contract, revocando le “Allowance” agli smart contract che non vogliamo più utilizzare o a quelli di cui non ci fidiamo più.
Il mondo della blockchain è un po’ come una giungla. Sono tanti gli inconvenienti che potrebbero verificarsi. Ma in qualità di utenti saggi, dobbiamo essere preparati per prevenire ogni spiacevole sorpresa.
Commenti