Wéi schreift e Smart Kontrakt op WebAssembly am Ontology Netzwierk? Deel 1: Rust

Wéi schreift e Smart Kontrakt op WebAssembly am Ontology Netzwierk? Deel 1: Rust

Ontology Wasm Technologie reduzéiert d'Käschte fir dApp Smart Kontrakter mat komplexer Geschäftslogik an d'Blockchain ze transferéieren, an doduerch den dApp Ökosystem wesentlech beräichert.

В настоящее время Ontologie Wasm ënnerstëtzt gläichzäiteg Entwécklung a béid Rust an C ++. D'Rust Sprooch ënnerstëtzt Wasm besser, an de generéierte Bytecode ass méi einfach, wat d'Käschte vun de Kontrakt Uruff weider reduzéieren kann. Also, Wéi benotzen ech Rust fir e Kontrakt am Ontology Netzwierk z'entwéckelen?

Entwéckelen engem WASM Kontrakt benotzt Rust

Schafen engem Kontrakt

cargo ass e gutt Tool fir Projeten ze kreéieren a Packagen ze managen wann Dir Programmer am Rust entwéckelt, wat d'Entwéckler hëlleft besser d'Interaktioun vu Code an Drëttbibliothéiken ze organiséieren. Fir en neien Ontology Wasm Kontrakt ze kreéieren, fuert einfach de folgende Kommando:

Wéi schreift e Smart Kontrakt op WebAssembly am Ontology Netzwierk? Deel 1: Rust

D'Struktur vum Projet et generéiert:

Wéi schreift e Smart Kontrakt op WebAssembly am Ontology Netzwierk? Deel 1: Rust

D'Cargo.toml Datei gëtt benotzt fir Basisprojetinformatioun an ofhängeg Bibliothéikinformatioun ze konfiguréieren. D'[lib] Sektioun an der Datei muss op Crate-Typ = ["cdylib"] gesat ginn. D'lib.rs Datei gëtt benotzt fir d'Kontraktlogik ze codéieren. Zousätzlech musst Dir Ofhängegkeetsparameter an d'Sektioun [Ofhängegkeeten] vun der Cargo.toml Konfiguratiounsdatei addéieren:

Wéi schreift e Smart Kontrakt op WebAssembly am Ontology Netzwierk? Deel 1: Rust

Mat dëser Ofhängegkeet kënnen d'Entwéckler Interfaces nennen, déi mat der Ontologie Blockchain interagéieren an Tools wéi de Serialiséierungsparameter.

Kontrakt Entrée Funktioun

All Programm huet eng Input Funktioun, wéi d'Haaptfunktioun déi mir normalerweis gesinn, awer e Kontrakt huet keng Haaptfunktioun. Wann Dir e Wasm Kontrakt mat Rust entwéckelt, gëtt d'Invoke Funktioun als Standard benotzt als Inputfunktioun fir de Kontrakt ze benotzen. Den Numm vun enger Funktioun am Rust wäert onkloer sinn wann Dir de Rust Quellcode an Bytecode kompiléiert deen vun enger virtueller Maschinn ausgefouert ka ginn. Fir ze verhënneren datt de Compiler redundante Code generéiert an d'Gréisst vum Kontrakt reduzéiert, füügt d'Invoke Funktioun d'#[no_mangle] Annotatioun derbäi.

Wéi kritt d'Oprufffunktioun Parameteren fir eng Transaktioun auszeféieren?

D'ontio_std Bibliothéik bitt d'Runtime :: Input () Funktioun fir d'Parameteren ze kréien fir eng Transaktioun auszeféieren. Entwéckler kënnen ZeroCopySource benotze fir déi resultéierend Byte-Array ze deserialiséieren. An deem déi éischt Byte-Array gelies gëtt den Numm vun der Opruffmethod ass, gefollegt vun de Methodparameter.

Wéi gëtt d'Resultat vun der Ausféierung vum Kontrakt zréckginn?

D'Runtime :: ret Funktioun, déi vun der ontio_std Bibliothéik gëtt, gëtt d'Resultat vun der Method Ausféierung zréck.

Déi ofgeschloss Invoke Funktioun gesäit esou aus:

Wéi schreift e Smart Kontrakt op WebAssembly am Ontology Netzwierk? Deel 1: Rust

Serialiséierung an Deserialiséierung vu Kontraktdaten

Am Prozess vun der Entwécklung vu Kontrakter sinn d'Entwéckler ëmmer mat Probleemer vun der Serialiséierung an der Deserialiséierung konfrontéiert, speziell wéi een e Strukturdatentyp an der Datebank späichert a wéi een e Byte-Array aus der Datebank gelies gëtt fir e Strukturdatentyp ze kréien.

