Vai al contenuto principale

Aiuta ad aggiornare questa pagina

ūüĆŹ

C'è una nuova versione di questa pagina, ma al momento è solo in inglese. Aiutaci a tradurre l'ultima versione.

Traduci la pagina
Visualizza in inglese

Nessun bug qui!ūüźõ

Questa pagina non è stata tradotta. Per il momento, è stata intenzionalmente lasciata in inglese.

Test degli smart contract

Ultima modifica: , Invalid DateTime
Modifica la pagina

Testare gli smart contract √® una delle misure pi√Ļ importanti per migliorarne la sicurezza. A differenza dei software tradizionali, in genere gli smart contract non possono essere aggiornati dopo il lancio, il che rende imperativo testarli rigorosamente prima di distribuirli sulla rete di Ethereum.

Cosa significa testare gli smart contract?

Con testare gli smart contract si intende l'esecuzione di analisi e valutazioni dettagliate per valutare la qualità del codice sorgente durante il ciclo di sviluppo. Testare uno smart contract semplifica l'identificazione di bug e vulnerabilità e riduce la possibilità di errori software che potrebbero portare a costosi exploit.

Il test degli smart contract assume molte forme, con metodi differenti che offrono una serie di vantaggi. Le strategie per testare gli smart contract di Ethereum sono classificabili in due ampie categorie: test automatizzati e test manuali.

Test automatizzati

I test automatizzati comportano l'uso di strumenti automatizzati per svolgere test scriptati degli smart contract. Questa tecnica si affida a software automatizzati che possono eseguire ripetuti test per individuare eventuali difetti negli smart contract.

I test automatizzati sono efficienti, usano meno risorse e offrono livelli di copertura superiori alle analisi manuali. Gli strumenti di test automatizzati sono anche configurabili coi dati dei test, il che consente di confrontare i comportamenti previsti con i risultati effettivi.

Test manuali

I test manuali sono assistiti dall'uomo e implicano la presenza di un individuo che esegue manualmente i passaggi dei test. I controlli del codice, in cui sviluppatori e/o revisori analizzano ogni singola riga del codice del contratto, sono un esempio di test manuale per gli smart contract.

Il test manuale degli smart contract richiede notevoli abilità e un investimento considerevole di tempo, denaro e sforzo. Inoltre, a volte i test manuali possono essere soggetti a problemi derivati dall'errore umano.

Tuttavia, applicare il test manuale agli smart contract può anche esser vantaggioso. I controlli del codice sfruttano l'intelligenza umana per individuare difetti nel codice del contratto che potrebbero passare inosservati durante i test automatizzati.

Testare manualmente i propri smart contract permette anche di rivelare vulnerabilità esistenti al di fuori del codice, ma che possono comunque influenzarlo. Ad esempio, il controllo di uno smart contract può fare emergere vulnerabilità derivanti dall'interazione difettosa con i componenti al di fuori della catena.

Perché è importante testare gli smart contract?

Testare gli smart contract è importante per i seguenti motivi:

1. Gli smart contract sono applicazioni dal valore elevato

Gli smart contract hanno spesso a che fare con risorse finanziarie dal valore elevato, specialmente in settori come la finanza decentralizzata (DeFi), ed oggetti di valore, come i token non fungibili (NFT). Come tali, le vulnerabilità minori negli smart contract possono tradursi e spesso si traducono in perdite enormi e irrecuperabili per gli utenti. Effettuando test completi, tuttavia, è possibile esporre errori nel codice degli smart contract e ridurre i rischi di sicurezza prima della distribuzione.

2. Gli smart contract sono immutabili

Gli smart contract distribuiti nella Macchina Virtuale di Ethereum (EVM) sono immutabili di default. Mentre gli sviluppatori tradizionali potrebbero essere abituati a risolvere i bug del software dopo il lancio, lo sviluppo di Ethereum lascia poco spazio alla risoluzione delle falle di sicurezza una volta che uno smart contract è attivo sulla blockchain.

