Les adresses multisignatures dans Bitcoin

Dans Bitcoin, les adresses multisignatures sont des sortes de comptes-joints partagés par des titulaires qui doivent donner leur accord pour que des fonds soient dépensés. Contrairement aux adresses simples commençant par un 1 comme 13LcBDK1szyXRiParmZP3Y4QEwRKcYoJSq, les adresses multisignatures se présentent comme des chaînes de caractères commençant par un 3. Un exemple de ce type d’adresse est 3DyDCGSC59yYY46dnRH7Vw1iKbV8zeW36q.

Ces adresses se révèlent utiles dans certains cas pratiques comme le partage d’une adresse entre associés ou entre conjoints. Elles peuvent aussi améliorer la sécurité des fonds détenus par des entreprises très exposées au piratage comme les plateformes d’échange : en distribuant la production de signatures numériques entre plusieurs appareils ou individus indépendants, de telles adresses réduisent sensiblement le risque de vol lors d’une attaque informatique.

Pour mieux comprendre cet article, je vous conseille de lire mes articles précédents sur les clés et les adresses et sur les transactions.

Les scripts de multisignature

Bitcoin possède un langage de programmation interne appelé Script qui permet de bloquer et de débloquer les fonds dans les transactions. À l’instar des langages informatiques des années 60, ce langage de script se base sur une pile (stack) sur laquelle sont placées et manipulées les données. Il se compose d’une centaine de codes opératoires (op codes) possédant chacun leurs caractéristiques. Pour représenter les scripts, la notation usuelle est de mettre entre crochets les données poussées sur la pile, d’écrire en majuscule les opérateurs et de désigner les opérateurs OP_0, OP_1, etc. par les nombres qui leur correspondent. Une description détaillée des codes opératoires se trouve sur le wiki de Bitcoin.

Dans le multiple éventail des possibilités qu’offrent le langage de programmation de Bitcoin, il y a les scripts de multisignature. Ceux-ci permettent qu’une adresse soit partagée entre plusieurs participants et que toute transaction émise de cette adresse requière la signature d’un nombre prédéfini de ces participants. Par exemple, 3 personnes peuvent partager une adresse ne nécessitant que 2 signatures pour débloquer les fonds présents. Il est ainsi possible de fabriquer des schémas de multisignature m-of-n pour 1 ≤ m ≤ n ≤ 15, n étant le nombre de copropriétaires de l’adresse et m le nombre de signatures requises pour l’utilisation de l’adresse.

Pour construire un script de multisignature, les n participants doivent d’abord utiliser leurs clés privées pour calculer leurs clés publiques. Dans notre exemple de schéma à 3 participants et à 2 signataires, on utilise les clés privées suivantes :

k1 = KzwQjFQPytv5x6w2cLdF4BSweGVCPEt8b8HbcuTi8e75LRQfw94L
k2 = Ky4yk7uTBZ1EDbqyVfkvoZXURpWdRCxTpCERZb4gkn67fY8kK95R
k3 = Kz3Htg8mSfC997qkBxpVCdxYhEoRcFj5ikUjE96ipVAJPou7MwRD

Les clés publiques correspondantes sont :

K1 = 03d307d94c5d7cbf8ce1a6b62b3286eafddf13065ad4b101f7b7a222f673f9508c
K2 = 022d8de3ea6e5eb022fe37ccb6464da662c0105bfab676a8dd53f1fb2756ab5dfc
K3 = 02b2afb5a9f59ea62136e775c13457de2951bce4f433f738e9ceb2848a7e369c2a

Ces clés publiques sont ensuite enregistrées dans le script de verrouillage, qui se présente sous la forme :

m <clé publique 1> ... <clé publique n> n CHECKMULTISIG

Puis, les m signataires utilisent leurs clés privées pour signer numériquement une transaction. Les signatures sont placées dans le script de déverrouillage qui permet de débloquer les fonds :

0 <signature 1> ... <signature m>

L’exécution de ces deux scripts à la suite est valide si et seulement si chacune des signatures fournies correspond à l’une des clés publiques enregistrées. L’ordre des signatures doit suivre l’ordre des clés publiques associées. Les données et les nombres sont poussés sur la pile et OP_CHECKMULTISIG se charge en dernier lieu de procéder à la vérification. Il faut noter que la présence de OP_0 dans le script de déverrouillage est due à une erreur de conception de OP_CHECKMULTISIG qui nécessite un élément supplémentaire pour être exécuté.

Dans notre schéma à 3 participants et à 2 signataires, le script de verrouillage fait intervenir les 3 clés publiques :

2 <K1> <K2> <K3> 3 CHECKMULTISIG

Le script de déverrouillage pourra être, quant à lui, composé des signatures produites par la première et la troisième clé privée :

0 <sig(k1)> <sig(k3)>

Les adresses P2SH

