:DE: Überraschungsfreie Transaktionsvalidierung auf Cardano

Das EUTXO-Modell von Cardano ermöglicht die deterministische Ausführung von Plutus-Skripten

:calendar: 6. September 2021 :bust_in_silhouette: Polina Vinogradova :clock10: 12 Minuten Lesezeit

image

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:

  1. Plutus-Skripte können UTXOs sperren.
  2. 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.
  3. 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:

  1. 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.
  2. Die Transaktion legt für jedes Skript ein Budget für die rechnerische Ausführung fest.
  3. 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.
  4. 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 :uk: 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 :wink:

Part 2 des Blogbeitrags


Die Validierung von Alonzo-Transaktionen wird in zwei Phasen durchgeführt, um eine faire Vergütung für die Validierungsarbeit zu gewährleisten

:calendar: 07. September 2021 :bust_in_silhouette: Polina Vinogradova :clock10: 7 Minuten Lesezeit

grafik

In unserem letzten Blogbeitrag haben wir die deterministische Natur der Transaktions- und Skriptvalidierung auf dem Alonzo-Ledger besprochen, die sicherstellt, dass das Ergebnis der On-Chain-Transaktionsanwendung und der Skriptvalidierung lokal genau vorhergesagt werden kann, bevor die Transaktion überhaupt eingereicht wird.

Auf der Grundlage der Garantien, die das deterministische Design des Alonzo-Ledgers bietet, haben wir ein spezielles Zwei-Phasen-Validierungsschema implementiert. Es wurde entwickelt, um die Ressourcen, die die Nodes für die Validierung von Netzwerktransaktionen benötigen, zu minimieren und gleichzeitig unerwartete Kosten für den Nutzer zu vermeiden. In diesem Blogbeitrag gehen wir näher darauf ein, wie die zweiphasige Validierung funktioniert.

In der Shelley-, Allegra- und Mary-Ära war die Validierung von Transaktionen ein einstufiger Prozess. Die Auswirkung einer gültigen Transaktion auf das Hauptbuch war vollständig vorhersehbar, bevor sie durchgeführt wurde. Wenn eine Transaktion gültig war, wurde sie in einen Block aufgenommen und dem Ledger hinzugefügt. Wenn nicht, würde eine Node sie nach einem fehlgeschlagenen Validierungsversuch zurückweisen und die Transaktion würde nicht in einen Block aufgenommen werden. Nodes, die eingehende Transaktionen validierten, verbrauchten jedoch Zeit und Ressourcen, unabhängig davon, ob die Transaktion in einem Block landete oder nicht.

Alonzo führt Plutus-Skripte ein, deren Validierung im Vergleich zu einfachen Skripten früherer Epochen erheblich mehr Ressourcen erfordern kann. Um das Problem der Nodes zu lösen, die Ressourcen für die Validierung von Skripten von Transaktionen aufwenden, die abgelehnt werden, führt Alonzo einen zweistufigen Validierungsansatz ein. Diese Strategie sorgt für ein vorhersehbares Ergebnis bei der Übertragung von Transaktionen auf den Ledger und gewährleistet außerdem eine faire Entschädigung der Nodes für ihre Arbeit und den Ressourcenverbrauch.

Zweistufige Transaktionsvalidierung

Die Transaktionsvalidierung bei Cardano ist in zwei Phasen unterteilt. Der Hauptgrund für die Einführung einer zweiphasigen Validierung ist die Begrenzung der Menge an unentgeltlicher Validierungsarbeit durch die Nodes. Jede Phase erfüllt einen bestimmten Zweck, um dieses Ziel zu erreichen. Grob gesagt, wird in der ersten Phase geprüft, ob die Transaktion korrekt aufgebaut ist und die Bearbeitungsgebühr bezahlt werden kann. In der zweiten Phase werden die in der Transaktion enthaltenen Skripte ausgeführt. Wenn die Transaktion in Phase 1 gültig ist, werden die Skripte in Phase 2 ausgeführt. Schlägt Phase 1 fehl, werden keine Skripte ausgeführt, und die Transaktion wird sofort verworfen.

