Lebenszyklus eines intelligenten Vertrags

Lebenszyklus eines intelligenten Vertrags und Try-Catch-Implementierung

Im vorhergehenden Road to Neo3-Artikel haben wir einen allgemeinen Überblick über die Bedeutung der Ausnahmebehandlung in Neo-Smart-Verträgen gegeben und einige der vorläufigen Entwicklungsdiskussionen untersucht. Bevor wir uns eingehender mit der Implementierung bei Bitcoin Revolution befassen, werden wir den Lebenszyklus eines Neo Smart-Vertrags verfolgen, um besser zu verstehen, wie der neue Mechanismus für die Ausnahmebehandlung angewendet wird.

Implementierung bei Bitcoin Revolution

NeoVM allein ist nicht in der Lage, höhere Programmiersprachen wie Python oder JavaScript zu verstehen. Sobald ein Entwickler einen intelligenten Vertrag in der von ihm gewählten Sprache geschrieben hat, muss er in einen Satz von Opcodes umgewandelt werden, die NeoVM lesen und ausführen kann.

Opcodes sind Anweisungen, die von NeoVM verstanden werden können und einer bestimmten auszuführenden Operation entsprechen. Um z.B. eine einfache Additionsberechnung in NeoVM durchzuführen, könnten wir den Opcode „PUSH1“ verwenden, um die Zahl 1 auf den Stapel zu schieben, dann „PUSH2“, um die Zahl 2 oben auf den Stapel zu legen, und schließlich den Opcode „ADD“, um die beiden obersten Werte auf dem Stapel zu addieren.

Kompilieren von Python-Quellcode zu Neo2-Opcodes (Beachten Sie, dass aufgrund des Designs von NeoVM und Optimierungen während der Kompilierung mit neo-boa der resultierende Bytecode nicht unbedingt so einfach ist wie unser Beispiel PUSH1, PUSH2, ADD).

Dieser Umwandlungsprozess wird von einem Compiler übernommen, der den Quellcode des Vertrags in den Bytecode umwandelt, der von NeoVM ausgeführt werden kann. Im Neo-Ökosystem gibt es Compiler für mehrere Sprachen, wie z.B. den Kern-C#-Compiler Neon, neo-boa für Python und neo-go für Go.

Wie wir im letzten Artikel bemerkt haben, erforderte die Schaffung des neuen Ausnahmebehandlungssystems mehrere neue Opcodes, die die neue Logik mit sich brachten, die zum Abfangen und Behandeln von Ausnahmen in NeoVM erforderlich ist. Dazu gehören die drei Anweisungen, die für den Mechanismus selbst erforderlich sind: TRY, ENDTRY und ENDFINALLY, zusammen mit drei Anweisungen zum Werfen von Fehlern oder zur Fehlerbehandlung der VM nach Bedarf: ABORT, ASSERT und THROW.

Bytecode in die VM

Nachdem die Bytecode-Version eines intelligenten Vertrags erstellt wurde, besteht der nächste Schritt darin, ihn in NeoVM zu laden, was in der Regel dadurch erreicht wird, dass der Vertrag mittels einer Transaktion in die Neo-Blockkette eingebracht wird. Diese speichert den Vertrag auf jedem Knoten im Netzwerk, wo er bei Bedarf aufgerufen werden kann.

Der Aufruf erfolgt über den entsprechend benannten InvocationStack, eine Schlüsselkomponente der NeoVM-Ausführungsmaschine. Wenn ein intelligenter Vertrag aufgerufen wird, werden der Bytecode des Vertrags und alle anderen relevanten Parameter in die VM geladen, wodurch ein laufender Ausführungskontext erzeugt wird. Dieser Ausführungskontext kann als eine isolierte Umgebung zur Ausführung der relevanten end vom Anfangszustand „KEINE“ arbeitet sich NeoVM dann durch jeweils eine Operation und stoppt erst, wenn der InvocationStack leer ist (Übergang in den Zustand „HALT“) oder wenn ein Fehler auftritt (Übergang in den Zustand „FAULT“).

Sobald die VM den Zustand „FAULT“ erreicht hat, kann der Zustand nicht mehr rückgängig gemacht werden. Dies gilt unabhängig davon, ob der FEHLER durch einen Fehler im Vertrag, durch eine ungültige Transaktion oder durch absichtliches Einwerfen des Codes aus einem anderen Grund entstanden ist.

Um Neo-Smart-Verträge mit Ausnahmebehandlungsfunktionen auszustatten, musste daher eine Lösung gefunden werden, die die Ausführung (und das Scheitern) von Codesegmenten ermöglicht, ohne dass der gesamte Aufruf fehlerhaft ist.

Behandlung von Ausnahmen während der Ausführung

Zur Erläuterung des Entwurfs gab Chuan Lu, Protokollgruppenleiter bei Neo Global Development Shanghai und Erstautor des Mechanismus, in einem Neosäulenartikel einen schriftlichen Überblick über die ursprüngliche Version. Obwohl er mit der fertigen Implementierung noch nicht ganz auf dem neuesten Stand ist, stellt Chuan Lu zwei wichtige Teile des Systems vor: TryStack und ExceptionHandlingContext.

Ein ExceptionHandlingContext wird immer dann erzeugt, wenn NeoVM den TRY-Opcode ausführt, wobei der neue Kontext zum TryStack hinzugefügt wird. Der Kontext enthält wichtige Informationen wie Zeiger auf die Anweisungen, die ausgeführt werden sollen, wenn entweder eine Ausnahme abgefangen wird oder als Teil des optionalen Finally-Segments zuletzt ausgeführt werden soll. Die beiden anderen Opcodes, ENDTRY und ENDFINALLY, werden verwendet, um NeoVM zu den nächsten auszuführenden Anweisungen zu leiten und sicherzustellen, dass der Code wie vorgesehen ausgeführt wird.

This entry was posted in Bitcoin. Bookmark the permalink.

Comments are closed.