Leçons 1/4 · 20 min
Ce qu'est un contrat : code, état, déterminisme, gaz
Un cas concret
Une coopérative de cacao à Bafoussam veut un registre des lots dont les règles ne puissent pas être modifiées en secret par une seule personne : qui peut enregistrer un lot, qu'un numéro de lot ne soit jamais utilisé deux fois. Un contrat intelligent (smart contract) est un programme, avec ses données, stocké à une adresse sur une chaîne dotée d'une machine virtuelle programmable (celles de type Ethereum, par exemple). Les utilisateurs l'appellent en envoyant des transactions ; chaque nœud exécute l'appel et doit arriver au même nouvel état.
Précision de départ : le langage le plus répandu pour ces chaînes est Solidity, mais ce cours n'en enseigne pas la syntaxe. Les exemples ci-dessous sont en pseudo-code, lisible sans connaître aucun langage.
contract LotRegistry:
storage owner // fixé à la création
storage lots: map lotId -> (holder, weightKg)
function register(lotId, weightKg):
require caller == owner // contrôle d'accès
require lots[lotId] does not exist
lots[lotId] = (caller, weightKg)
emit Registered(lotId)require signifie : si la condition est fausse, tout l'appel est annulé et l'état reste comme avant. caller est l'adresse qui a signé la transaction (ou le contrat qui l'appelle). Vous avez vu au sujet des transactions que cette signature est vérifiée par le protocole ; le contrat, lui, décide ce qu'elle autorise.
Quatre propriétés qui définissent le métier
1. Déterminisme. Tous les nœuds doivent obtenir le même résultat à partir du même état et de la même transaction. Donc un contrat ne peut pas tirer un nombre au hasard « vraiment aléatoire », ni appeler une page web (deux nœuds interrogeraient à des instants différents et obtiendraient des réponses différentes). L'horodatage d'un bloc existe, mais c'est une valeur fixée par le producteur du bloc dans des bornes, pas une horloge de confiance.
2. Gaz. Chaque opération coûte un nombre d'unités de gaz, et l'exécution est mesurée : l'émetteur fixe une limite de gaz et un prix par unité, et les frais payés sont le gaz consommé × le prix (comme dans l'atelier sur les frais). Si la limite est atteinte avant la fin, l'exécution est annulée, mais le travail effectué reste payé. Cela empêche les boucles infinies de bloquer le réseau.
Exemple avec un barème fictif : écrire une nouvelle case de stockage coûte 20 000 unités, lire une case 200, et chaque transaction a un coût de base de 21 000. L'appel register lit deux cases (owner et l'existence du lot) et écrit une case : 21 000 + 200 + 200 + 20 000 = 41 400 unités (dans ce barème fictif, le couple (holder, weightKg) tient dans une seule case et l'événement emit est ignoré ; avec deux écritures séparées, le total serait de 61 400). Avec une limite de 40 000, l'appel manque de gaz : tout est annulé, et les 40 000 unités sont payées quand même. Avec une limite de 45 000, il passe et seul le gaz réellement consommé (41 400) est facturé. Les vrais barèmes diffèrent ; l'idée reste.
Conséquence de conception : une fonction qui parcourt une liste qui grandit avec les utilisateurs finit par dépasser la limite de gaz d'un bloc et devient inutilisable. On évite les boucles non bornées.
3. Publicité. L'état d'un contrat est lisible par tous. Les mots-clés « privé » d'un langage empêchent seulement les autres contrats d'y accéder simplement ; quiconque lit le stockage voit les valeurs. Pas de secret dans un contrat.
4. Immutabilité. Une fois déployé, le code d'un contrat ne se modifie pas dans le schéma courant. Un bogue y est permanent. On peut prévoir un contrat « mandataire » (proxy) qui redirige vers une nouvelle version, mais alors celui qui détient le droit de changer de version détient un pouvoir énorme, et vos utilisateurs doivent lui faire confiance. Immutable est un avantage (les règles ne bougent pas) et un risque (les erreurs aussi).
Ce que cela ne garantit PAS
- Le contrat garantit que ses règles sont appliquées, pas que les faits sont vrais : si le propriétaire enregistre « 500 kg » pour un lot qui en pèse 50, la chaîne conserve fidèlement un mensonge.
- Un contrat ne s'exécute jamais seul : il faut qu'une transaction l'appelle. Il ne peut pas « agir à minuit ».
- Déployé ne veut pas dire correct.
À retenir : code et état à une adresse, résultat déterministe, exécution mesurée en gaz, état public, code figé.
