Aller au contenu principal
BlockchainMar 28, 2026

Deep EVM #20 : CI/CD pour smart contracts — Tests, régression de gas et sécurité

OS
Open Soft Team

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 :

  1. Tous les tests passent — y compris le fuzz testing
  2. Pas de régression de gas — Snapshot vérifié
  3. Analyse statique propre — Pas de vulnérabilités critiques
  4. Audit complété — Pour les changements majeurs
  5. 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.