Daher wird von den Nodes erwartet, dass sie verarbeitbare Transaktionen zu einem Block hinzufügen, selbst wenn die Transaktionen nicht Phase-2 gültig sind. Dies bedeutet, dass entweder:

  • eine Node einen geringen unentgeltlichen Arbeitsaufwand betreibt, um festzustellen, dass eine Transaktion nicht verarbeitbar ist, aber keine teure Phase-2-Validierung durchgeführt wird, oder
  • die Transaktion verarbeitbar ist. Der Knoten kann dann eine Phase-2-Validierung der Skripte durchführen, die Transaktion entsprechend als entweder Phase-2-gültig oder Phase-2-ungültig kennzeichnen und sie einem Block hinzufügen. In beiden Fällen wird der Knoten später für beide Phasen der Validierung über die Gebühr oder die Sicherheiten, die für diese Transaktion erhoben werden, entschädigt.

Es wird erwartet, dass Phase-2-Fehler selten sind, da ein Benutzer, der eine Transaktion mit fehlerhaften Skripten einreicht, ada verliert und nichts erreicht. Dies ist lokal vorhersehbar und daher ein vermeidbares Ereignis. Die Phase 1 ist eine notwendige Schutzmaßnahme, um einen Ausgleich für die potenziell ressourcenintensiven Berechnungen der Skripte zu gewährleisten.

Schauen wir uns die Besonderheiten der einzelnen Phasen genauer an.

Phase 1

Die erste Phase der Validierung muss einfach sein. Wenn diese Phase fehlschlägt, wird eine Node nicht für die geleistete Arbeit entschädigt, da er keine Bearbeitungsgebühren für nicht bearbeitbare Transaktionen annehmen kann.

Die Phase-1-Validierung prüft zwei Dinge: dass eine Transaktion korrekt konstruiert ist und dass es möglich ist, sie dem Hauptbuch hinzuzufügen. Diese Validierung umfasst die folgenden und einige weitere Prüfungen:

  • er zahlt die korrekte Höhe an Gebühren und stellt die korrekte Höhe der Sicherheiten (d. h. die im Falle eines Skriptausfalls eingezogene Ada, siehe unten)
  • sie enthält alle für die Ausführung von Plutus-Skripten erforderlichen Daten
  • er überschreitet keine in den Protokollparametern festgelegten Grenzen (für Ausgabegrößen usw.)
  • seine Eingänge beziehen sich auf die im Ledger vorhandenen UTXOs
  • das das angegebene Berechnungsbudget für die Transaktion die maximale Ressourcengrenze pro Transaktion nicht überschreitet
  • Integritäts-Hash-Prüfungen, usw.

Bevor eine eingehende Transaktion in den Mempool (und schließlich in einen Block) aufgenommen wird, muss eine Node alle Validierungsprüfungen der Phase 1 durchführen. Wenn eine dieser Prüfungen fehlschlägt, wird die Transaktion abgelehnt, ohne in einen Block aufgenommen zu werden, und es werden keine Gebühren erhoben. In früheren Epochen war dies die einzige Validierungsphase, und Cardano behandelte alle Validierungsfehler auf diese Weise.

Von ehrlichen, nicht kompromittierten Nodes wird nicht erwartet, dass sie absichtlich nicht verarbeitbare Transaktionen produzieren. Nodes können auch die Verbindungen abbrechen, von denen ungültige Phase-1-Transaktionen verbreitet werden.

Phase 2

In der zweiten Phase der Validierung werden Plutus-Skripte ausgeführt, die rechenintensiver sein können. Daher werden nach einem Erfolg oder einem Misserfolg in der zweiten Phase Gebühren erhoben. Das eingenommene Geld fließt in den Gebührentopf und entschädigt so die Nodes für die im Validierungsprozess verbrauchten Ressourcen.

Eine erfolgreiche Validierung in Phase 1 garantiert nicht, dass alle Aktionen der Transaktion verarbeitet werden können, sondern nur, dass die Einziehung der Sicherheiten möglich ist. In Phase 2 erfolgt die Validierung des Plutus-Skripts, und die Entscheidung, ob eine vollständige Verarbeitung oder nur die Einziehung der Sicherheiten erfolgen soll. Dies wird auf Grundlage des Ergebnisses in der Validierung entschieden:

  • die Transaktion vollständig anwenden (die einzige Möglichkeit vor Alonzo) - wenn die Plutus-Skripte alle Aktionen der Transaktion validieren, oder
  • die Sicherheiten einziehen und den Rest der Transaktion ignorieren - wenn eines der Plutus-Skripte fehlschlägt.

