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

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

Ontology Wasm tehnologija smanjuje troškove migracije dApp pametnih ugovora sa složenom poslovnom logikom na blockchain, čime uvelike obogaćuje dApp ekosistem.

В настоящее время Ontology Wasm Istovremeno podržava i Rust i C++ razvoj. Rust jezik bolje podržava Wasm, a generirani bajt kod je jednostavniji, što može dodatno smanjiti troškove ugovora. dakle, kako koristiti Rust za razvoj ugovora na Ontology mreži?

Razvijanje WASM ugovora sa Rustom

Napravite ugovor

teret je dobar alat za kreiranje projekata i upravljanje paketima za Rust razvoj, koji pomaže programerima da bolje organizuju interakciju koda i biblioteka trećih strana. Da kreirate novi Ontology Wasm ugovor, jednostavno pokrenite sljedeću naredbu:

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

Struktura projekta koju generiše:

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

Datoteka Cargo.toml se koristi za postavljanje osnovnih informacija o projektu i informacija o zavisnim bibliotekama. Odjeljak [lib] datoteke mora biti postavljen na crate-type = ["cdylib"]. Datoteka lib.rs se koristi za pisanje logičkog koda ugovora. Osim toga, morate dodati parametre ovisnosti u odjeljak [zavisnosti] konfiguracijske datoteke Cargo.toml:

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

Uz ovu ovisnost, programeri mogu pozvati sučelja koja su u interakciji s Ontology blockchainom i alatima kao što je parametar serijalizacije.

Funkcija unosa ugovora

Svaki program ima funkciju unosa, kao što je glavna funkcija koju obično vidimo, ali ugovor nema glavnu funkciju. Kada je Wasm ugovor razvijen pomoću Rusta, zadana funkcija pozivanja se koristi kao ulazna funkcija za korištenje ugovora. Ime funkcije u Rustu će biti nejasno prilikom kompajliranja Rust izvornog koda u bajt kod koji može da izvrši virtuelna mašina. Kako bi spriječio kompajler da generiše redundantni kod i smanji veličinu ugovora, funkcija invoke dodaje napomenu #[no_mangle].

Kako funkcija pozivanja dobiva parametre za izvršenje transakcije?

Biblioteka ontio_std pruža funkciju runtime::input() za dobivanje parametara za izvršenje transakcije. Programeri mogu koristiti ZeroCopySource da deserializiraju rezultirajući niz bajtova. U kojoj je prvi niz pročitanih bajtova ime metode pozivanja, a zatim slijede parametri metode.

Kako se vraća rezultat izvršenja ugovora?

Funkcija runtime::ret koju daje biblioteka ontio_std vraća rezultat izvršenja metode.

Dovršena funkcija pozivanja izgleda ovako:

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

Serijalizacija i deserializacija podataka ugovora

U procesu razvoja ugovora, programeri uvijek naiđu na probleme sa serijalizacijom i deserijalizacijom, posebno s tim kako pohraniti struct tip podataka u bazu podataka i kako deserializirati niz bajtova koji se čita iz baze podataka kako bi dobili struct tip podataka.

Biblioteka ontio_std pruža sučelje dekodera i kodera za serijalizaciju i deserijalizaciju podataka. Polja strukture također implementiraju interfejse dekodera i kodera tako da struktura može biti serijalizovana i deserijalizovana. Instance klase Sink su potrebne kada se serijaliziraju različiti tipovi podataka. Instanca klase Sink ima polje tipa skupa buf koje pohranjuje podatke tipa bajta, a svi serijalizirani podaci se pohranjuju u buf.

Za podatke fiksne dužine (npr.: bajt, u16, u32, u64, itd.), podaci se direktno konvertuju u niz bajtova i zatim pohranjuju u buf; za podatke nefiksne dužine, prvo se mora serijalizirati dužina, a zatim Ddata (na primjer, neoznačeni cijeli brojevi nepoznate veličine, uključujući u16, u32 ili u64, itd.).

Deserijalizacija je sušta suprotnost. Za svaku metodu serijalizacije postoji odgovarajuća metoda deserijalizacije. Deserijalizacija zahtijeva korištenje instanci klase Source. Ova instanca klase ima dva polja buf i pos. Buf se koristi za pohranjivanje podataka koji se deserializiraju, a pos se koristi za pohranjivanje trenutne pozicije čitanja. Kada se čita određeni tip podataka, ako znate njegovu dužinu, možete ga pročitati direktno, za podatke nepoznate dužine—prvo pročitajte dužinu, a zatim pročitajte sadržaj.

Pristup i ažuriranje podataka u lancu

ontologija-wasm-cdt-rust - inkapsuliran operativni metod za rad s podacima u lancu, koji je pogodan za programere da implementiraju operacije kao što su dodavanje, brisanje, promjena i upit podataka u lancu kako slijedi:

  • baza podataka::get(ključ) - koristi se za traženje podataka iz lanca, a ključ zahtjeva implementaciju AsRef interfejsa;
  • baza podataka::put(ključ, vrijednost) - koristi se za pohranjivanje podataka na mreži. Key zahteva implementaciju interfejsa AsRef, a vrednost zahteva implementaciju interfejsa Encoder;
  • baza podataka::delete(ključ) - koristi se za uklanjanje podataka iz lanca, a ključ zahtijeva implementaciju AsRef interfejsa.

Testiranje ugovora

Kada se implementiraju metode ugovora, potreban nam je pristup podacima u lancu i potrebna nam je odgovarajuća virtuelna mašina za izvršavanje bajt koda ugovora, tako da je generalno neophodno da se ugovor rasporedi na lancu radi testiranja. Ali ova metoda testiranja je problematična. Da bi se programerima olakšalo testiranje ugovora, biblioteka ontio_std pruža lažni modul za testiranje. Ovaj modul pruža simulaciju podataka u kolu, olakšavajući programerima da testiraju metode u ugovoru. Konkretni primjeri se mogu naći ovdje.

Otklanjanje grešaka ugovora

console::debug(msg) prikazuje informacije o otklanjanju grešaka tokom otklanjanja grešaka u ugovoru. Informacije o poruci bit će dodane u datoteku dnevnika čvora. Preduvjet je postavljanje razine datoteke dnevnika na način otklanjanja grešaka kada je pokrenut lokalni testni čvor za ontologiju.

runtime::notify(msg) ispisuje odgovarajuće informacije za otklanjanje grešaka dok se ugovor otklanja greške. Ova metoda će pohraniti informacije unesene u lanac i može se tražiti iz lanca korištenjem metode getSmartCodeEvent.

Članak su preveli urednici Hashrate&Shares posebno za OntologyRussia. plakati

Jeste li programer? Pridružite se našoj tehničkoj zajednici na Diskord. Takođe, pogledajte Centar za programere na našoj web stranici, gdje možete pronaći alate za programere, dokumentaciju i još mnogo toga.

ontologija

izvor: www.habr.com

Dodajte komentar