
Die Ontology Wasm-Technologie reduziert die Kosten für die Übertragung von dApp-Smart-Verträgen mit komplexer Geschäftslogik in die Blockchain und bereichert so das dApp-Ökosystem erheblich.
Derzeit unterstützt
Ontology Wasm gleichzeitig die Entwicklung von Rust und
C ++ . Rust unterstützt Wasm besser und der generierte Bytecode ist einfacher, wodurch die Kosten für Vertragsanrufe weiter gesenkt werden können.
Wie kann man Rust verwenden, um einen Vertrag im Ontology-Netzwerk zu entwickeln?WASM-Vertragsentwicklung mit Rust
Vertragserstellung
Cargo ist ein gutes Tool zum Erstellen von Projekten und Verwalten von Paketen bei der Entwicklung von Programmen in Rust, mit dem Entwickler die Interaktion von Code und Bibliotheken von Drittanbietern besser organisieren können. Führen Sie zum Erstellen eines neuen Ontology Wasm-Vertrags einfach den folgenden Befehl aus:

Die Struktur des Projekts, das es generiert:

Die Datei Cargo.toml wird verwendet, um grundlegende Projektinformationen und abhängige Bibliotheksinformationen zu konfigurieren. Der Abschnitt [lib] in der Datei muss auf crate-type = [“cdylib”] gesetzt sein. Die lib.rs-Datei wird zum Schreiben von Vertragslogikcode verwendet. Darüber hinaus müssen Sie dem Abschnitt [Abhängigkeiten] der Konfigurationsdatei Cargo.toml Abhängigkeitsparameter hinzufügen:

Mit dieser Abhängigkeit können Entwickler Schnittstellen aufrufen, die mit der Ontologie-Blockchain interagieren, sowie Tools wie den Serialisierungsparameter.
Vertragserfassungsfunktion
Jedes Programm hat eine Eingabefunktion, wie z. B. eine Hauptfunktion, die wir normalerweise sehen, aber der Vertrag hat keine Hauptfunktion. Wenn ein Wasm-Vertrag mit Rust entwickelt wird, wird der Aufruf standardmäßig als Eingabefunktion für die Verwendung des Vertrags verwendet. Ein Funktionsname in Rust ist nicht klar, wenn Rust-Quellcode in Bytecode kompiliert wird, den eine virtuelle Maschine ausführen kann. Um den Compiler davor zu warnen, redundanten Code zu generieren und die Vertragsgröße zu verringern, fügt die Aufruffunktion die Annotation # [no_mangle] hinzu.
Wie ruft der Aufruf Parameter ab, um eine Transaktion auszuführen?
Die Bibliothek ontio_std bietet die Funktion runtime :: input (), um die Parameter für die Transaktion abzurufen. Entwickler können ZeroCopySource verwenden, um das resultierende Byte-Array zu deserialisieren. Dabei ist das erste gelesene Byte-Array der Name der aufgerufenen Methode, gefolgt von den Methodenparametern.
Wie ist das Ergebnis des Vertrages?
Die Funktion runtime :: ret, die von der Bibliothek ontio_std bereitgestellt wird, gibt das Ergebnis der Methode zurück.
Die fertige Aufruffunktion lautet wie folgt:

Serialisierung und Deserialisierung von Vertragsdaten
Bei der Entwicklung von Verträgen treten Entwickler immer wieder auf Probleme bei der Serialisierung und Deserialisierung auf, insbesondere beim Speichern des Strukturtyps der Daten in der Datenbank und beim Byte-Array-Lesen von Bytes aus der Datenbank zum Deserialisieren, um den Strukturtyp der Daten zu erhalten.
Die Bibliothek ontio_std bietet Decoder- und Encoder-Schnittstellen zum Serialisieren und Deserialisieren von Daten. Die Felder der Strukturstruktur implementieren auch die Schnittstellen des Decoders und des Codierers, so dass die Struktur serialisiert und deserialisiert werden kann. Sink-Instanzen sind erforderlich, wenn verschiedene Datentypen serialisiert werden. Eine Instanz der Sink-Klasse verfügt über ein Set-Type-Feld-Buf, in dem die Bytetypdaten gespeichert sind, und alle serialisierten Daten werden in Buf gespeichert.
Bei Daten mit fester Länge (z. B. Byte, U16, U32, U64 usw.) werden die Daten direkt in ein Array von Bytes konvertiert und dann in Buf gespeichert. Für Daten mit nicht fester Länge müssen Sie zuerst die Länge und dann D \ data serialisieren (z. B. vorzeichenlose Ganzzahlen unbekannter Größe, einschließlich u16, u32 oder u64 usw.).
Deserialisierung ist genau das Gegenteil. Für jede Serialisierungsmethode gibt es eine entsprechende Deserialisierungsmethode. Die Deserialisierung erfordert die Verwendung von Instanzen der Source-Klasse. Diese Klasseninstanz hat zwei Felder buf und pos. Buf wird verwendet, um zu deserialisierende Daten zu speichern, und pos wird verwendet, um die aktuelle Leseposition zu speichern. Wenn ein bestimmter Datentyp gelesen wird und Sie seine Länge kennen, können Sie ihn direkt für Daten unbekannter Länge lesen. Lesen Sie zuerst die Länge und dann den Inhalt.
Zugriff auf und Aktualisierung von Daten in der Kette
Ontology-wasm-cdt-rust - hat eine betriebliche Methode zum Arbeiten mit Daten in einer Kette zusammengefasst, mit der Entwickler Vorgänge wie das Hinzufügen, Löschen, Ändern und Abfragen von Daten in einer Kette wie folgt implementieren können:
- database :: get (key) - wird verwendet, um Daten von der Kette anzufordern, und key fordert die Implementierung der AsRef-Schnittstelle an.
- database :: put (Schlüssel, Wert) - wird zum Speichern von Daten im Netzwerk verwendet. Ausführung der AsRef-Schnittstelle für Schlüsselanforderungen und Implementierung der Encoder-Schnittstelle für Wertanforderungen;
- database :: delete (Schlüssel) - wird verwendet, um Daten aus der Kette zu entfernen, und der Schlüssel fordert die Implementierung der AsRef-Schnittstelle an.
Vertragstests
Wenn die Vertragsmethoden implementiert sind, benötigen wir Zugriff auf die Daten in der Verbindung und die entsprechende virtuelle Maschine, um den Bytecode des Vertrags auszuführen. Daher müssen wir den Vertrag in der Regel zum Testen in der Kette bereitstellen. Eine solche Testmethode ist jedoch problematisch. Um Entwicklern das Testen von Verträgen zu erleichtern, bietet die Bibliothek ontio_std ein Scheinmodul zum Testen. Dieses Modul bietet die Simulation von Daten in einer Schaltung und erleichtert Entwicklern das Testen von Methoden in einem Vertrag. Spezifische Beispiele finden Sie
hier .
Vertrags-Debugging
console :: debug (msg) druckt Debugging-Informationen beim Debuggen eines Vertrags. Die Nachrichteninformationen werden in die Knotenprotokolldatei eingegeben. Voraussetzung ist, dass die Ebene der Protokolldatei im Debug-Modus festgelegt wird, wenn der lokale Ontologie-Testknoten ausgeführt wird.
runtime :: notify (msg) zeigt beim Debuggen des Vertrags die entsprechenden Debugging-Informationen an. Diese Methode speichert die eingegebenen Informationen in der Schaltung und kann mit der Methode getSmartCodeEvent von der Schaltung angefordert werden.
Der Artikel wurde von Hashrate & Shares speziell für OntologyRussia übersetzt. Klicken Sie auf
Bist du ein Entwickler? Treten Sie unserer Tech-Community auf
Discord bei . Besuchen Sie außerdem
das Developer Center auf unserer Website, wo Sie Entwicklertools, Dokumentation und vieles mehr finden.
Ontologie