Benché esistano meccanismi di aggiornabilità per gli smart contract, come gli schemi del proxy, possono essere difficili da implementare. Oltre a ridurre l'immutabilità e introdurre complessità, spesso gli aggiornamenti richiedono complessi processi di governance.

In gran parte, gli aggiornamenti dovrebbero essere considerati come l'ultima spiaggia ed evitati, se non necessari. Rilevare potenziali vulnerabilità e difetti nel proprio smart contract durante la fase pre-lancio riduce il bisogno di aggiornamenti logici.

Test automatizzati per gli smart contract

1. Test funzionali

I test funzionali verificano la funzionalità di uno smart contract e garantiscono che ogni funzione nel codice funzioni come previsto. I test funzionali richiedono la comprensione di come lo smart contract dovrebbe comportarsi in determinate condizioni. Quindi, è possibile testare ogni funzione eseguendo calcoli con i valori selezionati e confrontando i risultati ottenuti con quelli previsti.

I test funzionali coprono tre metodi: test unitario, test d'integrazione e test di sistema.

Test unitario

Il test dell'unità comporta il test della correttezza dei singoli componenti in uno smart contract. Un test unitario è semplice, rapido da eseguire e fornisce un'idea chiara di cosa è andato storto se il test fallisce.

I testi unitari sono fondamentali per lo sviluppo degli smart contract, specialmente se occorre aggiungere nuova logica al codice. Puoi verificare il comportamento di ogni funzione e confermare che venga eseguito come desiderato.

Eseguire un test unitario spesso richiede la creazione di asserzioni, semplici dichiarazioni informali che specificano i requisiti di uno smart contract. Il test unitario è poi utilizzabile per testare ogni asserazione e verificare se resta vera durante l'esecuzione.

Esempi di asserzioni correlate al contratto includono:

i. "Solo l'admin può interrompere il contratto"

ii. "I non admin non possono coniare nuovi token"

iii. "Il contratto si ripristina in caso di errore"

Test d'integrazione

Il test d'integrazione è di un livello superiore rispetto al test unitario sulla gerarchia dei test. Nel test d'integrazione, i singoli componenti dello smart contract vengono testati insieme.

Questo approccio rileva gli errori derivanti dalle interazioni tra i diversi componenti di un contratto o tra diversi contratti. Dovresti usare questo metodo se hai un contratto complesso con numerose funzioni o con una funzione che si interfaccia con altri contratti.

Il test d'integrazione può essere utile per assicurarsi che aspetti come l'eredità e l'iniezione di dipendenza funzionino correttamente.

Test di sistema

I test di sistema sono la fase finale del test funzionale per gli smart contract. Un sistema valuta lo smart contract come un prodotto completamente integrato per vedere se performa come specificato nei requisiti tecnici.

Puoi pensare a questa fase come al controllo del flusso end-to-end del tuo smart contract dal punto di vista di un utente. Un modo efficace per eseguire i test di sistema su uno smart contract consiste nel distribuirli su un ambiente simile a quello di produzione, come una rete di prova o una rete di sviluppo.

Qui gli utenti finali possono eseguire prove e segnalare eventuali problemi con la logica aziendale del contratto e le funzionalità generali. Il test di sistema è importante perché non è possibile cambiare il codice una volta distribuito il contratto nell'ambiente dell'EVM principale.

2. Analisi statica/dinamica

L'analisi statica e l'analisi dinamica sono due metodi di test automatizzati per valutare le qualità di sicurezza degli smart contract. Entrambe le tecniche, tuttavia, usano approcci differenti per trovare difetti nel codice del contratto.

Analisi statica

L'analisi statica esamina il codice sorgente o il bytecode di uno smart contract prima dell'esecuzione. Questo significa che puoi eseguire il debug del codice del contratto senza eseguire effettivamente il programma. Gli analizzatori statici possono rilevare le vulnerabilità comuni negli smart contract e aiutare a conformarsi alle pratiche migliori.

Analisi dinamica

Le tecniche di analisi dinamica richiedono l'esecuzione dello smart contract in un ambiente di esecuzione per identificare i problemi a livello del codice. Gli analizzatori del codice dinamico osservano i comportamenti del contratto durante l'esecuzione e generano un rapporto dettagliato sulle vulnerabilità e violazioni di proprietà identificate.

Il fuzzing (test con dati casuali) è un esempio di una tecnica di analisi dinamica per testare i contratti. Durante i test di fuzzing, un fuzzer alimenta lo smart contract con dati malformati e non validi e monitora la reazione del contratto a tali input.

Come ogni programma, gli smart contract si affidano agli input forniti dagli utenti per eseguire funzioni. E, pur supponendo che gli utenti forniscano input corretti, potrebbe anche accadere il contrario.

In alcuni casi, inviare valori di input errati a uno smart contract può causare perdite di risorse, crash, o peggio condurre all'esecuzione di codice indesiderato. Le campagne di fuzzing identificano tali problemi in anticipo, consentendo di eliminare la vulnerabilità.

Test manuale per gli smart contract

1. Controlli del codice

Un controllo del codice è una valutazione dettagliata del codice sorgente di uno smart contract per scoprire possibili punti di guasto, falle di sicurezza e pratiche di sviluppo deboli. Anche se i controlli del codice possono essere automatizzati, qui facciamo riferimento all'analisi del codice assistita dall'uomo.

I controlli del codice richiedono una mentalità da utente malevolo per mappare i possibili vettori di attacco negli smart contract. Anche eseguendo controlli automatizzati, l'analisi di ogni riga del codice sorgente è un requisito minimo per scrivere smart contract sicuri.

Puoi anche commissionare un controllo di sicurezza per dare agli utenti garanzie migliori sulla sicurezza dello smart contract. I controlli beneficiano dall'ampia analisi eseguita dai professionisti della cyber-sicurezza e rilevano le vulnerabilità potenziali o i bug che potrebbero danneggiare la funzionalità dello smart contract.

2. Caccia ai bug

Una caccia ai bug √® una ricompensa finanziaria data a un individuo che scopre una vulnerabilit√† o un bug nel codice di un programma e la segnala agli sviluppatori. Le cacce ai bug sono simili ai controlli poich√© comportano di chiedere ad altri di aiutare a trovare difetti negli smart contract. La differenzza principale √® che i programmi di caccia ai bug sono aperti alla pi√Ļ ampia community di sviluppatori/hacker.

I programmi di caccia ai bug attraggono spesso un'ampia classe di hacker etici e di professionisti della sicurezza indipendenti con abilità ed esperienza uniche. Questo potrebbe essere un vantaggio rispetto ai controlli sugli smart contract che si affidano principalmente a team che potrebbero possedere esperienze limitate o minime.

Test vs. verifica formale

Sebbene i test aiutino a confermare che un contratto restituisce i risultati previsti per alcuni input di dati, non può provare in via conclusiva lo stesso per gli input non usati durante i test. Testare uno smart contract non può garantire la "correttezza funzionale", il che significa che non può mostrare che un programma si comporta come richiesto per tutte le serie di valori e condizioni di input.

Come tali, gli sviluppatori sono incoraggiati a incorporare la verifica formale nel loro approccio a valutare la correttezza degli smart contract. La verifica formale usa metodi formali, tecniche matematicamente rigorose per specificare e verificare software.

La verifica formale è considerata importante per gli smart contract perché aiuta gli sviluppatori a testare formalmente le ipotesi correlate agli stessi. A tale scopo vengono create specifiche formali che descrivono le proprietà di uno smart contract e si verifica che un modello formale dello smart contract corrisponda alla specifica. Questo approccio aumenta la fiducia che uno smart contract eseguirà le funzioni solo come definito nella sua logica aziendale e in nessun altro caso.

Maggiori informazioni sulla verifica formale per gli smart contract

Strumenti di test e librerie

