Chapitre 04 : Les transactions
Les transactions sont le cœur du système Bitcoin, la blockchain est le moyen de les stocker de manière inaltérable.
Entrées et sorties de transaction
Une transaction bitcoin est composée d’entrées et de sorties. Les entrées sont les fonds qui sont utilisés et les sorties sont les fonds qui sont envoyés à quelqu’un d’autre (ou à vous-même).
La première chose nécessaire pour créer une nouvelle transaction, c’est de partir des fonds en sortie d’une ancienne transaction. Une sortie de transaction qui n’a pas été encore été utilisée comme entrée d’une autre transaction est appelée Unspent Transaction Output (UTXO).
Comme vous pouvez le voir sur le schéma ci-dessus, pour créer TX1, nous utilisons une des sorties de TX0 et une personne créera plus tard TX3 en utilisant une des sorties de TX1. Une autre sortie de TX 0 va être utilisée pour créer TX2. Ainsi de suite, les entrées sont utilisées pour créer des transactions qui créent des sorties.
D’ailleurs, pour savoir combien vous posséder, votre wallet, va consulter la blockchain et regarder la liste des UTXO qu’elle peut utiliser avec vos clés. La somme de ceux-ci est votre balance !
Une des caractéristiques importantes à comprendre est que si vous voulez utiliser un UTXO, vous devez l’utiliser entièrement. Imaginons que vous ayez deux outputs qui vous appartiennent et que vous souhaitez les utiliser comme input d’une nouvelle transaction :
- Un avec 2 BTC.
- L’autre avec 0,5 BTC.
Si vous voulez envoyer 2,3 BTC à une personne, vous allez créer une transaction qui aura comme input les deux outputs précédents et comme vous êtes obligé d’utiliser l’ensemble des bitcoins dans ses UTXO, vous ne pouvez pas choisir de prendre la première entrée et 0,3 de la deuxième par exemple.
En output de votre transaction, vous allez avoir deux outputs :
- Le destinataire des 2,3 BTC.
- Le “rendu” (0,2 BTC) qui va avoir comme destinataire vous ! (enfin une de vos adresses).
Note : La seule exception est ce que l’on appelle les transactions coinbase. Chaque nouveau bloc a une transaction particulière qui crée des bitcoins pour récompenser le travail de sécurisation des mineurs - C’est la seule façon de créer des Bitcoins, mais nous verrons cela plus tard.
Dans le détail, les transactions outputs sont composés de deux choses :
- Le nombre de Bitcoin (en satoshi) “stockés” à cette adresse.
- Les conditions pour utiliser cet output (Appelé locking script, witness script ou scriptPubKey).
Les transactions inputs eux sont composés de :
- L’identifiant de la transaction et de l’index de l’output (vout) que l’on souhaite consommer.
- Un scriptsig qui doit satisfaire les conditions définies par le locking script et placé dans l’UTXO de l’output que l’on souhaite consommer.
- Un numéro de séquence.
L’immense majorité des transactions ont des frais (fees) qui récompense les mineurs pour leur travail (quand il n’y aura plus de bitcoin à créer, les mineurs seront récompensés par l’ensemble des frais des transactions de chaque bloc) - Cela permet aussi d’éviter que des petits malins remplissent la blockchain à vitesse grand V en y ajouter des milliers de transactions inutiles.
À là base, il n’y a aucune obligation d’ajouter des frais pour le mineur à sa transaction mais, aujourd’hui, si vous n’en mettez pas, votre transaction ne sera pas traitée - Plus, vous mettez de frais, plus les mineurs vont essayer d’ajouter votre transaction dans un block pour gagner cette récompense ! Aujourd’hui, les frais sont calculés de manière dynamique.
Les scripts !
Le langage utilisé pour les scripts qui verrouillent les outputs s’appelle tout simplement “Script” et il est vraiment très basique, similaire à de l’assembleur! Le script qui verrouille un UTXO et le script qui permet de le déverrouiller sont écrits dans ce langage.
Voici le principe :
- Un locking script est une condition placée sur un output, c’est cette condition qu’il faut remplir pour pouvoir utiliser cet output comme input d’une nouvelle transaction. Il est appelé locking script, witness script ou scriptPubKey.
- Un unlocking script est un script qui résout les conditions placées sur un output via un locking script. Ceci permet d’utiliser l’output comme input d’une transaction.
Quand un nœud va récupérer une nouvelle transaction, il va récupérer l’input qui va lui indiquer de quel output il part. À partir de l’output utilisé comme input, le nœud va récupérer le locking script de l’output.
Le script d’unlocking va être exécuté en premier, la stack résultante va être ensuite copiée puis le script de locking va être exécutée. Si le résultat de l’exécution du script de locking avec la stack copiée sont identiques, alors, les fonds peuvent être utilisés.
Le script le plus simple et le plus répandu est “Pay-to-Public-Key-Hash script” qui correspond simplement à un paiement qui pourra être utilisée par le propriétaire d’une adresse Bitcoin. Pour ce faire, il faudra en unlock script une clé publique et une signature digitale crée grâce à la clé privée correspondante.
Signature digitale
La signature permet de prouver que vous avez bien signé quelque chose sans révéler votre clé privée. Dans Bitcoin on signe grâce à l’algorithme Elliptic Curve Digital Signature Algorithm, ou ECDSA.
En plus de prouver que vous possédez bien les fonds que vous voulez dépenser, la signature électronique garantit aussi que la transaction que vous allez envoyer par internet ne peut être altéré. En effet, tout changement dans le contenu dans la transaction casserait la signature !
Dans bitcoin le message signé est la transaction, ou pour être exact, c’est le hash d’une partie des données dans la transaction.