Road to Neo3: Ausnahmebehandlung in Neo-Smart-Verträgen

Für die nächste Serie in unserer Road to Neo3-Funktion werden wir uns den neuen Mechanismus zur Ausnahmebehandlung ansehen, der für die virtuelle Maschine (VM) von Neo3 entwickelt wird. Durch das Hinzufügen von Ausnahmebehandlungsfunktionen zu Neo Smart-Verträgen sollen diese robuster werden und sich eher wie herkömmliche Anwendungen verhalten, die sich von unerwarteten Fehlern erholen können.

Die Neo Virtual Machine

Alle Verträge, die für die Neo-Blockchain bereitgestellt werden, werden in NeoVM von Knoten im Netzwerk ausgeführt. Wenn ein Vertrag hier aufgerufen wird, werden die mit der Aufruftransaktion verknüpften Eingaben über den Vertragsbytecode in der VM ausgeführt. Eine interaktive Anleitung zur Funktionsweise von NeoVM finden Sie hier.

Jeder Knoten auf Neo führt denselben Code mit derselben VM aus, sodass das Ergebnis entscheidend dafür ist, ob das Ergebnis des Aufrufs erfolgreich ist oder fehlschlägt. Dies ist gut, da dies bedeutet, dass die Transaktion, wenn sie ungültige Eingaben hatte (z. B. der Versuch, mehr Assets zu senden, als eine Adresse besitzt), nicht weiter geht und die Vertragsausführung gestoppt wird.

In einigen Fällen kann es wünschenswert sein, dass ein Vertrag unerwartete Situationen ordnungsgemäß bewältigen und seinen Betrieb fortsetzen kann. Um dies zu ermöglichen, müssen Entwickler in der Lage sein, ihre Verträge mit der Fähigkeit auszustatten, solche Ereignisse vorherzusagen und mit fallspezifischer Logik darauf zu reagieren.

Dies wird durch die Implementierung von Ausnahmebehandlungsmechanismen erreicht, mit denen Entwickler spezielle Anweisungen schreiben können, die im Falle eines unerwarteten Fehlers verwendet werden. Diese können einfach protokollieren und den Entwickler über das spezielle Problem informieren, das beim Debuggen aufgetreten ist, oder sie können weiteren Code zum Analysieren und Verarbeiten des Aufrufs bereitstellen.

Bitcoin

Erster Try-Catch-Vorschlag

Der übliche Ansatz für die Behandlung von Ausnahmen ist ein Try-Catch-Mechanismus, mit dem ein Programm vorab auf Ausnahmen testen kann, anstatt zufällig auf eine zu stoßen und abzustürzen. Das Programm führt den zu prüfenden Code im Abschnitt try aus und erkennt und verarbeitet dann alle Probleme im Abschnitt catch .

Der Wunsch, Neo-Verträge um Funktionen zur Ausnahmebehandlung zu erweitern, wurde erstmals im Juli 2018 von Erik Zhang, Neo-Mitbegründer und Kernentwickler, geäußert. Dies führte zur Vorlage eines ersten Vorschlags für einen Try-Catch-Mechanismus durch Igor Coelho von NeoResearch. Schlagen Sie einen neuen TRY-Opcode vor, der den Speicherort der VM notiert, zu dem sie springen kann, wenn eine Ausnahme auftritt.

Der beobachtete Code kann dann ausgeführt werden, aber anstatt einen Fehler zu beheben, würde die VM vor dem Fortfahren zum Fangort springen. Dies bedeutet, dass Code, der normalerweise dazu führt, dass die VM in den Status FAULT wechselt, stattdessen verarbeitet und weiterverarbeitet werden kann.

Ein einfaches Beispiel für dieses Verhalten lieferte Coelho, das eine Division durch Nullfehler demonstrierte. In der aktuellen Neo2-VM würden diese Anweisungen den Status FAULT auslösen und die Ausführung des Vertrags beenden.

Mit dem vorgeschlagenen TRY-Opcode zum Springen von Positionen könnte der Fehler stattdessen vorhergesagt und behandelt werden. Vor dem Ausführen des zu überwachenden Codes kann der TRY-Opcode der VM Informationen darüber liefern, wo im Falle eines Fehlers weitere Anweisungen eingeholt werden müssen. In dem vorgeschlagenen Entwurf hatte dies die Form eines CATCH-Opcodes, der den Grund für die Ausnahme liefern kann.