Passer au contenu principal
Change page

Anatomie des contrats intelligents

Dernière mise à jour de la page : 15 avril 2026

Les contrats intelligents sont des programmes qui s'exécutent à une adresse sur Ethereum. Ils sont constitués de données et de fonctions qui peuvent s'exécuter lors de la réception d'une transaction. Cette page explique la composition d'un contrat intelligent.

Prérequis

Assurez-vous d'avoir d'abord lu la page sur les contrats intelligents. Ce document part du principe que vous êtes déjà familiarisé avec des langages de programmation comme JavaScript ou Python.

Données

Toute donnée de contrat doit être affectée à un emplacement : soit storage, soit memory. Il est coûteux de modifier le stockage dans un contrat intelligent. Vous devez donc décider de l'endroit où vous souhaitez conserver vos données.

Stockage

Les données persistantes sont appelées stockage et sont représentées par des variables d'état. Ces valeurs sont stockées en permanence sur la blockchain. Vous devez déclarer le type afin que le contrat puisse garder une trace de la quantité de stockage nécessaire sur la blockchain quand il compile.

// Exemple Solidity
contract SimpleStorage {
    uint storedData; // Variable d'état
    // ...
}
# Vyper example
storedData: int128

Si vous avez déjà programmé des langages orientés objet, vous serez probablement familiarisé avec la plupart des types. Cependant, address devrait être nouveau pour vous si vous débutez dans le développement Ethereum.

Un type address peut contenir une adresse Ethereum qui équivaut à 20 octets ou 160 bits. ce qui donne une adresse en notation hexadécimale commençant par 0x.

Les autres types incluent les :

  • booléens ;
  • nombres entiers ;
  • numéros de points fixes ;
  • tableaux d'octets de taille fixe ;
  • tableaux d'octets de taille dynamique
  • littéraux rationnels et entiers
  • littéraux de chaîne
  • littéraux hexadécimaux
  • énumérations

Pour plus d'explications, consultez les pages ci-dessous :

Mémoire

Les valeurs qui ne sont stockées que pendant la durée de l'exécution d'une fonction de contrat sont appelées variables de mémoire. Celles-ci n'étant pas stockées de façon permanente sur la blockchain, elles sont donc moins chères à utiliser.

Apprenez-en davantage sur la façon dont l'EVM stocke les données (le stockage, la mémoire et la pile) dans la documentation de Solidity (opens in a new tab).

Variables d'environnement

En plus des variables que vous définissez sur votre contrat, il existent quelques variables globales spéciales. Elles sont principalement utilisées pour fournir des informations sur la blockchain ou la transaction en cours.

Exemples :

PropriétéVariable d'étatDescription
block.timestampuint256Horodatage de la période du bloc actuel
msg.senderAdresseExpéditeur du message (appel en cours)

Fonctions

En termes simples, les fonctions peuvent obtenir ou définir des informations en réponse à des transactions entrantes.

Il existe deux types d'appels de fonctions :

  • internal – celles-ci ne créent pas d'appel EVM
    • Les fonctions internes et les variables d'état ne sont accessibles qu'en interne (c'est-à-dire depuis le contrat actuel ou les contrats qui en dérivent)
  • external – celles-ci créent un appel EVM
    • Les fonctions externes font partie de l'interface du contrat, ce qui signifie qu'elles peuvent être appelées à partir d'autres contrats et via des transactions. Une fonction externe f ne peut pas être appelée en interne (c.-à-d. que f() ne fonctionne pas, mais this.f() fonctionne).

Elles peuvent également être public ou private

  • Les fonctions public peuvent être appelées en interne depuis le contrat ou en externe via des messages
  • Les fonctions private ne sont visibles que pour le contrat dans lequel elles sont définies et non dans les contrats dérivés

Les fonctions et les variables d'état peuvent être rendues publiques ou privées

Voici une fonction pour mettre à jour une variable d'état sur un contrat :

// Solidity example
function update_name(string value) public {
    dapp_name = value;
}
  • Le paramètre value de type string est passé dans la fonction : update_name
  • Elle est déclarée public, ce qui signifie que n'importe qui peut y accéder
  • Elle n'est pas déclarée view, elle peut donc modifier l'état du contrat

Fonctions View

Ces fonctions promettent de ne pas modifier l’état des données du contrat. Les exemples courants sont les fonctions « getter » - vous pouvez utiliser ceci pour obtenir le solde d'un utilisateur par exemple.

// Solidity example
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Voici ce qui est considéré comme une modification d'état :

  1. Écriture dans les variables d'état
  2. Émettre des événements (opens in a new tab).
  3. Créer d'autres contrats (opens in a new tab).
  4. Utiliser selfdestruct.
  5. Envoi d'ether via des appels
  6. Appeler toute fonction non marquée view ou pure.
  7. Utilisation d'appels de bas niveau
  8. Utilisation d'un assemblage en ligne conteant certains opcodes

Fonctions constructeur

Les fonctions constructor ne sont exécutées qu'une seule fois lors du premier déploiement du contrat. Comme le constructor dans de nombreux langages de programmation orientés objet, ces fonctions initialisent souvent les variables d'état à leurs valeurs spécifiées.

# Vyper example

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Fonctions intégrées

En plus des variables et des fonctions que vous définissez pour votre contrat, il existe des fonctions spéciales intégrées. Exemple le plus évident :

  • address.send() – Solidity
  • send(address) – Vyper

Celles-ci permettent aux contrats d’envoyer des ETH à d’autres comptes.

Écrire des fonctions

Votre fonction a besoin des éléments suivants :

  • Paramètre variable et type (si elle accepte des paramètres)
  • Déclaration de fonction internal/external
  • Déclaration de fonction pure/view/payable
  • Type de renvoi (si elle renvoie une valeur)

Un contrat complet pourrait ressembler à cela. Ici, la fonction constructor fournit une valeur initiale pour la variable dapp_name.

Événements et journaux

Les événements permettent à votre contrat intelligent de communiquer avec votre frontend ou d'autres applications abonnées. Une fois qu'une transaction est validée et ajoutée à un bloc, les contrats intelligents peuvent émettre des événements et enregistrer des informations, que le frontend peut ensuite traiter et utiliser.

Exemples annotés

Voici quelques exemples rédigés en Solidity. Si vous souhaitez vous amuser avec le code, vous pouvez interagir avec celui-ci dans Remix (opens in a new tab).

Hello world

Jeton

Actif numérique unique

En savoir plus

Consultez la documentation Solidity et Vyper pour une vue d'ensemble plus complète des contrats intelligents :

Cet article vous a-t-il été utile ?