Es sei daran erinnert, dass die Skriptvalidierung ein lokal vorhersehbares Ergebnis hat und garantiert stattfindet. Die Benutzer können die Ergebnisse der Skriptvalidierung lokal überprüfen und es gibt keine Meinungsverschiedenheiten zwischen ehrlichen Nodes darüber, wie eine bestimmte Transaktion und die darin enthaltenen Skripte zu bearbeiten sind.

Sicherheiten

Wenn Skripte nicht validiert werden, müssen wir die Nodes für ihre Arbeit entschädigen. Aber wir können nicht einfach Geld von den Transaktionsinputs nehmen, denn diese könnten mit Skripten gesperrt worden sein - die, die fehlgeschlagen sind! Stattdessen führt Alonzo eine spezielle Regelung für diesen Fall ein. Die Sicherheit einer Transaktion ist der Ada-Betrag, der im Falle einer fehlgeschlagenen Phase-2-Skriptvalidierung als Gebühr eingezogen wird. Bei einer verarbeitbaren Transaktion muss dieser Betrag mindestens einen bestimmten Prozentsatz der Transaktionsgebühr betragen, der in einem Protokollparameter festgelegt wird.

Dieser Betrag wird zum Zeitpunkt der Konstruktion des Vorgangs festgelegt. Nicht direkt, sondern durch Hinzufügen von Sicherheitseingaben zur Transaktion. Der Gesamtsaldo in den UTXOs, die diesen speziell gekennzeichneten Eingängen entsprechen, ist der Sicherheitenbetrag der Transaktion. Diese UTXOs müssen Adressen von öffentlichen Schlüsseln (und nicht von Skripten) haben und dürfen keine anderen Token als Ada enthalten.

Die Sicherheitseingänge werden nur dann aus dem Ledger UTXO entfernt, wenn ein Skript die Phase-2-Validierung nicht besteht. Wenn alle Skripte die Validierung bestehen, wird der angegebene Betrag der Transaktionsgebühr eingezogen, wie in früheren Epochen. Der Betrag stammt aus den regulären, nicht besicherten Eingaben, und die besicherten Eingaben werden einfach ignoriert. Und, gute Nachrichten! Es ist zulässig, dieselben Eingänge sowohl als Sicherheiten als auch als reguläre Eingänge zu verwenden, da immer nur einer der beiden Sätze aus dem UTXO entfernt wird.

Die für die Validierung der Verwendung von Sicherheiten erforderlichen Signaturen spielen auch eine wichtige Rolle bei der Wahrung der Integrität einer Transaktion. Diese verhindern, dass Angreifer den Inhalt einer Transaktion so verändern, dass die zwar weiterhin verarbeitbar ist, aber die Phase-2-Validierung nicht besteht. Ein Beispiel hierfür wäre, dass ein Angreifer einen Redeemer ersetzt. Um eine solche Änderung vorzunehmen, sind die Unterschriften der Schlüsselinhaber der Sicherheiten erforderlich. Die Schlüsselinhaber von den Sicherheiten sind auch die einzigen Benutzer, die bei einer fehlgeschlagenen Skriptvalidierung Ada verlieren können.

Da die Skriptauswertung deterministisch ist, können die Schlüsselinhaber von den Sicherheiten lokal prüfen, ob die Transaktion die Phase-2-Validierung auf der Kette bestehen wird, bevor sie diese signieren. Wenn dies der Fall ist, können sie sicher sein, dass dies auch on-Chain der Fall sein wird, und sie werden ihre Sicherheiten definitiv nicht verlieren. Ein Nutzer, der in gutem Glauben handelt, sollte seine Sicherheiten niemals verlieren. Das bedeutet auch, dass sie dieselben Sicherheiten für mehrere Transaktionen wiederverwenden können und sicher sein können, dass die Sicherheiten nicht eingezogen werden.

Jetzt, da wir das öffentliche Alonzo-Testnetz gestartet haben, laden wir alle Benutzer und Entwickler ein, es durch das Erstellen und Ausführen von Plutus-Skripten zu testen. Weitere Informationen findet ihr im speziellen Alonzo-Testnet-Repository, oder ihr diskutiert einfach über Plutus und Alonzothemen mit unserer vielfältigen Community.


Dies ist eine Übersetzung des :uk: Blogbeitrages No-surprises transaction validation on Cardano Part 2, welches am 07. 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