Strumenti per i test unitari

Solidity-Coverage - Strumento di copertura del codice di Solidity, utile per testare gli smart contract.

  • GitHub

Waffle - Quadro per lo sviluppo e l'esecuzione di test avanzati sugli smart contract (basato su ethers.js).

Remix Tests - Strumento per testare gli smart contract di Solidity. Opera sotto il plugin "Solidity Unit Testing" di Remix IDE, usato per scrivere ed eseguire casi di prova per un contratto.

OpenZeppelin Test Helpers - Libreria di affermazione per testare gli smart contract di Ethereum. Assicurati che i tuoi contratti si comportino come previsto!

Quadro di test degli smart contract di Truffle - Quadro di test automatizzato per testare i tuoi contratti in un attimo.

Quadro per i test unitari di Brownie - Brownie utilizza Pytest, un quadro di test ricco di funzioni che consente di scrivere piccoli test con codice minimo, facilmente scalabile per i grandi progetti ed è altamente estensibile.

Test di Foundry - Foundry offre Forge, un quadro di prova di Ethereum veloce e flessibile, capace di eseguire semplici test unitari, controlli di ottimizzazione del gas e fuzzing del contratto.

Etheno - Strumento di test di Ethereum tutto in uno che comprende un multiplexer di JSON RPC, un contenitore di strumenti d'analisi e lo strumento di integrazione del test. Etheno elimina la complessità di configurare strumenti di analisi come Manticore ed Echidna sui grandi progetti multi-contrattuali.

Strumenti di analisi statica

Mythril - Strumento di valutazione del bytecode dell'EVM per rilevare le vulnerabilità del contratto usando l'analisi a macchia, l'analisi concolica e la verifica del flusso di controllo.

Slither - Quadro di analisi statica di Solidity basato su Python per trovare vulnerabilità, migliorare la comprensione del codice e scrivere analisi personalizzate per gli smart contract.

Rattle - Quadro di analisi statica del bytecode dell'EVM progettato per operare sugli smart contract distribuiti.

Strumenti di analisi dinamica

Echidna - Fuzzer del contratto veloce, per rilevare le vulnerabilità negli smart contract tramite i test basati sulla proprietà.

Harvey - Strumento di fuzzing automatizzato utile per rilevare le violazioni di proprietà nel codice dello smart contract.

Manticore - Quadro di esecuzione simbolico dinamico per analizzare il bytecode dell'EVM.

Servizi di controllo degli smart contract

ConsenSys Diligence - Servizio di controllo degli smart contract che aiuta i progetti sull'ecosistema della blockchain ad assicurare che i loro protocolli siano pronti al lancio e creati per proteggere gli utenti.

CertiK - Studio di sicurezza della blockchain, pioniere nell'uso di tecnologie di verifica formali e all'avanguardia sugli smart contract e le reti della blockchain.

Trail of Bits - Azienda di cybersicurezza che combina la ricerca sulla sicurezza con una mentalità da utente malevolo per ridurre i rischi e fortificare il codice.

PeckShield - Azienda di sicurezza della blockchain che offre prodotti e servizi per la sicurezza, privacy e utilizzabilità dell'intero ecosistema della blockchain.

QuantStamp - Servizio di controllo che facilita l'adozione mainstream della tecnologia della blockchain tramite servizi di sicurezza e valutazione dei rischi.

OpenZeppelin - Azienda di sicurezza degli smart contract che fornisce controlli di sicurezza per i sistemi distribuiti.

Piattaforme di caccia ai bug

Immunefi - Piattaforma di caccia ai bug per gli smart contract e i progetti di DeFi, in cui i ricercatori revisionano il codice, divulgano le vulnerabilit√†, vengono pagati e rendono le cripto pi√Ļ sicure.

HackerOne - Piattaforma di coordinazione delle vulnerabilità e di caccia ai bug che connette le aziende ai tester di penetrazione e i ricercatori sulla cybersicurezza.

Letture consigliate

Questo articolo è stato utile?