Chapitre 05 : Les transactions avancées

Voici quelques informations supplémentaires sur les transactions Bitcoin.

Multi-signature.

Une adresse multi-signature (utilisée notamment pour le lighting network) est en fait un script de verrouillage où X clés publiques sont enregistrées et au moins Y d’entre elles (Y étant inférieur à X) sont nécessaires pour déverrouiller les fonds.

Si par exemple, on crée une adresse multi-signature 2-de-3 cela veut dire que deux des trois clés sont nécessaires pour déverrouiller les fonds.

Un script multi-signature ressemble à cela : M <Public Key 1> <Public Key 2> ... <Public Key N> N CHECKMULTISIG

N est le nombre total de clés et M est le nombre de signatures minimum requise.

  • Exemple de script de locking : 2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG.
  • Exemple de script de unlocking : <Signature B> <Signature C>.
  • Exemple de script exécuté : <Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG

Pay-to-Script-Hash.

Avec les paiements P2SH, le script peut être remplacé par son empreinte (hash). Quand une transaction va essayer d’utiliser l’output ayant un script P2SH, il doit présenter un script dont le hash correspond à celui de l’output en plus de son script de déverrouillage.

Le script de verrouillage s’appelle le redeem script. Pour faire simple, si vous fournissez le script dont le hash est stocké sur l’ouput, vous pouvez utiliser l’input. Il faudra donc fournir le script correspondant au hash et le script de déverrouillage.

Un des gros avantage est que vous pouvez encoder les scripts sous forme d’adresses. Mais surtout, à mon avis, c’est que vous ne révélez rien sur le script de déverrouillage avant que l’output soit dépensé!

Note : Les adresses Bitcoin utilisant le format P2SH sont identifiables, car elles commencent par le chiffre “3”.

Data Recording Output (RETURN).

Dans la version 0.9 du client Bitcoin Core, un compromis a été trouvé avec l’introduction de l’opérateur RETURN. RETURN permet aux développeurs d’ajouter 80 octets de données de non-paiement à une sortie de transaction. Cependant, contrairement à l’utilisation de “faux” UTXO, l’opérateur RETURN crée une sortie explicitement non dépensable, elles n’est donc pas stockée dans les UTXO (ce qui économise le pool de mémoire UTXO et ne surcharge pas les nœuds complets).

Time lock.

Les blocages horaires sont des restrictions sur les transactions qui permettent de ne pouvoir les utiliser qu’après un certain temps. Ceci est implémenté par le champ nLocktime dans une transaction. Deux nouvelles fonctionnalités de timelock ont été introduites fin 2015 et mi-2016 qui offrent des timelocks au niveau des UTXO. Ces méthodes sont CHECKLOCKTIMEVERIFY et CHECKSEQUENCEVERIFY.

Les blocages horaires sont utiles pour postdater les transactions et verrouiller les fonds à une date future.

Segregated witness

En cryptographie, le terme “témoin” est utilisé pour décrire une solution à un puzzle cryptographique. Pour Bitcoin, le “témoin” satisfait une condition cryptographique placée sur une sortie de transaction non dépensée (UTXO). Le terme " témoin" est un terme plus général pour un “script de déverrouillage”.

Avant l’introduction de segwit, chaque entrée d’une transaction était suivie des données qui la déverrouillait.

Segregated Witness est une modification du bitcoin qui a déplacé les données témoins du champ scriptSig (script de déverrouillage) d’une transaction vers une structure de données distincte qui accompagne une transaction.

Les avantages de segwit sont nombreux :

  • Le hash de la transaction ne porte désormais plus sur les données témoin. On peut donc connaître à l’avance le hash qu’aura une transaction dans la blockchain peu importe les scripts de déverrouillage qui seront ajoutés par les différents tiers (Hyper important pour le lighting network).
  • Une version de script a été ajouté pour mieux gérer les mises à jour.
  • Une fois validée, on peut supprimer les données témoin. Il n’y a plus besoin de les stocker ou de les transmettre.

Encore une fois, Segwit est un changement qui porte sur l’output d’une transaction. Quand une transaction utilise un output, elle doit fournir un witness. Dans une transaction classique, le witness est fourni dans la partie input de la nouvelle transaction. Dans le cas de segwit, le témoin peut-être en dehors des données de la transaction.

Si on reprend un exemple basique de paiement à une adresse, le script de verrouillage sera: DUP HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 EQUALVERIFY CHECKSIG

Avec P2WPKH (Pay-to-Witness-Public-Key-Hash), on va avoir : 0 ab68025513c3dbd2f7b92a94e0581f5d50f654e7

  • Le premier élément (0) est la version du script.
  • Le deuxième élément est le script de verrouillage appelé witness programm.

Le script de déverrouillage en temps normal serait :

“Vin” : [
  "txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
  "vout": 0,
  "scriptSig": “<Bob’s scriptSig>”,
]

Et voici la transaction avec, comme vous pouvez le voir, le champs scriptSig de la transaction est vide, les informations se trouvent dans les données témoins.

[...]
  “Vin” : [
  "txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
  "vout": 0,
  "scriptSig": “”,
]
[...]
  “witness”: “<Bob’s witness data>”
[...]

Le format d’adresse segwit natif est défini dans BIP-173. BIP-173 encode uniquement les scripts témoins (P2WPKH et P2WSH). Elles commencent par bc1.

Identifiants de transaction

Avec Segregated Witness, les transactions ont deux identifiants :

  • txid : Double-SHA256 hachage de la transaction sérialisée, sans les données témoins.
  • wxtxid : Double-SHA256 hachage de la transaction sérialisée, avec les données témoins.

Le txid traditionnel est calculé exactement de la même manière qu’avec une transaction non segwit. Cependant, étant donné qu’une transaction segwit pure (une transaction qui ne contient que des entrées segwit) a des scriptSigs vides dans chaque entrée, aucune partie de la transaction ne peut être modifiée par un tiers. Par conséquent, dans une transaction segwit pure, le txid est immuable, même lorsque la transaction n’est pas confirmée.