
Introduzione
Quando ho iniziato a sviluppare con Solidity, ho lasciato gli IDE online e ho iniziato a usare Hardhat come mio nuovo framework principale. Dopo mesi passati a costruire progetti e a creare un flusso di lavoro, mi sono trovato bene con il layout della rete, la strategia di test e l'organizzazione dei progetti.
Tuttavia, quando qualcuno ha detto che i vantaggi in termini di prestazioni di Foundry erano impressionanti, mi sono interessato abbastanza da fare un confronto adeguato tra i due popolari framework di sviluppo di contratti intelligenti.
Per fare una valutazione giusta, ho creato gli stessi progetti con l'aiuto di entrambi e ho usato lo stesso contratto MiniBank e altre impostazioni di test. Questa esperienza pratica ha mostrato che le prestazioni, l'esperienza degli sviluppatori e il flusso di lavoro sono molto diversi tra questi due strumenti e vale la pena esaminarli per chiunque debba scegliere tra i due.
Architettura e configurazioni del progetto
All'inizio, impostarli è un po' diverso nei due framework. Foundry crea un file di configurazione foundry.toml basato su coppie chiave-valore, che è simile al file hardhat.config.js di Hardhat. Entrambi permettono anche di personalizzare le cartelle sorgente, le directory di output della compilazione, ecc.
La struttura predefinita delle cartelle è un po' diversa in Foundry, però, non puoi configurare direttamente più reti nel file di configurazione, dato che Hardhat fa un ottimo lavoro nel gestire più reti. Gli altri parametri in foundry.toml sono legati alle opzioni di test, come la verbosità o le impostazioni dell'account e le opzioni relative al prezzo del gas.
La funzione di rimappatura di Foundry è davvero interessante perché offre un approccio efficace all'importazione delle dipendenze. Puoi rendere l'importazione dei contratti molto più semplice creando scorciatoie nella configurazione.
Per esempio, invece di scrivere lunghi percorsi di importazione, puoi usare delle scorciatoie che rendono il tuo codice più facile da leggere e mantenere.
Approcci alla gestione delle dipendenze
I framework sono molto diversi nel modo in cui gestiscono le dipendenze:
- •Hardhat usa l'ecosistema npm già pronto, che è subito accessibile agli sviluppatori JavaScript
- •Per installare i contratti OpenZeppelin basta un comando npm install
- •Foundry usa la gestione delle dipendenze tramite il sottomodulo Git con lo strumento CLI forge
- •Le dipendenze sono salvate in una cartella lib/ e aggiunte in un file .gitmodules invece che in package.json
Questo metodo accetta qualsiasi repository GitHub che includa smart contract come dipendenza e ti permette di essere più flessibile nella scelta delle librerie.
Puoi specificare il nome dell'organizzazione e del repository GitHub e, se vuoi, anche il ramo o il tag da installare. Una volta installato il forge, puoi usare il comando di rimappatura del forge per vedere i percorsi di importazione predefiniti che Foundry userà, che poi puoi personalizzare ancora di più con i file di configurazione.
Strumenti di sviluppo e debug
Uno dei punti di forza di Hardhat è il suo debugging. Il framework offre anche l'uso di console.log di default, che è simile allo stile di debugging che ci si aspetta nello sviluppo JavaScript. Questa funzionalità è molto pubblicizzata come punto di forza e può essere facilmente monitorata dagli sviluppatori per capire come è stata eseguita l'operazione e cosa non va.
Foundry ha bisogno di un altro modo per registrare i contratti. Anche se puoi installare e importare Hardhat a mano e mettere un contratto console, il modo migliore per farlo è copiare un contratto console speciale nel tuo progetto.
Soprattutto per i file di prova, il contratto DSTest che c'è dentro include eventi di registrazione come logstring, logint e logaddress che possono essere emessi senza bisogno di altre dipendenze.
Metodologie di test
L'esperienza di test è forse la differenza più evidente tra i due framework.
Approccio di test Hardhat
Hardhat si basa su modelli di test JavaScript standard:
- •Usa describe e it blocks insieme a Mocha come libreria di asserzioni predefinita
- •I file di prova potrebbero assomigliare a questo stile più naturale degli sviluppatori che hanno familiarità con lo sviluppo web
- •Offre nomi descrittivi dei test che spiegano chiaramente lo scopo
- •Modelli asincroni familiari
- •La curva di apprendimento è minima per chi ha già familiarità con lo sviluppo web moderno
Approccio di test della fonderia
Foundry funziona in modo completamente diverso:
- •I test sono fatti come contratti intelligenti Solidity, che prendono da DSTest
- •Tutti i test hanno come prefisso la parola test o testFail
- •Tutte le affermazioni sono fatte tramite il contratto DSTest ereditato
- •I file di prova sono veri e propri contratti intelligenti che si usano nei test
Padroneggia il test degli smart contract
Confronta i framework e scegli l'approccio di test più adatto al tuo progetto.
Il metodo Foundry ha un sacco di implicazioni:
- •I contratti di prova devono essere istanziati in una procedura setUp() simile a beforeEach nei clienti JavaScript
- •Il metodo di invio dei contratti ETH ha una sintassi particolare con i parametri di valore racchiusi tra parentesi graffe
- •La curva di apprendimento iniziale, che può sembrare un po' ripida, può essere compensata dal fatto che non serve gestire operazioni asincrone
Funzionalità di test di Learning Foundry
Foundry introduce il concetto noto come cheat code, che offre potenti utilità di test. Si tratta di funzioni speciali a un indirizzo di contratto designato che ti permettono di accedere allo stato nella blockchain durante i test.
Puoi:
- •Cambia il numero del blocco attuale
- •Non fingere di essere altri account
- •Rivendica determinati comportamenti contrattuali
Per usare i cheat code devi definire un'interfaccia e istanziarla come variabile di stato all'indirizzo speciale del cheat. Dopo averlo impostato, puoi usare il cheat con funzioni come:
- •vm.prank() per impostare la prossima chiamata al contratto su un destinatario diverso
- •vm.roll() per far avanzare la blockchain fino a un certo punto
Uno dei cheat code più interessanti è vm.expectRevert(), che va chiamato prima della transazione che vuoi fallisca. Questa inversione dei modelli standard di asserzione può sembrare controintuitiva, ma dà un controllo chiaro delle probabili condizioni di fallimento.
Risultati del confronto delle prestazioni
La differenza di prestazioni tra i framework è notevole e si nota subito. Con gli stessi contratti e scenari di test, ho ottenuto risultati interessanti sui tempi di compilazione ed esecuzione dei test:
Risultati del confronto delle prestazioni
| Scenario | Foundry | Casco di protezione |
|---|---|---|
| Progetti puliti (senza cache) | 1,44 secondi | 5,17 secondi |
| Con la cache attivata | 0,45 secondi | 3,98 secondi |
| 26 progetti di contratti intelligenti | 8,53 secondi | 14,56 secondi |
Queste differenze di prestazioni diventano più evidenti quando il progetto diventa più complesso.
Test di fonderia: pro e contro
Pro e contro dei test di fonderia
| Pro | Contro |
|---|---|
| Niente complicazioni con async/await | I nomi dei test non sono così descrittivi come nei test JavaScript |
| I test funzionano super veloce | L'asserzione expectRevert è controintuitiva. |
| Rapporto sul gas generato automaticamente | Curva di apprendimento per i cheat code |
| Tutto quello che è scritto in Solidity | Gli strumenti di implementazione sono ancora in fase di sviluppo |
I vantaggi in termini di prestazioni sono indiscutibili, ma i nomi dei test Solidity non possono essere descrittivi come quelli JavaScript, il che può rendere poco chiaro lo scopo del test. Il sistema di cheat code, sebbene potente, richiede un investimento iniziale in termini di apprendimento.
Strategie di implementazione dei contratti
Il deployment è un ambito in cui Hardhat offre attualmente un'esperienza di sviluppo migliore. Il framework accetta:
- •Script di distribuzione basati su JavaScript
- •Collegamento con una varietà di reti
- •Carica la configurazione tramite variabili d'ambiente
- •Gestisci con eleganza le situazioni di implementazione complicate
Gli script di distribuzione basati su JavaScript sono attualmente richiesti in Foundry, ma possono essere complicati quando i costruttori devono avere i loro argomenti forniti. La soluzione suggerita è quella di creare script bash di distribuzione per gestire la complessità delle distribuzioni, ma il team di sviluppo sta lavorando a soluzioni di distribuzione più avanzate.
Questo è uno dei punti deboli più grossi di Foundry rispetto a Hardhat, che ha un ecosistema di distribuzione ben sviluppato.
Strumenti dell'interfaccia a riga di comando
Foundry ha lo strumento CLI cast per interagire con la blockchain e interrogare gli smart contract. È un'utilità potente che ti permette di:
- •Chiama le funzioni del contratto
- •Controlla lo stato della blockchain
- •Fai un sacco di cose con la blockchain dalla riga di comando
Anche se cast offre tutte le funzionalità per interagire con la blockchain, per fare operazioni complesse serve una struttura complessa della riga di comando. Come per l'implementazione, potrebbe servire uno script bash per evitare di digitare più volte comandi lunghi.
Riepilogo comparativo dei framework
Confronto delle caratteristiche del framework
| Caratteristica | Foundry | Casco di protezione |
|---|---|---|
| Installazione | Tramite comando curl CLI | Non serve con npx o tramite npm |
| Strumenti CLI | forge per gestire il progetto, cast per interagire con i contratti | hardhat gestisci il progetto (crea/compila/esegui script) |
| Crea e prova le prestazioni | Velocità eccezionale | Moderare le prestazioni |
| Dipendenze | Sottomoduli Git | Pacchetti npm |
| Configurazione | foundry.toml | hardhat.config.js |
| Isolamento dei test | Sì tramite -match-test -match-contract | Sì, solo tramite o salta nei file di prova |
| Implementazioni dei contratti | Tramite lo strumento CLI Cast | Script basati su JavaScript |
Fare la scelta giusta
Foundry ha un potenziale enorme grazie alle sue prestazioni fantastiche, alla sua community attiva e al suo modo creativo di testare gli smart contract. La struttura è perfetta per cicli di sviluppo veloci e ha ottimi strumenti di test che possono accelerare molto lo sviluppo una volta capito come usarli.
Comunque, Foundry sta ancora crescendo, soprattutto per quanto riguarda gli strumenti di implementazione e il miglioramento dell'esperienza degli sviluppatori. Foundry ha dei punti di forza interessanti per quegli sviluppatori che preferiscono un modello ibrido con:
- •Foundry per lo sviluppo e il collaudo dei contratti
- •Hardhat per la distribuzione e gli script
Gli utenti che hanno più familiarità con gli strumenti JavaScript standard e le pratiche di implementazione consolidate potrebbero ora essere più produttivi con Hardhat, anche se la scelta dipende ancora una volta dal proprio background e dalla capacità di adottare strumenti più recenti.
Entrambe le architetture stanno ancora cambiando velocemente e l'ecosistema dello sviluppo degli smart contract ha un sacco di alternative valide che rispondono alle esigenze di vari sviluppatori e casi d'uso.


