1. Qu’est-ce qu’un Smart Contract ?

Théorisé par Nick Szabo dès 1994 et concrétisé par Ethereum en 2015, un Smart Contract (contrat intelligent) est un programme autonome déployé sur la blockchain. Il dispose de sa propre adresse de compte, stocke des variables d’état et exécute automatiquement des instructions logiques déterministes dès qu’il est sollicité par une transaction externe.

2. La Machine Virtuelle Ethereum (Ethereum Virtual Machine – EVM)

L’EVM est un ordinateur mondial décentralisé à pile (Stack Machine) exécutant du bytecode standardisé (Opcodes). Chaque opération élémentaire exécutée par l’EVM (une addition, une écriture dans le stockage, une comparaison) consomme une quantité déterminée de Gas :

Coût de transaction = Gaz consommé × Prix unitaire du Gaz (exprimé en Gwei)

Ce mécanisme de gaz empêche les boucles infinies accidentelles ou malveillantes (problème de l’arrêt de Turing) et rémunère les nœuds pour les ressources matérielles mobilisées.

3. De Remix IDE aux frameworks professionnels (Hardhat / Foundry)

Dans la pratique professionnelle transmise par ecole-informatique.ch :

  • Remix IDE : Environnement web interactif idéal pour prototyper rapidement, compiler et tester un contrat dans un navigateur.
  • Hardhat : L’environnement industriel de référence basé sur Node.js et TypeScript. Il permet d’automatiser la compilation, les tests unitaires automatisés (avec Mocha et Chai) et les scripts de déploiement multi-réseaux.

4. Structure canonique d’un contrat Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @title CoffreFortSimple
 * @dev Contrat de dépôt et retrait sécurisé pour le Groupe Éducasuisse
 */
contract CoffreFortSimple {
    // Variable d'état stockée de manière permanente sur la blockchain
    address public immutable proprietaire;
    mapping(address => uint256) public soldes;

    // Événement émis lors d'une transaction
    event DepotEffectue(address indexed deposant, uint256 montant);
    event RetraitEffectue(address indexed beneficiaire, uint256 montant);

    constructor() {
        proprietaire = msg.sender;
    }

    function deposer() external payable {
        require(msg.value > 0, "Le montant depose doit etre superieur a 0");
        soldes[msg.sender] += msg.value;
        emit DepotEffectue(msg.sender, msg.value);
    }
}

Règle de syntaxe : L’indication de licence SPDX et la directive pragma solidity sont obligatoires en tête de chaque fichier source pour fixer la version du compilateur.