
Die Ontology Wasm-Technologie senkt die Kosten fĂŒr die Migration von dApp-Smart Contracts mit komplexer GeschĂ€ftlogik auf die Blockchain und bereichert somit das dApp-Ăkosystem erheblich.
Derzeit unterstĂŒtzt sowohl die Entwicklung in Rust als auch in C++. Rust unterstĂŒtzt Wasm besser, und der generierte Bytecode ist einfacher, was die Kosten fĂŒr Vertragsaufrufe weiter senken kann. Daher wie verwendet man Rust zur Entwicklung eines Vertrags im Ontology-Netzwerk?
Entwicklung eines WASM-Vertrags mit Rust
Vertragserstellung
ist ein hilfreiches Projektmanagement- und Paketverwaltungstool fĂŒr die Programmierung in Rust, das Entwicklern hilft, die Interaktion zwischen ihrem Code und externen Bibliotheken besser zu organisieren. Um einen neuen Ontology Wasm-Vertrag zu erstellen, fĂŒhren Sie einfach den folgenden Befehl aus:
![]()
Die Projektstruktur, die es generiert:

Die Datei Cargo.toml wird verwendet, um grundlegende Informationen ĂŒber das Projekt und die abhĂ€ngigen Bibliotheken zu konfigurieren. Der Abschnitt [lib] in der Datei muss auf crate-type = ["cdylib"] gesetzt werden. Die Datei lib.rs wird verwendet, um die Logik des Vertrags zu implementieren. Zudem mĂŒssen Sie die AbhĂ€ngigkeitsparameter im Abschnitt [dependencies] der Konfigurationsdatei Cargo.toml hinzufĂŒgen:

Mit dieser AbhÀngigkeit können Entwickler Schnittstellen aufrufen, die mit der Ontology-Blockchain interagieren, sowie Werkzeuge wie den Serialisierungsparameter.
Eingabefunktion des Vertrags
Jedes Programm hat eine Eingabefunktion, wie die main-Funktion, die wir normalerweise sehen, aber ein Vertrag hat keine main-Funktion. Wenn ein Wasm-Vertrag mit Rust entwickelt wird, wird die Funktion invoke standardmĂ€Ăig als Eingabefunktion fĂŒr den Vertrag verwendet. Der Name der Funktion in Rust bleibt bei der Kompilierung des Rust-Quellcodes in Bytecode, der von der virtuellen Maschine ausgefĂŒhrt werden kann, unklar. Um den Compiler daran zu hindern, ĂŒberflĂŒssigen Code zu generieren und die GröĂe des Vertrags zu reduzieren, fĂŒgt die Funktion invoke die Annotation #[no_mangle] hinzu.
Wie erhĂ€lt die Funktion invoke Parameter zur AusfĂŒhrung einer Transaktion?
Die Bibliothek ontio_std stellt die Funktion runtime::input() zur VerfĂŒgung, um Parameter fĂŒr die AusfĂŒhrung von Transaktionen zu erhalten. Entwickler können ZeroCopySource zur Deserialisierung des erhaltenen Byte-Arrays verwenden. Das erste gelesene Byte-Array ist der Name der invoke-Methode, gefolgt von den Methodenparametern.
Wie wird das Ergebnis der VertragserfĂŒllung zurĂŒckgegeben?
Die Funktion runtime::ret, die von der Bibliothek ontio_std bereitgestellt wird, gibt das Ergebnis der Methodenimplementierung zurĂŒck.
Die vollstĂ€ndige invoke-Funktion sieht folgendermaĂen aus:

Serialisierung und Deserialisierung von Vertragsdaten
Bei der Entwicklung von VertrĂ€gen stoĂen Entwickler hĂ€ufig auf Probleme mit der Serialisierung und Deserialisierung, insbesondere darauf, wie Datentypen vom struct-Typ in einer Datenbank gespeichert und wie Byte-Arrays, die aus der Datenbank gelesen werden, deserialisiert werden, um den struct-Datentyp zu erhalten.
Die Bibliothek ontio_std bietet Decoder- und Encoder-Schnittstellen fĂŒr die Serialisierung und Deserialisierung von Daten an. Die Felder der Struktur struct implementieren ebenfalls Decoder- und Encoder-Schnittstellen, sodass die Struktur serialisiert und deserialisiert werden kann. Instanzen der Klasse Sink sind erforderlich, wenn verschiedene Datentypen serialisiert werden. Eine Instanz der Klasse Sink hat ein set-Feld vom Typ buf, das die Byte-Daten speichert, wĂ€hrend alle serialisierten Daten in buf gespeichert werden.
FĂŒr festgelegte Datentypen (z. B.: byte, u16, u32, u64 usw.) werden die Daten direkt in ein Byte-Array umgewandelt und dann in buf gespeichert; fĂŒr variable Datentypen muss zunĂ€chst die LĂ€nge serialisiert und dann Ddata (z. B. Vorzeichenlose Ganzzahlen unbekannter GröĂe, einschlieĂlich u16, u32 oder u64 usw.) verarbeitet werden.
Die Deserialisierung ist das genaue Gegenteil. FĂŒr jede Serialisierungsmethode gibt es die entsprechende Deserialisierungsmethode. Die Deserialisierung erfordert die Verwendung von Instanzen der Klasse Source. Diese Instanz hat zwei Felder: buf und pos. Buf wird verwendet, um die Daten zu speichern, die deserialisiert werden, wĂ€hrend pos verwendet wird, um die aktuelle Leseposition zu speichern. Wenn ein bestimmter Datentyp gelesen wird und seine LĂ€nge bekannt ist, können Sie ihn direkt lesen; fĂŒr unbekannte LĂ€ngen muss zuerst die LĂ€nge und dann der Inhalt gelesen werden.
Zugriff auf und Aktualisierung von Daten in der Kette
Ontology-wasm-cdt-rust â kapselte die betriebliche Methode zur Arbeit mit Daten in der Blockchain ein, die fĂŒr Entwickler praktisch ist, um Operationen wie HinzufĂŒgen, Löschen, Ăndern und Abfragen von Daten in der Blockchain wie folgt durchzufĂŒhren:
- datenbank::get(key) â wird verwendet, um Daten aus der Blockchain abzufragen, wobei key die Implementierung des AsRef-Interfaces abfrĂ€gt;
- datenbank::put(key, value) â wird verwendet, um Daten im Netzwerk zu speichern. Key fragt die AusfĂŒhrung des AsRef-Interfaces ab, wĂ€hrend value die Implementierung des Encoder-Interfaces abfragt;
- datenbank::delete(key) â wird verwendet, um Daten aus der Kette zu löschen, wobei key die Implementierung des AsRef-Interfaces abfragt.
VertragsprĂŒfung
Wenn die Methoden des Vertrags implementiert werden, benötigen wir Zugriff auf die Daten in der Blockchain und wir benötigen eine entsprechende virtuelle Maschine, um den Bytecode des Vertrags auszufĂŒhren. Daher ist es in der Regel notwendig, den Vertrag zur PrĂŒfung in der Blockchain bereitzustellen. Doch diese Methode der PrĂŒfung ist problematisch. Um die PrĂŒfung von VertrĂ€gen fĂŒr Entwickler zu erleichtern, bietet die Bibliothek ontio_std ein Mock-Modul fĂŒr Tests. Dieses Modul simuliert Daten in der Blockchain, um fĂŒr Entwickler das Unit-Testing von Methoden im Vertrag zu erleichtern. Konkrete Beispiele sind verfĂŒgbar .
Vertragsdebugging
console::debug(msg) gibt Debug-Informationen wÀhrend des Debuggings des Vertrags aus. Die Information msg wird in die Log-Datei des Knotens aufgenommen. Eine Voraussetzung ist die Einstellung des Log-Datei-Levels in den Debug-Modus, wenn der lokale Test-Knoten von Ontology lÀuft.
runtime::notify(msg) gibt relevante Debug-Informationen wÀhrend des Debuggings des Vertrags aus. Diese Methode speichert die eingegebene Information in der Blockchain und kann mit der Methode getSmartCodeEvent aus der Blockchain abgerufen werden.
Der Artikel wurde von der Redaktion Hashrate&Shares speziell fĂŒr OntologyRussia ĂŒbersetzt.
Sind Sie Entwickler? Treten Sie unserer technischen Gemeinschaft bei auf . Schauen Sie auch in das auf unserer Website, wo Sie Entwicklerwerkzeuge, Dokumentationen und vieles mehr finden können.
Ontology
- /
- Telegram /
- /
Quelle: habr.com
