Bitcoins werden von Computerprogrammen verwaltet, die das Geld nur gegen ein gültiges Zeugnis (“Witness”, ein kryptographischer Besitznachweis) freigeben. Diese Bitcoin-Skripte kodieren Ausgabebedingungen, die festlegen, was ein gültiger Witness ist und was nicht. Jede Transaktion beruht auf diesem Mechanismus. Diese Funktionalität sicherzustellen bedeutet, Transaktionen zu ermöglichen. Wie können wir garantieren, dass diese Programme korrekt sind, besonders wenn sie komplexe Ausgabebedingungen kodieren? Wie können wir die Komplexität unter Kontrolle behalten? Baumförmige Programme wie Miniscript sind eine Lösung für dieses Problem.
Als Ansammlung von über Kanten verbundene Knoten sind Bäume eine der fundamentalsten Datenstrukturen. Jeder Knoten ist mit Null oder mehr Kindern, aber nur einem Elternknoten verbunden. Der Baum “wächst” aus einem speziellen Wurzelknoten, der keinen Elternknoten besitzt. Ergebnis davon ist, dass wir jeden Knoten nehmen und seine Abkömmlinge betrachten können: sie bilden einen kleineren Baum! Ein Baum besteht rekursiv aus vielen kleineren Bäumen. Das bedeutet, dass wenn wir Daten als Baumstruktur darstellen können, wir sie mit rekursiven Algorithmen bearbeiten können, die sie Stück für Stück herunterbrechen. Das erleichtert uns Dinge wie Datenanalyse.
Die Suche nach Bäumen in Bitcoin
Miniscript ist eine Untermenge von Bitcoin-Script. Es zwingt Scripte in eine Baumstruktur, welche identifiziert, was jeder Teil des Skriptes tut. Ein Teil mag eine Signatur abfragen, ein anderer ein Hash-Preimage; manche setzen ein Zeitschloss, und andere kombinieren Teile, um eine grössere Bedingung zu bilden. Durch Betrachtung der Baumstruktur wird die Bedeutung des Scripts ausgedrückt. Jeder Teil erfüllt eine Rolle, die in dem Baum erscheint.
Hier ist ein Beispiel eines Bitcoin Scripts mit der Miniscript Struktur darüber.
Die hinzugekommene Struktur erweist sich als wirklich hilfreich: Eigenschaften eines Scripts können statisch analysiert und induktiv bewiesen werden, indem man sich am Baum entlang bewegt. Wir können leicht zeigen, dass ein Script einen gegebenen Witness akzeptiert oder zurückweist, dass dafür eine gegebene Gebühr anfällt, oder dass es im Laufe seiner Ausführung an Ressourcengrenzen stösst. Wir können sogar zwei Scripte zu einem zusammenführen, das die Zusammensetzung der Ausgabebedingungen kodiert. Mit diesem Werkzeugkasten können wir komplexe Ausgabebedingungen kodieren und doch sicher sein, dass das resultierende Script korrekt ist.
Rohskripten von Bitcoin fehlt die obige Einfachheit, und es ist entsprechend komplizierter zu benutzen. Die Bedeutung eines Scripts wird implizit durch eine C++-Implementierung definiert. Scripts im Allgemeinen haben keine klare Struktur und sind schwierig zu diskutieren. Ausserdem kann Bitcoin Script per se nicht einmal grundlegende Operationen wie Multiplikation oder Verkettung ausdrücken. Diese Hindernisse machen es schwierig, Ausgabebedingungen so frei zu kodieren, wie wir das gerne möchten.
Miniscript verbessert die Kernfunktionalität von Bitcoin Scripts, indem es Scripts in eine Baumstruktur zwingt. Mit dieser Auflage können wir kleine, sich ordentlich benehmende Scripts, die Schlüssel- Hash- oder Zeitschlösser kodieren, inkludieren und schliessen exotische Scripts aus, die andere Dinge tun. Da Miniscript letztlich Bitcoin Script mit Struktur ist, kann man es schon jetzt, ohne Soft Fork, benutzen. Nur Wallets und Software, die diese Struktur anwenden wollen, müssen aktualisiert werden, um es zu unterstützen.
An die Grenzen gehen
Wie können wir unter Beibehaltung seiner nützlichen EIgenschaften mehr machen als Miniscript? Wie können wir das System leistungsfähiger machen und dennoch seine Struktur beibehalten? Dieser Gedanke führte uns zu Simplicity, einer völlig neuen Blockchain-Sprache, von Grund auf als Alternative zu Bitcoin Script erfunden.
Simplicity-Programme sind Bäume: Der Wurzelknoten repräsentiert das Gesamtprogramm, während jeder Knoten einen Teil der Berechnungen erledigt. Konkret hat ein Elternknoten Zugriff auf die Berechnungen seiner Kinder und sammelt gemäss seiner Funktion deren Ergebnisse auf. Dies beginnt an den Blättern. Wo konstante Werte wie Public Keys oder Witness Daten zurückgegeben werden. Das Einsammeln der Werte setzt sich von unten nach oben fort, bis das Gesamtresultat im Wurzelknoten berechnet wird.
Hier ist eine Skizze eines Simplicity Programms, das zu dem Bitcoin Script von weiter oben passt. Du kannst erkennen, wie seine Struktur der Miniscript-Baumstruktur entspricht. Echte Simplicity-Programme sind detaillierter (and, or, key und older bestehen aus kleineren, Kombinatoren genannten Programmstücken), aber wenn wir herauszoomen, sehen Simplicity und Miniscript gleich aus.
Simplicity ist allgemein genug, um beliebige boole’sche Funktionen zu berechnen. Jede davon kann man sich als Ausgabebedingung vorstellen, eine Funktion, die Witnesse akzeptiert oder zurückweist. Simplicity kann Covenants, Delegation, Zero-Knowledge-Proofs und vieles mehr formulieren. Diese Ausducksstärke mag beunruhigend wirken, aber wir können die programmatische Korrektheit prüfen. Simplicity hat explizite Semantik, sodass klar ist, was das Programm tut. Es gibt keine unangenehmen Überraschungen. Wieder macht es die Baumstruktur einfach, Eigenschaften statisch zu analysieren und zu beweisen. Wir können zeigen, dass ein gegebenes Programm kostengünstig auszuführen ist, und dass es eine gegebene Ausgabebedingung korrekt kodiert. Wir haben denselben Werkzeugkasten wie für Miniscript, aber für eine viel grössere Menge an Programme.
Anders als Miniscript benötigt Simplicity einen Soft Fork, um auf Bitcoin einsetzbar zu werden. Es würde dann neben Bitcoin Script (Miniscript) in einer anderen Art von Taproot-Blatt existieren. Der nächste Schritt ist die Implementierung von Simplicity in Elements, der quelloffenen Plattform, auf der Liquid aufbaut, um sein Potential für Bitcoin zu beweisen. Das würde auch Erfahrungen für das endgültige Sprachdesign liefern.
Sprachgrenzen überbrücken
Wir bauen eine Brücke zwischen Miniscript und Simplicity. Die Miniscript-Baumstruktur ist einfach in Simplicity zu replizieren, so dass wir Bitcoin Scripts in Simplicity-Programme konvertieren können und Miniscript zu einer Untermenge von Simplicity wird. Man kann Programme aus existierenden Scripts erzeugen, prüfen ob ein Programm und ein Script semantisch gleichwertig sind, und später die Programme verfeinern, um über das hinauszugehen, was Miniscript ausdrücken kann. Für jene, die sich mit Miniscript auskennen, wird dies eine grossartige Einführung in die Welt von Simplicity. Unser nächster Beitrag in dieser Serie wird diese Brücke detailliert beschreiben.
Eine Baumförmige Zukunft
Baumförmige Programme wie Miniscript sind einfach zu lesen und analysieren. Eine Reihe von Werkzeugen funktioniert auf diesen Programmen und hilft uns, deren Korrektheit im Auge zu behalten. Simplicity tritt in diese Fussstapfen und erlaubt beliebige Berechnungen unter Benutzunge eines Baums. Es ist viel leistungsfähiger als Miniscript, aber dank seiner Struktur dennoch wohlverhaltend. Alles, was an Miniscript gut ist, überträgt sich auf Simplicity. Das Ergebnis ist eine Sprache, die sich der Vorteile eines Baums erfreut, während sie trotzdem beliebige Berechnungen zulässt.
Die Zukunft ist hoffentlich baumförmig. Wir arbeiten stetig daran, Simplicity Wirklichkeit werden zu lassen. Miniscript mittels einer Brücke in Simplicity zu konvertieren ist ein guter Anfang. Bleib dran für einen Follow-Up wie du die Brücke selbst benutzt!