Miniscript : Une solution pour faciliter la création de transactions complexes sur Bitcoin

0
2530

Traduction d’un article d’Aaron van Wirdum publié hier dans Bitcoin Magazine :

« Bitcoin a créé le premier langage de programmation de smart contract que le monde ait jamais connu. “Script”, comme on l’appelle, permet aux utilisateurs de programmer différentes conditions permettant de dépenser des bitcoins. Bien qu’il s’agisse d’un concept révolutionnaire, ce langage n’est pas facile à utiliser, en particulier lorsque les conditions de dépenses sont complexes. Des erreurs humaines peuvent se glisser dans l’écriture ou la vérification du contrat. Il est cependant capital, en particulier quand de l’argent est en jeu, que les conditions fixées soient interprétées correctement.

Au cours de l’année écoulée, trois ingénieurs blockchain se sont employés à améliorer ce langage. En réduisant au strict minimum les scripts, leur “nouveau” langage de programmation – “Miniscript” – réduit la complexité et devrait rendre la programmation sur Bitcoin plus facile et plus sûre.

“Miniscript est, sur le plan théorique, plus contraignant que Script”, a déclaré Andrew Poelstra, directeur de la recherche chez Blockstream et co-concepteur de Miniscript, “mais il peut faire tout ce que les gens font aujourd’hui avec Script.”

SCRIPT

Commençons par le début.

Chaque transaction Bitcoin comprend deux parties principales : les entrées et les sorties, qui consistent toutes deux en des morceaux de code. Les entrées “déverrouillent” les bitcoins et les sorties les “verrouillent” à nouveau, en spécifiant dans quelles conditions elles peuvent être déverrouillées dans une transaction ultérieure. Ces exigences incluent généralement une signature cryptographique valide, mais les possibilités sont plus nombreuses. Par exemple, on peut imposer un délai ou un nombre secret.

Ce code inclus dans les transactions est créé avec Script, un langage de programmation spécialement conçu pour Bitcoin. Script a été inspiré par Forth, un langage de programmation inventé dans les années 60 et conçu à l’origine pour faire fonctionner des radiotélescopes. Ce langage a été modifié pour l’adapter à Bitcoin.

Par exemple, Script n’a pas “d’opcode” créant des boucles : il n’exécute pas la même instruction de façon illimitée. Dans Bitcoin, il n’est pas nécessaire d’effectuer le même calcul de façon illimitée, car les nœuds Bitcoin ne calculent pas réellement les transactions – ils valident les transactions. (Pour une explication plus technique, reportez-vous à ce message de Russell O’Connor, ingénieur chez Blockstream.) 

Script est également “non typé”. Cela signifie que les résultats des calculs peuvent être interprétés et utilisés de différentes manières. Par exemple, le résultat d’une signature valide peut être “vrai” ce qui peut être interprété et utilisé comme un nombre “1” dans des équations mathématiques : “vrai” plus “vrai” donnerait “2”, ce qui pourrait, par exemple, signifier que suffisamment de signatures ont été fournies lorsqu’un minimum de deux signatures valides sont requises.

Cela nous amène à la propriété la plus importante de Script dans le contexte de cet article : les résultats des calculs peuvent être interprétés de nombreuses façons. Même si une signature est invalide, par exemple, le script peut être écrit de telle sorte que la transaction reste valide pour une autre raison.

“Il y a des opcodes dans Bitcoin Script qui font des choses vraiment absurdes”, explique Poelstra. “Par exemple, essayez d’interprétez une signature comme une valeur vraie ou fausse, convertissez cette variable booléenne en nombre, indexez-la dans la pile puis réorganisez la pile en fonction de ce nombre. Les règles spécifiques pour faire cela sont super délirantes.”

Cela peut rendre Script difficile à utiliser. En particulier, si les exigences pour dépenser (“déverrouiller”) des bitcoins deviennent plus complexes, l’auteur d’une transaction peut inclure involontairement un élément dans le code permettant de dépenser les pièces dans des conditions différentes de celles prévues. À l’inverse, le destinataire d’une transaction peut ne pas remarquer une telle bizarrerie et perdre ses fonds au profit d’un attaquant qui s’en aperçoit.

UN EXEMPLE CONCRET

Voici un exemple concret de la manière dont ces problèmes limitent l’usage de Script.

Le portefeuille “Blockstream Green” est par défaut configuré en “co-signalisation”. L’utilisateur du portefeuille contrôle l’une des deux clés et Blockstream contrôle l’autre. Les fonds peuvent être dépensés de deux manières. Quand l’utilisateur souhaite dépenser une pièce, il signe la transaction et demande à Blockstream de la signer également. Blockstream exécute l’instruction lorsque l’utilisateur confirme qu’il souhaite réellement effectuer la transaction par un moyen secondaire, comme une confirmation par courrier électronique. Mais quelque chose pourrait mal tourner chez Blockstream – la société pourrait disparaître ou perd la clé correspondante, ou tout simplement ne pas signer pour une tout autre raison. Dans ce cas, l’utilisateur dispose toujours d’une solution de secours pour dépenser ses bitcoins : une fois le délai programmé écoulé, il peut créer une transaction qui sera valide au bout d’un mois par exemple.

Cela fonctionne bien, mais ça limite les usages. L’utilisateur ne peut plus utiliser le potentiel des smart contracts de Bitcoin, même s’il ajoute davantage de flexibilité dans sa configuration.

