Kako napisati pametan ugovor na WebAssembly u Ontology mreži? Dio 1: Rust

Kako napisati pametan ugovor na WebAssembly u Ontology mreži? Dio 1: Rust

Tehnologija Ontology Wasm smanjuje troškove prijenosa pametnih ugovora dApp sa složenom poslovnom logikom na blokčejn, čime značajno obogaćuje dApp ekosustav.

Trenutno Ontology Wasm istovremeno podržava razvoj na jeziku Rust i na jeziku C++. Jezik Rust bolje podržava Wasm, a generirani bajt-kod je jednostavniji, što može dodatno smanjiti troškove poziva ugovora. Dakle, kako koristiti Rust za razvoj ugovora u mreži Ontology?

Razvoj WASM - ugovora pomoću Rusta

Kreiranje ugovora

Cargo — to je dobar alat za izradu projekata i upravljanje paketima prilikom razvoja programa na Rustu, koji pomaže programerima bolje organizirati interakciju koda i vanjskih biblioteka. Da biste stvorili novi Ontology Wasm-ugovor, jednostavno izvršite sljedeću naredbu:

Kako napisati pametan ugovor na WebAssembly u Ontology mreži? Dio 1: Rust

Struktura projekta koju generira:

Kako napisati pametan ugovor na WebAssembly u Ontology mreži? Dio 1: Rust

Datoteka Cargo.toml koristi se za postavljanje osnovnih informacija o projektu i informacijama o ovisnim biblioteka. Odjeljak [lib] u datoteci mora biti postavljen na vrijednost crate-type = ["cdylib"]. Datoteka lib.rs koristi se za pisanje logike ugovora. Uz to, morate dodati parametre ovisnosti u odjeljak [dependencies] datoteke konfiguracije Cargo.toml:

Kako napisati pametan ugovor na WebAssembly u Ontology mreži? Dio 1: Rust

Pomoću ove ovisnosti programeri mogu pozivati sučelja koja komuniciraju s blokčejnom Ontology, kao i alate poput parametra za serijalizaciju.

Funkcija ulaza ugovora

Svaki program ima funkciju ulaza, kao što je npr. main-funkcija koju obično vidimo, ali ugovor nema main-funkciju. Kada se razvija Wasm-ugovor koristeći Rust, funkcija invoke se po defaultu koristi kao funkcija ulaza za korištenje ugovora. Ime funkcije u Rustu će biti nejasno prilikom kompajliranja izvorne koda Rusta u bajt-kod, koji može izvršavati virtualna mašina. Da bi upozorio kompajler da ne generira suvišni kod i smanjio veličinu ugovora, funkcija invoke dodaje oznaku #[no_mangle].

Kako funkcija invoke prima parametre za izvršenje transakcije?

Biblioteka ontio_std pruža funkciju runtime::input() za dobivanje parametara za izvršenje transakcije. Razvijači mogu koristiti ZeroCopySource za deserializaciju dobivenog niza bajtova. U kojem je prvi očitani niz bajtova naziv invoke-metode, zatim parametri metode.

Kako se vraća rezultat izvršenja ugovora?

Funkcija runtime::ret, koja se pruža bibliotekom ontio_std, vraća rezultat izvršenja metode.

Završena invoke-funkcija izgleda ovako:

Kako napisati pametan ugovor na WebAssembly u Ontology mreži? Dio 1: Rust

Serializacija i deserializacija podataka ugovora

Tijekom razvoja ugovora, programeri se uvijek susreću s problemima serializacije i deserializacije, posebno o tome kako pohraniti struct-tip podataka u bazu podataka i kako deserializirati niz bajtova pročitan iz baze podataka kako bi se dobio struct-tip podataka.

Biblioteka ontio_std pruža dekoder i enkoder za serializaciju i deserializaciju podataka. Polja strukture struct također implementiraju dekoderske i enkoderske sučelja, tako da se struktura može serializirati i deserializirati. Instanca klase Sink potrebna je kada se serializiraju različiti tipovi podataka. Instanca klase Sink ima set-tip polje buf koje pohranjuje bajt tip podataka, a svi serializirani podaci pohranjuju se u buf.

Za podatke fiksne duljine (na primjer: byte, u16, u32, u64 itd.) podaci se izravno pretvaraju u niz bajtova i zatim se pohranjuju u buf; za podatke nepoznate duljine prvo se mora serializirati duljina, a zatim podaci (npr. cijeli brojevi bez znaka nepoznate veličine, uključujući u16, u32 ili u64 itd.).

Deserializacija je izravna suprotnost. Za svaku metodu serializacije postoji odgovarajuća metoda deserializacije. Deserializacija zahtijeva korištenje instanci klase Source. Ova instanca klase ima dva polja buf i pos. Buf se koristi za pohranu podataka koji će se deserializirati, a pos se koristi za pohranu trenutne pozicije očitavanja. Kada se očitava određeni tip podataka, ako znate njihovu duljinu, možete ih izravno očitati, a za podatke nepoznate duljine— prvo očitajte duljinu, a zatim očitajte sadržaj.

Pristup i ažuriranje podataka u lancu

Ontology-wasm-cdt-rust — enkapsulira operativnu metodu rada s podacima u lancu, koja je pogodna za programere da implementiraju operacije kao što su dodavanje, brisanje, izmjena i upit podataka u lancu na sljedeći način:

  • database::get(key) — koristi se za traženje podataka iz lanca, a key zahtijeva implementaciju sučelja AsRef;
  • database::put(key, value) — koristi se za pohranu podataka u mreži. Key zahtijeva izvođenje sučelja AsRef, a value zahtijeva implementaciju sučelja Encoder;
  • database::delete(key) — koristi se za brisanje podataka iz lanca, a key zahtijeva implementaciju sučelja AsRef.

Testiranje ugovora

Kada se implementiraju metode ugovora, potrebna nam je dostupnost podataka u lancu i odgovarajuća virtualna mašina za izvođenje bajtkoda ugovora, stoga je obično potrebno rasporediti ugovor u lancu za testiranje. No, ova metoda testiranja je problematična. Kako bi olakšali testiranje ugovora za programere, knjižnica ontio_std pruža mock modul za testiranje. Ovaj modul osigurava simulaciju podataka u lancu, olakšavajući programerima jedinično testiranje metoda u ugovoru. Konkretnim primjerima možete se pronaći ovdje.

Debugging ugovora

console::debug(msg) ispisuje informacije za otklanjanje pogrešaka tijekom otklanjanja ugovora. Informacija msg bit će unesena u log datoteku čvora. Obavezno je postaviti razinu log datoteke u režim otklanjanja pogrešaka kada se pokreće lokalni test čvor Ontology.

runtime::notify(msg) ispisuje odgovarajuće informacije za otklanjanje pogrešaka tijekom otklanjanja ugovora. Ova metoda će sačuvati unesene informacije u lancu i mogu se zatražiti iz lanca putem metode getSmartCodeEvent.

Članak je preveden uredništvom Hashrate&Shares posebno za OntologyRussia. klik

Jeste li programer? Pridružite se našoj tehničkoj zajednici na Discord. Također, zavirite u Centar za programere na našoj web stranici, tamo možete pronaći alate za programere, dokumentaciju i još mnogo toga.

Ontology

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster