Glossaire / Transactions et frais
SIGHASH_SINGLE
- Qu'est-ce que SIGHASH_SINGLE ?
- SIGHASH_SINGLE est l'indicateur qui lie une signature à une seule sortie, celle qui occupe la même position dans la liste que l'entrée signée.
L'entrée zéro est associée à la sortie zéro, l'entrée un à la sortie un, et tout le reste de la transaction est laissé non signé. Ce mécanisme permet à plusieurs parties de garantir chacune leur propre versement au sein d'une même transaction partagée. Il porte aussi le bogue de signature le plus tristement célèbre de bitcoin, que les entrées héritées contiennent encore.
Comment cela fonctionne
L'empreinte conserve l'entrée signée, la version de la transaction, le locktime, et exactement une sortie : celle dont l'index correspond à l'index de l'entrée.
Les sorties situées après cet index sont retirées de la copie avant le hachage. Les sorties situées avant sont conservées comme espaces réservés mais vidées, avec une valeur de moins un et un script vide, de sorte que leur contenu réel n'est pas couvert non plus. Les numéros de séquence de toutes les autres entrées sont mis à zéro, comme sous l'indicateur sans sorties.
Vient ensuite le bogue. Dans l'algorithme d'origine, si l'index de l'entrée signée est supérieur ou égal au nombre de sorties, aucune sortie ne correspond pour le hachage. Plutôt que d'échouer, le code renvoie une empreinte fixe : la valeur un sur 32 octets. Tout signataire qui se trouve dans cette position produit une signature sur une empreinte identique, de sorte que la signature n'est liée à aucune transaction particulière et peut être reprise et rejouée par quiconque peut placer une entrée au même index. Cette branche subsiste dans Bitcoin Core à ce jour, car la supprimer changerait la validité de bitcoins déjà présents sur la chaîne.
Les deux réécritures de l'algorithme de hachage des signatures l'ont fermé. Le BIP143 précise que pour une entrée segwit version 0 sans sortie correspondante, la partie sorties de l'empreinte est de 32 octets nuls, tandis que le reste de l'empreinte engage toujours cette entrée précise, de sorte que rien n'est rejouable. Le BIP341 va plus loin : sur une entrée Taproot, une signature de ce type avec un index dépassant le nombre de sorties échoue simplement à la validation.
Où le voir
L'indicateur apparaît sous la forme d'un 03 final sur une signature, et vous le trouverez presque exclusivement dans des offres pré-signées plutôt que dans des paiements ordinaires.
Le schéma est celui d'une demi-transaction publiée comme une invitation. Un vendeur signe la déclaration « cette entrée qui est la mienne entre dans la transaction, et la sortie à l'index correspondant me verse mon prix demandé », puis laisse le reste de la transaction vide pour qu'un acheteur le remplisse. Comme la signature du vendeur ignore toutes les autres entrées et sorties, l'acheteur peut ajouter ses propres fonds, sa propre monnaie rendue et des frais au taux que demande le mempool, et la garantie du vendeur tient toujours. Les places de marché d'ordinals et de runes reposent exactement sur ce mécanisme, diffusé sous forme de PSBT, et c'est l'un des rares échanges réellement sans tiers de confiance que bitcoin prend en charge sans intermédiaire.
Il est presque toujours associé à ANYONECANPAY, car seul, l'indicateur engage encore la liste complète des entrées, ce qui va à l'encontre de l'objectif de laisser la transaction ouverte pour qu'un autre la complète.
SIGHASH_SINGLE vs SIGHASH_ANYONECANPAY
SIGHASH_SINGLE est un mode de base et SIGHASH_ANYONECANPAY un modificateur, ils répondent donc à des questions différentes. Le mode de base détermine quelle part du côté sorties une signature couvre : la totalité, aucune, ou une sortie correspondante. Le modificateur détermine quelle part du côté entrées elle couvre : toutes les entrées, ou seulement celle qui est signée. Vous choisissez un mode de base, puis décidez séparément d'ajouter ou non le modificateur, ce qui explique que l'octet d'indicateur sur une signature réelle soit généralement la somme des deux plutôt que l'un ou l'autre seul.