Solidity Débutant

Solidity : Les Fondamentaux des Contrats Intelligents

Découvrez comment créer vos premiers contrats intelligents sur Ethereum en maîtrisant les concepts essentiels de Solidity. Un voyage progressif du zéro jusqu'à la compréhension complète de la blockchain programmable.

Preparetoi.academy 30 min

1. Qu'est-ce que Solidity et pourquoi c'est révolutionnaire

Solidity est un langage de programmation conçu spécifiquement pour écrire des contrats intelligents sur la blockchain Ethereum. Un contrat intelligent est un programme informatique qui s'exécute automatiquement lorsque certaines conditions sont remplies, sans intervention humaine. Contrairement aux programmes traditionnels qui tournent sur des serveurs centralisés, les contrats Solidity s'exécutent sur des milliers d'ordinateurs simultanément à travers le réseau Ethereum, garantissant transparence, sécurité et immuabilité.

Définition formelle : Solidity est un langage de programmation orienté objet, statiquement typé, créé en 2015 par Gavin Wood, qui permet de créer des applications décentralisées (DApps) en codifiant la logique métier directement dans la blockchain Ethereum.

Analogie simple : Imaginez Solidity comme un système de distributeur automatique intelligent. Un contrat Solidity est comme les instructions programmées dans le distributeur : "Si quelqu'un insère 5 euros ET appuie sur le bouton du soda, ALORS distribuer le soda et rendre la monnaie". Personne ne peut modifier ces règles une fois qu'elles sont installées, et tout le monde peut vérifier que le processus est honnête.

Aspect Programme Traditionnel Contrat Solidity
Exécution Serveurs centralisés Réseau décentralisé
Confiance Basée sur l'entreprise Basée sur le code
Modification Possible après déploiement Impossible (immuable)
Transparence Privée Publique et auditable
Coût Frais de serveur Frais de gaz

Astuce pédagogique : Pour bien comprendre Solidity, pensez toujours à la question "qui contrôle cette donnée ou cette action ?". Dans Solidity, personne ne contrôle vraiment le réseau - c'est la majorité du réseau qui valide chaque action, créant une confiance sans autorité centrale.

⚠️ Attention critique : Ne confondez jamais Solidity avec Bitcoin. Bitcoin est une cryptocurrence basée sur la blockchain, tandis que Solidity est un langage pour programmer sur Ethereum. Ethereum est la plateforme blockchain qui exécute les contrats Solidity. Bitcoin n'a pas de langage de programmation de contrats intelligents au niveau d'Ethereum.

Une révolution majeure : avant Solidity, les cryptocurrencies ne pouvaient que transférer de la monnaie. Solidity a changé cela en permettant n'importe quel type de logique programmée. Aujourd'hui, grâce à Solidity, nous avons des échanges décentralisés, des jeux blockchain, des systèmes de prêt peer-to-peer, et bien d'autres applications impossibles à censurer.

2. Les variables et types de données : la mémoire des contrats

Une variable est un espace de stockage dans la blockchain qui contient une valeur. Contrairement aux variables dans un programme traditionnel qui disparaissent quand le programme s'arrête, les variables Solidity sont stockées de manière permanente dans la blockchain, disponibles pour toujours et consultables par quiconque.

Définition formelle : Une variable Solidity est un conteneur nommé qui stocke une valeur d'un type de données spécifique dans la blockchain. Chaque variable occupe de l'espace dans le stockage permanent (appelé "state"), ce qui coûte de l'énergie (gaz) à créer et modifier.

Analogie simple : Imaginez la blockchain comme un immense livre comptable public, permanent et accessible à tous. Les variables Solidity sont comme les lignes écrites dans ce livre. Une fois écrite, une ligne ne peut jamais être complètement effacée - elle reste visible à tout jamais. Si vous modifiez une ligne, tout le monde peut voir la modification et quand elle s'est produite.

Type de donnée Exemple Taille Usage
uint (unsigned integer) 256 256 bits Nombres positifs entiers
int (signed integer) -100, 50 256 bits Nombres avec signe
bool true, false 8 bits Valeurs booléennes
address 0x742d35Cc6634C0532925a3b844Bc9e7595f42D1 160 bits Adresses Ethereum
string "Bonjour" Variable Texte
bytes 0xABCD... Variable Données binaires

Astuce pédagogique : En Solidity, "uint" est l'abréviation de "uint256", ce qui signifie un entier non signé de 256 bits. C'est le type par défaut et le plus utilisé pour stocker des montants (tokens, ethers, etc.). Toujours préférer "uint" à "uint256" pour la lisibilité, bien qu'ils soient identiques.

