Les mouvements de fond Bitcoin sont gérés par des programmes informatiques qui les débloquent en échange d'un témoin valide. Ces scripts Bitcoin contiennent les conditions de dépense qui définissent ce qui est et ce qui n'est pas un témoin valide. Chaque transaction repose sur ce mécanisme. S'assurer que cela fonctionne et l’équivalent de s'assurer que les transactions fonctionnent. Comment s'assurer que ces programmes sont corrects, surtout lorsqu'ils renferment des conditions de dépense complexes ? Comment pouvons-nous suivre le programme malgré cette complexité ? Les programmes formant une arborescence comme Miniscript sont une solution à ce problème.
En tant que collection de nœuds reliés par des arêtes, une arborescence est une structure de données assez simple. Chaque nœud est relié à zéro ou plusieurs enfants mais à un seul parent. L'arbre évolue à partir d'un nœud racine spécial qui n'a pas de parent. Par conséquent, nous pouvons prendre n'importe quel nœud et examiner ses descendants : C'est un peu comme un arbre plus petit ! Un arbre est récursivement constitué de nombreux arbres plus petits. Cela signifie que si nous pouvons représenter des données sous la forme d'un arbre, nous pouvons les traiter via des algorithmes récursifs, qui les décomposent morceau par morceau. Cela facilite l'analyse des données.
La recherche d'arborescence dans Bitcoin
Miniscript est un sous-ensemble de Bitcoin Script. Il impose une structure arborescente aux scripts et identifie ce que fait chaque partie du script. Certaines parties demandent une signature, d'autres une préimage de hachage ; certaines appliquent un timelock, et d'autres combinent différentes parties pour former une condition plus complexe. En regardant l'arborescence, l'utilité d'un script est rendue explicite. Chaque partie du script remplit son rôle et ce rôle peut être compris en observant l'arborescence.
Voici un exemple de script Bitcoin et de son arborescence Miniscript.
La structure de l’arborescence s'avère très utile : Les propriétés d'un script peuvent être analysées de manière statique et prouvées inductivement en se déplaçant le long de l'arbre. Nous pouvons facilement montrer qu'un script accepte ou rejette un témoin donné, qu'il encourt des frais, ou qu'il atteindra la limite des ressources pendant son exécution. Nous pouvons même combiner deux scripts en un seul qui contiendra un composé de leurs conditions de dépense. Grâce à cette boîte à outils, nous pouvons coder des conditions de dépense complexes tout en étant sûrs que le script qui en découle est correct.
Le composant Script de Bitcoin ne dispose pas des fonctions ci-dessus et est donc plus compliqué à utiliser. La signification d'un script est implicitement définie par une implémentation C++. Les scripts, en général, n'ont pas de structure claire et sont difficiles à comprendre. De plus, Bitcoin Script lui-même ne peut pas exprimer des opérations fondamentales comme la multiplication ou la concaténation. Ces obstacles font qu'il est difficile de coder simplement les conditions de dépense comme nous le souhaiterions.
Miniscript améliore la fonctionnalité de base de Bitcoin Script en imposant que les scripts ressemblent à une structure arborescente. Grâce à cette exigence, nous ajoutons des petits scripts plus clair qui encodent des clés, hachent ou ajoutent des verrous temporels, tout en excluant les scripts exotiques qui font autre chose. Parce que Miniscript reste Bitcoin Script mais avec une structure en plus, vous pouvez l'utiliser dès maintenant sans passer par un soft fork. Seuls les portefeuilles et logiciels qui veulent utiliser cette structure doivent être mis à jour pour le supporter.
Repousser les limites
Comment pouvons-nous aller encore plus loin que le Miniscript tout en préservant ses propriétés ? Comment pouvons-nous rendre le système plus puissant tout en préservant sa structure ? Simplicity est un langage blockchain entièrement nouveau, prévu dès le départ comme une alternative à Bitcoin Script.
Les programmes Simplicity sont des arborescences : Le nœud racine représente l'ensemble du programme tandis que les autres nœuds effectuent leur part des calculs. Concrètement, un nœud parent a accès aux calculs de ses enfants et agrège leurs résultats. Cela commence au niveau des feuilles, où des valeurs constantes telles que les clés publiques ou les données des témoins sont renvoyées. L'agrégation se poursuit de bas en haut jusqu'à ce que le résultat global soit calculé à la racine.
Voici l'esquisse d'un programme Simplicity qui correspond au script Bitcoin ci-dessus. Remarquez comment sa structure est conforme à l'arborescence du Miniscript. Les vrais programmes Simplicity sont plus détaillés (les commandes and, or, key et older sont des fragments de programme plus petits appelés combinateurs), mais si nous prenons un peu de recul, Simplicity et Miniscript se ressemblent.
Simplicity est suffisamment versatile pour calculer des fonctions booléennes arbitraires. Chacune d'entre elles peut être considérée comme une condition de dépense, une fonction qui accepte ou rejette des témoins. Simplicity peut faire des clauses de dépenses, de la délégation, des zero-knowledge proofs, et bien plus encore. Cette puissance expressive peut sembler intimidante, mais nous pouvons analyser le code pour en vérifier la validité. Simplicity a une sémantique explicite, les actions que fait le programme sont donc claires. Il n'y a pas de mauvaises surprises. La structure arborescente facilite l'analyse statique et la démonstration des propriétés. Nous pouvons montrer qu'un programme donné aura les ressources nécessaires pour s’exécuter et qu'il renferme une condition de dépense donnée. Nous disposons de la même boîte à outils que pour Miniscript, mais pour un ensemble de programmes beaucoup plus complet.
Contrairement à Miniscript, Simplicity nécessiterait un soft fork pour être utilisable sur Bitcoin. Il existerait à côté de Bitcoin Script (Miniscript) dans un nouveau type de feuille Taproot. La prochaine étape consiste à implémenter Simplicity dans Elements, la plateforme open-source sur laquelle Liquid est construit, afin de prouver son potentiel pour Bitcoin. Cela contribuera également à définir la version finale du langage.
Faire le point entre les langages de programmation
Nous construisons un pont entre Miniscript et Simplicity. La structure arborescente de Miniscript est facile à reproduire dans Simplicity, de sorte que nous pouvons convertir les scripts Bitcoin en programmes Simplicity et que Miniscript devient un sous-ensemble de Simplicity. Vous pouvez générer des programmes à partir de scripts existants, vérifier si un programme et un script sont sémantiquement équivalents, et plus tard affiner vos programmes pour aller plus loin que ce que Miniscript permet. Pour ceux qui connaissent Miniscript, ce serait déjà une excellente introduction au monde de Simplicity. Le prochain article de cette série décrira cette passerelle plus en détail.
Un avenir arborescent
Les programmes arborescents comme le Miniscript sont faciles à lire et à analyser. Une gamme d'outils fonctionnant avec ces programmes nous aide à confirmer leur exactitude. Simplicity permet d'effectuer des calculs arbitraires à l'aide d'un arbre. Il est beaucoup plus puissant que Miniscript, mais reste conforme, grâce à sa structure. Ce qui est génial avec Miniscript se retrouve aussi dans Simplicity. Le résultat est un langage qui bénéficie des avantages d'une arborescence tout en permettant des calculs arbitraires.
L'avenir est, espérons-le, en forme d'arbre. Nous travaillons sans relâche pour faire de Simplicity une réalité. Convertir des programmes Miniscript vers Simplicity via une passerelle est un excellent moyen de commencer. Restez à l'écoute pour un suivi sur la façon d'utiliser la passerelle vous-même !