03-Foundry-Testing - Tests, Fuzzing et Verification Formelle
Navigation : Sommaire de la série | << SC-11 LLM-Assisted | SC-15 Zero-Knowledge Proofs >>
Cette troisième sous-série (SC-12 a SC-14) introduit le testing rigoureux des smart contracts : la suite d’outils Foundry (forge, cast, anvil), le fuzz testing d’invariants, puis la vérification formelle avec Certora Prover et le langage CVL. C’est le passage du « code qui semble marcher » au « code dont on prouve les propriétés ». Ces notebooks ont une signature pédagogique particulière : le code Solidity y est présente comme chaînes de caractères avec les sorties de tests correspondantes ([PASS]/[FAIL]) documentées comme illustration. Une installation locale de Foundry et Certora permet de reproduire les tests pour de vrai.
Notebooks
| # | Notebook | Durée | Contenu |
|---|---|---|---|
| 12 | SC-12-Foundry-Testing-Python | 45 min | Installation Foundry, structure de projet, tests Solidity (DSTest), cheatcodes, assertions |
| 13 | SC-13-Fuzz-Invariants-Python | 40 min | Fuzz testing, paramètres aléatoires, invariants de contrats, vm.assume |
| 14 | SC-14-Formal-Verification-Python | 50 min | Verification formelle, Certora Prover, CVL, spécifications, règles |
Total : 3 notebooks, ~2h15.
Cette sous-série est une escalade de l’assurance : chaque étape couvre une classe de bugs plus large que la précédente — du « ça marche sur mes exemples » au « propriété garantie quelles que soient les entrées ».
flowchart LR
U["<b>Tests unitaires</b><br/>SC-12 · Foundry<br/>cas isolés fixés"]
F["<b>Fuzz d'invariants</b><br/>SC-13 · forge --fuzz-runs<br/>familles d'entrées aléatoires"]
V["<b>Vérification formelle</b><br/>SC-14 · Certora / Halmos<br/>toutes les entrées (prouvé)"]
U -->|"couvre les bugs d'un cas"| F
F -->|"couvre une famille d'entrées"| V
V -->|"pont vers Lean"| LEAN["preuve formelle<br/>mathématique"]
Parcours d’apprentissage
Étape 1 : Suite Foundry (SC-12, 45 min)
Installation et configuration de Foundry (forge, cast, anvil), création d’un projet avec la structure standard, écriture de tests en Solidity avec DSTest, utilisation des cheatcodes (vm.prank, vm.warp, vm.expectRevert) pour simuler des scénarios, et application des assertions avec logging.
Étape 2 : Fuzz et invariants (SC-13, 40 min)
Le fuzz testing : passer des paramètres aléatoires aux fonctions de test, tester des invariants (propriétés qui doivent toujours tenir, quelles que soient les entrées), et filtrer les entrées invalides avec vm.assume. Cette étape change la manière de penser les tests : on ne vérifie plus des cas isolés mais des familles entières de comportements.
Étape 3 : Verification formelle (SC-14, 50 min)
La vérification formelle comme niveau au-dessus du testing : Certora Prover et le langage de spécification CVL (Certora Verification Language), écriture de spécifications et de règles, vérification d’invariants mathématiques. Pont naturel avec la série Lean (preuve formelle de propriétés).
Prérequis
Par notebook
| Notebook | Fondations requises | Dépendances |
|---|---|---|
| SC-12 Foundry-Testing | SC-3 a SC-6 complètes (01-Solidity-Foundation) ; terminal/bash | Foundry (forge, cast, anvil) |
| SC-13 Fuzz-Invariants | SC-12 complète ; tests unitaires Solidity | Foundry |
| SC-14 Formal-Verification | SC-12 + SC-13 complètes ; notions de logique formelle | Foundry ; Certora Prover ou Halmos (recommandé) |
Configuration requise
- Foundry installé :
curl -L https://foundry.paradigm.xyz | bash && foundryup. Les notebooks SC-12/13 invoquentforge test/forge build. - Certora Prover (SC-14) : compte Certora + accès cloud ; alternative open-source Halmos (symbolic exécution).
- Python 3.10+ pour les cellules d’orchestration.
- Aucun faucet, aucun ETH réel nécessaire : les tests tournent en local via
anvilou en simulation.
Ponts inter-séries
| Série | Lien | Relation |
|---|---|---|
| SmartContracts (parent) | Vue d’ensemble | Contexte, parcours global, glossaire |
| 02-Solidity-Advanced | Prérequis | SC-7..11 (standards ERC, DeFi, DAO, AA, LLM) |
| 04-Privacy-Cryptography | Suite | SC-15..17 (ZK proofs, chiffrement homomorphe, vote vérifiable) |
| SymbolicAI/Lean | SC-14 (formal verif) | Verification formelle = même paradigme que la preuve Lean (CVL vs tactiques Lean) |
Points de vigilance (exécution Foundry)
- Foundry doit être installé localement pour reproduire les tests pour de vrai (
forge,cast,anvilsur le PATH). Les notebooks orchestrent les commandesforgedepuis des cellules Python. - Signature pédagogique : le code Solidity est présente comme chaînes de caractères avec les sorties de tests ([PASS]/[FAIL]) documentées. SC-12 et SC-13 exécutent désormais
forgepour de vrai : SC-12 re-exécute la suite Foundry avecforgesur le PATH (#3765) et SC-13 lance unforge test --fuzz-runsqui découvre un contre-exemple d’overflow (la moyenne naïve(a+b)/2panique, la version safe résiste, #3921). Les sorties committes sont donc des runs forge authentiques, pas de simples illustrations ; si Foundry n’est pas installé, le notebook affiche honnêtement un message d’install sans sortie fabriquée. - SC-14 Certora : la vérification formelle requiert un accès Certora (commercial) ou Halmos (open-source). Les règles CVL ne sont pas toutes vérifiables sans ces outils.
- Audit #3164 : cette sous-série a été auditée (fidélité) — les résultats de tests sont honnêtement documentés comme illustration, pas comme exécution masquée. 1 finding de labeling (SC-12) résolu via #3369.
Ressources
- Foundry Book (Foundry contributors) –
forge test,forge build, fuzzing, cheatcodes. book.getfoundry.sh. - Certora Documentation (Certora Inc.) – Certora Prover, langage CVL, écriture de spécifications. docs.certora.com.
- Halmos (a16z, 2023) – symbolic exécution open-source pour tests Foundry.
- Wilkinson, M. (2022) – “Foundry: A Blazing Fast, Portable, and Modular Toolkit for Ethereum Application Development”.
- Voir aussi les références transversales dans le README parent de la série.
Conclusion / Prochaines étapes
Ce que vous avez appris
Cette troisième sous-série introduit le testing rigoureux : le passage du « code qui semble marcher » au « code dont on prouve les propriétés ». L’arc pédagogique est une escalade de l’assurance — chaque étape couvre une classe de bugs plus large que la précédente :
- La suite Foundry (SC-12) — installation et configuration de
forge/cast/anvil, structure de projet, tests en Solidity avec DSTest, cheatcodes (vm.prank,vm.warp,vm.expectRevert) pour simuler des scénarios, et assertions avec logging. - Le fuzz et les invariants (SC-13) — passer des paramètres aléatoires aux fonctions de test, vérifier des invariants (propriétés qui doivent toujours tenir), filtrer les entrées invalides avec
vm.assume. Cette étape change la manière de penser les tests : on ne vérifie plus des cas isolés mais des familles entières de comportements. - La vérification formelle (SC-14) — le niveau au-dessus du testing : Certora Prover et le langage de spécification CVL, écriture de spécifications et de règles, vérification d’invariants mathématiques. Pont naturel avec la série Lean (même paradigme de preuve formelle).
Cette sous-série a une signature pédagogique particulière : le code Solidity y est présenté comme chaînes de caractères avec les sorties de tests ([PASS]/[FAIL]) documentées comme illustration — une installation locale de Foundry et Certora permet de reproduire les tests pour de vrai.
Prochaines étapes
- Appliquer la preuve à la confidentialité : la suite est 04-Privacy-Cryptography (SC-15 à SC-17), où la rigueur formelle des protocoles cryptographiques (ZKP, chiffrement homomorphe) devient centrale.
- Approfondir la preuve formelle : SymbolicAI/Lean développe le même paradigme (spécifier puis prouver) dans un cadre mathématique pur — CVL et Lean sont deux instances du même idéal de vérification.
- La série dans son ensemble : le sommaire SmartContracts cartographie les sept sous-séries — celle-ci est le garde-fous qualité.
Le fil rouge
Le testing des smart contracts propose un changement de regard sur la fiabilité : ne plus demander « est-ce que ça marche sur mes exemples ? » mais « quelles propriétés sont garanties quelles que soient les entrées ? ». L’escalade tests unitaires → fuzz → vérification formelle n’est pas un luxe : sur une chaîne où le code est immuable et où une faille coûte des millions, prouver un invariant (qu’il résiste à toute entrée, même aléatoire, même adversariale) est précisément ce qui distingue un protocole déployable d’une démonstration de prototype — et cette exigence d’assurance est le pont vers les protocoles cryptographiques de la sous-série suivante.