⚠️ Attention critique : Chaque modification de variable coûte du gaz (frais de transaction). Modifier une variable existante coûte moins cher que d'en créer une nouvelle. Les développeurs Solidity expérimentés optimisent constamment pour minimiser les modifications de variables et économiser le gaz des utilisateurs.

Les types "uint" en Solidity offrent des options granulaires : uint8, uint16, uint32, jusqu'à uint256. Un uint8 peut stocker des nombres de 0 à 255, un uint16 de 0 à 65,535. Le choix du bon type économise du gaz et rend le code plus sûr. Par exemple, si vous stockez un pourcentage (0-100), utiliser uint8 plutôt que uint256 économise l'énergie.

3. Les fonctions : les actions programmées du contrat

Une fonction Solidity est un bloc de code réutilisable qui effectue une action spécifique quand elle est appelée. Les fonctions sont les "verbes" de Solidity - elles font agir le contrat. Une fonction peut lire des données, modifier des variables, transférer de l'argent, ou communiquer avec d'autres contrats.

Définition formelle : Une fonction est une séquence d'instructions nommée qui accepte des paramètres en entrée (optionnels), effectue une logique spécifique, et retourne éventuellement une valeur en sortie. Les fonctions en Solidity ont des modificateurs de visibilité qui contrôlent qui peut les appeler.

Analogie simple : Pensez aux fonctions comme des services client dans une banque. "Consulter le solde" est une fonction : on vous donne votre compte, elle vérifie votre solde et vous le retourne. "Faire un virement" est une autre fonction : elle demande le compte destinataire, le montant, puis effectue l'action. Une banque ne ferait jamais un virement sans vérifier d'abord que vous avez assez d'argent - c'est exactement ce que font les fonctions Solidity avec leurs conditions.

Concept Description Exemple
Paramètres Données entrant dans la fonction function transfert(uint montant)
Retour Valeur que la fonction renvoie returns (bool succès)
public N'importe qui peut l'appeler Visibilité maximale
private Seul le contrat l'utilise Seules les autres fonctions du contrat
view Lit les données sans modifier Gratuit, pas de gaz
pure Aucune lecture ni modification Le plus basique

Astuce pédagogique : Les fonctions marquées "view" (comme "consulter mon solde") ne coûtent aucun gaz car elles lisent juste la blockchain sans la modifier. Les fonctions qui modifient l'état (comme "envoyer de l'argent") coûtent du gaz car elles créent de nouvelles transactions. Utilisez "view" pour toutes les lectures pour économiser l'argent de vos utilisateurs.

⚠️ Attention critique : Oubliez les modificateurs de visibilité (public/private) est l'une des plus grandes vulnérabilités de sécurité en Solidity. Une fonction publique involontaire peut permettre à un attaquant de drainer les fonds du contrat. En 2016, le exploit DAO qui a coûté 50 millions de dollars provenait d'une fonction mal protégée. Toujours être explicite sur qui peut appeler vos fonctions.

Les fonctions Solidity peuvent aussi avoir des "modificateurs" (modifiers) qui sont des conditions préalables - par exemple, un modificateur "onlyOwner" qui garantit que seul le propriétaire du contrat peut appeler cette fonction. C'est la fondation de la sécurité Solidity.

4. L'héritage et la modularité : construire des contrats complexes

L'héritage en Solidity fonctionne comme dans le monde réel : un contrat enfant hérite des propriétés et comportements d'un contrat parent. Cela permet de réutiliser du code, de créer une hiérarchie logique et de construire des systèmes complexes à partir de briques simples et testées.

Définition formelle : L'héritage est un mécanisme de programmation orientée objet où un contrat (contrat enfant/dérivé) hérite de toutes les variables et fonctions d'un ou plusieurs contrats parents (contrats de base). Le contrat enfant peut ajouter de nouvelles fonctionnalités ou modifier les existantes.

Analogie simple : Imaginez la hiérarchie des véhicules. "Véhicule" est la classe parent avec des propriétés communes : couleur, vitesse maximale, accélérer(), freiner(). "Voiture" hérite de Véhicule et ajoute : nombre de portes, ouvrir_coffre(). "Voiture électrique" hérite de Voiture et modifie la fonction recharger() pour ajouter la recharge électrique. Chaque niveau construit sur le précédent sans tout réécrire.

