Deep EVM #20 : CI/CD pour smart contracts — Tests, régression de gas et sécurité
Engineering Team
Les smart contracts ne sont pas des logiciels ordinaires
Les smart contracts ne sont pas comme les logiciels classiques. Une fois déployés, ils sont immuables. Un bug dans une application web signifie un hotfix et un redéploiement. Un bug dans un smart contract signifie des fonds perdus, une corruption permanente de l’état, ou une mise à niveau proxy coûteuse.
Cette immuabilité exige un pipeline CI/CD plus rigoureux que tout autre type de logiciel.
Architecture du pipeline
# .gitlab-ci.yml
stages:
- lint
- test
- gas-check
- security
- deploy
lint:
stage: lint
script:
- forge fmt --check
- solhint 'src/**/*.sol'
unit-tests:
stage: test
script:
- forge test -vvv
- forge test --fuzz-runs 10000
gas-regression:
stage: gas-check
script:
- forge snapshot --check
allow_failure: false
security-scan:
stage: security
script:
- slither src/ --sarif output.sarif
- mythril analyze src/Contract.sol
deploy-testnet:
stage: deploy
script:
- forge script script/Deploy.s.sol --rpc-url $TESTNET_RPC --broadcast
only:
- main
Suivi de régression de gas
forge snapshot crée un fichier .gas-snapshot qui enregistre le coût en gas de chaque test. En CI, --check compare avec le snapshot de référence et échoue si le gas augmente.
# Créer le snapshot de référence
forge snapshot
# En CI, vérifier les régressions
forge snapshot --check --tolerance 5
# Échoue si un test utilise plus de 5% de gas en plus
Cela empêche les développeurs d’introduire accidentellement des inefficiences de gas.
Analyse statique
Slither
Slither détecte les vulnérabilités communes :
slither src/ --exclude naming-convention --filter-paths test/
Détections clés : réentrance, variables d’état non utilisées, fonctions publiques qui devraient être externes, comparaisons de timestamps dangereuses.
Mythril
Mythril effectue une exécution symbolique pour trouver des chemins d’exploitation :
mythril analyze src/Contract.sol --execution-timeout 300
Vérification automatique sur Etherscan
Après le déploiement, vérifiez automatiquement le code source :
forge verify-contract \
--chain-id 1 \
--compiler-version v0.8.24 \
$CONTRACT_ADDRESS \
src/Contract.sol:Contract \
--etherscan-api-key $ETHERSCAN_KEY
Vérifications de sécurité au déploiement
Avant chaque déploiement en production, vérifiez :
- Tous les tests passent — y compris le fuzz testing
- Pas de régression de gas — Snapshot vérifié
- Analyse statique propre — Pas de vulnérabilités critiques
- Audit complété — Pour les changements majeurs
- Simulation de déploiement — Fork du mainnet, déployer, tester
// script/Deploy.s.sol
contract DeployScript is Script {
function run() public {
vm.startBroadcast();
// Déployer
Contract c = new Contract();
// Vérification post-déploiement
require(c.owner() == msg.sender, "Owner check failed");
require(c.paused() == false, "Should not be paused");
vm.stopBroadcast();
}
}
Conclusion
Un pipeline CI/CD robuste pour les smart contracts est votre dernière ligne de défense contre les bugs coûteux. Le suivi de régression de gas, l’analyse statique et les vérifications de déploiement automatisées transforment un processus risqué en une opération prévisible et sûre.