D'ontio_std Bibliothéik bitt Decoder- an Encoder-Interfaces fir d'Serialiséierung an d'Deserialiséierung vun Daten. D'Felder vun engem Struktur implementéieren och Decoder- an Encoder-Interfaces sou datt d'Struktur serialiséiert an deserialiséiert ka ginn. Instanzen vun der Sink Klass si gebraucht wann verschidden Zorte vun Daten serialiséiert ginn. Eng Instanz vun der Sink-Klass huet e Set-Typ Feldbuf, deen Byte-Typ Daten späichert, an all serialiséiert Daten ginn am Buf gespäichert.

Fir Donnéeën mat fixer Längt (zB: Byte, u16, u32, u64, etc.), ginn d'Donnéeën direkt an e Byte-Array ëmgewandelt an dann a Buf gespäichert; fir Net-fix Längt Daten, Dir musst éischt d'Längt an dann d'Ddata serialize (wéi unsigned Ganzen vun onbekannter Gréisst, dorënner u16, u32 oder u64, etc.).

Deserialiséierung ass genau de Géigendeel. Fir all Serialiséierungsmethod gëtt et eng entspriechend Deserialiséierungsmethod. Deserialiséierung erfuerdert d'Benotzung vun Instanzen vun der Source Klass. Dës Klass Instanz huet zwee Felder buf an pos. Buf gëtt benotzt fir d'Donnéeën ze späicheren déi deserialiséiert ginn a pos gëtt benotzt fir déi aktuell Liespositioun ze späicheren. Wann eng spezifesch Zort vun Daten gelies gëtt, wann Dir seng Längt kennt, kënnt Dir se direkt liesen, fir Daten vun onbekannter Längt, liest d'Längt fir d'éischt an liest dann den Inhalt.

Zougang an Update Daten an der Kette

Ontologie-wasm-cdt-rust - eng operationell Method verschlësselt fir mat Daten op enger Kette ze schaffen, wat fir Entwéckler bequem ass fir Operatiounen ëmzesetzen wéi d'Addéieren, d'Läschen, d'Ännerung an d'Ufroen vun Daten op enger Kette wéi follegt:

  • Datebank :: kréien (Schlëssel) - benotzt fir Daten aus der Kette ze froen, a Schlëssel freet eng Ëmsetzung vun der AsRef Interface;
  • Datebank::put(Schlëssel, Wäert) - benotzt fir Daten am Netz ze späicheren. Schlëssel fuerdert Ëmsetzung vun der AsRef Interface, a Wäert fuerdert Ëmsetzung vun der Encoder Interface;
  • Datebank :: läschen (Schlëssel) - gëtt benotzt fir Daten aus der Kette ze läschen, a Schlëssel freet eng Ëmsetzung vun der AsRef Interface.

Kontrakt Testen

Wann Dir Kontraktmethoden implementéiert, brauche mir Zougang zu Daten op der Kette a mir brauche déi entspriechend virtuell Maschinn fir de Kontrakt Bytecode auszeféieren, also ass et typesch néideg fir de Kontrakt op d'Kette ze testen fir ze testen. Awer dës Testmethod ass problematesch. Fir Kontrakt Tester méi einfach fir Entwéckler ze maachen, bitt d'ontio_std Bibliothéik e Spotttestmodul. Dëse Modul gëtt Simulatioun vun Daten an enger Kette, mécht et méi einfach fir Entwéckler Test Methoden an engem Kontrakt ze Eenheet. Spezifesch Beispiller kënne fonnt ginn hei.

Debugging vum Kontrakt

console :: debug (msg) Dréckt Debug Informatiounen iwwerdeems e Kontrakt Debugging. D'Messg Informatioun gëtt an d'Logdatei vum Node aginn. Eng Viraussetzung ass de Log Dateiniveau op Debug Modus ze setzen wann Dir de lokalen Ontology Test Node leeft.

runtime :: notify (msg) dréckt entspriechend Debugging Informatioun wärend de Kontrakt debugged gëtt. Dës Method späichert déi aginn Informatioun an d'Kette a kann aus der Kette gefrot ginn mat der getSmartCodeEvent Method.

Den Artikel gouf vun den Redaktoren vun Hashrate&Shares speziell fir OntologyRussia iwwersat. klickt

Sidd Dir en Entwéckler? Maacht mat bei eiser Tech Gemeinschaft um Schwaarz. Och kuckt op Entwéckler Center op eiser Websäit, wou Dir Entwéckler Tools, Dokumentatioun a vill méi fannt.

Ontologie

Source: will.com

Setzt e Commentaire