Das EUTXO-Modell von Cardano ermöglicht die deterministische Ausführung von Plutus-Skripten
6. September 2021
Polina Vinogradova
12 Minuten Lesezeit
Während der Alonzo Hard Fork die Kernfunktionalität von Plutus Smart Contracts in Cardano einführt, entwickelt sich der Ledger weiter, um dem wachsenden Bedarf an dezentralen Lösungen gerecht zu werden. Das Design des Cardano-Ledgers konzentriert sich auf hohe Zuverlässigkeit, Sicherheit und bewährte formale Verifizierung. Im Einklang mit dieser Strategie ist es auch wichtig sicherzustellen, dass die Transaktionsverarbeitung deterministisch ist, was bedeutet, dass ein Benutzer die Auswirkungen und das Ergebnis vor der tatsächlichen Ausführung vorhersagen kann.
Die Fähigkeit, die Kosten der Transaktionsausführung zu garantieren und zu wissen, wie sich die Transaktion auf dem Ledger verhält, bevor sie eingereicht wird, wird mit der Einführung der Unterstützung von Smart Contracts noch wichtiger. Auf UTXO (Unspent Transaction Output) basierende Blockchains, wie Cardano, bieten solche Möglichkeiten. Kontobasierte Blockchains wie Ethereum sind indeterministisch, was bedeutet, dass sie die Vorhersagbarkeit der Auswirkungen einer Transaktion auf der Kette nicht garantieren können. Dies birgt das Risiko von Geldverlusten, unvorhersehbar hohen Gebühren und zusätzlichen Möglichkeiten für nachteiliges Verhalten.
In diesem Blogbeitrag werfen wir einen genaueren Blick auf die Vorteile von Cardanos deterministischem Design, das eine sichere Transaktions- und Skriptbewertung vor der Ausführung ermöglicht. Im nächsten Blog-Beitrag, der im Laufe dieser Woche erscheint, werden wir die beiden Phasen der Transaktionsvalidierung auf Cardano besprechen.
Was ist Transaktionsdeterminismus und warum ist er wichtig?
Determinismus ist im Zusammenhang mit der Transaktions- und Skriptverarbeitung ein Synonym für Vorhersagbarkeit. Das bedeutet, dass ein Nutzer lokal (außerhalb der Chain) vorhersagen kann, wie sich seine Transaktion auf den On-Chain-Zustand des Ledgers auswirken wird, ohne:
- unerwartete Ergebnisse oder Fehler bei der Skriptvalidierung
- unerwartete Gebühren
- unerwartete Aktualisierungen des Ledgers oder des Skriptstatus.
In einem deterministischen System kann eine Transaktion auch dann abgelehnt werden, wenn sie korrekt konstruiert wurde. Abgelehnt bedeutet, dass die Transaktion überhaupt nicht auf den Ledger angewandt werden konnte und somit keine Auswirkung auf dessen Zustand hat, sodass keine Gebühren gezahlt werden. Der Grund dafür sind Änderungen im Ledger, die durch andere Transaktionen verursacht werden. Die sind zwischen dem Zeitpunkt, an dem die ursprüngliche Transaktion erstellt wird, und dem Zeitpunkt, an dem sie verarbeitet wird, durchgeführt worden. Dies kann sogar bei einfachen Transaktionen vorkommen. Zum Beispiel könnte eine andere Transaktion einen UTXO ausgeben, den ein Benutzer ebenfalls ausgeben wollte. Der Determinismus stellt sicher, dass eine Transaktion, wenn sie akzeptiert wird, nur vorhersehbare Auswirkungen auf den Zustand des Ledgers hat.
Das Problem des Indeterminismus angehen
Indeterminismus bedeutet, dass wir vor der Ausführung nicht vorhersagen können, welche Auswirkungen eine Transaktion auf den Ledger haben wird. Bei der Entwicklung des Ledgers und des Dolmetschers für einen Smart Contract ist es wichtig, Bedingungen vorauszusehen, unter denen Indeterminismus auftreten könnte, und Entscheidungen zu treffen, um diese Situationen zu vermeiden. Eine der Hauptgefahren in einem solchen Fall ist der Zugriff auf veränderbare Ledger-Daten, d. h. Daten, die geändert oder umgestaltet werden können. Wenn die Änderungen, die eine Transaktion oder ein Smart Contract am Ledger vornimmt, vom Zustand des Ledgers zum Zeitpunkt der Verarbeitung abhängen und nicht nur vom Inhalt der Transaktion, kann Indeterminismus ein Problem werden.
Ethereum ist besonders anfällig für dieses Problem. So können beispielsweise die gas-preise oder der Kurs einer dezentralen Börse (DEX) zwischen dem Zeitpunkt, an dem ein Nutzer eine Transaktion einreicht, und dem Zeitpunkt, an dem sie verarbeitet wird, schwanken. Dies führt zu unerwarteten Gas-Gebühren oder Preisänderungen bei gekauften Vermögenswerten. Ein Skript könnte auch einfach fehlschlagen, was zu hohen Ausführungskosten (Hunderte von Dollar) führt, ohne dass eine Wirkung eintritt. Dies könnte z. B. der Fall sein, wenn die zur Deckung der gas-Kosten verfügbaren Mittel mitten in der Ausführung aufgebraucht sind. Das deterministische Ledger-Design schließt diese Möglichkeiten aus.
Andere mögliche Quellen für Indeterminismus sind zum Beispiel, dass Skripte diese Daten sehen können:
- Daten in dem Block, der die Transaktion enthält, die aber nicht in einer Transaktion enthalten sind, z. B. Systemzufälligkeit, Block-Kopf oder die aktuelle Slot-Nummer
- Daten, die von einem Angreifer verändert oder ausgetauscht werden, was das Ergebnis der Skriptvalidierung verändern könnte, während die Transaktion selbst verarbeitungsfähig bleibt.
In den meisten Systemen gibt es Möglichkeiten, diese Probleme mit verbesserten Praktiken beim Schreiben von Skripten oder mit Layer-2-Lösungen zu entschärfen. Cardano ist darauf ausgelegt, vorhersehbare Ergebnisse für alle Skripte und Transaktionen zu garantieren.
Die Vorteile des UTXO-Basismodells in Bezug auf den Determinismus
Der Cardano-Ledger basiert auf einem UTXO-Buchhaltungsmodell, was bedeutet, dass die Vermögenswerte im Ledger in nicht verbrauchten Ausgaben und nicht in Konten gespeichert werden. Jeder dieser Outputs spezifiziert die Menge der darin gespeicherten Vermögenswerte zusammen mit seiner Adresse. Nicht verbrauchte Ausgaben sind unveränderlich, so dass eine Transaktion zwar die gesamte Ausgabe verbrauchen, aber nicht verändern kann.
Zur Übertragung von Vermögenswerten verbraucht eine Transaktion einen oder mehrere Outputs und erzeugt neue, die insgesamt die gleichen Mengen an Vermögenswerten enthalten wie die verbrauchten. Diese Mengen - und ihre UTXO-Adressen - sind in den Outputs der Transaktion angegeben. Die einzige Möglichkeit für eine Transaktion, die Auswirkungen einer anderen Transaktion auf das Hauptbuch zu beeinflussen, besteht darin, dieselben UTXO auszugeben, die die spätere Transaktion auszugeben versucht, wodurch sie von der Node zurückgewiesen wird. Dies ist das Hauptmerkmal, auf das sich das UTXO-Modell stützt, um den Determinismus zu erhalten.
Ein UTXO-Ledger hat sowohl Vorteile als auch Nachteile gegenüber dem kontobasierten Modell. Bei letzterem gibt es beispielsweise weniger Fälle, in denen sich Transaktionen gegenseitig blockieren. Im Gegensatz zu UTXOs sind Konten veränderliche Ledger-Daten. So kann eine Transaktion z. B. eine andere Menge an Vermögenswerten auf einem Konto sehen, je nachdem, ob sie vor oder nach einer anderen Transaktion verarbeitet wurde, die dasselbe Konto aktualisiert. Dieser Umstand führt zwar nicht zu einer Ablehnung der Transaktion, kann aber zu unterschiedlichen - und unvorhersehbaren - Änderungen im Hauptbuch führen.
Das Ausgeben eines UTXO ist nur ein Beispiel für eine Aktion, die eine Transaktion durchführen kann. Als nächstes erklären wir, was Transaktionsaktionen sind und wie sie validiert werden können. Die wichtigsten Änderungen, die in Alonzo eingeführt wurden, sind Änderungen am Prozess der Aktionsvalidierung.
Validierung von Aktionen mit Signaturen und Skripten
Ein wichtiger Aspekt bei der Verarbeitung einer Transaktion ist die Validierung der Aktionen, die sie ausführt. Eine Transaktion führt eine Aktion aus, wenn sie Daten im spezifischen Feld für diese Aktion enthält. Zum Beispiel gibt eine Transaktion UTXO U aus, wenn sie in ihrem Eingabefeld einen Verweis auf U enthält, und sie prägt einen Token X, wenn ihr Münzfeld X enthält.
Wenn der Knoten eine Transaktion bearbeitet, prüft er, ob er die beabsichtigte Aktion durchführen kann. Dazu muss der Autor der Transaktion relevante Daten bereitstellen, z. B. Skripte, Einlöser oder Unterschriften. Ein gängiges Beispiel für eine Aktion, die eine Validierung erfordert, ist die Ausgabe eines mit einem öffentlichen Schlüssel gesperrten UTXO. Die Transaktion muss eine Signatur des entsprechenden privaten Schlüssels liefern, um diese Aktion durchzuführen.
Cardano verwendet Skripte, um Aktionen zu validieren. Diese Skripte, bei denen es sich um Codestücke handelt, implementieren reine Funktionen mit den Ausgaben “Wahr” oder “Falsch”. Bei der Skriptvalidierung wird der Skript-Interpreter aufgerufen, um ein bestimmtes Skript mit den entsprechenden Argumenten auszuführen.
Die Skriptvalidierung kann für die folgenden Aktionen durchgeführt werden:
- Ausgeben eines durch eine Skriptadresse gesperrten UTXO: Das Skript, das ausgeführt wird, ist dasjenige, dessen Hash die Adresse bildet.
- Prägung eines Tokens: Das Skript, das ausgeführt wird, ist dasjenige, dessen Hash die Policy-ID des zu prägenden Tokens bildet.
- Auszahlung der Rewards: Das Skript, das ausgeführt wird, ist dasjenige, dessen Hash die Staking-Adresse bildet.
- Anwendung eines Zertifikats: Das Skript, das ausgeführt wird, ist dasjenige, dessen Hash den Berechtigungsnachweis des Zertifikatsautors bildet.
Alle Transaktionsaktionen teilen der Node nicht nur mit, welches Skript ausgeführt werden soll, sondern geben auch an, wie die an das Skript übergebenen Argumente zusammengesetzt werden sollen.
Der Multi-Asset-Ledger von Cardano (Mary) unterstützt einfache Multisig- und Timelock-Skriptsprachen. Diese ermöglichen es den Benutzern, die für die Durchführung einer Aktion (z. B. Ausgabe eines UTXO oder Prägung eines nicht fungiblen Tokens (NFT)) erforderlichen Signaturen und das Zeitintervall, in dem die Aktion durchgeführt werden kann, anzugeben. Ein Timelock-Skript kann niemals die tatsächliche Slot-Nummer in der Transaktion sehen, die es beinhaltet. Timelock kann nur die Gültigkeitsdauer der übertragenden Transaktion sehen. Würde man einem Timelock-Skript erlauben, die aktuelle Slot-Nummer zu sehen (d. h. die Daten, die vom Block und nicht vom Autor kommen), würde der Determinismus durchbrochen. Dies wird dadurch sichergestellt, dass ein Benutzer nicht den genauen Slot kennen kann, in dem die Transaktion verarbeitet wird, und daher nicht vorhersagen kann, wie sich das Skript verhalten wird.
Mary-Skripte sind, im Gegensatz zu Plutus-Verträgen in Alonzo, sehr begrenzt in dem, was sie ausdrücken können. Der Alonzo Hard Fork läutet eine neue Ära mächtiger, zustandsorientierter Verträge ein, die die deterministische Ledger-Eigenschaft nicht beeinträchtigen.
Plutus Skripte
Alonzo führt aufgrund der Implementierung von Plutus-Skripten einen neuen Ansatz zur Transaktionsvalidierung auf Cardano ein. Das erweiterte UTXO-Modell (extended unspent transaction output), das als Teil von Alonzo eingesetzt wird, bietet die Ledger-Infrastruktur zur Unterstützung von Plutus-Verträgen. Im Folgenden geben wir einen Überblick über die Ledger- und Transaktionsänderungen. Weitere Einzelheiten zur Arbeit mit dem Ledger und den Plutus-Skripten findet ihr im Plutus-Pionierprogramm!
Alonzo ändert die Daten im Hauptbuch wie folgt:
- Plutus-Skripte können UTXOs sperren.
- Eine neue Komponente, die dem Inhalt der Output-Werte von UTXOs hinzugefügt wurde, ermöglicht eine dem Skriptstatus ähnliche Funktionalität. Zusätzlich zu Assets und einer Adresse enthält ein von Plutus-Skripten gesperrter UTXO auch ein Datum. Ein Datum ist ein Datenelement, das als eine Interpretation des Skriptstatus betrachtet werden kann.
- Es gibt eine Reihe von neuen Protokollparametern, mit denen zusätzliche Validierungsanforderungen an Transaktionen gestellt werden. Dazu gehören Obergrenzen für die Rechenressourcen, die Skripte verbrauchen können.
Um Plutus-Skripte zu unterstützen, wurden die Transaktionen wie folgt aktualisiert:
- Für jede ihrer Aktionen hat die Transaktion nun ein benutzerdefiniertes Argument, den so genannten Redeemer. Je nach Skript kann ein Redeemer einen anderen Zweck erfüllen. So kann er z. B. das Gebot sein, das der Benutzer in einer Auktion abgibt, oder der Tipp des Benutzers in einem Ratespiel, neben vielen anderen Funktionen.
- Die Transaktion legt für jedes Skript ein Budget für die rechnerische Ausführung fest.
- Um sicherzustellen, dass eine Transaktion ihre Ausführungsgebühr bezahlen kann, führt Alonzo zusätzliche Daten ein, die wir in einem weiteren Blogbeitrag erörtern werden.
- Die Transaktionen enthalten einen Integritätshash, mit dem sichergestellt wird, dass sie nicht kompromittiert, veraltet usw. sind.
Es gibt auch einige Änderungen bei der Validierung von Alonzo-Transaktionen im Vergleich zu Mary. Für jede Aktion stellt die Node die vom Plutus-Interpreter erwarteten Skriptargumente zusammen, darunter:
- das Datum
- the redeemer
- das Ausführungsbudget
- eine Zusammenfassung der Transaktion
Die Node führt neue, Alonzo-spezifische Prüfungen durch, die sicherstellen, dass die Transaktion korrekt aufgebaut ist. So darf sie beispielsweise das maximale Budget für Ausführungsressourcen nicht überschreiten. Außerdem ruft er den Plutus-Skriptinterpreter auf, um die Skripte auszuführen.
Datumsobjekte vs. Skriptstatus
Wie die veränderlichen Konten fällt auch der veränderliche Skriptstatus in die Kategorie der Indeterminismus-Quellen “veränderliche Hauptbuchdaten”. Wir haben bereits gesehen, dass das UTXO-Modell das Problem des Indeterminismus bei veränderlichen Konten vermeidet. Es kann uns auch dabei helfen, das Konzept des Skriptstatus so zu überdenken, dass der Determinismus erhalten bleibt. Wenn ein UTXO durch ein Plutus-Skript gesperrt ist, ist der Skriptcode dieses UTXOs mit seiner Adresse verbunden. Das Status-Analogon dieses Skripts ist das in diesem UTXO gespeicherte Datum. Wenn eine Transaktion diesen UTXO ausgibt, wird er aus dem Hauptbuch gelöscht, einschließlich des Datums. Der Inhalt des Plutus-Skripts könnte jedoch erzwingen, dass die Transaktion, die es ausgibt, auch ein UTXO mit einem bestimmten Datum erstellt, das als aktualisierter Skriptstatus angesehen werden kann.
Budget für die Skriptausführung
Das nicht-deterministische Gas-Modell kann den Benutzern unvorhersehbar hohe Gebühren berechnen. In Cardano-Skripten wird diese Quelle des Indeterminismus dadurch angegangen, dass das Ressourcenbudget selbst sowie die zur Deckung dieses Budgets erforderliche Gebühr in der Transaktion enthalten sein müssen. In Alonzo kann ein Benutzer beides lokal vorhersagen, wenn er die Transaktion konstruiert. Die Ausführung eines Skripts gibt zwangsläufig entweder True oder False zurück und wird nicht in einer Endlosschleife ausgeführt. Der Grund dafür ist, dass jede Operation, die ein Skript ausführt, eine von Null abweichende Menge an Ressourcen benötigt, die vom Interpreter verfolgt werden. Wenn das von der Transaktion festgelegte Budget überschritten wird, bricht die Skriptausführung ab und gibt False zurück.
Transaktionsvalidierung in Alonzo
Um die möglichen Ursachen für Indeterminismus zu beseitigen, werden die Ergebnisse der Skript- und Transaktionsvalidierung durch die folgenden Schlüsselpunkte vorhersehbar gemacht:
- der Skriptinterpreter wird immer beendet und gibt dasselbe Prüfergebnis zurück, wenn er auf dieselben Argumente angewendet wird
- eine Transaktion legt notwendigerweise alle Argumente fest, die während der Validierung an den Skriptinterpreter übergeben werden
- eine Transaktion gibt alle Aktionen an, die eine Skriptvalidierung erfordern
- obligatorische Signaturen einer Transaktion stellen sicher, dass sie nicht von einem Angreifer so verändert werden kann, dass Skripte fehlschlagen
- Die Durchführung einer Transaktion im EUTXO-Ledger-Modell ist deterministisch.
Der letzte Punkt wurde weitgehend vom UTXO-Modell übernommen, da die Aktualisierungen des Alonzo-Ledger-Protokolls größtenteils mit den Aktualisierungen früherer Epochen übereinstimmen (einschließlich des Delegationsschemas usw.). Nach dem Alonzo-Upgrade wirkt sich eine fehlgeschlagene oder erfolgreiche Skriptvalidierung darauf aus, wie eine Transaktion verarbeitet wird (mehr dazu in Teil 2!). Das Ergebnis “Wahr” oder “Falsch” sowie die mit beiden Ergebnissen verbundenen Änderungen im Hauptbuch sind jedoch für eine bestimmte Transaktion vorhersehbar.
Das deterministische Verhalten von Cardanos Skript- und Transaktionsvalidierungen ist kein natürliches Ergebnis der Verwendung des EUTXO-Modells. Um diese Eigenschaft zu gewährleisten, musste das IOG-Team die Quelle jedes Datenteils, das ein Skript sehen darf, sorgfältig verfolgen.
Die deterministische Auswertungseigenschaft ist in der Alonzo-Spezifikation formal spezifiziert, und das IOG-Team hat auch einen Beweis dafür skizziert, dass der Interpreter nur die Argumente erhält, die diese Eigenschaft nicht verletzen.
In unserem zweiten Blog-Beitrag werden wir einen genaueren Blick auf den 2-Phasen-Validierungsprozess von Cardano-Transaktionen werfen. Haltet also im Laufe dieser Woche die Augen offen für Teil 2.
Dies ist eine Übersetzung des Blogbeitrages No-surprises transaction validation on Cardano, welches am 06. September 2021 auf dem IOG Blog veröffentlicht wurde.
Ich habe mir viel Mühe gegeben den Artikel möglichst genau zu übersetzen, durch die Länge und der sehr detaillierten fachspezifischen Erklärung, kann es vorkommen, dass nicht alles perfekt übersetzt ist. Wenn ihr einen Fehler findet, lasst es mich gerne wissen