Dans Bitcoin, les adresses simples sont appelées adresses P2PKH (Pay-to-Public-Key-Hash) car elles sont construites à partir du hachage d’une clé publique. Mais il existe aussi des adresses P2SH (Pay-to-Script-Hash), qui sont appelées comme cela car elles sont construites à partir du hachage d’un script. Ces adresses ont été introduites en 2012 sous la forme d’un soft fork (BIP-16) pour faciliter l’usage des scripts dans les transactions. Elles ont quelques avantages par rapport à une utilisation brute, dont celui de simplifier la tâche à ceux qui veulent envoyer des fonds à ces adresses : le fardeau de la construction des scripts revient en effet aux détenteurs de ces adresses. La quasi-totalité des scripts complexes sont implémentés sous la forme de scripts P2SH, y compris les scripts de multisignature qui nous intéressent ici.

Comment cela fonctionne ? D’abord on récupère le script de verrouillage du schéma qu’on veut appliquer. Celui-ci est appelé script de règlement (redeem script) car il ne sera dévoilé au reste du réseau qu’au moment de la signature de la transaction de dépense. Dans le cas d’un schéma de multisignature, le script de règlement est :

m <clé publique 1> ... <clé publique n> n CHECKMULTISIG

L’adresse P2SH est obtenue par le hachage de ce script de règlement par les fonctions SHA256 et RIPEMD160, d’où le nom de Pay-to-Script-Hash. Dans notre exemple de schéma de multisignature à 3 participants et à 2 signataires, on obtient :

86b192cc018924737814981cfa12b573ca1118fd

Comme pour les adresses simples, l’adresse est ensuite encodée en base 58, à la seule différence que l’octet de version est fixé à 0x05 ce qui la fait toujours commencer par un 3 :

3DyDCGSC59yYY46dnRH7Vw1iKbV8zeW36q

Pour les transactions entrantes, le nouveau script de verrouillage est alors très simplifié :

HASH160 <hachage du script de règlement> EQUAL

Pour les transaction sortantes, le nouveau script de déverrouillage se compose des signatures nécessaires ainsi que du script de règlement qui est considéré comme une donnée poussée sur le pile :

0 <signature 1> ... <signature m> <script de règlement>

L’exécution de ce genre de script est un peu différente de celle des scripts utilisés pour les adresses simples. D’abord, le script de déverrouillage est exécuté : les données sont poussées sur la pile une à une (le zéro, les signatures et le script de règlement) et copiées pour plus tard. Ensuite, le script de verrouillage est exécuté : il vérifie que le script de règlement est bien le bon en le hachant (OP_HASH160) et en le comparant avec la donnée fournie dans l’adresse (OP_EQUAL). Enfin, les données poussées sur la pile et copiées lors de la première étape sont exécutées en tant que script1 : c’est la vérification des signatures avec OP_CHECKMULTISIG.

Une dernière différence avec les adresses simple est la signature de la transaction : dans la préimage de la signature, on utilise le script de règlement lui-même à la place du script de verrouillage de l’UTXO à dépenser.

 

Ainsi, les adresses multisignatures sont des adresses différentes des adresses simples qu’on a l’habitude de voir et utilisent le type P2SH qui facilitent grandement leur usage. Elles permettent à plusieurs parties de posséder un adresse commune (compte-joint). Elles sont également utilisées dans la sécurisation des fonds au sein des plateformes d’échange : en témoigne l’adresse multisignatures de Bitfinex qui possède plus de 180 000 BTC au 09/07/2018.

Les adresses P2SH ont leur format dans Bitcoin Cash (BCH) et commencent par un p, comme par exemple pzrtrykvqxyjgumczjvpe7sjk4eu5ygcl5gtatuc5j. Du côté de Bitcoin (BTC), la mise à jour SegWit a introduit deux nouveaux types d’adresses dont le type P2WSH (Pay-to-Witness-Script-Hash) qui n’est qu’une version actualisée du type P2SH. Les adresses P2WSH sont reconnaissables grâce à leur longueur supérieure à la normale, comme bc1qjv5w5d64mac6esvxcqj4nmfsycssgp3rmxluhxcp9na3zu3xe6fqut04y3.

Merci d’avoir lu cet article.


Notes

1. Voir la fonction VerifyScript dans /src/script/interpreter.cpp.

Références

Andreas M. Antonopoulos, Mastering Bitcoin: Programming the Open Blockchain (seconde édition), juin 2017, chapitre 7.
Soroush Pour, Bitcoin multisig the hard way: Understanding raw P2SH multisig transactions, 20 décembre 2014.

Je suis fasciné par les cryptomonnaies et par l'impact qu'elles pourraient avoir sur nos vies. De formation scientifique, je m'attache à décrire leur fonctionnement technique de la façon la plus fidèle possible.

0 Comments

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.