Aller au contenu
buybitcoinsmart

Glossaire / Protocole et mises à jour

Engagement de témoin

Qu'est-ce que l'engagement de témoin ?
L'engagement de témoin est un hachage de 32 octets placé dans une sortie de la transaction coinbase, qui rattache chaque wtxid d'un bloc à l'arbre de Merkle déjà présent dans l'en-tête.

Spécifié dans BIP-141.

Segregated witness a été nécessaire pour enregistrer une seconde racine de Merkle sans toucher à l'en-tête de bloc, et le BIP-141 la place dans une sortie coinbase afin que le changement puisse être déployé comme un soft fork. Le script doit faire au moins 38 octets et commencer par 0x6a24aa21a9ed. L'engagement lie les signatures qui autorisent vos bitcoins au bloc qui les a minés, puisqu'un txid laisse de côté les données de témoin par construction.

Comment cela fonctionne

Le BIP-141 spécifie l'engagement de témoin jusqu'à l'opcode, et un nœud recalcule la valeur avant d'accepter le bloc.

Les nœuds construisent un second arbre de Merkle sur le bloc, en utilisant les wtxid comme feuilles à la place des txid et en les combinant de la manière dont l'arbre de l'en-tête est lui-même construit. La feuille de la transaction coinbase n'est pas son vrai wtxid : le BIP-141 suppose que cette valeur est de 32 octets nuls, car le nombre en cours de calcul se trouve dans cette transaction même et rien ne peut se hacher lui-même. Ce qui est écrit dans la sortie est un double SHA-256 de la racine de témoin jointe à une valeur réservée de témoin de 32 octets, et cette valeur réservée doit apparaître comme unique élément dans le champ de témoin de l'entrée coinbase elle-même.

Octet par octet, le script de sortie se lit ainsi : un octet d'OP_RETURN (0x6a), un octet poussant les 36 suivants (0x24), un en-tête d'engagement de quatre octets (0xaa21a9ed), puis le hachage de 32 octets. Le total fait 38 octets, et tout ce qui vient à partir du 39e octet est une donnée facultative sans signification pour le consensus.

Deux règles limites empêchent ce schéma d'être détourné ou appliqué à l'excès. Lorsque plusieurs sorties correspondent, celle dont l'indice de sortie est le plus élevé compte, de sorte qu'un leurre placé plus tôt ne peut pas déplacer la vraie valeur. Et lorsqu'aucune transaction d'un bloc ne porte de données de témoin, l'engagement est facultatif. La règle a été déployée via les bits de version BIP9 sous le nom segwit sur le bit 1, avec une fenêtre de signalement sur le réseau principal allant du 15 novembre 2016 à minuit UTC au 15 novembre 2017 à minuit UTC.

Où le voit-on

Un engagement de témoin apparaît sur un explorateur de blocs comme une sortie de la transaction coinbase dont le script commence par OP_RETURN.

Ouvrez la première transaction d'un bloc récent quelconque et les sorties se répartissent en deux types : celles qui paient la pool et ses clients, et une dont l'hexadécimal de script commence par 6a24aa21a9ed. Les 32 octets qui suivent ce préfixe sont l'engagement lui-même, et tout ce qui dépasse les 38 premiers octets est de l'espace libre.

Les logiciels de minage rencontrent ce champ plus souvent que quiconque. La valeur est un hachage de chaque wtxid du bloc, elle doit donc être recalculée chaque fois que l'ensemble des transactions candidates change, et réécrite dans la coinbase avant même que l'en-tête soit haché.

La valeur réservée est la partie à surveiller. Le BIP-141 ne lui donne aujourd'hui aucune signification pour le consensus et la réserve délibérément, afin qu'un futur soft fork puisse imbriquer un nouvel engagement dans l'engagement existant en hachant d'abord la nouvelle valeur avec la valeur réservée. Le document interdit aux usages hors consensus, comme le merge mining, d'occuper cet espace, et nomme ce à quoi il est réservé : des arbres de sommes sur les frais, des compteurs de taille de bloc et de sigops, et des liens vers les sorties qu'une transaction dépense. Ensemble, ceux-ci donneraient à un client léger une preuve courte qu'un bloc est invalide plutôt que le bloc lui-même.

Engagement de témoin vs racine de Merkle

L'engagement de témoin et la racine de Merkle sont les racines de deux arbres distincts, et un seul des deux occupe une place dans l'en-tête de bloc.

La racine de Merkle est un champ d'en-tête dont les feuilles sont des txid, et un txid exclut par construction les données de témoin. L'engagement de témoin vit dans une sortie de transaction, ses feuilles sont des wtxid, qui incluent ces données, et sa feuille coinbase est mise à zéro. L'imbrication est toute l'astuce. La transaction coinbase figure dans l'arbre plus ancien comme une feuille parmi d'autres, donc modifier l'engagement change la coinbase, change la racine de Merkle de l'en-tête, et casse le bloc même pour un logiciel qui n'a jamais entendu parler de segregated witness.

À ne pas confondre avec

Questions fréquentes

Chaque bloc contient-il un engagement de témoin ?

Non. Le BIP-141 rend l'engagement facultatif pour un bloc dans lequel aucune transaction ne porte de données de témoin, et obligatoire pour tout bloc qui en porte, auquel cas la transaction coinbase doit comporter la sortie qui le contient.

Qu'est-ce que le préfixe aa21a9ed dans une sortie coinbase ?

0xaa21a9ed est l'en-tête d'engagement de quatre octets qui marque une sortie coinbase comme l'engagement de témoin. Il suit OP_RETURN et une poussée de 36 octets, et les 32 octets qui le suivent sont le hachage d'engagement.

À quoi sert la valeur réservée de témoin ?

La valeur réservée de témoin est un champ de 32 octets dans le témoin de l'entrée coinbase qui n'a aujourd'hui aucune signification pour le consensus. Le BIP-141 la réserve pour qu'un futur soft fork puisse imbriquer un engagement supplémentaire dans l'engagement existant, et interdit aux usages hors consensus, comme le merge mining, de l'occuper.

Termes associés

Plus de termes : Protocole et mises à jour

Lire cette page en anglais