“À l’heure actuelle, Green utilise un script fixe pour tous les clients, qui n’est en fait qu’une simple signature multiple”, explique Poelstra. “Mais nous ne devrions pas nous soucier de ce que dit le script. Ce qui nous importe, c’est qu’il soit impossible de dépenser les pièces sans notre signature avant le délai fixé. Si l’utilisateur souhaite introduire des conditions plus complexes, nous devrions pouvoir faire avec, tant que la condition qui nous importe est remplie. »

L’utilisateur pourrait avoir envie, par exemple, d’autoriser ses proches à dépenser les fonds après un an, au cas où il décéderait. Ou peut-être que cet utilisateur est une société qui souhaiterait créer une configuration multisig où deux personnes, sur trois autorisées, doivent pouvoir dépenser ensemble les fonds (en combinaison avec Blockstream).

Actuellement, cela pourrait techniquement être possible avec Bitcoin Script. Cependant, il faudrait que l’utilisateur conçoive une configuration personnalisée et que Blockstream y participe.

“Mais si l’utilisateur nous donne un script arbitraire, il nous est impossible de dire si les conditions qui nous importent sont remplies, car le comportement d’un ensemble de scripts est vraiment compliqué », ajoute Poelstra. “Par exemple, si un script semble prendre une signature, nous devons réfléchir à ce qui se passe si l’utilisateur donne une mauvaise signature. »

MINISCRIPT

Miniscript a été conçu au cours de la dernière année par Poelstra, Pieter Wuille, ingénieur technique chez Blockstream Core, et par Sanket Kanjalkar, stagiaire chez Blockstream (cependant, Miniscript n’est pas officiellement un produit Blockstream).

En bref, Miniscript est une version “simplifiée » de Script : une sélection “d’outils » de la “boîte à outils de Script » facilitant son utilisation et sa vérification par les humains. Ces outils sont soigneusement choisis pour pouvoir faire pratiquement tout ce qui peut être fait avec Script – il n’existe que quelques exceptions marginales que personne n’utilise réellement de toute façon. Ainsi, bien qu’une ligne de Miniscript soit toujours une ligne de Script valide, elle évite essentiellement les erreurs humaines en empêchant le code de fournir des résultats inattendus, peut-être involontaires.

En prenant l’exemple du problème ci-dessus, avec Miniscript, un utilisateur peut facilement concevoir une configuration telle que Blockstream puisse vérifier de manière triviale que sa seule condition est remplie. Plus précisément, Blockstream peut voir que les fonds ne peuvent être dépensés que s’il a signé ou après un mois écoulé – quelles que soient les autres conditions incluses dans la configuration de l’utilisateur, qu’il s’agisse de délais supplémentaires, de multisigs ou autres. Avec Miniscript, il ne peut y avoir aucune bizarrerie inattendue qui pourrait outrepasser la condition de Blockstream.

Miniscript est si simple et prévisible que la configuration peut être schématisée en un arbre de décision : une visualisation (“codage pictural ») de la configuration, qui est très facile à comprendre.

L’arbre ci-dessous, par exemple, montre une configuration dans laquelle l’utilisateur souhaite que deux membres du conseil d’administration d’une entreprise sur trois doivent signer. La condition de blockstream est la même, comme toujours : signer ou attendre un certain délai.

Visualization de Miniscript

“Avec Miniscript, Blockstream peut facilement participer à des configurations plus complexes : nous décodons le script en un arbre, puis nous vérifions chaque feuille de l’arbre et nous demandons (a) cette feuille a-t-elle une condition de délai ? ou (b) cette feuille nécessite-t-elle l’une de nos signatures ? » explique Poelstra.

Si la réponse à ces deux questions est oui, Blockstream peut participer.

MINISCRIPT A L’USAGE

Bien que Miniscript soit un travail en cours, ses premières versions ont été publiées et sont prêtes à être utilisées.

Pour rendre le processus d’écriture de Miniscript encore plus facile, Wuille a également conçu un “langage de contrat ». Ce langage est en soi un langage de programmation. Après avoir programmé dans ce langage les conditions dans lesquelles des fonds peuvent être dépensés, elles peut être compilées (“traduite ») en miniscript, et donc en un script valide, pour être incluse dans une sortie de transaction Bitcoin.

Autre avantage important : ce langage de contrat est automatiquement compilé dans la version la meilleure et la plus efficace de Miniscript, selon de ce que le script code réellement.

“Le problème avec Miniscript, c’est qu’il s’agit simplement de scripts… vous avez des tas de façons différentes d’écrire ‘ou’, des tas de façons d’écrire ‘et’ et certaines sont plus efficaces que d’autres », conclut Poelstra. “Le langage de contrat ne comporte qu’un ‘ou’, un ‘et’ et ainsi de suite, et Pieter [Wuille] a écrit ce compilateur extrêmement optimisé qui convertira en Miniscript pour vous et le fera de manière optimale. »

Miniscript et le compilateur ne sont pas que des concepts théoriques. Même si leur version actuelle ne sont pas des versions finales, Blockstream les utilise d’ores et déjà en interne pour la branche de développement de son logiciel “Liquid sidechain ». (Poelstra a souligné que l’utilisation du compilateur d’optimisation de Wuille permettait à Blockstream d’économiser 22 octets par rapport au script maison.)

Wuille héberge une version de démonstration du compilateur Miniscript, que tout le monde peut utiliser sur bitcoin.sipa.be/miniscript.

Source : bitcoinmagazine.com