Qu’est-ce qu’un contrat intelligent ?
Un contrat intelligent (smart contract) est un programme déployé sur un réseau blockchain, qui s’exécute selon les règles de son code dès qu’une transaction ou un autre programme l’appelle. Il peut lire des données entrantes et des données inscrites sur la chaîne, vérifier des conditions prédéfinies et, en cas d’exécution réussie, mettre à jour les données conservées par la blockchain.
Le mot « intelligent » ne signifie pas que le programme réfléchit de lui-même, et le mot « contrat » ne garantit pas qu’il constitue un contrat au sens juridique. Ce nom met en avant autre chose : des participants peuvent écrire un ensemble de règles de fonctionnement sous forme de code, traité selon le protocole par les nœuds qui font tourner le logiciel de la blockchain et vérifient les transactions, sans qu’un serveur unique décide seul du résultat.
Commencer par distinguer code, état et appel
Le code définit les opérations que le programme peut effectuer et les conditions requises pour chacune. L’état correspond aux données que le programme conserve actuellement sur la chaîne : soldes, propriétaires, paramètres ou autorisations. La transaction ou l’appel fournit l’émetteur, la fonction et les données d’entrée de cette exécution précise, et déclenche la lecture ou la modification de l’état.
Un même code peut produire des résultats différents selon les données reçues ou selon l’état courant. « S’exécuter conformément au code » ne veut donc pas dire qu’un contrat renvoie toujours la même réponse, mais qu’avec les mêmes règles de chaîne, le même état courant, les mêmes données de transaction et le même contexte d’exécution, les validateurs doivent aboutir au même résultat. Le contexte d’exécution comprend l’appelant, l’horodatage du bloc et les autres informations que le protocole fournit pour cette exécution.
Un contrat ne se réveille pas non plus de lui-même pour consulter l’heure, un prix ou un événement réel. Il attend généralement une transaction ou un message du protocole. Si le programme a besoin d’informations hors chaîne — prix de marché, météo, résultat d’un match —, un mécanisme de données comme un oracle doit d’abord les transmettre sur la chaîne. Un contrat ne peut exécuter que les données qu’il reçoit : il ne peut pas prouver seul qu’une information externe est exacte.
Le problème auquel répondent les contrats intelligents
Dans une application ordinaire, la logique principale tourne habituellement sur des serveurs contrôlés par l’éditeur ou le prestataire. Les utilisateurs envoient une requête au serveur, qui lit une base de données, applique les règles et renvoie un résultat. L’exploitant de ce serveur peut mettre à jour le programme, modifier les droits sur la base de données ou interrompre le service.
Un contrat intelligent déplace une partie de cette logique et de cet état dans l’environnement d’exécution partagé de la blockchain. Lorsqu’une transaction conforme est confirmée par le réseau, les nœuds calculent le résultat selon les mêmes règles et inscrivent les changements d’état valides dans le registre. Les participants peuvent vérifier la transaction et son résultat de façon indépendante, au lieu de s’appuyer seulement sur les enregistrements fournis par le back-end d’une application.
Cela ne signifie pas que l’application se passe désormais d’exploitants ou de serveurs. Le site web, l’application mobile, l’indexation des données, les notifications et le support client peuvent rester assurés par des systèmes centralisés, et le contrat lui-même peut conserver des droits d’administration. Pour juger de la façon dont une application est contrôlée, il faut examiner séparément le programme sur la chaîne, les services hors chaîne qui ne tournent pas sur la blockchain, et les clés qui peuvent utiliser les droits d’administration.
Du déploiement à l’exécution
Les blockchains n’emploient pas toutes le même nom ni le même traitement pour les contrats intelligents, mais le processus passe généralement par le déploiement, l’appel, l’exécution et l’enregistrement.
Déployer le programme sur le réseau
Le développeur écrit d’abord le programme dans un langage pris en charge par le réseau, puis convertit le code dans une forme exploitable par l’environnement d’exécution de ce réseau. Le déploiement s’effectue généralement par une transaction particulière ; après confirmation par le réseau, le programme reçoit un identifiant sur la chaîne que d’autres comptes ou programmes peuvent appeler.
Celui qui déploie peut inscrire dans le programme des données et des droits initiaux : qui peut suspendre une fonction, modifier un paramètre ou approuver une mise à niveau. Tous les contrats ne disposent pas de ces droits, et ceux-ci ne disparaissent pas automatiquement parce que le code est appelé « contrat intelligent ».
Un utilisateur ou un programme émet un appel
L’utilisateur déclenche généralement une transaction depuis un portefeuille ou une interface applicative, en indiquant la fonction à appeler et les données d’entrée. Un autre contrat intelligent peut également l’appeler pendant son exécution, ce qui permet de combiner plusieurs programmes en une seule opération.
Le libellé d’un bouton ou le message du portefeuille affiché avant l’appel n’est que l’interprétation de la transaction par l’interface. Ce qui est réellement soumis, ce sont des données encodées. Si l’interface les affiche de façon incomplète, se connecte à une mauvaise adresse ou masque des autorisations supplémentaires, l’effet réel de la signature peut différer de ce que l’utilisateur croyait approuver.
Les nœuds exécutent et vérifient le résultat
Les réseaux ne répartissent pas de la même manière « qui exécute d’abord et qui vérifie ensuite ». Sur de nombreuses chaînes publiques orientées exécution, les nœuds validateurs rejouent ou contrôlent l’exécution du contrat selon les mêmes règles afin de confirmer les changements d’état produits par la transaction. Le programme lit l’état courant et les données d’entrée, vérifie les conditions dans l’ordre et calcule un résultat.
Sur Ethereum, par exemple, les contrats intelligents sont appelés par des transactions et exécutés dans la machine virtuelle Ethereum. Dans Hyperledger Fabric, un programme comparable s’appelle chaincode : les nœuds qui satisfont la politique d’endossement simulent d’abord l’exécution et signent le résultat, puis les nœuds peers du canal vérifient les signatures d’endossement et les enregistrements de lecture-écriture ; seules les transactions validées mettent à jour l’état courant. Une politique d’endossement est simplement la règle par laquelle les membres du réseau décident à l’avance quelles organisations doivent approuver un résultat. Ces différences montrent que « contrat intelligent » désigne une catégorie de programmes, et non l’implémentation particulière d’une seule chaîne publique.
Écrire un état ou renvoyer une lecture
Un appel qui modifie l’état de la chaîne doit être confirmé comme transaction. Un programme peut par exemple mettre à jour le solde d’un token, enregistrer une autorisation ou changer le détenteur d’un objet numérique. En cas d’échec de l’exécution, le changement d’état attendu ne prend généralement pas effet, mais l’émetteur peut malgré tout supporter les frais de traitement déjà consommés par le réseau ; les règles exactes dépendent du réseau.
Lire un état existant ne nécessite généralement pas de nouvelle transaction sur la chaîne. Une application peut interroger un nœud sur un solde, un paramètre ou un enregistrement, et le nœud renvoie le résultat localement. Comme l’état partagé n’est pas modifié, cette lecture n’a pas besoin d’être reconfirmée par l’ensemble du réseau. Les réseaux et les prestataires peuvent toutefois prévoir leurs propres modalités d’interrogation ou de tarification.
Différence avec un contrat ordinaire
Un contrat intelligent est d’abord un programme ; un contrat ordinaire est d’abord un arrangement juridique entre des parties. Les deux peuvent être liés — des parties peuvent utiliser un programme pour effectuer un paiement ou consigner l’exécution d’une obligation —, mais la similitude des noms ne les rend pas identiques par nature.
Ce qu’un programme peut apprécier, ce sont les données que son code peut lire et les conditions explicitement formulées. Il ne comprendra pas nécessairement l’intention réelle des parties, ne traitera pas les clauses ambiguës, ne détectera pas une fraude et ne déterminera pas une réparation dans le monde réel. La question de savoir si un résultat inscrit sur la chaîne correspond à un droit, et comment un litige est tranché, dépend de l’arrangement concerné et des règles applicables ; elle ne se déduit pas du nom donné au code.
L’inverse est vrai aussi : un contrat juridique n’utilise pas forcément de contrat intelligent. Il peut être consigné et exécuté par des systèmes traditionnels. Pour apprécier la relation entre les deux, il faut demander séparément ce que fait réellement le code, et quel arrangement juridique ou contractuel les parties ont conclu par ailleurs.
Différence avec une application décentralisée
Un contrat intelligent n’est généralement qu’un élément d’une application décentralisée. Une application décentralisée (decentralized application, DApp) peut aussi comprendre une interface web ou mobile, une connexion de portefeuille, des bases de données hors chaîne, du stockage de fichiers et des services de données.
Lorsqu’un utilisateur clique sur « échanger » sur une page web, l’interface présente les actifs et les paramètres, le portefeuille lui permet de vérifier la demande et de la signer, le contrat intelligent applique les règles sur la chaîne, et les nœuds vérifient la transaction. Une erreur dans l’une de ces couches peut modifier le résultat final.
Un contrat déployé sur une blockchain ne rend donc pas l’ensemble de l’application décentralisée. Un nom de domaine frontal peut être fermé, un service de données peut renvoyer des informations erronées, et un administrateur peut conserver des droits de mise à niveau ou de suspension. Évaluer une application suppose d’examiner ses composants et ceux qui les contrôlent.
Un contrat peut-il être modifié ou mis à niveau
Certaines blockchains conservent le code d’un contrat déployé sans modification, mais cela ne signifie pas que la logique applicative ne peut jamais évoluer. Les développeurs peuvent déployer un nouveau contrat et faire migrer les utilisateurs, ou recourir à une structure de proxy dans laquelle un point d’entrée fixe transfère les appels vers un contrat de logique remplaçable.
La possibilité de mise à niveau peut servir à corriger des failles ou à ajouter des fonctions. Elle implique aussi que certains comptes, dispositifs de signature multiple ou processus de gouvernance peuvent avoir le pouvoir de modifier le comportement du programme. L’existence d’un droit de mise à niveau, les personnes qui peuvent l’exercer, l’éventuel délai d’attente et la possibilité de sortie pour les utilisateurs doivent être vérifiés dans la structure et les droits du contrat concerné.
Même lorsque le code lui-même ne peut pas être modifié, un administrateur peut encore changer le résultat au moyen de paramètres, de listes d’autorisation, d’un interrupteur de suspension ou d’une source de données externe. À l’inverse, l’absence de droit de mise à niveau ne réduit pas les risques : une faille impossible à corriger peut subsister longtemps.
Usages courants
Les contrats intelligents permettent de combiner actifs et données sur la chaîne selon des règles uniformes. Parmi les usages courants :
- consigner l’émission, les soldes, les transferts et les autorisations d’un token selon des règles uniformes ;
- échanger des actifs selon les règles de quantité et de prix inscrites dans le programme ;
- gérer la mise en garantie, le prêt et le remboursement d’actifs, y compris leur liquidation lorsque les conditions ne sont plus remplies ;
- consigner l’identifiant d’objets numériques et la relation de détention ;
- gérer des actifs selon plusieurs signatures ou des droits attachés à des rôles ;
- appliquer des changements de paramètres à partir du résultat d’un vote sur la chaîne.
Ces usages décrivent des types de programmes ; ils n’indiquent pas qu’un contrat donné est fiable, pertinent ou adapté à qui que ce soit. Des programmes de même type peuvent reposer sur des droits, des sources de données et des modes de mise à niveau entièrement différents.
Limites et risques
Écrire des règles sous forme de code exécutable transpose aussi sur la chaîne les erreurs de code et la conception des droits. Les limites courantes comprennent :
- Failles de code : une erreur de condition, de calcul ou de contrôle des droits peut entraîner un traitement incorrect des actifs ou des données.
- Droits d’administration : un administrateur, un compte de mise à niveau ou les participants à une signature multiple peuvent suspendre ou modifier le programme.
- Données externes : si un oracle fournit des données erronées, retardées ou manipulées, le contrat peut s’exécuter normalement sur une entrée fausse.
- Dépendances de composition : lorsqu’un contrat appelle d’autres contrats, une panne, une mise à niveau ou une variation des actifs disponibles en amont peut se répercuter en aval.
- Ordre des transactions : d’autres participants du réseau peuvent voir une transaction en attente avant sa confirmation et soumettre des opérations connexes plus tôt, ce qui modifie les conditions auxquelles la transaction initiale fait finalement face.
- Interfaces et signatures : une page malveillante, une adresse erronée ou une demande d’autorisation peu claire peuvent amener un utilisateur à signer une opération qu’il n’avait pas prévue.
- Coût d’exécution : les calculs complexes et le stockage sur la chaîne peuvent exiger des frais plus élevés ; une transaction peut échouer si les frais sont insuffisants ou les conditions non remplies.
Un code public n’est pas pour autant un code compréhensible. Ce qui s’exécute sur la blockchain peut être du bytecode compilé, c’est-à-dire les instructions de bas niveau lues par l’environnement d’exécution. Même lorsqu’un projet publie un code source plus lisible, un lecteur non spécialiste aura du mal à confirmer qu’il correspond au programme sur la chaîne, qu’il a été suffisamment testé, ou qu’un proxy ne renvoie pas actuellement vers une autre logique.
Un audit de sécurité peut révéler une partie des problèmes, mais il ne prouve pas l’absence de failles et n’élimine pas les risques liés aux administrateurs, aux données externes, aux conditions de marché ou aux signatures des utilisateurs. Apprécier un programme précis suppose de regarder au-delà d’une mention « audité ».
FAQ
Les contrats intelligents s’exécutent-ils automatiquement ?
Ils s’exécutent conformément à leur code, mais ont généralement besoin d’une transaction, d’un autre contrat ou d’un message du protocole pour être déclenchés. Déployer un contrat ne signifie pas qu’il surveillera le monde réel et lancera toutes les opérations de lui-même.
Tous les contrats intelligents sont-ils publics ?
Pas nécessairement. Sur les blockchains publiques, le code exécuté et les données de transaction peuvent généralement être lus par les nœuds, mais le code source n’est pas toujours publié ni vérifié. Les réseaux permissionnés peuvent en outre restreindre les membres autorisés à consulter les données et à appeler les programmes.
Un contrat est-il impossible à modifier après déploiement ?
Pas nécessairement. Le code d’origine peut rester inchangé, mais une application peut migrer vers un nouveau contrat, ou remplacer la logique via un proxy et des droits d’administration. Il faut vérifier la structure de mise à niveau concernée plutôt que se fier à une communication sur l’immuabilité.
Un contrat intelligent peut-il lire directement les données d’un site web ?
En général, il ne peut pas traiter un contenu web ordinaire comme une entrée fiable sur la chaîne. Il a besoin d’un oracle, d’un participant autorisé ou d’un autre mécanisme pour transmettre les données, et ces sources créent des dépendances supplémentaires.
Une exécution réussie signifie-t-elle que l’opération était saine ?
Non. Une exécution réussie indique seulement que la transaction respectait le code en vigueur et les règles du réseau. Elle ne prouve pas que le code correspond à l’intention de l’utilisateur, que les données externes étaient correctes, que les droits étaient correctement configurés, ni que le programme est exempt de failles économiques ou de sécurité.
Concepts associés
Poursuis avec blockchain, bloc, frais de gas et nœud de blockchain, ou reviens au glossaire des cryptomonnaies.
Sources
- NISTIR 8202 : présentation de la technologie blockchain — définition générale des contrats intelligents, code et état, exigences d’exécution par les nœuds.
- Ethereum.org : introduction aux contrats intelligents — déploiement, appels, état, composition et limites des données hors chaîne.
- Ethereum.org : interagir avec les contrats intelligents — différence entre lire l’état et soumettre un changement d’état.
- Ethereum.org : mettre à niveau les contrats intelligents — code immuable comparé aux structures de mise à niveau par proxy.
- Hyperledger Fabric : contrats intelligents et chaincode — chaincode, endossement, validation et mise à jour de l’état dans un réseau permissionné.