Concept Définition Exemple Blockchain
Contrat parent Le contrat de base ERC20 (token standard)
Contrat enfant Hérite du parent MonToken hérite d'ERC20
Fonction virtuelle Peut être modifiée transfer() qu'on peut personnaliser
Polymorphisme Même nom, comportement différent transfer() différent pour chaque token
Interface Contrat sans implémentation Définit les fonctions à implémenter

Astuce pédagogique : Les normes Ethereum comme ERC20 (tokens), ERC721 (NFTs) et ERC1155 (collections) sont des contrats parents que vous devriez connaître. Au lieu de programmer un token de zéro (complexe et dangereux), vous hériterez simplement d'ERC20 qui est audité et sécurisé. C'est la pratique standard de l'industrie.

⚠️ Attention critique : L'ordre d'héritage multiple en Solidity suit un ordre spécifique appelé C3 Linearization. Si vous avez un contrat qui hérite de deux parents qui héritent eux-mêmes du même grand-parent, l'ordre compte énormément pour la sécurité. Un mauvais ordre d'héritage peut créer des vulnérabilités imprévisibles.

La modularité via l'héritage n'est pas qu'une question technique - c'est philosophique. Ethereum a standardisé des interfaces communes (ERC20, ERC721) justement pour que les contrats puissent interagir les uns avec les autres. Votre token ERC20 peut automatiquement fonctionner avec n'importe quel portefeuille ou échange qui supporte ERC20, sans modification. C'est la puissance de la standardisation.

5. Les événements et la sécurité : construire en confiance

Un événement en Solidity est un enregistrement immuable qu'un contrat émet pour signifier que quelque chose d'important s'est produit. Les événements sont journalisés sur la blockchain et sont consultables par quiconque, créant un audit trail transparent et permanent. La sécurité en Solidity n'est jamais accidentelle - elle doit être architecturée dès le départ.

Définition formelle : Un événement est un log structuré qu'un contrat émet pour indiquer l'occurrence d'une action important. Les événements sont indexés sur la blockchain, permanents et immuables, mais ne coûtent rien à lire (contrairement aux variables d'état). La sécurité en Solidity repose sur le principe de minimisation des risques : chaque fonction doit vérifier ses conditions avant d'agir.

Analogie simple : Imaginez un coffre-fort bancaire avec une caméra de surveillance. Chaque fois que quelqu'un entre, la caméra enregistre "Jean a entré le 15 janvier à 10h30". L'enregistrement vidéo (l'événement) ne coûte rien à consulter, ne peut jamais être supprimé, et quiconque peut vérifier qui a eu accès. C'est un audit trail parfait. La sécurité (les gardiens, les tests biométriques, les limites de retrait) c'est aussi s'assurer que seules les bonnes personnes peuvent entrer et faire les bonnes actions.

Élément de Sécurité But Exemple
require() Vérifier une condition avant d'agir require(solde >= montant, "Solde insuffisant");
revert() Arrêter l'exécution et annuler if(error) revert("Erreur détectée");
assert() Vérifier l'invariant interne assert(totalSupply == sum(balances));
Événements Enregistrer les actions importantes emit Transfer(de, vers, montant);
Modificateurs Contrôler l'accès aux fonctions modifier onlyOwner { require(msg.sender == owner); _; }

Astuce pédagogique : Toujours écrire les vérifications (require) AVANT de modifier les variables (checks-effects-interactions pattern). D'abord, vérifiez que tout est légal. Ensuite, modifiez l'état. Enfin, interagissez avec d'autres contrats. Cet ordre simple prévient 90% des exploits Solidity. Les événements permettent aux portefeuilles et aux interfaces utilisateur de rester synchronisées en écoutant les événements émis.

⚠️ Attention critique : Les contrats Solidity ne peuvent jamais être complètement sûrs à 100%. Même les plus grands projets (Uniswap, OpenZeppelin) se font auditer par des experts externes. Le langage lui-même a des pièges : integer overflow (jusqu'à Solidity 0.8), reentrancy attacks, front-running. L'attitude correcte est d'être humble : vérifier deux fois, tester extensivement, faire auditer avant de mettre du vrai argent en risque.

La sécurité Solidity est un domaine en évolution constante. Chaque année, de nouvelles classes de vulnérabilités sont découvertes. Les meilleurs développeurs Solidity lisent les rapports d'audit d'autres projets, suivent les standards de sécurité (OpenZeppelin), et testent leur code automatiquement avec des outils comme Hardhat et Foundry. Un contrat sans événements est comme une banque sans registre de transactions - comment les utilisateurs sauraient-ils qu'une action s'est produite ? Les événements créent la transparence qui est le cœur de blockchain.

Accédez à des centaines d'examens QCM — Découvrir les offres Premium