Les smart contracts avec Bitcoin (1/3) : Une monnaie programmable
Acheter Bitcoin (BTC)
Partenaire Bitpanda
Nous connaissons tous Bitcoin comme un système de paiement permettant de déplacer de la valeur d'un bout à l'autre du monde sans intermédiaire de confiance et dont la vocation première est de devenir une monnaie numérique saine et universelle. Mais saviez-vous que, loin d'être réduit à la seule fonction de paiement, Bitcoin était capable de bien plus ?
En effet, il s'agit d'une monnaie programmable capable de gérer des smart contracts. La notion de smart contract, a été inventée par Nick Szabo en 1994. Elle souvent traduite assez maladroitement par « contrat intelligent », alors qu'on devrait plutôt parler de contrat auto-exécutable, ou de contrat autonome, dans le sens où son exécution ne nécessite pas l'intervention d'un tiers de confiance. Dans le monde de la blockchain et des crypto-monnaies, le terme est utilisé pour décrire un programme qui s'exécute automatiquement sur une chaîne de blocs lorsque certaines conditions sont remplies.
Si on parle beaucoup de Ethereum lorsqu'il s'agit de smart contracts, Bitcoin a été un pionnier dans le domaine en permettant l'écriture de scripts complexes sur sa chaîne de blocs. Dans cette série d'articles, nous allons voir comment ces contrats sont mis en place et quels usages on peut en faire. Mais d'abord, nous allons nous concentrer sur le fonctionnement des transactions, véritables pierres angulaires du protocole, et au sein desquelles sont exécutés ces programmes.
Le rôle central des transactions
Bitcoin est un protocole d'échange de valeur : c'est pour cela que les transactions constituent l'élément central de Bitcoin. Tout est construit autour d'elles. Pour que Bitcoin ait de la valeur, il faut impérativement qu'il soit facile de construire une transaction et de la propager sur le réseau, afin qu'elle soit aisément validée et ajoutée à la chaîne de blocs.
Les transactions ont généralement lieu entre des adresses publiques. Une transaction est typiquement constituée d'une adresse d'envoi, d'une adresse de réception, d'un montant envoyé et de frais de transactions exprimés en bitcoins. Les portefeuilles, c'est-à-dire les programmes qui servent à envoyer, recevoir et conserver des bitcoins, sont conçus pour que l'utilisateur ne voie pas tout ce qui se passe, et se chargent d'afficher les montants envoyés et reçus, ainsi que le solde total détenu.
À titre d'illustration, supposons qu'une personne nommée Alice veuille envoyer 10 mBTC à un individu appelé Bob (1 mBTC = 0.001 BTC). Sur la chaîne de blocs, la transaction est réalisée entre leurs deux adresses : la somme de 10 mBTC est échangée entre l'adresse d'Alice (1ALiCefkmxr8XE4WWUiUpWXDQgQTJvFp1r) et l'adresse de Bob (1BobmpD4eGKQaM4MsEqvQ4vnUJSbQEu6kL). Une fois la transaction validée, les soldes des deux adresses sont mis à jour sur leurs portefeuilles respectifs. Le schéma ci-dessous représente cette transaction.
Pour que la transaction soit acceptée par le réseau, il faut qu'elle soit signée numériquement par la clé privée de l'envoyeur. Les noeuds du réseau vérifient que la signature correspond bien à la clé publique de l'envoyeur et si c'est le cas, elle est inscrite sur la chaîne de blocs. Dans notre cas c'est Alice qui doit signer la transaction en utilisant sa clé privée : 5JE3pwUNRKDYJuBwZHBABZRqizF7ZUwHxAhS2dy3n4btwtsUaxx.
Si les notions de clé privée et d'adresse vous échappent, vous pouvez vous référer à l'article « Clés privées, clés publiques et adresses dans Bitcoin » qui expliquent ces concepts en détail.
Le concept de transaction paraît donc assez simple de prime abord. Cependant, la réalité se révèle un peu plus complexe : les transactions de Bitcoin contiennent plus d'informations que l'on ne croit. Même dans le cas d'un paiement, des scripts (les fameux smart contracts) sont exécutés pour assurer le bon déroulement des choses. Pour comprendre comment ces programmes marchent, il faut aller plus loin, et s'intéresser à ce qu'on appelle les UTXO.
Vous avez dit UTXO ?
Toute transaction est constituée d'entrées et de sorties. Sauf dans le cas de la génération de nouveaux bitcoins, chaque entrée est la sortie d'une autre transaction. Dans Bitcoin, on porte donc attention aux sorties transactionnelles, et en particulier aux sorties transactionnelles non dépensées, presque toujours désignées sous le nom d'UTXO, abréviation de l'anglais Unspent Transaction Output.
Les UTXO représentent de facto les bitcoins en circulation : un bitcoin n'existe que parce qu'il est le résultat d'une transaction et qu'il n'est inclus dans aucune autre transaction. Même les bitcoins nouvellement créés résultent d'une transaction, appelée « coinbase », que le mineur construit pour se récompenser.
Lors d'une transaction, les UTXO en entrée sont déverrouillés et de nouveaux UTXO sont verrouillés. Bien évidemment, le montant en sortie ne peut pas excéder le montant en entrée. Le verrouillage et déverrouillage des UTXO se fait par l'intermédiaire de scripts dont l'exécution se fait lors de la validation par les nœuds du réseau. La transaction n'est réalisée que lorsque les scripts sont valides aux yeux du réseau : si l'un d'entre eux est invalide, la transaction est rejetée.
Dans le cas d'une transaction entre adresses simples, les scripts de déverrouillage consistent à vérifier les signatures qui correspondent aux adresses en entrée. Les scripts de verrouillage consistent quant à eux à verrouiller les fonds aux adresses de sortie. Prenons notre exemple de transaction entre Alice et Bob et regardons comment tout cela fonctionne.
Dans cette transaction, on peut voir ce qui arrive lorsque Alice (ou plutôt son portefeuille) envoie 10 mBTC à Bob. Au cours de transactions précédentes, Alice a reçu respectivement 5 et 7 mBTC d'autres personnes : 2 UTXO ont donc été créés à son adresse. Puisqu'il s'agit de son adresse, elle peut, à l'aide de sa clé, débloquer ces UTXO pour les dépenser. Ce sont ainsi 12 mBTC qui sont déverrouillés et deviennent dépensables.
Bob, lui, a juste fourni son adresse à Alice, de sorte à ce qu'elle lui envoie des bitcoins sans qu'il ait besoin de faire quoi que ce soit. Alice verrouille donc 10 mBTC à l'adresse de Bob, ce qui crée un nouvel UTXO.
De par sa nature de sortie transactionnelle, un UTXO ne peut pas être partiellement dépensé. C'est pourquoi Alice doit se « rendre la monnaie » en renvoyant la somme non dépensée à son adresse : ici 1.99 mBTC. Un deuxième UTXO est créé.
Cette transaction a donc 2 entrées et 2 sorties. Les frais de réseau, ou les frais de transaction payés aux mineurs, n'apparaissent pas explicitement dans la transaction mais sont calculés à partir des données présentes : ici 0.01 mBTC sont envoyés au mineur qui inclura la transaction dans un bloc.
Lors de la transaction, les scripts de déverrouillage interagissent avec les scripts de verrouillage précédents pour rendre dépensables les UTXO. Si un script échoue, par exemple si quelqu'un essaie de signer à la place d'Alice, la transaction est invalide et n'a pas lieu.
Une monnaie programmable
Ainsi, le caractère programmable du protocole se situe au sein des transactions, et plus précisément dans les scripts qui verrouillent et déverrouillent les UTXO. Ce qu'il faut retenir, c'est que toutes les transactions contiennent des scripts, ce qui fait de Bitcoin une monnaie programmable par essence.
Pourtant, Bitcoin n'était initialement pas censé fonctionner comme cela : le livre blanc publié en octobre 2008 ne fait aucune mention d'un langage de programmation interne au protocole. Ce n'est qu'avec la version 0.1 du logiciel en janvier 2009 qu'il a vu le jour. Baptisé de façon peu originale Script, ce langage permettait d'élargir les possibilités transactionnelles du Bitcoin. Comme l'explique Satoshi Nakamoto en juin 2010 sur le forum BitcoinTalk :
La nature de Bitcoin est telle que, dès la version 0.1 lancée, son fonctionnement de base était gravé dans le marbre pour le reste de son existence. C'est à cause de cela que je voulais concevoir Bitcoin pour qu'il supporte tous les types de transaction auxquels je pouvais penser. Le problème était que chaque chose requérait un code particulier et des champs de données, qu'elle soit utilisée ou non, et ne pouvait couvrir qu'un cas particulier à la fois. Ç'aurait été une explosion de cas particuliers. La solution était Script, qui généralisait le problème de façon à ce que les parties contractantes puissent décrire leurs transactions comme des prédicats que les nœuds du réseau évaluaient. Les nœuds ont seulement besoin de comprendre la transaction dans la mesure où ils évaluent si les conditions de l'émetteur sont remplies ou non.
Le langage de script est donc un langage assez riche : composé de plus de 100 codes opératoires différents, il permet un large éventail d'actions. Cependant, contrairement à celui d'Ethereum, le langage de script de Bitcoin n'est a priori pas Turing-complet et ne permet pas de faire des boucles. Mais cela ne l'empêche d'être très utile et constitue même un avantage en terme de sécurité.
Dans le prochain article, nous verrons comment ce langage de programmation fonctionne et comment les codes opératoires interagissent avec les données. Puis, dans l'article suivant, nous nous intéresserons aux multiples utilisations que l'on peut faire de cet outil fantastique au sein de Bitcoin.
Si vous avez des questions sur les crypto-monnaies, le Bitcoin ou la blockchain vous trouverez peut-être une réponse dans notre Foire Aux Questions.
Avis des lecteurs